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 19123e2e115SBram 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 19923e2e115SBram 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 472cd6b4f30SBram Moolenaar catch /E1012:/ 473f0b9f43cSBram Moolenaar n = 233 474f0b9f43cSBram Moolenaar endtry 475f0b9f43cSBram Moolenaar assert_equal(233, n) 476f0b9f43cSBram Moolenaar 477f0b9f43cSBram Moolenaar try 478f0b9f43cSBram Moolenaar n = +g:astring 479cd6b4f30SBram Moolenaar catch /E1012:/ 480f0b9f43cSBram Moolenaar n = 244 481f0b9f43cSBram Moolenaar endtry 482f0b9f43cSBram Moolenaar assert_equal(244, n) 483f0b9f43cSBram Moolenaar 484f0b9f43cSBram Moolenaar try 485f0b9f43cSBram Moolenaar n = +g:alist 486cd6b4f30SBram Moolenaar catch /E1012:/ 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:') 64484934998Srbtnn 64584934998Srbtnn # skipping try-finally-endtry when try-finally-endtry is used in another block 64684934998Srbtnn lines =<< trim END 64784934998Srbtnn if v:true 64884934998Srbtnn try 64984934998Srbtnn finally 65084934998Srbtnn endtry 65184934998Srbtnn else 65284934998Srbtnn try 65384934998Srbtnn finally 65484934998Srbtnn endtry 65584934998Srbtnn endif 65684934998Srbtnn END 65784934998Srbtnn CheckDefAndScriptSuccess(lines) 6588a7d6542SBram Moolenaarenddef 6598a7d6542SBram Moolenaar 6603f987b59SBram Moolenaardef Test_try_in_catch() 6613f987b59SBram Moolenaar var lines =<< trim END 6623f987b59SBram Moolenaar vim9script 6633f987b59SBram Moolenaar var seq = [] 6643f987b59SBram Moolenaar def DoIt() 6653f987b59SBram Moolenaar try 6663f987b59SBram Moolenaar seq->add('throw 1') 6673f987b59SBram Moolenaar eval [][0] 6683f987b59SBram Moolenaar seq->add('notreached') 6693f987b59SBram Moolenaar catch 6703f987b59SBram Moolenaar seq->add('catch') 6713f987b59SBram Moolenaar try 6723f987b59SBram Moolenaar seq->add('throw 2') 6733f987b59SBram Moolenaar eval [][0] 6743f987b59SBram Moolenaar seq->add('notreached') 6753f987b59SBram Moolenaar catch /nothing/ 6763f987b59SBram Moolenaar seq->add('notreached') 6773f987b59SBram Moolenaar endtry 6783f987b59SBram Moolenaar seq->add('done') 6793f987b59SBram Moolenaar endtry 6803f987b59SBram Moolenaar enddef 6813f987b59SBram Moolenaar DoIt() 6823f987b59SBram Moolenaar assert_equal(['throw 1', 'catch', 'throw 2', 'done'], seq) 6833f987b59SBram Moolenaar END 6843f987b59SBram Moolenaarenddef 6853f987b59SBram Moolenaar 686d3d8feebSBram Moolenaardef Test_error_in_catch() 687d3d8feebSBram Moolenaar var lines =<< trim END 688d3d8feebSBram Moolenaar try 689d3d8feebSBram Moolenaar eval [][0] 690d3d8feebSBram Moolenaar catch /E684:/ 691d3d8feebSBram Moolenaar eval [][0] 692d3d8feebSBram Moolenaar endtry 693d3d8feebSBram Moolenaar END 694d3d8feebSBram Moolenaar CheckDefExecFailure(lines, 'E684:', 4) 695d3d8feebSBram Moolenaarenddef 696d3d8feebSBram Moolenaar 6972e34c34bSBram Moolenaar" :while at the very start of a function that :continue jumps to 6982e34c34bSBram Moolenaardef TryContinueFunc() 6992e34c34bSBram Moolenaar while g:Count < 2 7002e34c34bSBram Moolenaar g:sequence ..= 't' 7012e34c34bSBram Moolenaar try 7022e34c34bSBram Moolenaar echoerr 'Test' 7032e34c34bSBram Moolenaar catch 7042e34c34bSBram Moolenaar g:Count += 1 7052e34c34bSBram Moolenaar g:sequence ..= 'c' 7062e34c34bSBram Moolenaar continue 7072e34c34bSBram Moolenaar endtry 7082e34c34bSBram Moolenaar g:sequence ..= 'e' 7092e34c34bSBram Moolenaar g:Count += 1 7102e34c34bSBram Moolenaar endwhile 7112e34c34bSBram Moolenaarenddef 7122e34c34bSBram Moolenaar 7132e34c34bSBram Moolenaardef Test_continue_in_try_in_while() 7142e34c34bSBram Moolenaar g:Count = 0 7152e34c34bSBram Moolenaar g:sequence = '' 7162e34c34bSBram Moolenaar TryContinueFunc() 7172e34c34bSBram Moolenaar assert_equal('tctc', g:sequence) 7182e34c34bSBram Moolenaar unlet g:Count 7192e34c34bSBram Moolenaar unlet g:sequence 7202e34c34bSBram Moolenaarenddef 7212e34c34bSBram Moolenaar 7229cb577a6SBram Moolenaardef Test_nocatch_return_in_try() 7239cb577a6SBram Moolenaar # return in try block returns normally 7249cb577a6SBram Moolenaar def ReturnInTry(): string 7259cb577a6SBram Moolenaar try 7269cb577a6SBram Moolenaar return '"some message"' 7279cb577a6SBram Moolenaar catch 7289cb577a6SBram Moolenaar endtry 7299cb577a6SBram Moolenaar return 'not reached' 7309cb577a6SBram Moolenaar enddef 7319cb577a6SBram Moolenaar exe 'echoerr ' .. ReturnInTry() 7329cb577a6SBram Moolenaarenddef 7339cb577a6SBram Moolenaar 7341430ceebSBram Moolenaardef Test_cnext_works_in_catch() 7351430ceebSBram Moolenaar var lines =<< trim END 7361430ceebSBram Moolenaar vim9script 737c323527dSBram Moolenaar au BufEnter * eval 1 + 2 7381430ceebSBram Moolenaar writefile(['text'], 'Xfile1') 7391430ceebSBram Moolenaar writefile(['text'], 'Xfile2') 7401430ceebSBram Moolenaar var items = [ 7411430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile1', valid: true}, 7421430ceebSBram Moolenaar {lnum: 1, filename: 'Xfile2', valid: true} 7431430ceebSBram Moolenaar ] 7441430ceebSBram Moolenaar setqflist([], ' ', {items: items}) 7451430ceebSBram Moolenaar cwindow 7461430ceebSBram Moolenaar 7471430ceebSBram Moolenaar def CnextOrCfirst() 7481430ceebSBram Moolenaar # if cnext fails, cfirst is used 7491430ceebSBram Moolenaar try 7501430ceebSBram Moolenaar cnext 7511430ceebSBram Moolenaar catch 7521430ceebSBram Moolenaar cfirst 7531430ceebSBram Moolenaar endtry 7541430ceebSBram Moolenaar enddef 7551430ceebSBram Moolenaar 7561430ceebSBram Moolenaar CnextOrCfirst() 7571430ceebSBram Moolenaar CnextOrCfirst() 7581430ceebSBram Moolenaar writefile([getqflist({idx: 0}).idx], 'Xresult') 7591430ceebSBram Moolenaar qall 7601430ceebSBram Moolenaar END 7611430ceebSBram Moolenaar writefile(lines, 'XCatchCnext') 7621430ceebSBram Moolenaar RunVim([], [], '--clean -S XCatchCnext') 7631430ceebSBram Moolenaar assert_equal(['1'], readfile('Xresult')) 7641430ceebSBram Moolenaar 7651430ceebSBram Moolenaar delete('Xfile1') 7661430ceebSBram Moolenaar delete('Xfile2') 7671430ceebSBram Moolenaar delete('XCatchCnext') 7681430ceebSBram Moolenaar delete('Xresult') 7691430ceebSBram Moolenaarenddef 7701430ceebSBram Moolenaar 7719e1d9e34SBram Moolenaardef Test_throw_skipped() 7729e1d9e34SBram Moolenaar if 0 7739e1d9e34SBram Moolenaar throw dontgethere 7749e1d9e34SBram Moolenaar endif 7759e1d9e34SBram Moolenaarenddef 7769e1d9e34SBram Moolenaar 7778f81b22eSBram Moolenaardef Test_nocatch_throw_silenced() 7788f81b22eSBram Moolenaar var lines =<< trim END 7798f81b22eSBram Moolenaar vim9script 7808f81b22eSBram Moolenaar def Func() 7818f81b22eSBram Moolenaar throw 'error' 7828f81b22eSBram Moolenaar enddef 7838f81b22eSBram Moolenaar silent! Func() 7848f81b22eSBram Moolenaar END 7858f81b22eSBram Moolenaar writefile(lines, 'XthrowSilenced') 7868f81b22eSBram Moolenaar source XthrowSilenced 7878f81b22eSBram Moolenaar delete('XthrowSilenced') 7888f81b22eSBram Moolenaarenddef 7898f81b22eSBram Moolenaar 790e859312eSBram Moolenaardef DeletedFunc(): list<any> 791e859312eSBram Moolenaar return ['delete me'] 792e859312eSBram Moolenaarenddef 793e859312eSBram Moolenaardefcompile 794e859312eSBram Moolenaardelfunc DeletedFunc 795e859312eSBram Moolenaar 796257cc5eeSBram Moolenaardef ThrowFromDef() 797a72cfb80SBram Moolenaar throw "getout" # comment 798257cc5eeSBram Moolenaarenddef 799257cc5eeSBram Moolenaar 800257cc5eeSBram Moolenaarfunc CatchInFunc() 801257cc5eeSBram Moolenaar try 802257cc5eeSBram Moolenaar call ThrowFromDef() 803257cc5eeSBram Moolenaar catch 804257cc5eeSBram Moolenaar let g:thrown_func = v:exception 805257cc5eeSBram Moolenaar endtry 806257cc5eeSBram Moolenaarendfunc 807257cc5eeSBram Moolenaar 808257cc5eeSBram Moolenaardef CatchInDef() 809257cc5eeSBram Moolenaar try 810257cc5eeSBram Moolenaar ThrowFromDef() 811257cc5eeSBram Moolenaar catch 812257cc5eeSBram Moolenaar g:thrown_def = v:exception 813257cc5eeSBram Moolenaar endtry 814257cc5eeSBram Moolenaarenddef 815257cc5eeSBram Moolenaar 816f575adffSBram Moolenaardef ReturnFinally(): string 817f575adffSBram Moolenaar try 818f575adffSBram Moolenaar return 'intry' 819373863edSBram Moolenaar finall 820f575adffSBram Moolenaar g:in_finally = 'finally' 821f575adffSBram Moolenaar endtry 822f575adffSBram Moolenaar return 'end' 823f575adffSBram Moolenaarenddef 824f575adffSBram Moolenaar 825257cc5eeSBram Moolenaardef Test_try_catch_nested() 826257cc5eeSBram Moolenaar CatchInFunc() 827257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 828257cc5eeSBram Moolenaar 829257cc5eeSBram Moolenaar CatchInDef() 830257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 831f575adffSBram Moolenaar 832f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 833f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 834d3d8feebSBram Moolenaar 835d3d8feebSBram Moolenaar var l = [] 836d3d8feebSBram Moolenaar try 837d3d8feebSBram Moolenaar l->add('1') 838d3d8feebSBram Moolenaar throw 'bad' 839d3d8feebSBram Moolenaar l->add('x') 840d3d8feebSBram Moolenaar catch /bad/ 841d3d8feebSBram Moolenaar l->add('2') 842d3d8feebSBram Moolenaar try 843d3d8feebSBram Moolenaar l->add('3') 844d3d8feebSBram Moolenaar throw 'one' 845d3d8feebSBram Moolenaar l->add('x') 846d3d8feebSBram Moolenaar catch /one/ 847d3d8feebSBram Moolenaar l->add('4') 848d3d8feebSBram Moolenaar try 849d3d8feebSBram Moolenaar l->add('5') 850d3d8feebSBram Moolenaar throw 'more' 851d3d8feebSBram Moolenaar l->add('x') 852d3d8feebSBram Moolenaar catch /more/ 853d3d8feebSBram Moolenaar l->add('6') 854d3d8feebSBram Moolenaar endtry 855d3d8feebSBram Moolenaar endtry 856d3d8feebSBram Moolenaar endtry 857d3d8feebSBram Moolenaar assert_equal(['1', '2', '3', '4', '5', '6'], l) 858834193afSBram Moolenaar 859834193afSBram Moolenaar l = [] 860834193afSBram Moolenaar try 861834193afSBram Moolenaar try 862834193afSBram Moolenaar l->add('1') 863834193afSBram Moolenaar throw 'foo' 864834193afSBram Moolenaar l->add('x') 865834193afSBram Moolenaar catch 866834193afSBram Moolenaar l->add('2') 867834193afSBram Moolenaar throw 'bar' 868834193afSBram Moolenaar l->add('x') 869834193afSBram Moolenaar finally 870834193afSBram Moolenaar l->add('3') 871834193afSBram Moolenaar endtry 872834193afSBram Moolenaar l->add('x') 873834193afSBram Moolenaar catch /bar/ 874834193afSBram Moolenaar l->add('4') 875834193afSBram Moolenaar endtry 876834193afSBram Moolenaar assert_equal(['1', '2', '3', '4'], l) 877f575adffSBram Moolenaarenddef 878f575adffSBram Moolenaar 8799939f57bSBram Moolenaardef TryOne(): number 8809939f57bSBram Moolenaar try 8819939f57bSBram Moolenaar return 0 8829939f57bSBram Moolenaar catch 8839939f57bSBram Moolenaar endtry 8849939f57bSBram Moolenaar return 0 8859939f57bSBram Moolenaarenddef 8869939f57bSBram Moolenaar 8879939f57bSBram Moolenaardef TryTwo(n: number): string 8889939f57bSBram Moolenaar try 889cfcd011fSBram Moolenaar var x = {} 8909939f57bSBram Moolenaar catch 8919939f57bSBram Moolenaar endtry 8929939f57bSBram Moolenaar return 'text' 8939939f57bSBram Moolenaarenddef 8949939f57bSBram Moolenaar 8959939f57bSBram Moolenaardef Test_try_catch_twice() 8969939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 8979939f57bSBram Moolenaarenddef 8989939f57bSBram Moolenaar 899f575adffSBram Moolenaardef Test_try_catch_match() 900cfcd011fSBram Moolenaar var seq = 'a' 901f575adffSBram Moolenaar try 902f575adffSBram Moolenaar throw 'something' 903f575adffSBram Moolenaar catch /nothing/ 904f575adffSBram Moolenaar seq ..= 'x' 905f575adffSBram Moolenaar catch /some/ 906f575adffSBram Moolenaar seq ..= 'b' 907f575adffSBram Moolenaar catch /asdf/ 908f575adffSBram Moolenaar seq ..= 'x' 909e8c4abbbSBram Moolenaar catch ?a\?sdf? 910e8c4abbbSBram Moolenaar seq ..= 'y' 911f575adffSBram Moolenaar finally 912f575adffSBram Moolenaar seq ..= 'c' 913f575adffSBram Moolenaar endtry 914f575adffSBram Moolenaar assert_equal('abc', seq) 915257cc5eeSBram Moolenaarenddef 916257cc5eeSBram Moolenaar 917e8c4abbbSBram Moolenaardef Test_try_catch_fails() 918d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 919d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 920d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 921d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 922d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 923d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 924d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 925d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 92613106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 927d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 928585fea7bSBram Moolenaar 929e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 930d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 931e8c4abbbSBram Moolenaarenddef 932e8c4abbbSBram Moolenaar 9337c5b3c03SBram Moolenaardef Try_catch_skipped() 9347c5b3c03SBram Moolenaar var l = [] 9357c5b3c03SBram Moolenaar try 9367c5b3c03SBram Moolenaar finally 9377c5b3c03SBram Moolenaar endtry 9387c5b3c03SBram Moolenaar 9397c5b3c03SBram Moolenaar if 1 9407c5b3c03SBram Moolenaar else 9417c5b3c03SBram Moolenaar try 9427c5b3c03SBram Moolenaar endtry 9437c5b3c03SBram Moolenaar endif 9447c5b3c03SBram Moolenaarenddef 9457c5b3c03SBram Moolenaar 9467c5b3c03SBram Moolenaar" The skipped try/endtry was updating the wrong instruction. 9477c5b3c03SBram Moolenaardef Test_try_catch_skipped() 9487c5b3c03SBram Moolenaar var instr = execute('disassemble Try_catch_skipped') 9497c5b3c03SBram Moolenaar assert_match("NEWLIST size 0\n", instr) 9507c5b3c03SBram Moolenaarenddef 9517c5b3c03SBram Moolenaar 9527c5b3c03SBram Moolenaar 9537c5b3c03SBram Moolenaar 954006ad48bSBram Moolenaardef Test_throw_vimscript() 955f5be8cdbSBram Moolenaar # only checks line continuation 956cfcd011fSBram Moolenaar var lines =<< trim END 957006ad48bSBram Moolenaar vim9script 958006ad48bSBram Moolenaar try 959006ad48bSBram Moolenaar throw 'one' 960006ad48bSBram Moolenaar .. 'two' 961006ad48bSBram Moolenaar catch 962006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 963006ad48bSBram Moolenaar endtry 964006ad48bSBram Moolenaar END 965006ad48bSBram Moolenaar CheckScriptSuccess(lines) 9661e021e63SBram Moolenaar 9671e021e63SBram Moolenaar lines =<< trim END 9681e021e63SBram Moolenaar vim9script 969352134bbSBram Moolenaar @r = '' 9701e021e63SBram Moolenaar def Func() 9711e021e63SBram Moolenaar throw @r 9721e021e63SBram Moolenaar enddef 9731e021e63SBram Moolenaar var result = '' 9741e021e63SBram Moolenaar try 9751e021e63SBram Moolenaar Func() 9761e021e63SBram Moolenaar catch /E1129:/ 9771e021e63SBram Moolenaar result = 'caught' 9781e021e63SBram Moolenaar endtry 9791e021e63SBram Moolenaar assert_equal('caught', result) 9801e021e63SBram Moolenaar END 9811e021e63SBram Moolenaar CheckScriptSuccess(lines) 982006ad48bSBram Moolenaarenddef 983006ad48bSBram Moolenaar 984ed677f55SBram Moolenaardef Test_error_in_nested_function() 98503dfde2bSBram Moolenaar # an error in a nested :function aborts executing in the calling :def function 986cfcd011fSBram Moolenaar var lines =<< trim END 987ed677f55SBram Moolenaar vim9script 988ed677f55SBram Moolenaar def Func() 989ed677f55SBram Moolenaar Error() 990ed677f55SBram Moolenaar g:test_var = 1 991ed677f55SBram Moolenaar enddef 992ed677f55SBram Moolenaar func Error() abort 993ed677f55SBram Moolenaar eval [][0] 994ed677f55SBram Moolenaar endfunc 995ed677f55SBram Moolenaar Func() 996ed677f55SBram Moolenaar END 997ed677f55SBram Moolenaar g:test_var = 0 998ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 999ed677f55SBram Moolenaar assert_equal(0, g:test_var) 1000ed677f55SBram Moolenaarenddef 1001ed677f55SBram Moolenaar 1002227c58a4SBram Moolenaardef Test_abort_after_error() 1003227c58a4SBram Moolenaar var lines =<< trim END 1004227c58a4SBram Moolenaar vim9script 1005227c58a4SBram Moolenaar while true 1006227c58a4SBram Moolenaar echo notfound 1007227c58a4SBram Moolenaar endwhile 1008227c58a4SBram Moolenaar g:gotthere = true 1009227c58a4SBram Moolenaar END 1010227c58a4SBram Moolenaar g:gotthere = false 1011227c58a4SBram Moolenaar CheckScriptFailure(lines, 'E121:') 1012227c58a4SBram Moolenaar assert_false(g:gotthere) 1013227c58a4SBram Moolenaar unlet g:gotthere 1014227c58a4SBram Moolenaarenddef 1015227c58a4SBram Moolenaar 101637c83711SBram Moolenaardef Test_cexpr_vimscript() 1017f5be8cdbSBram Moolenaar # only checks line continuation 101837c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 1019cfcd011fSBram Moolenaar var lines =<< trim END 102037c83711SBram Moolenaar vim9script 102137c83711SBram Moolenaar cexpr 'File' 102237c83711SBram Moolenaar .. ' someFile' .. 102337c83711SBram Moolenaar ' line 19' 102437c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 102537c83711SBram Moolenaar END 102637c83711SBram Moolenaar CheckScriptSuccess(lines) 102737c83711SBram Moolenaar set errorformat& 102837c83711SBram Moolenaarenddef 102937c83711SBram Moolenaar 1030c9edd6b5SBram Moolenaardef Test_statusline_syntax() 1031c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 1032cfcd011fSBram Moolenaar var lines =<< trim END 1033c9edd6b5SBram Moolenaar vim9script 1034c9edd6b5SBram Moolenaar func g:Status() 1035c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 1036c9edd6b5SBram Moolenaar endfunc 1037c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 1038c9edd6b5SBram Moolenaar redrawstatus 1039c9edd6b5SBram Moolenaar set laststatus statusline= 1040c9edd6b5SBram Moolenaar END 1041c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 1042c9edd6b5SBram Moolenaarenddef 1043c9edd6b5SBram Moolenaar 1044b209750bSBram Moolenaardef Test_list_vimscript() 1045b209750bSBram Moolenaar # checks line continuation and comments 1046cfcd011fSBram Moolenaar var lines =<< trim END 1047b209750bSBram Moolenaar vim9script 1048cfcd011fSBram Moolenaar var mylist = [ 1049b209750bSBram Moolenaar 'one', 1050b209750bSBram Moolenaar # comment 1051b209750bSBram Moolenaar 'two', # empty line follows 1052b209750bSBram Moolenaar 1053b209750bSBram Moolenaar 'three', 1054b209750bSBram Moolenaar ] 1055b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 1056b209750bSBram Moolenaar END 1057b209750bSBram Moolenaar CheckScriptSuccess(lines) 105866250c93SBram Moolenaar 105966250c93SBram Moolenaar # check all lines from heredoc are kept 106066250c93SBram Moolenaar lines =<< trim END 106166250c93SBram Moolenaar # comment 1 106266250c93SBram Moolenaar two 106366250c93SBram Moolenaar # comment 3 106466250c93SBram Moolenaar 106566250c93SBram Moolenaar five 106666250c93SBram Moolenaar # comment 6 106766250c93SBram Moolenaar END 106866250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 10694bce26bbSBram Moolenaar 10704bce26bbSBram Moolenaar lines =<< trim END 10714bce26bbSBram Moolenaar [{ 10724bce26bbSBram Moolenaar a: 0}]->string()->assert_equal("[{'a': 0}]") 10734bce26bbSBram Moolenaar END 10744bce26bbSBram Moolenaar CheckDefAndScriptSuccess(lines) 1075b209750bSBram Moolenaarenddef 1076b209750bSBram Moolenaar 10772a1381c3SBram Moolenaarif has('channel') 107840ee466cSBram Moolenaar let someJob = test_null_job() 107940ee466cSBram Moolenaar 108040ee466cSBram Moolenaar def FuncWithError() 108140ee466cSBram Moolenaar echomsg g:someJob 108240ee466cSBram Moolenaar enddef 108340ee466cSBram Moolenaar 108440ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 108540ee466cSBram Moolenaar try 108640ee466cSBram Moolenaar call FuncWithError() 108740ee466cSBram Moolenaar catch 108840ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 108940ee466cSBram Moolenaar endtry 109040ee466cSBram Moolenaar endfunc 10912a1381c3SBram Moolenaarendif 109240ee466cSBram Moolenaar 10938a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 10948a7d6542SBram Moolenaar vim9script 1095cfcd011fSBram Moolenaar var name: string = 'bob' 10968a7d6542SBram Moolenaar def Concat(arg: string): string 10978a7d6542SBram Moolenaar return name .. arg 10988a7d6542SBram Moolenaar enddef 1099227a69deSBram Moolenaar g:result = Concat('bie') 1100227a69deSBram Moolenaar g:localname = name 11018a7d6542SBram Moolenaar 11028a7d6542SBram Moolenaar export const CONST = 1234 1103cfcd011fSBram Moolenaar export var exported = 9876 1104cfcd011fSBram Moolenaar export var exp_name = 'John' 11058a7d6542SBram Moolenaar export def Exported(): string 11068a7d6542SBram Moolenaar return 'Exported' 11078a7d6542SBram Moolenaar enddef 110824e93165SBram Moolenaar export def ExportedValue(): number 110924e93165SBram Moolenaar return exported 111024e93165SBram Moolenaar enddef 111124e93165SBram Moolenaar export def ExportedInc() 111224e93165SBram Moolenaar exported += 5 111324e93165SBram Moolenaar enddef 11140f2a5cc6SBram Moolenaar export final theList = [1] 11158a7d6542SBram MoolenaarEND 11168a7d6542SBram Moolenaar 1117b3ca9824SBram Moolenaardef Undo_export_script_lines() 1118b3ca9824SBram Moolenaar unlet g:result 1119b3ca9824SBram Moolenaar unlet g:localname 1120b3ca9824SBram Moolenaarenddef 1121b3ca9824SBram Moolenaar 11225269bd2aSBram Moolenaardef Test_vim9_import_export() 1123cfcd011fSBram Moolenaar var import_script_lines =<< trim END 11248a7d6542SBram Moolenaar vim9script 112524e93165SBram Moolenaar import {exported, Exported, ExportedValue} from './Xexport.vim' 112624e93165SBram Moolenaar g:exported1 = exported 11276e587dcbSBram Moolenaar exported += 3 112824e93165SBram Moolenaar g:exported2 = exported 112924e93165SBram Moolenaar g:exported3 = ExportedValue() 113024e93165SBram Moolenaar 113124e93165SBram Moolenaar import ExportedInc from './Xexport.vim' 113224e93165SBram Moolenaar ExportedInc() 113324e93165SBram Moolenaar g:exported_i1 = exported 113424e93165SBram Moolenaar g:exported_i2 = ExportedValue() 113524e93165SBram Moolenaar 113624e93165SBram Moolenaar exported = 11 113724e93165SBram Moolenaar g:exported_s1 = exported 113824e93165SBram Moolenaar g:exported_s2 = ExportedValue() 113924e93165SBram Moolenaar 11408a7d6542SBram Moolenaar g:imported_func = Exported() 11416e587dcbSBram Moolenaar 114240f4f7a4SBram Moolenaar def GetExported(): string 1143e0de171eSBram Moolenaar var local_dict = {ref: Exported} 114440f4f7a4SBram Moolenaar return local_dict.ref() 114540f4f7a4SBram Moolenaar enddef 114640f4f7a4SBram Moolenaar g:funcref_result = GetExported() 114740f4f7a4SBram Moolenaar 11484db572eeSBram Moolenaar var dir = './' 11494db572eeSBram Moolenaar var ext = ".vim" 11504db572eeSBram Moolenaar import {exp_name} from dir .. 'Xexport' .. ext 11516e587dcbSBram Moolenaar g:imported_name = exp_name 11526e587dcbSBram Moolenaar exp_name ..= ' Doe' 11536e587dcbSBram Moolenaar g:imported_name_appended = exp_name 115424e93165SBram Moolenaar g:exported_later = exported 11550f2a5cc6SBram Moolenaar 11560f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 11570f2a5cc6SBram Moolenaar theList->add(2) 11580f2a5cc6SBram Moolenaar assert_equal([1, 2], theList) 11598a7d6542SBram Moolenaar END 11608a7d6542SBram Moolenaar 11618a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 11628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 11638a7d6542SBram Moolenaar 11648a7d6542SBram Moolenaar source Ximport.vim 11658a7d6542SBram Moolenaar 11668a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 11678a7d6542SBram Moolenaar assert_equal('bob', g:localname) 116824e93165SBram Moolenaar assert_equal(9876, g:exported1) 116924e93165SBram Moolenaar assert_equal(9879, g:exported2) 117024e93165SBram Moolenaar assert_equal(9879, g:exported3) 117124e93165SBram Moolenaar 117224e93165SBram Moolenaar assert_equal(9884, g:exported_i1) 117324e93165SBram Moolenaar assert_equal(9884, g:exported_i2) 117424e93165SBram Moolenaar 117524e93165SBram Moolenaar assert_equal(11, g:exported_s1) 117624e93165SBram Moolenaar assert_equal(11, g:exported_s2) 117724e93165SBram Moolenaar assert_equal(11, g:exported_later) 117824e93165SBram Moolenaar 11798a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 118040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 11816e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 11826e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 11838a7d6542SBram Moolenaar assert_false(exists('g:name')) 11848a7d6542SBram Moolenaar 1185b3ca9824SBram Moolenaar Undo_export_script_lines() 118624e93165SBram Moolenaar unlet g:exported1 118724e93165SBram Moolenaar unlet g:exported2 118824e93165SBram Moolenaar unlet g:exported3 118924e93165SBram Moolenaar unlet g:exported_i1 119024e93165SBram Moolenaar unlet g:exported_i2 119124e93165SBram Moolenaar unlet g:exported_later 11928a7d6542SBram Moolenaar unlet g:imported_func 11936e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 11948a7d6542SBram Moolenaar delete('Ximport.vim') 1195f2d5c240SBram Moolenaar 11961c991144SBram Moolenaar # similar, with line breaks 1197cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 11981c991144SBram Moolenaar vim9script 11991c991144SBram Moolenaar import { 12001c991144SBram Moolenaar exported, 12011c991144SBram Moolenaar Exported, 12021c991144SBram Moolenaar } 12031c991144SBram Moolenaar from 12041c991144SBram Moolenaar './Xexport.vim' 120524e93165SBram Moolenaar g:exported = exported 120624e93165SBram Moolenaar exported += 7 120724e93165SBram Moolenaar g:exported_added = exported 12081c991144SBram Moolenaar g:imported_func = Exported() 12091c991144SBram Moolenaar END 12101c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 12111c991144SBram Moolenaar source Ximport_lbr.vim 12121c991144SBram Moolenaar 121324e93165SBram Moolenaar assert_equal(11, g:exported) 121424e93165SBram Moolenaar assert_equal(18, g:exported_added) 12151c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 12161c991144SBram Moolenaar 12171c991144SBram Moolenaar # exported script not sourced again 12181c991144SBram Moolenaar assert_false(exists('g:result')) 121924e93165SBram Moolenaar unlet g:exported 122024e93165SBram Moolenaar unlet g:exported_added 12211c991144SBram Moolenaar unlet g:imported_func 12221c991144SBram Moolenaar delete('Ximport_lbr.vim') 12231c991144SBram Moolenaar 1224cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 1225f2d5c240SBram Moolenaar vim9script 1226f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 1227f2d5c240SBram Moolenaar def UseExport() 122824e93165SBram Moolenaar g:exported_def = Export.exported 1229f2d5c240SBram Moolenaar enddef 123024e93165SBram Moolenaar g:exported_script = Export.exported 1231cb4e80faSBram Moolenaar assert_equal(1, exists('Export.exported')) 1232cb4e80faSBram Moolenaar assert_equal(0, exists('Export.notexported')) 1233f2d5c240SBram Moolenaar UseExport() 1234f2d5c240SBram Moolenaar END 1235f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 1236f2d5c240SBram Moolenaar source Ximport.vim 123724e93165SBram Moolenaar 123824e93165SBram Moolenaar assert_equal(18, g:exported_def) 123924e93165SBram Moolenaar assert_equal(18, g:exported_script) 124024e93165SBram Moolenaar unlet g:exported_def 124124e93165SBram Moolenaar unlet g:exported_script 1242f2d5c240SBram Moolenaar 1243cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 1244599c89c8SBram Moolenaar vim9script 1245599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1246599c89c8SBram Moolenaar def Func() 1247cfcd011fSBram Moolenaar var dummy = 1 1248cfcd011fSBram Moolenaar var imported = Export + dummy 1249599c89c8SBram Moolenaar enddef 1250822ba247SBram Moolenaar defcompile 1251599c89c8SBram Moolenaar END 1252599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 125344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 1254599c89c8SBram Moolenaar 1255cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 1256599c89c8SBram Moolenaar vim9script 1257599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1258599c89c8SBram Moolenaar def Func() 1259cfcd011fSBram Moolenaar var imported = Export . exported 1260599c89c8SBram Moolenaar enddef 1261822ba247SBram Moolenaar defcompile 1262599c89c8SBram Moolenaar END 1263599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 126444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 1265599c89c8SBram Moolenaar 1266921ba529SBram Moolenaar var import_func_duplicated =<< trim END 1267921ba529SBram Moolenaar vim9script 1268921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1269921ba529SBram Moolenaar import ExportedInc from './Xexport.vim' 1270921ba529SBram Moolenaar 1271921ba529SBram Moolenaar ExportedInc() 1272921ba529SBram Moolenaar END 1273921ba529SBram Moolenaar writefile(import_func_duplicated, 'Ximport.vim') 1274921ba529SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 1275921ba529SBram Moolenaar 1276a6294955SBram Moolenaar var import_star_as_duplicated =<< trim END 1277a6294955SBram Moolenaar vim9script 1278a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1279a6294955SBram Moolenaar var some = 'other' 1280a6294955SBram Moolenaar import * as Export from './Xexport.vim' 1281a6294955SBram Moolenaar defcompile 1282a6294955SBram Moolenaar END 1283a6294955SBram Moolenaar writefile(import_star_as_duplicated, 'Ximport.vim') 1284a6294955SBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 4, 'Ximport.vim') 1285a6294955SBram Moolenaar 1286cb4e80faSBram Moolenaar var import_star_as_lines_script_no_dot =<< trim END 1287cb4e80faSBram Moolenaar vim9script 1288cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1289cb4e80faSBram Moolenaar g:imported_script = Export exported 1290cb4e80faSBram Moolenaar END 1291cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_no_dot, 'Ximport.vim') 1292cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1029:') 1293cb4e80faSBram Moolenaar 1294cb4e80faSBram Moolenaar var import_star_as_lines_script_space_after_dot =<< trim END 1295cb4e80faSBram Moolenaar vim9script 1296cb4e80faSBram Moolenaar import * as Export from './Xexport.vim' 1297cb4e80faSBram Moolenaar g:imported_script = Export. exported 1298cb4e80faSBram Moolenaar END 1299cb4e80faSBram Moolenaar writefile(import_star_as_lines_script_space_after_dot, 'Ximport.vim') 1300cb4e80faSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:') 1301cb4e80faSBram Moolenaar 1302cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 1303599c89c8SBram Moolenaar vim9script 1304599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 1305599c89c8SBram Moolenaar def Func() 1306cfcd011fSBram Moolenaar var imported = Export. 1307599c89c8SBram Moolenaar enddef 1308822ba247SBram Moolenaar defcompile 1309599c89c8SBram Moolenaar END 1310599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 131144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 1312599c89c8SBram Moolenaar 1313cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 13141c991144SBram Moolenaar vim9script 13151c991144SBram Moolenaar import * 13161c991144SBram Moolenaar as Export 13171c991144SBram Moolenaar from 13181c991144SBram Moolenaar './Xexport.vim' 13191c991144SBram Moolenaar def UseExport() 132024e93165SBram Moolenaar g:exported = Export.exported 13211c991144SBram Moolenaar enddef 13221c991144SBram Moolenaar UseExport() 13231c991144SBram Moolenaar END 13241c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 13251c991144SBram Moolenaar source Ximport.vim 132624e93165SBram Moolenaar assert_equal(18, g:exported) 132724e93165SBram Moolenaar unlet g:exported 13281c991144SBram Moolenaar 1329cfcd011fSBram Moolenaar var import_star_lines =<< trim END 1330f2d5c240SBram Moolenaar vim9script 1331f2d5c240SBram Moolenaar import * from './Xexport.vim' 1332f2d5c240SBram Moolenaar END 1333f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 133444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 1335f2d5c240SBram Moolenaar 1336f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 1337cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 1338fa29c8abSBram Moolenaar vim9script 1339fa29c8abSBram Moolenaar import name from './Xexport.vim' 1340fa29c8abSBram Moolenaar END 1341fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 134244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 1343fa29c8abSBram Moolenaar 1344f5be8cdbSBram Moolenaar # try to import something that is already defined 1345cfcd011fSBram Moolenaar var import_already_defined =<< trim END 13465269bd2aSBram Moolenaar vim9script 1347cfcd011fSBram Moolenaar var exported = 'something' 13485269bd2aSBram Moolenaar import exported from './Xexport.vim' 13495269bd2aSBram Moolenaar END 13505269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1351057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13525269bd2aSBram Moolenaar 1353f5be8cdbSBram Moolenaar # try to import something that is already defined 13545269bd2aSBram Moolenaar import_already_defined =<< trim END 13555269bd2aSBram Moolenaar vim9script 1356cfcd011fSBram Moolenaar var exported = 'something' 13575269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 13585269bd2aSBram Moolenaar END 13595269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1360057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13615269bd2aSBram Moolenaar 1362f5be8cdbSBram Moolenaar # try to import something that is already defined 13635269bd2aSBram Moolenaar import_already_defined =<< trim END 13645269bd2aSBram Moolenaar vim9script 1365cfcd011fSBram Moolenaar var exported = 'something' 13665269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 13675269bd2aSBram Moolenaar END 13685269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 1369057e84afSBram Moolenaar assert_fails('source Ximport.vim', 'E1054:', '', 3, 'Ximport.vim') 13705269bd2aSBram Moolenaar 1371918a4249SBram Moolenaar # try changing an imported const 1372918a4249SBram Moolenaar var import_assign_to_const =<< trim END 1373918a4249SBram Moolenaar vim9script 1374918a4249SBram Moolenaar import CONST from './Xexport.vim' 1375918a4249SBram Moolenaar def Assign() 1376918a4249SBram Moolenaar CONST = 987 1377918a4249SBram Moolenaar enddef 1378918a4249SBram Moolenaar defcompile 1379918a4249SBram Moolenaar END 1380918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 1381918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 1382918a4249SBram Moolenaar 13830f2a5cc6SBram Moolenaar # try changing an imported final 13840f2a5cc6SBram Moolenaar var import_assign_to_final =<< trim END 13850f2a5cc6SBram Moolenaar vim9script 13860f2a5cc6SBram Moolenaar import theList from './Xexport.vim' 13870f2a5cc6SBram Moolenaar def Assign() 13880f2a5cc6SBram Moolenaar theList = [2] 13890f2a5cc6SBram Moolenaar enddef 13900f2a5cc6SBram Moolenaar defcompile 13910f2a5cc6SBram Moolenaar END 13920f2a5cc6SBram Moolenaar writefile(import_assign_to_final, 'Ximport.vim') 13930f2a5cc6SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 13940f2a5cc6SBram Moolenaar 1395f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 1396cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 1397fa29c8abSBram Moolenaar vim9script 1398fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 1399fa29c8abSBram Moolenaar END 1400fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 140144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 1402fa29c8abSBram Moolenaar 1403cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 1404fa29c8abSBram Moolenaar vim9script 1405fa29c8abSBram Moolenaar import name './Xexport.vim' 1406fa29c8abSBram Moolenaar END 1407fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 140844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 1409fa29c8abSBram Moolenaar 1410cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 1411fa29c8abSBram Moolenaar vim9script 1412fa29c8abSBram Moolenaar import name from Xexport.vim 1413fa29c8abSBram Moolenaar END 1414fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 14154db572eeSBram Moolenaar assert_fails('source Ximport.vim', 'E121:', '', 2, 'Ximport.vim') 1416fa29c8abSBram Moolenaar 1417cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1418fa29c8abSBram Moolenaar vim9script 1419fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1420fa29c8abSBram Moolenaar END 1421fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 142244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1423fa29c8abSBram Moolenaar 1424cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1425fa29c8abSBram Moolenaar vim9script 1426fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1427fa29c8abSBram Moolenaar END 14285269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 142944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1430fa29c8abSBram Moolenaar 143160579350SBram Moolenaar var import_redefining_lines =<< trim END 143260579350SBram Moolenaar vim9script 143360579350SBram Moolenaar import exported from './Xexport.vim' 143460579350SBram Moolenaar var exported = 5 143560579350SBram Moolenaar END 143660579350SBram Moolenaar writefile(import_redefining_lines, 'Ximport.vim') 143760579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1213: Redefining imported item "exported"', '', 3) 143860579350SBram Moolenaar 143960579350SBram Moolenaar var import_assign_wrong_type_lines =<< trim END 144060579350SBram Moolenaar vim9script 144160579350SBram Moolenaar import exported from './Xexport.vim' 144260579350SBram Moolenaar exported = 'xxx' 144360579350SBram Moolenaar END 144460579350SBram Moolenaar writefile(import_assign_wrong_type_lines, 'Ximport.vim') 144560579350SBram Moolenaar assert_fails('source Ximport.vim', 'E1012: Type mismatch; expected number but got string', '', 3) 144660579350SBram Moolenaar 144760579350SBram Moolenaar var import_assign_const_lines =<< trim END 144860579350SBram Moolenaar vim9script 144960579350SBram Moolenaar import CONST from './Xexport.vim' 145060579350SBram Moolenaar CONST = 4321 145160579350SBram Moolenaar END 145260579350SBram Moolenaar writefile(import_assign_const_lines, 'Ximport.vim') 145360579350SBram Moolenaar assert_fails('source Ximport.vim', 'E741: Value is locked: CONST', '', 3) 145460579350SBram Moolenaar 1455f2d5c240SBram Moolenaar delete('Ximport.vim') 14565269bd2aSBram Moolenaar delete('Ximport3.vim') 14578a7d6542SBram Moolenaar delete('Xexport.vim') 14588a7d6542SBram Moolenaar 1459f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 14603e191694SBram Moolenaar # Flags added or removed are also applied to the restored value. 14613e191694SBram Moolenaar set cpo=abcd 1462cfcd011fSBram Moolenaar var lines =<< trim END 1463750802b5SBram Moolenaar vim9script 1464750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 14653e191694SBram Moolenaar set cpo+=f 14663e191694SBram Moolenaar set cpo-=c 14673e191694SBram Moolenaar g:cpo_after_vim9script = &cpo 1468750802b5SBram Moolenaar END 1469750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1470750802b5SBram Moolenaar source Xvim9_script 14713e191694SBram Moolenaar assert_equal('fabd', &cpo) 1472750802b5SBram Moolenaar set cpo&vim 1473750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 14743e191694SBram Moolenaar var newcpo = substitute(&cpo, 'c', '', '') .. 'f' 14753e191694SBram Moolenaar assert_equal(newcpo, g:cpo_after_vim9script) 14763e191694SBram Moolenaar 1477750802b5SBram Moolenaar delete('Xvim9_script') 1478750802b5SBram Moolenaarenddef 1479750802b5SBram Moolenaar 14800a84284eSBram Moolenaardef Test_import_as() 14810a84284eSBram Moolenaar var export_lines =<< trim END 14820a84284eSBram Moolenaar vim9script 14830a84284eSBram Moolenaar export var one = 1 14840a84284eSBram Moolenaar export var yes = 'yes' 1485c967d57aSBram Moolenaar export var slist: list<string> 14860a84284eSBram Moolenaar END 14870a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 14880a84284eSBram Moolenaar 14890a84284eSBram Moolenaar var import_lines =<< trim END 14900a84284eSBram Moolenaar vim9script 14916c7cc347SBram Moolenaar var one = 'notused' 14926c7cc347SBram Moolenaar var yes = 777 14930a84284eSBram Moolenaar import one as thatOne from './XexportAs' 14940a84284eSBram Moolenaar assert_equal(1, thatOne) 14950a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 14960a84284eSBram Moolenaar assert_equal('yes', yesYes) 14970a84284eSBram Moolenaar END 14980a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 14990a84284eSBram Moolenaar 15000a84284eSBram Moolenaar import_lines =<< trim END 15010a84284eSBram Moolenaar vim9script 15020a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 15030a84284eSBram Moolenaar assert_equal(1, thatOne) 15040a84284eSBram Moolenaar assert_equal('yes', yesYes) 15050a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 15060a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 15070a84284eSBram Moolenaar END 15080a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15090a84284eSBram Moolenaar 1510c967d57aSBram Moolenaar import_lines =<< trim END 1511c967d57aSBram Moolenaar vim9script 1512c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1513c967d57aSBram Moolenaar impSlist->add(123) 1514c967d57aSBram Moolenaar END 1515c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1516c967d57aSBram Moolenaar 15170a84284eSBram Moolenaar delete('XexportAs') 15180a84284eSBram Moolenaarenddef 15190a84284eSBram Moolenaar 1520803af686SBram Moolenaarfunc g:Trigger() 1521803af686SBram Moolenaar source Ximport.vim 1522803af686SBram Moolenaar return "echo 'yes'\<CR>" 1523803af686SBram Moolenaarendfunc 1524803af686SBram Moolenaar 1525803af686SBram Moolenaardef Test_import_export_expr_map() 1526803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1527cfcd011fSBram Moolenaar var export_lines =<< trim END 1528803af686SBram Moolenaar vim9script 1529803af686SBram Moolenaar export def That(): string 1530803af686SBram Moolenaar return 'yes' 1531803af686SBram Moolenaar enddef 1532803af686SBram Moolenaar END 1533803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1534803af686SBram Moolenaar 1535cfcd011fSBram Moolenaar var import_lines =<< trim END 1536803af686SBram Moolenaar vim9script 1537803af686SBram Moolenaar import That from './Xexport_that.vim' 1538803af686SBram Moolenaar assert_equal('yes', That()) 1539803af686SBram Moolenaar END 1540803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1541803af686SBram Moolenaar 1542803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1543803af686SBram Moolenaar feedkeys('trigger', "xt") 1544803af686SBram Moolenaar 1545730b2483SBram Moolenaar delete('Xexport_that.vim') 1546803af686SBram Moolenaar delete('Ximport.vim') 1547803af686SBram Moolenaar nunmap trigger 1548803af686SBram Moolenaarenddef 1549803af686SBram Moolenaar 15508e1986e3SBram Moolenaardef Test_import_in_filetype() 15518e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15528e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1553cfcd011fSBram Moolenaar var export_lines =<< trim END 15548e1986e3SBram Moolenaar vim9script 1555cfcd011fSBram Moolenaar export var That = 'yes' 15568e1986e3SBram Moolenaar END 1557730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15588e1986e3SBram Moolenaar 1559cfcd011fSBram Moolenaar var import_lines =<< trim END 15608e1986e3SBram Moolenaar vim9script 1561730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15628e1986e3SBram Moolenaar assert_equal('yes', That) 15638e1986e3SBram Moolenaar g:did_load_mytpe = 1 15648e1986e3SBram Moolenaar END 15658e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15668e1986e3SBram Moolenaar 1567cfcd011fSBram Moolenaar var save_rtp = &rtp 15688e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15698e1986e3SBram Moolenaar 15708e1986e3SBram Moolenaar filetype plugin on 15718e1986e3SBram Moolenaar copen 15728e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15738e1986e3SBram Moolenaar 15748e1986e3SBram Moolenaar quit! 1575730b2483SBram Moolenaar delete('Xexport_ft.vim') 15768e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15778e1986e3SBram Moolenaar &rtp = save_rtp 15788e1986e3SBram Moolenaarenddef 15798e1986e3SBram Moolenaar 1580efa94447SBram Moolenaardef Test_use_import_in_mapping() 1581cfcd011fSBram Moolenaar var lines =<< trim END 1582efa94447SBram Moolenaar vim9script 1583efa94447SBram Moolenaar export def Funcx() 1584efa94447SBram Moolenaar g:result = 42 1585efa94447SBram Moolenaar enddef 1586efa94447SBram Moolenaar END 1587efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1588efa94447SBram Moolenaar lines =<< trim END 1589efa94447SBram Moolenaar vim9script 1590efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1591b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1592efa94447SBram Moolenaar END 1593efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1594efa94447SBram Moolenaar 1595efa94447SBram Moolenaar source Xmapscript.vim 1596b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1597efa94447SBram Moolenaar assert_equal(42, g:result) 1598efa94447SBram Moolenaar 1599efa94447SBram Moolenaar unlet g:result 1600efa94447SBram Moolenaar delete('XsomeExport.vim') 1601efa94447SBram Moolenaar delete('Xmapscript.vim') 1602b3ca9824SBram Moolenaar nunmap <F3> 1603efa94447SBram Moolenaarenddef 1604efa94447SBram Moolenaar 1605d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1606d3f8a9eeSBram Moolenaar var lines =<< trim END 1607d3f8a9eeSBram Moolenaar if has(g:feature) 1608d3f8a9eeSBram Moolenaar " legacy script 1609d3f8a9eeSBram Moolenaar let g:legacy = 1 1610d3f8a9eeSBram Moolenaar finish 1611d3f8a9eeSBram Moolenaar endif 1612d3f8a9eeSBram Moolenaar vim9script 1613d3f8a9eeSBram Moolenaar g:legacy = 0 1614d3f8a9eeSBram Moolenaar END 1615d3f8a9eeSBram Moolenaar g:feature = 'eval' 1616d3f8a9eeSBram Moolenaar g:legacy = -1 1617d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1618d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1619d3f8a9eeSBram Moolenaar 1620d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1621d3f8a9eeSBram Moolenaar g:legacy = -1 1622d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1623d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1624d3f8a9eeSBram Moolenaarenddef 1625d3f8a9eeSBram Moolenaar 1626750802b5SBram Moolenaardef Test_vim9script_fails() 16278a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16288a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1629cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16309721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1631cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1632750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1633750802b5SBram Moolenaar 1634cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1635c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1636c785b9a7SBram Moolenaar 1637e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1638e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16398a7d6542SBram Moolenaarenddef 16408a7d6542SBram Moolenaar 1641f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1642101f4810SBram Moolenaar CheckRunVimInTerminal 1643101f4810SBram Moolenaar 16449bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1645c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16469bb3eb3eSBram Moolenaarendfunc 16479bb3eb3eSBram Moolenaar 1648c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1649cfcd011fSBram Moolenaar var export =<< trim END 1650101f4810SBram Moolenaar vim9script 1651101f4810SBram Moolenaar export def Foo(): number 1652101f4810SBram Moolenaar return 0 1653101f4810SBram Moolenaar enddef 1654101f4810SBram Moolenaar END 1655730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1656101f4810SBram Moolenaar 1657e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16589bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16592949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1660101f4810SBram Moolenaar 1661730b2483SBram Moolenaar delete('XexportCmd.vim') 16629bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16639bb3eb3eSBram Moolenaarenddef 1664101f4810SBram Moolenaar 16652b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16662b32700dSBram Moolenaar var lines =<< trim END 1667a6294955SBram Moolenaar vim9script 1668a6294955SBram Moolenaar export var exported = 'thexport' 166960dc8274SBram Moolenaar 167060dc8274SBram Moolenaar export def TheFunc(x = 0) 167160dc8274SBram Moolenaar enddef 1672a6294955SBram Moolenaar END 1673a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1674a6294955SBram Moolenaar lines =<< trim END 16752b32700dSBram Moolenaar vim9script noclear 16762b32700dSBram Moolenaar g:loadCount += 1 16772b32700dSBram Moolenaar var s:reloaded = 'init' 1678a6294955SBram Moolenaar import exported from './XExportReload' 16792b32700dSBram Moolenaar 16802b32700dSBram Moolenaar def Again(): string 16812b32700dSBram Moolenaar return 'again' 16822b32700dSBram Moolenaar enddef 16832b32700dSBram Moolenaar 168460dc8274SBram Moolenaar import TheFunc from './XExportReload' 168560dc8274SBram Moolenaar TheFunc() 168660dc8274SBram Moolenaar 16872b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 16882b32700dSBram Moolenaar var s:loaded = true 16892b32700dSBram Moolenaar 16902b32700dSBram Moolenaar var s:notReloaded = 'yes' 16912b32700dSBram Moolenaar s:reloaded = 'first' 16922b32700dSBram Moolenaar def g:Values(): list<string> 1693a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 16942b32700dSBram Moolenaar enddef 16952b32700dSBram Moolenaar 16962b32700dSBram Moolenaar def Once(): string 16972b32700dSBram Moolenaar return 'once' 16982b32700dSBram Moolenaar enddef 16992b32700dSBram Moolenaar END 17002b32700dSBram Moolenaar writefile(lines, 'XReloaded') 17012b32700dSBram Moolenaar g:loadCount = 0 17022b32700dSBram Moolenaar source XReloaded 17032b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1704a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 17052b32700dSBram Moolenaar source XReloaded 17062b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1707a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17082b32700dSBram Moolenaar source XReloaded 17092b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1710a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17112b32700dSBram Moolenaar 171248e11c10SBram Moolenaar delete('XReloaded') 1713a6294955SBram Moolenaar delete('XExportReload') 17142b32700dSBram Moolenaar delfunc g:Values 17152b32700dSBram Moolenaar unlet g:loadCount 1716577dc93dSBram Moolenaar 1717577dc93dSBram Moolenaar lines =<< trim END 1718577dc93dSBram Moolenaar vim9script 1719577dc93dSBram Moolenaar def Inner() 1720577dc93dSBram Moolenaar enddef 1721577dc93dSBram Moolenaar END 1722577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1723577dc93dSBram Moolenaar source XreloadScript.vim 1724577dc93dSBram Moolenaar 1725577dc93dSBram Moolenaar lines =<< trim END 1726577dc93dSBram Moolenaar vim9script 1727577dc93dSBram Moolenaar def Outer() 1728577dc93dSBram Moolenaar def Inner() 1729577dc93dSBram Moolenaar enddef 1730577dc93dSBram Moolenaar enddef 1731577dc93dSBram Moolenaar defcompile 1732577dc93dSBram Moolenaar END 1733577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1734577dc93dSBram Moolenaar source XreloadScript.vim 1735577dc93dSBram Moolenaar 1736577dc93dSBram Moolenaar delete('XreloadScript.vim') 17372b32700dSBram Moolenaarenddef 17382b32700dSBram Moolenaar 17394c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1740cfcd011fSBram Moolenaar var lines =<< trim END 17418a7d6542SBram Moolenaar vim9script 17428a7d6542SBram Moolenaar const var = '' 1743cfcd011fSBram Moolenaar var valone = 1234 17448a7d6542SBram Moolenaar def MyFunc(arg: string) 17458a7d6542SBram Moolenaar valone = 5678 17468a7d6542SBram Moolenaar enddef 17478a7d6542SBram Moolenaar END 1748cfcd011fSBram Moolenaar var morelines =<< trim END 1749cfcd011fSBram Moolenaar var valtwo = 222 17508a7d6542SBram Moolenaar export def GetValtwo(): number 17518a7d6542SBram Moolenaar return valtwo 17528a7d6542SBram Moolenaar enddef 17538a7d6542SBram Moolenaar END 175403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17558a7d6542SBram Moolenaar source Xreload.vim 17568a7d6542SBram Moolenaar source Xreload.vim 17578a7d6542SBram Moolenaar source Xreload.vim 17588a7d6542SBram Moolenaar 1759f5be8cdbSBram Moolenaar # cannot declare a var twice 17608a7d6542SBram Moolenaar lines =<< trim END 17618a7d6542SBram Moolenaar vim9script 1762cfcd011fSBram Moolenaar var valone = 1234 1763cfcd011fSBram Moolenaar var valone = 5678 17648a7d6542SBram Moolenaar END 17658a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 176644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17678a7d6542SBram Moolenaar 17688a7d6542SBram Moolenaar delete('Xreload.vim') 17698a7d6542SBram Moolenaar delete('Ximport.vim') 17708a7d6542SBram Moolenaarenddef 17718a7d6542SBram Moolenaar 177207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 177307a65d26SBram Moolenaar" compiled function using that variable must fail. 177407a65d26SBram Moolenaardef Test_script_reload_change_type() 177507a65d26SBram Moolenaar var lines =<< trim END 177607a65d26SBram Moolenaar vim9script noclear 177707a65d26SBram Moolenaar var str = 'string' 177807a65d26SBram Moolenaar def g:GetStr(): string 177907a65d26SBram Moolenaar return str .. 'xxx' 178007a65d26SBram Moolenaar enddef 178107a65d26SBram Moolenaar END 178207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 178307a65d26SBram Moolenaar source Xreload.vim 178407a65d26SBram Moolenaar echo g:GetStr() 178507a65d26SBram Moolenaar 178607a65d26SBram Moolenaar lines =<< trim END 178707a65d26SBram Moolenaar vim9script noclear 178807a65d26SBram Moolenaar var str = 1234 178907a65d26SBram Moolenaar END 179007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 179107a65d26SBram Moolenaar source Xreload.vim 179207a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 179307a65d26SBram Moolenaar 179407a65d26SBram Moolenaar delfunc g:GetStr 179507a65d26SBram Moolenaar delete('Xreload.vim') 179607a65d26SBram Moolenaarenddef 179707a65d26SBram Moolenaar 1798c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1799c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1800c970e422SBram Moolenaar 1801c970e422SBram Moolenaardef Test_script_reload_from_function() 1802c970e422SBram Moolenaar var lines =<< trim END 1803c970e422SBram Moolenaar vim9script 1804c970e422SBram Moolenaar 1805c970e422SBram Moolenaar if exists('g:loaded') 1806c970e422SBram Moolenaar finish 1807c970e422SBram Moolenaar endif 1808c970e422SBram Moolenaar g:loaded = 1 1809c970e422SBram Moolenaar delcommand CallFunc 1810c970e422SBram Moolenaar command CallFunc Func() 1811c970e422SBram Moolenaar def Func() 1812a4c81beaSBram Moolenaar so XreloadFunc.vim 1813c970e422SBram Moolenaar g:didTheFunc = 1 1814c970e422SBram Moolenaar enddef 1815c970e422SBram Moolenaar END 1816c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1817c970e422SBram Moolenaar source XreloadFunc.vim 1818c970e422SBram Moolenaar CallFunc 1819c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1820c970e422SBram Moolenaar 1821c970e422SBram Moolenaar delete('XreloadFunc.vim') 1822c970e422SBram Moolenaar delcommand CallFunc 1823c970e422SBram Moolenaar unlet g:loaded 1824c970e422SBram Moolenaar unlet g:didTheFunc 1825c970e422SBram Moolenaarenddef 1826c970e422SBram Moolenaar 18276c3843caSBram Moolenaardef Test_script_var_shadows_function() 18286c3843caSBram Moolenaar var lines =<< trim END 18296c3843caSBram Moolenaar vim9script 18306c3843caSBram Moolenaar def Func(): number 18316c3843caSBram Moolenaar return 123 18326c3843caSBram Moolenaar enddef 18336c3843caSBram Moolenaar var Func = 1 18346c3843caSBram Moolenaar END 18356c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18366c3843caSBram Moolenaarenddef 18376c3843caSBram Moolenaar 1838c323527dSBram Moolenaardef Test_script_var_shadows_command() 1839c323527dSBram Moolenaar var lines =<< trim END 1840c323527dSBram Moolenaar var undo = 1 1841c323527dSBram Moolenaar undo = 2 1842c323527dSBram Moolenaar assert_equal(2, undo) 1843c323527dSBram Moolenaar END 1844c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1845c323527dSBram Moolenaar 1846c323527dSBram Moolenaar lines =<< trim END 1847c323527dSBram Moolenaar var undo = 1 1848c323527dSBram Moolenaar undo 1849c323527dSBram Moolenaar END 1850c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1851c323527dSBram Moolenaarenddef 1852c323527dSBram Moolenaar 185395006e3dSBram Moolenaardef s:RetSome(): string 185495006e3dSBram Moolenaar return 'some' 185595006e3dSBram Moolenaarenddef 185695006e3dSBram Moolenaar 1857fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1858fe465a01SBram Moolenaar" script-local name. 1859fe465a01SBram Moolenaardef Test_vim9script_funcref() 1860cfcd011fSBram Moolenaar var sortlines =<< trim END 1861fe465a01SBram Moolenaar vim9script 1862fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1863bed36b93SBram Moolenaar return i2 - i1 1864fe465a01SBram Moolenaar enddef 1865fe465a01SBram Moolenaar 1866fe465a01SBram Moolenaar export def FastSort(): list<number> 1867fe465a01SBram Moolenaar return range(5)->sort(Compare) 1868fe465a01SBram Moolenaar enddef 1869529fb5a5SBram Moolenaar 1870529fb5a5SBram Moolenaar export def GetString(arg: string): string 1871529fb5a5SBram Moolenaar return arg 1872529fb5a5SBram Moolenaar enddef 1873fe465a01SBram Moolenaar END 1874fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1875fe465a01SBram Moolenaar 1876cfcd011fSBram Moolenaar var lines =<< trim END 1877fe465a01SBram Moolenaar vim9script 1878fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1879fe465a01SBram Moolenaar def Test() 1880fe465a01SBram Moolenaar g:result = FastSort() 1881fe465a01SBram Moolenaar enddef 1882fe465a01SBram Moolenaar Test() 1883529fb5a5SBram Moolenaar 1884529fb5a5SBram Moolenaar # using a function imported with "as" 1885529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1886529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1887529fb5a5SBram Moolenaar 1888529fb5a5SBram Moolenaar # using the function from a compiled function 1889529fb5a5SBram Moolenaar def TestMore(): string 1890ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1891ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1892529fb5a5SBram Moolenaar enddef 1893ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1894529fb5a5SBram Moolenaar 1895529fb5a5SBram Moolenaar # error when using a function that isn't exported 1896529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1897fe465a01SBram Moolenaar END 1898fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1899fe465a01SBram Moolenaar 1900fe465a01SBram Moolenaar source Xscript.vim 1901fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1902fe465a01SBram Moolenaar 1903fe465a01SBram Moolenaar unlet g:result 1904fe465a01SBram Moolenaar delete('Xsort.vim') 1905fe465a01SBram Moolenaar delete('Xscript.vim') 190695006e3dSBram Moolenaar 1907cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 190895006e3dSBram Moolenaar assert_equal('some', Funcref()) 1909fe465a01SBram Moolenaarenddef 1910fe465a01SBram Moolenaar 1911601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1912601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1913601e76acSBram Moolenaar" function reference. 1914c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1915cfcd011fSBram Moolenaar var filterLines =<< trim END 1916c620c055SBram Moolenaar vim9script 1917c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1918c620c055SBram Moolenaar return idx % 2 == 1 1919c620c055SBram Moolenaar enddef 1920c620c055SBram Moolenaar export def FastFilter(): list<number> 1921c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1922c620c055SBram Moolenaar enddef 1923601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1924601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1925601e76acSBram Moolenaar enddef 1926c620c055SBram Moolenaar END 1927c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1928c620c055SBram Moolenaar 1929cfcd011fSBram Moolenaar var lines =<< trim END 1930c620c055SBram Moolenaar vim9script 1931601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1932c620c055SBram Moolenaar def Test() 1933cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1934c620c055SBram Moolenaar enddef 1935c620c055SBram Moolenaar Test() 1936601e76acSBram Moolenaar def TestDirect() 1937cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1938601e76acSBram Moolenaar enddef 1939601e76acSBram Moolenaar TestDirect() 1940c620c055SBram Moolenaar END 1941601e76acSBram Moolenaar CheckScriptSuccess(lines) 1942c620c055SBram Moolenaar delete('Xfilter.vim') 1943c620c055SBram Moolenaarenddef 1944c620c055SBram Moolenaar 19454c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1946cfcd011fSBram Moolenaar var first_lines =<< trim END 19474c17ad94SBram Moolenaar vim9script 19484c17ad94SBram Moolenaar def FuncYes(): string 19494c17ad94SBram Moolenaar return 'yes' 19504c17ad94SBram Moolenaar enddef 19514c17ad94SBram Moolenaar END 1952cfcd011fSBram Moolenaar var withno_lines =<< trim END 19534c17ad94SBram Moolenaar def FuncNo(): string 19544c17ad94SBram Moolenaar return 'no' 19554c17ad94SBram Moolenaar enddef 19564c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19574c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19584c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 195903afdcf1SBram Moolenaar enddef 196003afdcf1SBram Moolenaar END 1961cfcd011fSBram Moolenaar var nono_lines =<< trim END 196203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 196303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 196444d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19654c17ad94SBram Moolenaar enddef 19664c17ad94SBram Moolenaar END 19674c17ad94SBram Moolenaar 19684c17ad94SBram Moolenaar # FuncNo() is defined 196903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19704c17ad94SBram Moolenaar source Xreloaded.vim 19714c17ad94SBram Moolenaar g:DoCheck(true) 19724c17ad94SBram Moolenaar 19734c17ad94SBram Moolenaar # FuncNo() is not redefined 197403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19754c17ad94SBram Moolenaar source Xreloaded.vim 19765082471fSBram Moolenaar g:DoCheck(false) 19774c17ad94SBram Moolenaar 19784c17ad94SBram Moolenaar # FuncNo() is back 197903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19804c17ad94SBram Moolenaar source Xreloaded.vim 19815082471fSBram Moolenaar g:DoCheck(false) 19824c17ad94SBram Moolenaar 19834c17ad94SBram Moolenaar delete('Xreloaded.vim') 19844c17ad94SBram Moolenaarenddef 19854c17ad94SBram Moolenaar 198689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 198789483d40SBram Moolenaar # write the script with a script-local variable 1988cfcd011fSBram Moolenaar var lines =<< trim END 198989483d40SBram Moolenaar vim9script 1990cfcd011fSBram Moolenaar var name = 'string' 199189483d40SBram Moolenaar END 199289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 199389483d40SBram Moolenaar source XreloadVar.vim 199489483d40SBram Moolenaar 199589483d40SBram Moolenaar # now write the script using the same variable locally - works 199689483d40SBram Moolenaar lines =<< trim END 199789483d40SBram Moolenaar vim9script 199889483d40SBram Moolenaar def Func() 1999cfcd011fSBram Moolenaar var name = 'string' 200089483d40SBram Moolenaar enddef 200189483d40SBram Moolenaar END 200289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 200389483d40SBram Moolenaar source XreloadVar.vim 200489483d40SBram Moolenaar 200589483d40SBram Moolenaar delete('XreloadVar.vim') 200689483d40SBram Moolenaarenddef 200789483d40SBram Moolenaar 20088a7d6542SBram Moolenaardef Test_import_absolute() 2009cfcd011fSBram Moolenaar var import_lines = [ 2010e6085c53SBram Moolenaar 'vim9script', 2011e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 2012e6085c53SBram Moolenaar 'def UseExported()', 2013e6085c53SBram Moolenaar ' g:imported_abs = exported', 2014e6085c53SBram Moolenaar ' exported = 8888', 2015e6085c53SBram Moolenaar ' g:imported_after = exported', 2016e6085c53SBram Moolenaar 'enddef', 2017e6085c53SBram Moolenaar 'UseExported()', 2018e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2019e6085c53SBram Moolenaar ] 20208a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20218a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20228a7d6542SBram Moolenaar 20238a7d6542SBram Moolenaar source Ximport_abs.vim 20248a7d6542SBram Moolenaar 20258a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20264e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2027fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2028fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2029fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2030fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2031fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2032fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2033fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2034fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2035fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2036fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2037e6085c53SBram Moolenaar g:import_disassembled) 2038b3ca9824SBram Moolenaar 2039b3ca9824SBram Moolenaar Undo_export_script_lines() 20408a7d6542SBram Moolenaar unlet g:imported_abs 20414e12a5dfSBram Moolenaar unlet g:import_disassembled 20428a7d6542SBram Moolenaar 20438a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20448a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20458a7d6542SBram Moolenaarenddef 20468a7d6542SBram Moolenaar 20478a7d6542SBram Moolenaardef Test_import_rtp() 2048cfcd011fSBram Moolenaar var import_lines = [ 2049e6085c53SBram Moolenaar 'vim9script', 2050e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2051e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2052e6085c53SBram Moolenaar ] 20538a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2054b885a7c7SBram Moolenaar mkdir('import', 'p') 2055b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20568a7d6542SBram Moolenaar 2057cfcd011fSBram Moolenaar var save_rtp = &rtp 20588a7d6542SBram Moolenaar &rtp = getcwd() 20598a7d6542SBram Moolenaar source Ximport_rtp.vim 20608a7d6542SBram Moolenaar &rtp = save_rtp 20618a7d6542SBram Moolenaar 20628a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20638a7d6542SBram Moolenaar 2064b3ca9824SBram Moolenaar Undo_export_script_lines() 2065b3ca9824SBram Moolenaar unlet g:imported_rtp 20668a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2067b885a7c7SBram Moolenaar delete('import', 'rf') 20688a7d6542SBram Moolenaarenddef 20698a7d6542SBram Moolenaar 207025e0f586SBram Moolenaardef Test_import_compile_error() 2071cfcd011fSBram Moolenaar var export_lines = [ 207225e0f586SBram Moolenaar 'vim9script', 207325e0f586SBram Moolenaar 'export def ExpFunc(): string', 207425e0f586SBram Moolenaar ' return notDefined', 207525e0f586SBram Moolenaar 'enddef', 207625e0f586SBram Moolenaar ] 207725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 207825e0f586SBram Moolenaar 2079cfcd011fSBram Moolenaar var import_lines = [ 208025e0f586SBram Moolenaar 'vim9script', 208125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 208225e0f586SBram Moolenaar 'def ImpFunc()', 208325e0f586SBram Moolenaar ' echo ExpFunc()', 208425e0f586SBram Moolenaar 'enddef', 208525e0f586SBram Moolenaar 'defcompile', 208625e0f586SBram Moolenaar ] 208725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 208825e0f586SBram Moolenaar 208925e0f586SBram Moolenaar try 209025e0f586SBram Moolenaar source Ximport.vim 209125e0f586SBram Moolenaar catch /E1001/ 2092f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 20937707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 209425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 209525e0f586SBram Moolenaar endtry 209625e0f586SBram Moolenaar 209725e0f586SBram Moolenaar delete('Xexported.vim') 209825e0f586SBram Moolenaar delete('Ximport.vim') 209925e0f586SBram Moolenaarenddef 210025e0f586SBram Moolenaar 2101c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2102cfcd011fSBram Moolenaar var lines = [ 2103c4ce36d4SBram Moolenaar 'vim9script', 2104c4ce36d4SBram Moolenaar 'def Func()', 2105c4ce36d4SBram Moolenaar ' eval [][0]', 2106c4ce36d4SBram Moolenaar 'enddef', 2107c4ce36d4SBram Moolenaar 'Func()', 2108c4ce36d4SBram Moolenaar ] 2109c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2110c4ce36d4SBram Moolenaar 2111c4ce36d4SBram Moolenaar for count in range(3) 2112c4ce36d4SBram Moolenaar try 2113c4ce36d4SBram Moolenaar source Xtestscript.vim 2114c4ce36d4SBram Moolenaar catch /E684/ 2115c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2116c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2117c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2118c4ce36d4SBram Moolenaar endtry 2119c4ce36d4SBram Moolenaar endfor 2120c4ce36d4SBram Moolenaar 2121c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2122c4ce36d4SBram Moolenaarenddef 2123c4ce36d4SBram Moolenaar 2124eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2125cfcd011fSBram Moolenaar var export_lines =<< trim END 2126eef2102eSBram Moolenaar vim9script 2127eef2102eSBram Moolenaar export def Func() 2128eef2102eSBram Moolenaar echo 'imported' 2129eef2102eSBram Moolenaar enddef 2130eef2102eSBram Moolenaar END 2131eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2132eef2102eSBram Moolenaar 2133cfcd011fSBram Moolenaar var lines =<< trim END 2134eef2102eSBram Moolenaar vim9script 2135eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2136eef2102eSBram Moolenaar def Func() 2137eef2102eSBram Moolenaar echo 'local to function' 2138eef2102eSBram Moolenaar enddef 2139eef2102eSBram Moolenaar END 2140eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2141eef2102eSBram Moolenaar 2142eef2102eSBram Moolenaar lines =<< trim END 2143eef2102eSBram Moolenaar vim9script 2144eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2145eef2102eSBram Moolenaar def Outer() 2146eef2102eSBram Moolenaar def Func() 2147eef2102eSBram Moolenaar echo 'local to function' 2148eef2102eSBram Moolenaar enddef 2149eef2102eSBram Moolenaar enddef 2150eef2102eSBram Moolenaar defcompile 2151eef2102eSBram Moolenaar END 2152eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2153eef2102eSBram Moolenaar 2154eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2155eef2102eSBram Moolenaarenddef 2156eef2102eSBram Moolenaar 2157b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2158cfcd011fSBram Moolenaar var lines =<< trim END 2159b9a2cac3SBram Moolenaar vim9script 2160b9a2cac3SBram Moolenaar def Func() 2161b9a2cac3SBram Moolenaar echo 'one' 2162b9a2cac3SBram Moolenaar enddef 2163b9a2cac3SBram Moolenaar def Func() 2164b9a2cac3SBram Moolenaar echo 'two' 2165b9a2cac3SBram Moolenaar enddef 2166b9a2cac3SBram Moolenaar END 2167b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2168fa211f3cSBram Moolenaar 2169fa211f3cSBram Moolenaar lines =<< trim END 2170fa211f3cSBram Moolenaar vim9script 2171fa211f3cSBram Moolenaar def Foo(): string 2172fa211f3cSBram Moolenaar return 'foo' 2173fa211f3cSBram Moolenaar enddef 2174fa211f3cSBram Moolenaar def Func() 2175cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2176fa211f3cSBram Moolenaar enddef 2177fa211f3cSBram Moolenaar defcompile 2178fa211f3cSBram Moolenaar END 2179fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2180b9a2cac3SBram Moolenaarenddef 2181b9a2cac3SBram Moolenaar 21828a7d6542SBram Moolenaardef Test_fixed_size_list() 2183f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2184cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 21858a7d6542SBram Moolenaar l->remove(0) 21868a7d6542SBram Moolenaar l->add(5) 21878a7d6542SBram Moolenaar l->insert(99, 1) 21880f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 21898a7d6542SBram Moolenaarenddef 21908a7d6542SBram Moolenaar 2191ae616494SBram Moolenaardef Test_no_insert_xit() 2192d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2193d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2194d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2195d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2196d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2197ae616494SBram Moolenaar 2198ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2199ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2200ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2201ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2202f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2203f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 22046508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 22056508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2206f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2207f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2208f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2209ae616494SBram Moolenaarenddef 2210ae616494SBram Moolenaar 2211158906cfSBram Moolenaardef IfElse(what: number): string 2212cfcd011fSBram Moolenaar var res = '' 2213158906cfSBram Moolenaar if what == 1 2214158906cfSBram Moolenaar res = "one" 2215158906cfSBram Moolenaar elseif what == 2 2216158906cfSBram Moolenaar res = "two" 2217a259d8d3SBram Moolenaar else 2218158906cfSBram Moolenaar res = "three" 2219a259d8d3SBram Moolenaar endif 2220158906cfSBram Moolenaar return res 2221a259d8d3SBram Moolenaarenddef 2222a259d8d3SBram Moolenaar 2223158906cfSBram Moolenaardef Test_if_elseif_else() 2224158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2225158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2226158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22270f18b6d1SBram Moolenaarenddef 22280f18b6d1SBram Moolenaar 2229e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2230d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2231d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2232d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2233ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2234d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22356628b7ebSBram Moolenaar 22366628b7ebSBram Moolenaar var lines =<< trim END 22376628b7ebSBram Moolenaar var s = '' 22386628b7ebSBram Moolenaar if s = '' 22396628b7ebSBram Moolenaar endif 22406628b7ebSBram Moolenaar END 22416628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22426628b7ebSBram Moolenaar 22436628b7ebSBram Moolenaar lines =<< trim END 22446628b7ebSBram Moolenaar var s = '' 22456628b7ebSBram Moolenaar if s == '' 22466628b7ebSBram Moolenaar elseif s = '' 22476628b7ebSBram Moolenaar endif 22486628b7ebSBram Moolenaar END 22496628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2250e8c4abbbSBram Moolenaarenddef 2251e8c4abbbSBram Moolenaar 22526d69bf60SBram Moolenaarlet g:bool_true = v:true 22536d69bf60SBram Moolenaarlet g:bool_false = v:false 22546d69bf60SBram Moolenaar 22556d69bf60SBram Moolenaardef Test_if_const_expr() 2256cfcd011fSBram Moolenaar var res = false 22576d69bf60SBram Moolenaar if true ? true : false 22586d69bf60SBram Moolenaar res = true 22596d69bf60SBram Moolenaar endif 22606d69bf60SBram Moolenaar assert_equal(true, res) 22616d69bf60SBram Moolenaar 2262585fea7bSBram Moolenaar g:glob = 2 2263585fea7bSBram Moolenaar if false 22646797966dSBram Moolenaar execute('g:glob = 3') 2265585fea7bSBram Moolenaar endif 2266585fea7bSBram Moolenaar assert_equal(2, g:glob) 2267585fea7bSBram Moolenaar if true 22686797966dSBram Moolenaar execute('g:glob = 3') 2269585fea7bSBram Moolenaar endif 2270585fea7bSBram Moolenaar assert_equal(3, g:glob) 2271585fea7bSBram Moolenaar 22726d69bf60SBram Moolenaar res = false 22736d69bf60SBram Moolenaar if g:bool_true ? true : false 22746d69bf60SBram Moolenaar res = true 22756d69bf60SBram Moolenaar endif 22766d69bf60SBram Moolenaar assert_equal(true, res) 22776d69bf60SBram Moolenaar 22786d69bf60SBram Moolenaar res = false 22796d69bf60SBram Moolenaar if true ? g:bool_true : false 22806d69bf60SBram Moolenaar res = true 22816d69bf60SBram Moolenaar endif 22826d69bf60SBram Moolenaar assert_equal(true, res) 22836d69bf60SBram Moolenaar 22846d69bf60SBram Moolenaar res = false 22856d69bf60SBram Moolenaar if true ? true : g:bool_false 22866d69bf60SBram Moolenaar res = true 22876d69bf60SBram Moolenaar endif 22886d69bf60SBram Moolenaar assert_equal(true, res) 22896d69bf60SBram Moolenaar 22906d69bf60SBram Moolenaar res = false 22916d69bf60SBram Moolenaar if true ? false : true 22926d69bf60SBram Moolenaar res = true 22936d69bf60SBram Moolenaar endif 22946d69bf60SBram Moolenaar assert_equal(false, res) 22956d69bf60SBram Moolenaar 22966d69bf60SBram Moolenaar res = false 22976d69bf60SBram Moolenaar if false ? false : true 22986d69bf60SBram Moolenaar res = true 22996d69bf60SBram Moolenaar endif 23006d69bf60SBram Moolenaar assert_equal(true, res) 23016d69bf60SBram Moolenaar 23026d69bf60SBram Moolenaar res = false 23036d69bf60SBram Moolenaar if false ? true : false 23046d69bf60SBram Moolenaar res = true 23056d69bf60SBram Moolenaar endif 23066d69bf60SBram Moolenaar assert_equal(false, res) 23076d69bf60SBram Moolenaar 23086d69bf60SBram Moolenaar res = false 2309e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2310e8c4abbbSBram Moolenaar res = true 2311e8c4abbbSBram Moolenaar endif 2312e8c4abbbSBram Moolenaar assert_equal(false, res) 2313e8c4abbbSBram Moolenaar 2314e8c4abbbSBram Moolenaar res = false 23156d69bf60SBram Moolenaar if true && true 23166d69bf60SBram Moolenaar res = true 23176d69bf60SBram Moolenaar endif 23186d69bf60SBram Moolenaar assert_equal(true, res) 23196d69bf60SBram Moolenaar 23206d69bf60SBram Moolenaar res = false 23216d69bf60SBram Moolenaar if true && false 23226d69bf60SBram Moolenaar res = true 23236d69bf60SBram Moolenaar endif 23246d69bf60SBram Moolenaar assert_equal(false, res) 23256d69bf60SBram Moolenaar 23266d69bf60SBram Moolenaar res = false 23276d69bf60SBram Moolenaar if g:bool_true && false 23286d69bf60SBram Moolenaar res = true 23296d69bf60SBram Moolenaar endif 23306d69bf60SBram Moolenaar assert_equal(false, res) 23316d69bf60SBram Moolenaar 23326d69bf60SBram Moolenaar res = false 23336d69bf60SBram Moolenaar if true && g:bool_false 23346d69bf60SBram Moolenaar res = true 23356d69bf60SBram Moolenaar endif 23366d69bf60SBram Moolenaar assert_equal(false, res) 23376d69bf60SBram Moolenaar 23386d69bf60SBram Moolenaar res = false 23396d69bf60SBram Moolenaar if false && false 23406d69bf60SBram Moolenaar res = true 23416d69bf60SBram Moolenaar endif 23426d69bf60SBram Moolenaar assert_equal(false, res) 23436d69bf60SBram Moolenaar 23446d69bf60SBram Moolenaar res = false 23456d69bf60SBram Moolenaar if true || false 23466d69bf60SBram Moolenaar res = true 23476d69bf60SBram Moolenaar endif 23486d69bf60SBram Moolenaar assert_equal(true, res) 23496d69bf60SBram Moolenaar 23506d69bf60SBram Moolenaar res = false 23516d69bf60SBram Moolenaar if g:bool_true || false 23526d69bf60SBram Moolenaar res = true 23536d69bf60SBram Moolenaar endif 23546d69bf60SBram Moolenaar assert_equal(true, res) 23556d69bf60SBram Moolenaar 23566d69bf60SBram Moolenaar res = false 23576d69bf60SBram Moolenaar if true || g:bool_false 23586d69bf60SBram Moolenaar res = true 23596d69bf60SBram Moolenaar endif 23606d69bf60SBram Moolenaar assert_equal(true, res) 23616d69bf60SBram Moolenaar 23626d69bf60SBram Moolenaar res = false 23636d69bf60SBram Moolenaar if false || false 23646d69bf60SBram Moolenaar res = true 23656d69bf60SBram Moolenaar endif 23666d69bf60SBram Moolenaar assert_equal(false, res) 23673988f64fSBram Moolenaar 23683988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2369c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23703988f64fSBram Moolenaar if false | eval burp + 234 | endif 23713988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23723988f64fSBram Moolenaar if false 23733988f64fSBram Moolenaar burp 23743988f64fSBram Moolenaar endif 2375e525bddaSBram Moolenaar 2376e525bddaSBram Moolenaar # expression with line breaks skipped 2377e525bddaSBram Moolenaar if false 2378e525bddaSBram Moolenaar ('aaa' 2379e525bddaSBram Moolenaar .. 'bbb' 2380e525bddaSBram Moolenaar .. 'ccc' 2381e525bddaSBram Moolenaar )->setline(1) 2382e525bddaSBram Moolenaar endif 238380c34ca3SBram Moolenaarenddef 23846d69bf60SBram Moolenaar 238580c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2386d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2387d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2388d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2389d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 23906d69bf60SBram Moolenaarenddef 23916d69bf60SBram Moolenaar 239272abcf42SBram Moolenaardef RunNested(i: number): number 2393cfcd011fSBram Moolenaar var x: number = 0 239472abcf42SBram Moolenaar if i % 2 239572abcf42SBram Moolenaar if 1 2396f5be8cdbSBram Moolenaar # comment 239772abcf42SBram Moolenaar else 2398f5be8cdbSBram Moolenaar # comment 239972abcf42SBram Moolenaar endif 240072abcf42SBram Moolenaar x += 1 240172abcf42SBram Moolenaar else 240272abcf42SBram Moolenaar x += 1000 240372abcf42SBram Moolenaar endif 240472abcf42SBram Moolenaar return x 240572abcf42SBram Moolenaarenddef 240672abcf42SBram Moolenaar 240772abcf42SBram Moolenaardef Test_nested_if() 240872abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 240972abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 241072abcf42SBram Moolenaarenddef 241172abcf42SBram Moolenaar 2412ad39c094SBram Moolenaardef Test_execute_cmd() 2413e4984290SBram Moolenaar # missing argument is ignored 2414e4984290SBram Moolenaar execute 2415e4984290SBram Moolenaar execute # comment 2416e4984290SBram Moolenaar 2417ad39c094SBram Moolenaar new 2418ad39c094SBram Moolenaar setline(1, 'default') 2419d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2420ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2421a72cfb80SBram Moolenaar 2422d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2423a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2424a72cfb80SBram Moolenaar 2425cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2426cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2427a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2428ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2429a72cfb80SBram Moolenaar 2430d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2431ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2432a72cfb80SBram Moolenaar 2433cfcd011fSBram Moolenaar var cmd_first = 'call ' 2434cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2435ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2436ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2437ad39c094SBram Moolenaar bwipe! 2438585fea7bSBram Moolenaar 2439cfcd011fSBram Moolenaar var n = true 24402d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 24412d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 24422d6b20d6SBram Moolenaar 2443e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2444e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2445e5abf7afSBram Moolenaar 2446d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2447d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2448d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2449ad39c094SBram Moolenaarenddef 2450ad39c094SBram Moolenaar 245147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2452f5be8cdbSBram Moolenaar # only checks line continuation 2453cfcd011fSBram Moolenaar var lines =<< trim END 245447e880d6SBram Moolenaar vim9script 245547e880d6SBram Moolenaar execute 'g:someVar' 245647e880d6SBram Moolenaar .. ' = ' .. 245747e880d6SBram Moolenaar '28' 245847e880d6SBram Moolenaar assert_equal(28, g:someVar) 245947e880d6SBram Moolenaar unlet g:someVar 246047e880d6SBram Moolenaar END 246147e880d6SBram Moolenaar CheckScriptSuccess(lines) 246247e880d6SBram Moolenaarenddef 246347e880d6SBram Moolenaar 2464ad39c094SBram Moolenaardef Test_echo_cmd() 2465a72cfb80SBram Moolenaar echo 'some' # comment 2466585fea7bSBram Moolenaar echon 'thing' 2467ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2468ad39c094SBram Moolenaar 2469a72cfb80SBram Moolenaar echo "some" # comment 2470a72cfb80SBram Moolenaar echon "thing" 2471a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2472a72cfb80SBram Moolenaar 2473cfcd011fSBram Moolenaar var str1 = 'some' 2474cfcd011fSBram Moolenaar var str2 = 'more' 2475ad39c094SBram Moolenaar echo str1 str2 2476ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2477a72cfb80SBram Moolenaar 2478d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2479ad39c094SBram Moolenaarenddef 2480ad39c094SBram Moolenaar 2481f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2482f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2483f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2484f93c7feaSBram Moolenaar echo 'clear' 2485df069eecSBram Moolenaar :1messages 2486f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2487f93c7feaSBram Moolenaar 2488d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2489f93c7feaSBram Moolenaarenddef 2490f93c7feaSBram Moolenaar 249147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2492f5be8cdbSBram Moolenaar # only checks line continuation 2493cfcd011fSBram Moolenaar var lines =<< trim END 249447e880d6SBram Moolenaar vim9script 249547e880d6SBram Moolenaar echomsg 'here' 249647e880d6SBram Moolenaar .. ' is ' .. 249747e880d6SBram Moolenaar 'a message' 249847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 249947e880d6SBram Moolenaar END 250047e880d6SBram Moolenaar CheckScriptSuccess(lines) 250147e880d6SBram Moolenaarenddef 250247e880d6SBram Moolenaar 2503f93c7feaSBram Moolenaardef Test_echoerr_cmd() 25047de62623SBram Moolenaar var local = 'local' 250540ee466cSBram Moolenaar try 25067de62623SBram Moolenaar echoerr 'something' local 'wrong' # comment 250740ee466cSBram Moolenaar catch 25087de62623SBram Moolenaar assert_match('something local wrong', v:exception) 250940ee466cSBram Moolenaar endtry 2510f93c7feaSBram Moolenaarenddef 2511f93c7feaSBram Moolenaar 251247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2513f5be8cdbSBram Moolenaar # only checks line continuation 2514cfcd011fSBram Moolenaar var lines =<< trim END 251547e880d6SBram Moolenaar vim9script 251647e880d6SBram Moolenaar try 251747e880d6SBram Moolenaar echoerr 'this' 251847e880d6SBram Moolenaar .. ' is ' .. 251947e880d6SBram Moolenaar 'wrong' 252047e880d6SBram Moolenaar catch 252147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 252247e880d6SBram Moolenaar endtry 252347e880d6SBram Moolenaar END 252447e880d6SBram Moolenaar CheckScriptSuccess(lines) 252547e880d6SBram Moolenaarenddef 252647e880d6SBram Moolenaar 25277de62623SBram Moolenaardef Test_echoconsole_cmd() 25287de62623SBram Moolenaar var local = 'local' 25297de62623SBram Moolenaar echoconsole 'something' local # comment 25307de62623SBram Moolenaar # output goes anywhere 25317de62623SBram Moolenaarenddef 25327de62623SBram Moolenaar 253341fe0617SBram Moolenaardef Test_for_outside_of_function() 2534cfcd011fSBram Moolenaar var lines =<< trim END 253541fe0617SBram Moolenaar vim9script 253641fe0617SBram Moolenaar new 253741fe0617SBram Moolenaar for var in range(0, 3) 253841fe0617SBram Moolenaar append(line('$'), var) 253941fe0617SBram Moolenaar endfor 254041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 254141fe0617SBram Moolenaar bwipe! 2542522eefd9SBram Moolenaar 2543522eefd9SBram Moolenaar var result = '' 2544522eefd9SBram Moolenaar for i in [1, 2, 3] 2545522eefd9SBram Moolenaar var loop = ' loop ' .. i 2546522eefd9SBram Moolenaar result ..= loop 2547522eefd9SBram Moolenaar endfor 2548522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 254941fe0617SBram Moolenaar END 255041fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 255141fe0617SBram Moolenaar source Xvim9for.vim 255241fe0617SBram Moolenaar delete('Xvim9for.vim') 255341fe0617SBram Moolenaarenddef 25548a7d6542SBram Moolenaar 2555e8c4abbbSBram Moolenaardef Test_for_loop() 2556f2253963SBram Moolenaar var lines =<< trim END 2557cfcd011fSBram Moolenaar var result = '' 2558e8c4abbbSBram Moolenaar for cnt in range(7) 2559e8c4abbbSBram Moolenaar if cnt == 4 2560e8c4abbbSBram Moolenaar break 2561e8c4abbbSBram Moolenaar endif 2562e8c4abbbSBram Moolenaar if cnt == 2 2563e8c4abbbSBram Moolenaar continue 2564e8c4abbbSBram Moolenaar endif 2565e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2566e8c4abbbSBram Moolenaar endfor 2567e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 25680ad3e894SBram Moolenaar 2569cfcd011fSBram Moolenaar var concat = '' 25700ad3e894SBram Moolenaar for str in eval('["one", "two"]') 25710ad3e894SBram Moolenaar concat ..= str 25720ad3e894SBram Moolenaar endfor 25730ad3e894SBram Moolenaar assert_equal('onetwo', concat) 257438bd8de5SBram Moolenaar 257538bd8de5SBram Moolenaar var total = 0 257638bd8de5SBram Moolenaar for nr in 257738bd8de5SBram Moolenaar [1, 2, 3] 257838bd8de5SBram Moolenaar total += nr 257938bd8de5SBram Moolenaar endfor 258038bd8de5SBram Moolenaar assert_equal(6, total) 258138bd8de5SBram Moolenaar 258238bd8de5SBram Moolenaar total = 0 258338bd8de5SBram Moolenaar for nr 258438bd8de5SBram Moolenaar in [1, 2, 3] 258538bd8de5SBram Moolenaar total += nr 258638bd8de5SBram Moolenaar endfor 258738bd8de5SBram Moolenaar assert_equal(6, total) 258838bd8de5SBram Moolenaar 258938bd8de5SBram Moolenaar total = 0 259038bd8de5SBram Moolenaar for nr 259138bd8de5SBram Moolenaar in 259238bd8de5SBram Moolenaar [1, 2, 3] 259338bd8de5SBram Moolenaar total += nr 259438bd8de5SBram Moolenaar endfor 259538bd8de5SBram Moolenaar assert_equal(6, total) 2596036d0714SBram Moolenaar 2597a3589a0dSBram Moolenaar # with type 2598a3589a0dSBram Moolenaar total = 0 2599a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2600a3589a0dSBram Moolenaar total += n 2601a3589a0dSBram Moolenaar endfor 2602a3589a0dSBram Moolenaar assert_equal(6, total) 2603a3589a0dSBram Moolenaar 2604fe090eb5SBram Moolenaar var chars = '' 2605fe090eb5SBram Moolenaar for s: string in 'foobar' 2606fe090eb5SBram Moolenaar chars ..= s 2607fe090eb5SBram Moolenaar endfor 2608fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2609fe090eb5SBram Moolenaar 26105ede5b23SBram Moolenaar chars = '' 26115ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 26125ede5b23SBram Moolenaar chars ..= x 26135ede5b23SBram Moolenaar endfor 26145ede5b23SBram Moolenaar assert_equal('ab', chars) 26155ede5b23SBram Moolenaar 2616a3589a0dSBram Moolenaar # unpack with type 2617f2253963SBram Moolenaar var res = '' 2618a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2619a3589a0dSBram Moolenaar res ..= n .. s 2620a3589a0dSBram Moolenaar endfor 2621a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2622a3589a0dSBram Moolenaar 2623444d8783SBram Moolenaar # unpack with one var 2624444d8783SBram Moolenaar var reslist = [] 2625444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2626444d8783SBram Moolenaar reslist->add(x) 2627444d8783SBram Moolenaar endfor 2628444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2629444d8783SBram Moolenaar 2630a3589a0dSBram Moolenaar # loop over string 2631a3589a0dSBram Moolenaar res = '' 263274e54fcbSBram Moolenaar for c in 'aéc̀d' 263374e54fcbSBram Moolenaar res ..= c .. '-' 263474e54fcbSBram Moolenaar endfor 263574e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 263674e54fcbSBram Moolenaar 263774e54fcbSBram Moolenaar res = '' 263874e54fcbSBram Moolenaar for c in '' 263974e54fcbSBram Moolenaar res ..= c .. '-' 264074e54fcbSBram Moolenaar endfor 264174e54fcbSBram Moolenaar assert_equal('', res) 264274e54fcbSBram Moolenaar 264374e54fcbSBram Moolenaar res = '' 264474e54fcbSBram Moolenaar for c in test_null_string() 264574e54fcbSBram Moolenaar res ..= c .. '-' 264674e54fcbSBram Moolenaar endfor 264774e54fcbSBram Moolenaar assert_equal('', res) 2648f2253963SBram Moolenaar 2649f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2650f2253963SBram Moolenaar {a: 'Cat'} 2651f2253963SBram Moolenaar ] 2652f2253963SBram Moolenaar for dd in foo 2653f2253963SBram Moolenaar dd.counter = 12 2654f2253963SBram Moolenaar endfor 2655f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2656ad2d4969SBram Moolenaar 2657ad2d4969SBram Moolenaar reslist = [] 2658ad2d4969SBram Moolenaar for _ in range(3) 2659ad2d4969SBram Moolenaar reslist->add('x') 2660ad2d4969SBram Moolenaar endfor 2661ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2662f2253963SBram Moolenaar END 2663f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2664e8c4abbbSBram Moolenaarenddef 2665e8c4abbbSBram Moolenaar 26662eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 26672eb6fc3bSBram Moolenaar var lines =<< trim END 26682eb6fc3bSBram Moolenaar var flist: list<func> 26692eb6fc3bSBram Moolenaar for i in range(5) 26702eb6fc3bSBram Moolenaar var inloop = i 26712eb6fc3bSBram Moolenaar flist[i] = () => inloop 26722eb6fc3bSBram Moolenaar endfor 26732eb6fc3bSBram Moolenaar for i in range(5) 26742eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26752eb6fc3bSBram Moolenaar endfor 26762eb6fc3bSBram Moolenaar END 26772eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26782eb6fc3bSBram Moolenaar 26792eb6fc3bSBram Moolenaar lines =<< trim END 26802eb6fc3bSBram Moolenaar var flist: list<func> 26812eb6fc3bSBram Moolenaar for i in range(5) 26822eb6fc3bSBram Moolenaar var inloop = i 26832eb6fc3bSBram Moolenaar flist[i] = () => { 26842eb6fc3bSBram Moolenaar return inloop 26852eb6fc3bSBram Moolenaar } 26862eb6fc3bSBram Moolenaar endfor 26872eb6fc3bSBram Moolenaar for i in range(5) 26882eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 26892eb6fc3bSBram Moolenaar endfor 26902eb6fc3bSBram Moolenaar END 26912eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 26922eb6fc3bSBram Moolenaarenddef 26932eb6fc3bSBram Moolenaar 2694e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2695442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2696442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2697442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2698442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2699442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2700442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2701d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2702822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 27032d870f8dSBram Moolenaar delfunc! g:Func 2704675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2705675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2706675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 270774e54fcbSBram Moolenaar 270874e54fcbSBram Moolenaar # wrong type detected at compile time 270974e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 271074e54fcbSBram Moolenaar 271174e54fcbSBram Moolenaar # wrong type detected at runtime 271274e54fcbSBram Moolenaar g:adict = {a: 1} 271374e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 271474e54fcbSBram Moolenaar unlet g:adict 2715f6a8d420SBram Moolenaar 2716f6a8d420SBram Moolenaar var lines =<< trim END 2717f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2718f6a8d420SBram Moolenaar for e in d 2719f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2720f6a8d420SBram Moolenaar endfor 2721f6a8d420SBram Moolenaar END 2722f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2723fe090eb5SBram Moolenaar 2724fe090eb5SBram Moolenaar lines =<< trim END 2725fe090eb5SBram Moolenaar for nr: number in ['foo'] 2726fe090eb5SBram Moolenaar endfor 2727fe090eb5SBram Moolenaar END 2728fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2729404557e6SBram Moolenaar 2730404557e6SBram Moolenaar lines =<< trim END 2731404557e6SBram Moolenaar for n : number in [1, 2] 2732404557e6SBram Moolenaar echo n 2733404557e6SBram Moolenaar endfor 2734404557e6SBram Moolenaar END 2735404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2736efc5db52SBram Moolenaar 2737efc5db52SBram Moolenaar lines =<< trim END 2738efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2739efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2740efc5db52SBram Moolenaar echo k v 2741efc5db52SBram Moolenaar endfor 2742efc5db52SBram Moolenaar END 2743efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2744e8c4abbbSBram Moolenaarenddef 2745e8c4abbbSBram Moolenaar 2746ea87069dSBram Moolenaardef Test_for_loop_script_var() 2747ea87069dSBram Moolenaar # cannot use s:var in a :def function 2748ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2749ea87069dSBram Moolenaar 2750ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2751ea87069dSBram Moolenaar var lines =<< trim END 2752ea87069dSBram Moolenaar vim9script 2753ea87069dSBram Moolenaar var total = 0 2754ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2755ea87069dSBram Moolenaar total += s:var 2756ea87069dSBram Moolenaar endfor 2757ea87069dSBram Moolenaar assert_equal(6, total) 2758ea87069dSBram Moolenaar 2759ea87069dSBram Moolenaar total = 0 2760ea87069dSBram Moolenaar for var in [1, 2, 3] 2761ea87069dSBram Moolenaar total += var 2762ea87069dSBram Moolenaar endfor 2763ea87069dSBram Moolenaar assert_equal(6, total) 2764ea87069dSBram Moolenaar END 2765ea87069dSBram Moolenaarenddef 2766ea87069dSBram Moolenaar 2767792f786aSBram Moolenaardef Test_for_loop_unpack() 27684b8a0651SBram Moolenaar var lines =<< trim END 2769792f786aSBram Moolenaar var result = [] 2770792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2771792f786aSBram Moolenaar result->add(v1) 2772792f786aSBram Moolenaar result->add(v2) 2773792f786aSBram Moolenaar endfor 2774792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2775792f786aSBram Moolenaar 2776792f786aSBram Moolenaar result = [] 2777792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2778792f786aSBram Moolenaar result->add(v1) 2779792f786aSBram Moolenaar result->add(v2) 2780792f786aSBram Moolenaar result->add(v3) 2781792f786aSBram Moolenaar endfor 2782792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2783792f786aSBram Moolenaar 27844b8a0651SBram Moolenaar result = [] 27854b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 27864b8a0651SBram Moolenaar result->add(&ts) 27874b8a0651SBram Moolenaar result->add(&sw) 27884b8a0651SBram Moolenaar endfor 27894b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 27904b8a0651SBram Moolenaar 27914b8a0651SBram Moolenaar var slist: list<string> 27924b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 27934b8a0651SBram Moolenaar slist->add($LOOPVAR) 27944b8a0651SBram Moolenaar slist->add(@r) 27954b8a0651SBram Moolenaar slist->add(v:errmsg) 27964b8a0651SBram Moolenaar endfor 27974b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 27984b8a0651SBram Moolenaar 27994b8a0651SBram Moolenaar slist = [] 28004b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 28014b8a0651SBram Moolenaar slist->add(g:globalvar) 28024b8a0651SBram Moolenaar slist->add(b:bufvar) 28034b8a0651SBram Moolenaar slist->add(w:winvar) 28044b8a0651SBram Moolenaar slist->add(t:tabvar) 28054b8a0651SBram Moolenaar endfor 28064b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2807f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2808b777da9bSBram Moolenaar 2809b777da9bSBram Moolenaar var res = [] 2810b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2811b777da9bSBram Moolenaar res->add(n) 2812b777da9bSBram Moolenaar endfor 2813b777da9bSBram Moolenaar assert_equal([2, 5], res) 28144b8a0651SBram Moolenaar END 28154b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 28164b8a0651SBram Moolenaar 28174b8a0651SBram Moolenaar lines =<< trim END 2818792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2819792f786aSBram Moolenaar echo v1 v2 2820792f786aSBram Moolenaar endfor 2821792f786aSBram Moolenaar END 2822792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2823792f786aSBram Moolenaar 2824792f786aSBram Moolenaar lines =<< trim END 2825792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2826792f786aSBram Moolenaar echo v1 v2 2827792f786aSBram Moolenaar endfor 2828792f786aSBram Moolenaar END 2829792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2830792f786aSBram Moolenaar 2831792f786aSBram Moolenaar lines =<< trim END 2832792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2833792f786aSBram Moolenaar echo v1 2834792f786aSBram Moolenaar endfor 2835792f786aSBram Moolenaar END 2836792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2837792f786aSBram Moolenaarenddef 2838792f786aSBram Moolenaar 2839c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2840f2253963SBram Moolenaar var lines =<< trim END 2841c150c09eSBram Moolenaar var looped = 0 2842c150c09eSBram Moolenaar var cleanup = 0 2843c150c09eSBram Moolenaar for i in range(3) 2844c150c09eSBram Moolenaar looped += 1 2845c150c09eSBram Moolenaar try 2846c150c09eSBram Moolenaar eval [][0] 2847c150c09eSBram Moolenaar catch 2848c150c09eSBram Moolenaar continue 2849c150c09eSBram Moolenaar finally 2850c150c09eSBram Moolenaar cleanup += 1 2851c150c09eSBram Moolenaar endtry 2852c150c09eSBram Moolenaar endfor 2853c150c09eSBram Moolenaar assert_equal(3, looped) 2854c150c09eSBram Moolenaar assert_equal(3, cleanup) 2855f2253963SBram Moolenaar END 2856f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2857c150c09eSBram Moolenaarenddef 2858c150c09eSBram Moolenaar 2859d895b1d9Srbtnndef Test_while_skipped_block() 2860d895b1d9Srbtnn # test skipped blocks at outside of function 2861d895b1d9Srbtnn var lines =<< trim END 2862d895b1d9Srbtnn var result = [] 2863d895b1d9Srbtnn var n = 0 2864d895b1d9Srbtnn if true 2865d895b1d9Srbtnn n = 1 2866d895b1d9Srbtnn while n < 3 2867d895b1d9Srbtnn result += [n] 2868d895b1d9Srbtnn n += 1 2869d895b1d9Srbtnn endwhile 2870d895b1d9Srbtnn else 2871d895b1d9Srbtnn n = 3 2872d895b1d9Srbtnn while n < 5 2873d895b1d9Srbtnn result += [n] 2874d895b1d9Srbtnn n += 1 2875d895b1d9Srbtnn endwhile 2876d895b1d9Srbtnn endif 2877d895b1d9Srbtnn assert_equal([1, 2], result) 2878d895b1d9Srbtnn 2879d895b1d9Srbtnn result = [] 2880d895b1d9Srbtnn if false 2881d895b1d9Srbtnn n = 1 2882d895b1d9Srbtnn while n < 3 2883d895b1d9Srbtnn result += [n] 2884d895b1d9Srbtnn n += 1 2885d895b1d9Srbtnn endwhile 2886d895b1d9Srbtnn else 2887d895b1d9Srbtnn n = 3 2888d895b1d9Srbtnn while n < 5 2889d895b1d9Srbtnn result += [n] 2890d895b1d9Srbtnn n += 1 2891d895b1d9Srbtnn endwhile 2892d895b1d9Srbtnn endif 2893d895b1d9Srbtnn assert_equal([3, 4], result) 2894d895b1d9Srbtnn END 2895d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 2896d895b1d9Srbtnn 2897d895b1d9Srbtnn # test skipped blocks at inside of function 2898d895b1d9Srbtnn lines =<< trim END 2899d895b1d9Srbtnn def DefTrue() 2900d895b1d9Srbtnn var result = [] 2901d895b1d9Srbtnn var n = 0 2902d895b1d9Srbtnn if true 2903d895b1d9Srbtnn n = 1 2904d895b1d9Srbtnn while n < 3 2905d895b1d9Srbtnn result += [n] 2906d895b1d9Srbtnn n += 1 2907d895b1d9Srbtnn endwhile 2908d895b1d9Srbtnn else 2909d895b1d9Srbtnn n = 3 2910d895b1d9Srbtnn while n < 5 2911d895b1d9Srbtnn result += [n] 2912d895b1d9Srbtnn n += 1 2913d895b1d9Srbtnn endwhile 2914d895b1d9Srbtnn endif 2915d895b1d9Srbtnn assert_equal([1, 2], result) 2916d895b1d9Srbtnn enddef 2917d895b1d9Srbtnn DefTrue() 2918d895b1d9Srbtnn 2919d895b1d9Srbtnn def DefFalse() 2920d895b1d9Srbtnn var result = [] 2921d895b1d9Srbtnn var n = 0 2922d895b1d9Srbtnn if false 2923d895b1d9Srbtnn n = 1 2924d895b1d9Srbtnn while n < 3 2925d895b1d9Srbtnn result += [n] 2926d895b1d9Srbtnn n += 1 2927d895b1d9Srbtnn endwhile 2928d895b1d9Srbtnn else 2929d895b1d9Srbtnn n = 3 2930d895b1d9Srbtnn while n < 5 2931d895b1d9Srbtnn result += [n] 2932d895b1d9Srbtnn n += 1 2933d895b1d9Srbtnn endwhile 2934d895b1d9Srbtnn endif 2935d895b1d9Srbtnn assert_equal([3, 4], result) 2936d895b1d9Srbtnn enddef 2937d895b1d9Srbtnn DefFalse() 2938d895b1d9Srbtnn END 2939d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 2940d895b1d9Srbtnnenddef 2941d895b1d9Srbtnn 2942d0df1aacSBram Moolenaardef Test_while_loop() 2943cfcd011fSBram Moolenaar var result = '' 2944cfcd011fSBram Moolenaar var cnt = 0 2945d0df1aacSBram Moolenaar while cnt < 555 2946d0df1aacSBram Moolenaar if cnt == 3 2947d0df1aacSBram Moolenaar break 2948d0df1aacSBram Moolenaar endif 2949d0df1aacSBram Moolenaar cnt += 1 2950d0df1aacSBram Moolenaar if cnt == 2 2951d0df1aacSBram Moolenaar continue 2952d0df1aacSBram Moolenaar endif 2953d0df1aacSBram Moolenaar result ..= cnt .. '_' 2954d0df1aacSBram Moolenaar endwhile 2955d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2956dee37dc7SBram Moolenaar 2957dee37dc7SBram Moolenaar var s = '' 29580123cc1eSBram Moolenaar while s == 'x' # {comment} 2959dee37dc7SBram Moolenaar endwhile 2960d0df1aacSBram Moolenaarenddef 2961d0df1aacSBram Moolenaar 2962e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2963675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2964675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2965675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2966675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2967675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2968675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2969675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 29706628b7ebSBram Moolenaar 29716628b7ebSBram Moolenaar var lines =<< trim END 29726628b7ebSBram Moolenaar var s = '' 29736628b7ebSBram Moolenaar while s = '' 29746628b7ebSBram Moolenaar endwhile 29756628b7ebSBram Moolenaar END 29766628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2977bd5da371SBram Moolenaarenddef 2978bd5da371SBram Moolenaar 29799645e2d9SBram Moolenaardef Test_interrupt_loop() 2980cfcd011fSBram Moolenaar var caught = false 2981cfcd011fSBram Moolenaar var x = 0 298297acfc78SBram Moolenaar try 29839645e2d9SBram Moolenaar while 1 29849645e2d9SBram Moolenaar x += 1 29859645e2d9SBram Moolenaar if x == 100 29869645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 29879645e2d9SBram Moolenaar endif 29889645e2d9SBram Moolenaar endwhile 298997acfc78SBram Moolenaar catch 299097acfc78SBram Moolenaar caught = true 299197acfc78SBram Moolenaar assert_equal(100, x) 299297acfc78SBram Moolenaar endtry 299397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 299425859dd7SBram Moolenaar # consume the CTRL-C 299525859dd7SBram Moolenaar getchar(0) 29969645e2d9SBram Moolenaarenddef 299720431c9dSBram Moolenaar 29984fdae999SBram Moolenaardef Test_automatic_line_continuation() 2999cfcd011fSBram Moolenaar var mylist = [ 30004fdae999SBram Moolenaar 'one', 30014fdae999SBram Moolenaar 'two', 30024fdae999SBram Moolenaar 'three', 3003f5be8cdbSBram Moolenaar ] # comment 30044fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 30054fdae999SBram Moolenaar 3006cfcd011fSBram Moolenaar var mydict = { 3007e0de171eSBram Moolenaar ['one']: 1, 3008e0de171eSBram Moolenaar ['two']: 2, 3009e0de171eSBram Moolenaar ['three']: 30104fdae999SBram Moolenaar 3, 3011f5be8cdbSBram Moolenaar } # comment 3012e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3013e0de171eSBram Moolenaar mydict = { 30142c330432SBram Moolenaar one: 1, # comment 30152c330432SBram Moolenaar two: # comment 30162c330432SBram Moolenaar 2, # comment 30172c330432SBram Moolenaar three: 3 # comment 30182c330432SBram Moolenaar } 3019e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3020e0de171eSBram Moolenaar mydict = { 30212c330432SBram Moolenaar one: 1, 30224fdae999SBram Moolenaar two: 30234fdae999SBram Moolenaar 2, 30242c330432SBram Moolenaar three: 3 30254fdae999SBram Moolenaar } 3026e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3027e6085c53SBram Moolenaar 3028e6085c53SBram Moolenaar assert_equal( 3029e6085c53SBram Moolenaar ['one', 'two', 'three'], 3030e6085c53SBram Moolenaar split('one two three') 3031e6085c53SBram Moolenaar ) 30324fdae999SBram Moolenaarenddef 30334fdae999SBram Moolenaar 30347a092245SBram Moolenaardef Test_vim9_comment() 30357a092245SBram Moolenaar CheckScriptSuccess([ 30367a092245SBram Moolenaar 'vim9script', 30377a092245SBram Moolenaar '# something', 303893f82cbeSBram Moolenaar '#something', 303993f82cbeSBram Moolenaar '#{something', 30407a092245SBram Moolenaar ]) 304193f82cbeSBram Moolenaar 304293f82cbeSBram Moolenaar split Xfile 304393f82cbeSBram Moolenaar CheckScriptSuccess([ 304493f82cbeSBram Moolenaar 'vim9script', 304593f82cbeSBram Moolenaar 'edit #something', 304693f82cbeSBram Moolenaar ]) 304793f82cbeSBram Moolenaar CheckScriptSuccess([ 304893f82cbeSBram Moolenaar 'vim9script', 304993f82cbeSBram Moolenaar 'edit #{something', 305093f82cbeSBram Moolenaar ]) 305193f82cbeSBram Moolenaar close 305293f82cbeSBram Moolenaar 30537a092245SBram Moolenaar CheckScriptFailure([ 30547a092245SBram Moolenaar 'vim9script', 30557a092245SBram Moolenaar ':# something', 30567a092245SBram Moolenaar ], 'E488:') 30577a092245SBram Moolenaar CheckScriptFailure([ 30587a092245SBram Moolenaar '# something', 30597a092245SBram Moolenaar ], 'E488:') 30607a092245SBram Moolenaar CheckScriptFailure([ 30617a092245SBram Moolenaar ':# something', 30627a092245SBram Moolenaar ], 'E488:') 30637a092245SBram Moolenaar 30644a8d9f2eSBram Moolenaar { # block start 30654a8d9f2eSBram Moolenaar } # block end 30664a8d9f2eSBram Moolenaar CheckDefFailure([ 30674a8d9f2eSBram Moolenaar '{# comment', 30684a8d9f2eSBram Moolenaar ], 'E488:') 30694a8d9f2eSBram Moolenaar CheckDefFailure([ 30704a8d9f2eSBram Moolenaar '{', 30714a8d9f2eSBram Moolenaar '}# comment', 30724a8d9f2eSBram Moolenaar ], 'E488:') 30734a8d9f2eSBram Moolenaar 30744a8d9f2eSBram Moolenaar echo "yes" # comment 30754a8d9f2eSBram Moolenaar CheckDefFailure([ 30764a8d9f2eSBram Moolenaar 'echo "yes"# comment', 30774a8d9f2eSBram Moolenaar ], 'E488:') 30787a092245SBram Moolenaar CheckScriptSuccess([ 30797a092245SBram Moolenaar 'vim9script', 30807a092245SBram Moolenaar 'echo "yes" # something', 30817a092245SBram Moolenaar ]) 30827a092245SBram Moolenaar CheckScriptFailure([ 30837a092245SBram Moolenaar 'vim9script', 30847a092245SBram Moolenaar 'echo "yes"# something', 30857a092245SBram Moolenaar ], 'E121:') 30867a092245SBram Moolenaar CheckScriptFailure([ 30877a092245SBram Moolenaar 'vim9script', 30887a092245SBram Moolenaar 'echo# something', 3089f8103f27SBram Moolenaar ], 'E1144:') 30907a092245SBram Moolenaar CheckScriptFailure([ 30917a092245SBram Moolenaar 'echo "yes" # something', 30927a092245SBram Moolenaar ], 'E121:') 30937a092245SBram Moolenaar 30944a8d9f2eSBram Moolenaar exe "echo" # comment 30954a8d9f2eSBram Moolenaar CheckDefFailure([ 30964a8d9f2eSBram Moolenaar 'exe "echo"# comment', 30974a8d9f2eSBram Moolenaar ], 'E488:') 30984a8d9f2eSBram Moolenaar CheckScriptSuccess([ 30994a8d9f2eSBram Moolenaar 'vim9script', 31004a8d9f2eSBram Moolenaar 'exe "echo" # something', 31014a8d9f2eSBram Moolenaar ]) 31024a8d9f2eSBram Moolenaar CheckScriptFailure([ 31034a8d9f2eSBram Moolenaar 'vim9script', 31044a8d9f2eSBram Moolenaar 'exe "echo"# something', 31054a8d9f2eSBram Moolenaar ], 'E121:') 31064a8d9f2eSBram Moolenaar CheckScriptFailure([ 31074a8d9f2eSBram Moolenaar 'vim9script', 31084a8d9f2eSBram Moolenaar 'exe# something', 3109f8103f27SBram Moolenaar ], 'E1144:') 31104a8d9f2eSBram Moolenaar CheckScriptFailure([ 31114a8d9f2eSBram Moolenaar 'exe "echo" # something', 31124a8d9f2eSBram Moolenaar ], 'E121:') 31134a8d9f2eSBram Moolenaar 31147a092245SBram Moolenaar CheckDefFailure([ 31157a092245SBram Moolenaar 'try# comment', 31167a092245SBram Moolenaar ' echo "yes"', 31177a092245SBram Moolenaar 'catch', 31187a092245SBram Moolenaar 'endtry', 3119f8103f27SBram Moolenaar ], 'E1144:') 31202c5ed4e3SBram Moolenaar CheckScriptFailure([ 31212c5ed4e3SBram Moolenaar 'vim9script', 31222c5ed4e3SBram Moolenaar 'try# comment', 31232c5ed4e3SBram Moolenaar 'echo "yes"', 3124f8103f27SBram Moolenaar ], 'E1144:') 31257a092245SBram Moolenaar CheckDefFailure([ 31267a092245SBram Moolenaar 'try', 3127a72cfb80SBram Moolenaar ' throw#comment', 3128a72cfb80SBram Moolenaar 'catch', 3129a72cfb80SBram Moolenaar 'endtry', 3130f8103f27SBram Moolenaar ], 'E1144:') 3131a72cfb80SBram Moolenaar CheckDefFailure([ 3132a72cfb80SBram Moolenaar 'try', 3133a72cfb80SBram Moolenaar ' throw "yes"#comment', 3134a72cfb80SBram Moolenaar 'catch', 3135a72cfb80SBram Moolenaar 'endtry', 3136a72cfb80SBram Moolenaar ], 'E488:') 3137a72cfb80SBram Moolenaar CheckDefFailure([ 3138a72cfb80SBram Moolenaar 'try', 31397a092245SBram Moolenaar ' echo "yes"', 31407a092245SBram Moolenaar 'catch# comment', 31417a092245SBram Moolenaar 'endtry', 3142f8103f27SBram Moolenaar ], 'E1144:') 31432c5ed4e3SBram Moolenaar CheckScriptFailure([ 31442c5ed4e3SBram Moolenaar 'vim9script', 31452c5ed4e3SBram Moolenaar 'try', 31462c5ed4e3SBram Moolenaar ' echo "yes"', 31472c5ed4e3SBram Moolenaar 'catch# comment', 31482c5ed4e3SBram Moolenaar 'endtry', 3149f8103f27SBram Moolenaar ], 'E1144:') 31502c5ed4e3SBram Moolenaar CheckDefFailure([ 31512c5ed4e3SBram Moolenaar 'try', 31522c5ed4e3SBram Moolenaar ' echo "yes"', 31532c5ed4e3SBram Moolenaar 'catch /pat/# comment', 31542c5ed4e3SBram Moolenaar 'endtry', 31552c5ed4e3SBram Moolenaar ], 'E488:') 31567a092245SBram Moolenaar CheckDefFailure([ 31577a092245SBram Moolenaar 'try', 31587a092245SBram Moolenaar 'echo "yes"', 31597a092245SBram Moolenaar 'catch', 31607a092245SBram Moolenaar 'endtry# comment', 3161f8103f27SBram Moolenaar ], 'E1144:') 31622c5ed4e3SBram Moolenaar CheckScriptFailure([ 31632c5ed4e3SBram Moolenaar 'vim9script', 31642c5ed4e3SBram Moolenaar 'try', 31652c5ed4e3SBram Moolenaar ' echo "yes"', 31662c5ed4e3SBram Moolenaar 'catch', 31672c5ed4e3SBram Moolenaar 'endtry# comment', 3168f8103f27SBram Moolenaar ], 'E1144:') 31692c5ed4e3SBram Moolenaar 31702c5ed4e3SBram Moolenaar CheckScriptSuccess([ 31712c5ed4e3SBram Moolenaar 'vim9script', 31722c5ed4e3SBram Moolenaar 'hi # comment', 31732c5ed4e3SBram Moolenaar ]) 31742c5ed4e3SBram Moolenaar CheckScriptFailure([ 31752c5ed4e3SBram Moolenaar 'vim9script', 31762c5ed4e3SBram Moolenaar 'hi# comment', 3177f8103f27SBram Moolenaar ], 'E1144:') 31781966c248SBram Moolenaar CheckScriptSuccess([ 31791966c248SBram Moolenaar 'vim9script', 31801966c248SBram Moolenaar 'hi Search # comment', 31811966c248SBram Moolenaar ]) 31821966c248SBram Moolenaar CheckScriptFailure([ 31831966c248SBram Moolenaar 'vim9script', 31841966c248SBram Moolenaar 'hi Search# comment', 31851966c248SBram Moolenaar ], 'E416:') 31861966c248SBram Moolenaar CheckScriptSuccess([ 31871966c248SBram Moolenaar 'vim9script', 31881966c248SBram Moolenaar 'hi link This Search # comment', 31891966c248SBram Moolenaar ]) 31901966c248SBram Moolenaar CheckScriptFailure([ 31911966c248SBram Moolenaar 'vim9script', 31921966c248SBram Moolenaar 'hi link This That# comment', 31931966c248SBram Moolenaar ], 'E413:') 31941966c248SBram Moolenaar CheckScriptSuccess([ 31951966c248SBram Moolenaar 'vim9script', 31961966c248SBram Moolenaar 'hi clear This # comment', 31971966c248SBram Moolenaar 'hi clear # comment', 31981966c248SBram Moolenaar ]) 3199f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3200f5be8cdbSBram Moolenaar # hi clear This# comment', 32011966c248SBram Moolenaar CheckScriptFailure([ 32021966c248SBram Moolenaar 'vim9script', 32031966c248SBram Moolenaar 'hi clear# comment', 32041966c248SBram Moolenaar ], 'E416:') 32051966c248SBram Moolenaar 32061966c248SBram Moolenaar CheckScriptSuccess([ 32071966c248SBram Moolenaar 'vim9script', 32081966c248SBram Moolenaar 'hi Group term=bold', 32091966c248SBram Moolenaar 'match Group /todo/ # comment', 32101966c248SBram Moolenaar ]) 32111966c248SBram Moolenaar CheckScriptFailure([ 32121966c248SBram Moolenaar 'vim9script', 32131966c248SBram Moolenaar 'hi Group term=bold', 32141966c248SBram Moolenaar 'match Group /todo/# comment', 32151966c248SBram Moolenaar ], 'E488:') 32161966c248SBram Moolenaar CheckScriptSuccess([ 32171966c248SBram Moolenaar 'vim9script', 32181966c248SBram Moolenaar 'match # comment', 32191966c248SBram Moolenaar ]) 32201966c248SBram Moolenaar CheckScriptFailure([ 32211966c248SBram Moolenaar 'vim9script', 32221966c248SBram Moolenaar 'match# comment', 3223f8103f27SBram Moolenaar ], 'E1144:') 32241966c248SBram Moolenaar CheckScriptSuccess([ 32251966c248SBram Moolenaar 'vim9script', 32261966c248SBram Moolenaar 'match none # comment', 32271966c248SBram Moolenaar ]) 32281966c248SBram Moolenaar CheckScriptFailure([ 32291966c248SBram Moolenaar 'vim9script', 32301966c248SBram Moolenaar 'match none# comment', 32311966c248SBram Moolenaar ], 'E475:') 32321966c248SBram Moolenaar 32331966c248SBram Moolenaar CheckScriptSuccess([ 32341966c248SBram Moolenaar 'vim9script', 32351966c248SBram Moolenaar 'menutrans clear # comment', 32361966c248SBram Moolenaar ]) 32371966c248SBram Moolenaar CheckScriptFailure([ 32381966c248SBram Moolenaar 'vim9script', 32391966c248SBram Moolenaar 'menutrans clear# comment text', 32401966c248SBram Moolenaar ], 'E474:') 32411966c248SBram Moolenaar 32421966c248SBram Moolenaar CheckScriptSuccess([ 32431966c248SBram Moolenaar 'vim9script', 32441966c248SBram Moolenaar 'syntax clear # comment', 32451966c248SBram Moolenaar ]) 32461966c248SBram Moolenaar CheckScriptFailure([ 32471966c248SBram Moolenaar 'vim9script', 32481966c248SBram Moolenaar 'syntax clear# comment text', 32491966c248SBram Moolenaar ], 'E28:') 32501966c248SBram Moolenaar CheckScriptSuccess([ 32511966c248SBram Moolenaar 'vim9script', 32521966c248SBram Moolenaar 'syntax keyword Word some', 32531966c248SBram Moolenaar 'syntax clear Word # comment', 32541966c248SBram Moolenaar ]) 32551966c248SBram Moolenaar CheckScriptFailure([ 32561966c248SBram Moolenaar 'vim9script', 32571966c248SBram Moolenaar 'syntax keyword Word some', 32581966c248SBram Moolenaar 'syntax clear Word# comment text', 32591966c248SBram Moolenaar ], 'E28:') 32601966c248SBram Moolenaar 32611966c248SBram Moolenaar CheckScriptSuccess([ 32621966c248SBram Moolenaar 'vim9script', 32631966c248SBram Moolenaar 'syntax list # comment', 32641966c248SBram Moolenaar ]) 32651966c248SBram Moolenaar CheckScriptFailure([ 32661966c248SBram Moolenaar 'vim9script', 32671966c248SBram Moolenaar 'syntax list# comment text', 32681966c248SBram Moolenaar ], 'E28:') 32691966c248SBram Moolenaar 32701966c248SBram Moolenaar CheckScriptSuccess([ 32711966c248SBram Moolenaar 'vim9script', 32721966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 32731966c248SBram Moolenaar ]) 32741966c248SBram Moolenaar CheckScriptFailure([ 32751966c248SBram Moolenaar 'vim9script', 32761966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 32771966c248SBram Moolenaar ], 'E475:') 32781966c248SBram Moolenaar 32791966c248SBram Moolenaar CheckScriptSuccess([ 32801966c248SBram Moolenaar 'vim9script', 32811966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 32821966c248SBram Moolenaar ]) 32831966c248SBram Moolenaar CheckScriptFailure([ 32841966c248SBram Moolenaar 'vim9script', 32851966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 32861966c248SBram Moolenaar ], 'E789:') 32871966c248SBram Moolenaar 32881966c248SBram Moolenaar CheckScriptSuccess([ 32891966c248SBram Moolenaar 'vim9script', 32901966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 32911966c248SBram Moolenaar ]) 32921966c248SBram Moolenaar CheckScriptFailure([ 32931966c248SBram Moolenaar 'vim9script', 32941966c248SBram Moolenaar 'syntax match Word /pat/# comment', 32951966c248SBram Moolenaar ], 'E402:') 32961966c248SBram Moolenaar 32971966c248SBram Moolenaar CheckScriptSuccess([ 32981966c248SBram Moolenaar 'vim9script', 32991966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 33001966c248SBram Moolenaar ]) 33011966c248SBram Moolenaar CheckScriptFailure([ 33021966c248SBram Moolenaar 'vim9script', 33031966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 33041966c248SBram Moolenaar ], 'E475:') 33051966c248SBram Moolenaar CheckScriptFailure([ 33061966c248SBram Moolenaar 'vim9script', 33071966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 33081966c248SBram Moolenaar ], 'E406:') 33091966c248SBram Moolenaar CheckScriptFailure([ 33101966c248SBram Moolenaar 'vim9script', 33111966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 33121966c248SBram Moolenaar ], 'E475:') 33131966c248SBram Moolenaar 33141966c248SBram Moolenaar CheckScriptSuccess([ 33151966c248SBram Moolenaar 'vim9script', 33161966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 33171966c248SBram Moolenaar ]) 33181966c248SBram Moolenaar CheckScriptFailure([ 33191966c248SBram Moolenaar 'vim9script', 33201966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3321d032f34aSBram Moolenaar ], 'E402:') 33221966c248SBram Moolenaar 33231966c248SBram Moolenaar CheckScriptSuccess([ 33241966c248SBram Moolenaar 'vim9script', 33251966c248SBram Moolenaar 'syntax sync # comment', 33261966c248SBram Moolenaar ]) 33271966c248SBram Moolenaar CheckScriptFailure([ 33281966c248SBram Moolenaar 'vim9script', 33291966c248SBram Moolenaar 'syntax sync# comment', 33301966c248SBram Moolenaar ], 'E404:') 33311966c248SBram Moolenaar CheckScriptSuccess([ 33321966c248SBram Moolenaar 'vim9script', 33331966c248SBram Moolenaar 'syntax sync ccomment # comment', 33341966c248SBram Moolenaar ]) 33351966c248SBram Moolenaar CheckScriptFailure([ 33361966c248SBram Moolenaar 'vim9script', 33371966c248SBram Moolenaar 'syntax sync ccomment# comment', 33381966c248SBram Moolenaar ], 'E404:') 33391966c248SBram Moolenaar 33401966c248SBram Moolenaar CheckScriptSuccess([ 33411966c248SBram Moolenaar 'vim9script', 33421966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 33431966c248SBram Moolenaar ]) 33441966c248SBram Moolenaar CheckScriptFailure([ 33451966c248SBram Moolenaar 'vim9script', 33461966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 33471966c248SBram Moolenaar ], 'E475:') 3348a72cfb80SBram Moolenaar 3349a72cfb80SBram Moolenaar CheckScriptSuccess([ 3350a72cfb80SBram Moolenaar 'vim9script', 3351a72cfb80SBram Moolenaar 'command Echo echo # comment', 3352a72cfb80SBram Moolenaar 'command Echo # comment', 33532d870f8dSBram Moolenaar 'delcommand Echo', 3354a72cfb80SBram Moolenaar ]) 3355a72cfb80SBram Moolenaar CheckScriptFailure([ 3356a72cfb80SBram Moolenaar 'vim9script', 3357a72cfb80SBram Moolenaar 'command Echo echo# comment', 3358a72cfb80SBram Moolenaar 'Echo', 3359f8103f27SBram Moolenaar ], 'E1144:') 33602d870f8dSBram Moolenaar delcommand Echo 336170249ee8SBram Moolenaar 336270249ee8SBram Moolenaar var curdir = getcwd() 336370249ee8SBram Moolenaar CheckScriptSuccess([ 336470249ee8SBram Moolenaar 'command Echo cd " comment', 336570249ee8SBram Moolenaar 'Echo', 336670249ee8SBram Moolenaar 'delcommand Echo', 336770249ee8SBram Moolenaar ]) 336870249ee8SBram Moolenaar CheckScriptSuccess([ 3369090728adSBram Moolenaar 'vim9script', 337070249ee8SBram Moolenaar 'command Echo cd # comment', 337170249ee8SBram Moolenaar 'Echo', 337270249ee8SBram Moolenaar 'delcommand Echo', 337370249ee8SBram Moolenaar ]) 337470249ee8SBram Moolenaar CheckScriptFailure([ 337570249ee8SBram Moolenaar 'vim9script', 337670249ee8SBram Moolenaar 'command Echo cd " comment', 337770249ee8SBram Moolenaar 'Echo', 337870249ee8SBram Moolenaar ], 'E344:') 337970249ee8SBram Moolenaar delcommand Echo 338070249ee8SBram Moolenaar chdir(curdir) 338170249ee8SBram Moolenaar 3382a72cfb80SBram Moolenaar CheckScriptFailure([ 3383a72cfb80SBram Moolenaar 'vim9script', 3384a72cfb80SBram Moolenaar 'command Echo# comment', 3385a72cfb80SBram Moolenaar ], 'E182:') 3386a72cfb80SBram Moolenaar CheckScriptFailure([ 3387a72cfb80SBram Moolenaar 'vim9script', 3388a72cfb80SBram Moolenaar 'command Echo echo', 3389a72cfb80SBram Moolenaar 'command Echo# comment', 3390a72cfb80SBram Moolenaar ], 'E182:') 33912d870f8dSBram Moolenaar delcommand Echo 3392a72cfb80SBram Moolenaar 3393a72cfb80SBram Moolenaar CheckScriptSuccess([ 3394a72cfb80SBram Moolenaar 'vim9script', 3395a72cfb80SBram Moolenaar 'function # comment', 3396a72cfb80SBram Moolenaar ]) 3397a72cfb80SBram Moolenaar CheckScriptFailure([ 3398a72cfb80SBram Moolenaar 'vim9script', 33999898107fSBram Moolenaar 'function " comment', 34009898107fSBram Moolenaar ], 'E129:') 34019898107fSBram Moolenaar CheckScriptFailure([ 34029898107fSBram Moolenaar 'vim9script', 3403a72cfb80SBram Moolenaar 'function# comment', 3404f8103f27SBram Moolenaar ], 'E1144:') 3405a72cfb80SBram Moolenaar CheckScriptSuccess([ 3406a72cfb80SBram Moolenaar 'vim9script', 3407a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3408a72cfb80SBram Moolenaar ]) 3409a72cfb80SBram Moolenaar CheckScriptFailure([ 3410a72cfb80SBram Moolenaar 'vim9script', 3411a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3412a72cfb80SBram Moolenaar ], 'E488:') 3413a72cfb80SBram Moolenaar 3414a72cfb80SBram Moolenaar CheckScriptSuccess([ 3415a72cfb80SBram Moolenaar 'vim9script', 34164c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3417a72cfb80SBram Moolenaar 'endfunc', 34184c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3419a72cfb80SBram Moolenaar ]) 3420a72cfb80SBram Moolenaar CheckScriptFailure([ 3421a72cfb80SBram Moolenaar 'vim9script', 34224c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3423a72cfb80SBram Moolenaar 'endfunc', 34244c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3425a72cfb80SBram Moolenaar ], 'E488:') 3426a72cfb80SBram Moolenaar 3427a72cfb80SBram Moolenaar CheckScriptSuccess([ 3428a72cfb80SBram Moolenaar 'vim9script', 3429a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3430a72cfb80SBram Moolenaar ]) 3431a72cfb80SBram Moolenaar CheckScriptFailure([ 3432a72cfb80SBram Moolenaar 'vim9script', 3433a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3434a72cfb80SBram Moolenaar ], 'E488:') 3435e7e4838fSBram Moolenaar 3436e7e4838fSBram Moolenaar CheckScriptFailure([ 3437e7e4838fSBram Moolenaar 'def Test() " comment', 3438e7e4838fSBram Moolenaar 'enddef', 3439e7e4838fSBram Moolenaar ], 'E488:') 3440e7e4838fSBram Moolenaar CheckScriptFailure([ 3441e7e4838fSBram Moolenaar 'vim9script', 3442e7e4838fSBram Moolenaar 'def Test() " comment', 3443e7e4838fSBram Moolenaar 'enddef', 3444e7e4838fSBram Moolenaar ], 'E488:') 3445e7e4838fSBram Moolenaar 3446e7e4838fSBram Moolenaar CheckScriptSuccess([ 3447e7e4838fSBram Moolenaar 'func Test() " comment', 3448e7e4838fSBram Moolenaar 'endfunc', 34492d870f8dSBram Moolenaar 'delfunc Test', 3450e7e4838fSBram Moolenaar ]) 34519898107fSBram Moolenaar CheckScriptSuccess([ 3452e7e4838fSBram Moolenaar 'vim9script', 3453e7e4838fSBram Moolenaar 'func Test() " comment', 3454e7e4838fSBram Moolenaar 'endfunc', 34559898107fSBram Moolenaar ]) 3456e7e4838fSBram Moolenaar 3457e7e4838fSBram Moolenaar CheckScriptSuccess([ 3458e7e4838fSBram Moolenaar 'def Test() # comment', 3459e7e4838fSBram Moolenaar 'enddef', 3460e7e4838fSBram Moolenaar ]) 3461e7e4838fSBram Moolenaar CheckScriptFailure([ 3462e7e4838fSBram Moolenaar 'func Test() # comment', 3463e7e4838fSBram Moolenaar 'endfunc', 3464e7e4838fSBram Moolenaar ], 'E488:') 34650f37e356SBram Moolenaar 34660f37e356SBram Moolenaar var lines =<< trim END 34670f37e356SBram Moolenaar vim9script 34680f37e356SBram Moolenaar syn region Text 34690f37e356SBram Moolenaar \ start='foo' 34700f37e356SBram Moolenaar #\ comment 34710f37e356SBram Moolenaar \ end='bar' 34725072b47aSBram Moolenaar syn region Text start='foo' 34735072b47aSBram Moolenaar #\ comment 34745072b47aSBram Moolenaar \ end='bar' 34750f37e356SBram Moolenaar END 34760f37e356SBram Moolenaar CheckScriptSuccess(lines) 34770f37e356SBram Moolenaar 34780f37e356SBram Moolenaar lines =<< trim END 34790f37e356SBram Moolenaar vim9script 34800f37e356SBram Moolenaar syn region Text 34810f37e356SBram Moolenaar \ start='foo' 34820f37e356SBram Moolenaar "\ comment 34830f37e356SBram Moolenaar \ end='bar' 34840f37e356SBram Moolenaar END 34850f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 34862c5ed4e3SBram Moolenaarenddef 34872c5ed4e3SBram Moolenaar 34882c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 34892c5ed4e3SBram Moolenaar CheckCanRunGui 34902c5ed4e3SBram Moolenaar 34912c5ed4e3SBram Moolenaar CheckScriptFailure([ 34922c5ed4e3SBram Moolenaar 'vim9script', 34932c5ed4e3SBram Moolenaar 'gui#comment' 3494f8103f27SBram Moolenaar ], 'E1144:') 34952c5ed4e3SBram Moolenaar CheckScriptFailure([ 34962c5ed4e3SBram Moolenaar 'vim9script', 34972c5ed4e3SBram Moolenaar 'gui -f#comment' 3498*b8bd2e6eSBram Moolenaar ], 'E194:') 34997a092245SBram Moolenaarenddef 35007a092245SBram Moolenaar 3501a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 35026797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 35036797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3504a26b9700SBram Moolenaar 3505a26b9700SBram Moolenaar edit test.vim 3506a26b9700SBram Moolenaar doautocmd TabEnter #comment 3507a26b9700SBram Moolenaar assert_equal(1, g:entered) 3508a26b9700SBram Moolenaar 3509a26b9700SBram Moolenaar doautocmd TabEnter f.x 3510a26b9700SBram Moolenaar assert_equal(2, g:entered) 3511a26b9700SBram Moolenaar 3512a26b9700SBram Moolenaar g:entered = 0 3513a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3514a26b9700SBram Moolenaar assert_equal(2, g:entered) 3515a26b9700SBram Moolenaar 3516a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3517a26b9700SBram Moolenaar 3518a26b9700SBram Moolenaar au! TabEnter 3519a26b9700SBram Moolenaar unlet g:entered 3520d72c1bf0SBram Moolenaar 3521d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3522d72c1bf0SBram Moolenaar 'vim9script', 35236797966dSBram Moolenaar 'g:var = 123', 3524e55b1c09SBram Moolenaar 'b:var = 456', 3525e55b1c09SBram Moolenaar 'w:var = 777', 3526e55b1c09SBram Moolenaar 't:var = 888', 3527d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3528d72c1bf0SBram Moolenaar ]) 3529d72c1bf0SBram Moolenaar 3530d72c1bf0SBram Moolenaar CheckScriptFailure([ 3531d72c1bf0SBram Moolenaar 'vim9script', 3532cfcd011fSBram Moolenaar 'let var = 123', 3533cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3534cfcd011fSBram Moolenaar 3535cfcd011fSBram Moolenaar CheckScriptFailure([ 3536cfcd011fSBram Moolenaar 'vim9script', 3537cfcd011fSBram Moolenaar 'var g:var = 123', 3538e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3539e55b1c09SBram Moolenaar 3540e55b1c09SBram Moolenaar CheckScriptFailure([ 3541e55b1c09SBram Moolenaar 'vim9script', 3542cfcd011fSBram Moolenaar 'var b:var = 123', 3543e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3544e55b1c09SBram Moolenaar 3545e55b1c09SBram Moolenaar CheckScriptFailure([ 3546e55b1c09SBram Moolenaar 'vim9script', 3547cfcd011fSBram Moolenaar 'var w:var = 123', 3548e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3549e55b1c09SBram Moolenaar 3550e55b1c09SBram Moolenaar CheckScriptFailure([ 3551e55b1c09SBram Moolenaar 'vim9script', 3552cfcd011fSBram Moolenaar 'var t:var = 123', 3553e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3554e55b1c09SBram Moolenaar 3555e55b1c09SBram Moolenaar CheckScriptFailure([ 3556e55b1c09SBram Moolenaar 'vim9script', 3557cfcd011fSBram Moolenaar 'var v:version = 123', 3558e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3559e55b1c09SBram Moolenaar 3560e55b1c09SBram Moolenaar CheckScriptFailure([ 3561e55b1c09SBram Moolenaar 'vim9script', 3562cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3563e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 35646797966dSBram Moolenaar 35656797966dSBram Moolenaar CheckScriptFailure([ 35666797966dSBram Moolenaar 'vim9script', 35676797966dSBram Moolenaar 'g:var = 123', 356832e35117SBram Moolenaar 'unlet g:var# comment1', 3569d72c1bf0SBram Moolenaar ], 'E108:') 3570d72c1bf0SBram Moolenaar 3571d72c1bf0SBram Moolenaar CheckScriptFailure([ 3572d72c1bf0SBram Moolenaar 'let g:var = 123', 3573d72c1bf0SBram Moolenaar 'unlet g:var # something', 3574d72c1bf0SBram Moolenaar ], 'E488:') 3575faac4104SBram Moolenaar 3576faac4104SBram Moolenaar CheckScriptSuccess([ 3577faac4104SBram Moolenaar 'vim9script', 357832e35117SBram Moolenaar 'if 1 # comment2', 3579faac4104SBram Moolenaar ' echo "yes"', 3580faac4104SBram Moolenaar 'elseif 2 #comment', 3581faac4104SBram Moolenaar ' echo "no"', 3582faac4104SBram Moolenaar 'endif', 3583faac4104SBram Moolenaar ]) 3584faac4104SBram Moolenaar 3585faac4104SBram Moolenaar CheckScriptFailure([ 3586faac4104SBram Moolenaar 'vim9script', 358732e35117SBram Moolenaar 'if 1# comment3', 3588faac4104SBram Moolenaar ' echo "yes"', 3589faac4104SBram Moolenaar 'endif', 3590fae55a9cSBram Moolenaar ], 'E488:') 3591faac4104SBram Moolenaar 3592faac4104SBram Moolenaar CheckScriptFailure([ 3593faac4104SBram Moolenaar 'vim9script', 359432e35117SBram Moolenaar 'if 0 # comment4', 3595faac4104SBram Moolenaar ' echo "yes"', 3596faac4104SBram Moolenaar 'elseif 2#comment', 3597faac4104SBram Moolenaar ' echo "no"', 3598faac4104SBram Moolenaar 'endif', 3599fae55a9cSBram Moolenaar ], 'E488:') 3600faac4104SBram Moolenaar 3601faac4104SBram Moolenaar CheckScriptSuccess([ 3602faac4104SBram Moolenaar 'vim9script', 3603cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3604faac4104SBram Moolenaar ]) 3605faac4104SBram Moolenaar 3606faac4104SBram Moolenaar CheckScriptFailure([ 3607faac4104SBram Moolenaar 'vim9script', 3608cfcd011fSBram Moolenaar 'var v = 1# comment6', 3609fae55a9cSBram Moolenaar ], 'E488:') 3610faac4104SBram Moolenaar 3611faac4104SBram Moolenaar CheckScriptSuccess([ 3612faac4104SBram Moolenaar 'vim9script', 3613faac4104SBram Moolenaar 'new' 3614d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3615df069eecSBram Moolenaar ':$', 3616faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3617faac4104SBram Moolenaar 'bwipe!', 3618faac4104SBram Moolenaar ]) 3619faac4104SBram Moolenaar 3620f5be8cdbSBram Moolenaar CheckScriptFailure([ 3621f5be8cdbSBram Moolenaar 'vim9script', 3622f5be8cdbSBram Moolenaar 'new' 3623d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3624f5be8cdbSBram Moolenaar ':$', 3625f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3626f5be8cdbSBram Moolenaar 'bwipe!', 3627f5be8cdbSBram Moolenaar ], 'E488:') 3628f5be8cdbSBram Moolenaar 3629f5be8cdbSBram Moolenaar CheckScriptFailure([ 3630f5be8cdbSBram Moolenaar 'vim9script', 3631f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3632f5be8cdbSBram Moolenaar ], 'E477:') 3633a26b9700SBram Moolenaarenddef 3634a26b9700SBram Moolenaar 36357e5bd91dSBram Moolenaardef Test_finish() 3636cfcd011fSBram Moolenaar var lines =<< trim END 36377e5bd91dSBram Moolenaar vim9script 36386797966dSBram Moolenaar g:res = 'one' 36397e5bd91dSBram Moolenaar if v:false | finish | endif 36406797966dSBram Moolenaar g:res = 'two' 36417e5bd91dSBram Moolenaar finish 36426797966dSBram Moolenaar g:res = 'three' 36437e5bd91dSBram Moolenaar END 36447e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 36457e5bd91dSBram Moolenaar source Xfinished 36467e5bd91dSBram Moolenaar assert_equal('two', g:res) 36477e5bd91dSBram Moolenaar 36487e5bd91dSBram Moolenaar unlet g:res 36497e5bd91dSBram Moolenaar delete('Xfinished') 36507e5bd91dSBram Moolenaarenddef 36517e5bd91dSBram Moolenaar 3652a5d0077eSBram Moolenaardef Test_forward_declaration() 3653cfcd011fSBram Moolenaar var lines =<< trim END 3654a5d0077eSBram Moolenaar vim9script 3655a5d0077eSBram Moolenaar def GetValue(): string 3656a5d0077eSBram Moolenaar return theVal 3657a5d0077eSBram Moolenaar enddef 3658cfcd011fSBram Moolenaar var theVal = 'something' 3659822ba247SBram Moolenaar g:initVal = GetValue() 3660a5d0077eSBram Moolenaar theVal = 'else' 3661a5d0077eSBram Moolenaar g:laterVal = GetValue() 3662a5d0077eSBram Moolenaar END 3663a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3664a5d0077eSBram Moolenaar source Xforward 3665a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3666a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3667a5d0077eSBram Moolenaar 3668a5d0077eSBram Moolenaar unlet g:initVal 3669a5d0077eSBram Moolenaar unlet g:laterVal 3670a5d0077eSBram Moolenaar delete('Xforward') 3671a5d0077eSBram Moolenaarenddef 3672a5d0077eSBram Moolenaar 36739721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3674a6294955SBram Moolenaar var vim9_lines =<< trim END 3675a6294955SBram Moolenaar vim9script 3676a6294955SBram Moolenaar var local = 'local' 3677a6294955SBram Moolenaar g:global = 'global' 3678a6294955SBram Moolenaar export var exported = 'exported' 3679a6294955SBram Moolenaar export def GetText(): string 3680a6294955SBram Moolenaar return 'text' 3681a6294955SBram Moolenaar enddef 3682a6294955SBram Moolenaar END 3683a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3684a6294955SBram Moolenaar 3685cfcd011fSBram Moolenaar var legacy_lines =<< trim END 36869721fb4eSBram Moolenaar source Xvim9_script.vim 36879721fb4eSBram Moolenaar 36889721fb4eSBram Moolenaar call assert_false(exists('local')) 36899721fb4eSBram Moolenaar call assert_false(exists('exported')) 36909721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 36919721fb4eSBram Moolenaar call assert_equal('global', global) 36929721fb4eSBram Moolenaar call assert_equal('global', g:global) 36939721fb4eSBram Moolenaar 36949721fb4eSBram Moolenaar " imported variable becomes script-local 36959721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 36969721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 36979721fb4eSBram Moolenaar call assert_false(exists('exported')) 36989721fb4eSBram Moolenaar 36999721fb4eSBram Moolenaar " imported function becomes script-local 37009721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 37019721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 37029721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 37039721fb4eSBram Moolenaar END 37049721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 37059721fb4eSBram Moolenaar 37069721fb4eSBram Moolenaar source Xlegacy_script.vim 37079721fb4eSBram Moolenaar assert_equal('global', g:global) 3708f5be8cdbSBram Moolenaar unlet g:global 37099721fb4eSBram Moolenaar 37109721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 37119721fb4eSBram Moolenaar delete('Xvim9_script.vim') 37129721fb4eSBram Moolenaarenddef 3713a5d0077eSBram Moolenaar 3714e535db86SBram Moolenaardef Test_declare_script_in_func() 3715e535db86SBram Moolenaar var lines =<< trim END 3716e535db86SBram Moolenaar vim9script 3717e535db86SBram Moolenaar func Declare() 3718e535db86SBram Moolenaar let s:local = 123 3719e535db86SBram Moolenaar endfunc 3720e535db86SBram Moolenaar Declare() 3721e535db86SBram Moolenaar assert_equal(123, local) 3722e535db86SBram Moolenaar 3723e535db86SBram Moolenaar var error: string 3724e535db86SBram Moolenaar try 3725e535db86SBram Moolenaar local = 'asdf' 3726e535db86SBram Moolenaar catch 3727e535db86SBram Moolenaar error = v:exception 3728e535db86SBram Moolenaar endtry 3729e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3730e535db86SBram Moolenaar 3731e535db86SBram Moolenaar lockvar local 3732e535db86SBram Moolenaar try 3733e535db86SBram Moolenaar local = 999 3734e535db86SBram Moolenaar catch 3735e535db86SBram Moolenaar error = v:exception 3736e535db86SBram Moolenaar endtry 3737e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3738e535db86SBram Moolenaar END 3739e535db86SBram Moolenaar CheckScriptSuccess(lines) 3740e535db86SBram Moolenaarenddef 3741e535db86SBram Moolenaar 3742e535db86SBram Moolenaar 37437d699701SBram Moolenaarfunc Test_vim9script_not_global() 37447d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 37457d699701SBram Moolenaar let vim9lines =<< trim END 37467d699701SBram Moolenaar vim9script 3747cfcd011fSBram Moolenaar var name = 'local' 37487d699701SBram Moolenaar func TheFunc() 37497d699701SBram Moolenaar echo 'local' 37507d699701SBram Moolenaar endfunc 37517d699701SBram Moolenaar def DefFunc() 37527d699701SBram Moolenaar echo 'local' 37537d699701SBram Moolenaar enddef 37547d699701SBram Moolenaar END 37557d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 37567d699701SBram Moolenaar source Xvim9script.vim 37577d699701SBram Moolenaar try 37587d699701SBram Moolenaar echo g:var 37597d699701SBram Moolenaar assert_report('did not fail') 37607d699701SBram Moolenaar catch /E121:/ 37617d699701SBram Moolenaar " caught 37627d699701SBram Moolenaar endtry 37637d699701SBram Moolenaar try 37647d699701SBram Moolenaar call TheFunc() 37657d699701SBram Moolenaar assert_report('did not fail') 37667d699701SBram Moolenaar catch /E117:/ 37677d699701SBram Moolenaar " caught 37687d699701SBram Moolenaar endtry 37697d699701SBram Moolenaar try 37707d699701SBram Moolenaar call DefFunc() 37717d699701SBram Moolenaar assert_report('did not fail') 37727d699701SBram Moolenaar catch /E117:/ 37737d699701SBram Moolenaar " caught 37747d699701SBram Moolenaar endtry 37757d699701SBram Moolenaar 377625859dd7SBram Moolenaar call delete('Xvim9script.vim') 37777d699701SBram Moolenaarendfunc 37787d699701SBram Moolenaar 3779eeb27bfeSBram Moolenaardef Test_vim9_copen() 3780eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3781eeb27bfeSBram Moolenaar copen 3782eeb27bfeSBram Moolenaar quit 3783eeb27bfeSBram Moolenaarenddef 3784eeb27bfeSBram Moolenaar 378503290b84SBram Moolenaar" test using an auto-loaded function and variable 37862d6b20d6SBram Moolenaardef Test_vim9_autoload() 3787cfcd011fSBram Moolenaar var lines =<< trim END 37882d6b20d6SBram Moolenaar vim9script 378903290b84SBram Moolenaar def some#gettest(): string 379003290b84SBram Moolenaar return 'test' 379103290b84SBram Moolenaar enddef 379203290b84SBram Moolenaar g:some#name = 'name' 3793227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3794e3ffcd99SBram Moolenaar 3795e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3796e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3797e3ffcd99SBram Moolenaar enddef 379803290b84SBram Moolenaar END 379903290b84SBram Moolenaar 380003290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 380103290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 380203290b84SBram Moolenaar var save_rtp = &rtp 380303290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 380403290b84SBram Moolenaar 380503290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 380603290b84SBram Moolenaar assert_equal('name', g:some#name) 3807227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 380803290b84SBram Moolenaar g:some#other = 'other' 380903290b84SBram Moolenaar assert_equal('other', g:some#other) 381003290b84SBram Moolenaar 3811e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3812e3ffcd99SBram Moolenaar 381317f700acSBram Moolenaar # upper case script name works 381417f700acSBram Moolenaar lines =<< trim END 381517f700acSBram Moolenaar vim9script 381617f700acSBram Moolenaar def Other#getOther(): string 381717f700acSBram Moolenaar return 'other' 381817f700acSBram Moolenaar enddef 381917f700acSBram Moolenaar END 382017f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 382117f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 382217f700acSBram Moolenaar 382303290b84SBram Moolenaar delete('Xdir', 'rf') 382403290b84SBram Moolenaar &rtp = save_rtp 382503290b84SBram Moolenaarenddef 382603290b84SBram Moolenaar 382703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 382803290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 382903290b84SBram Moolenaar var lines =<< trim END 383003290b84SBram Moolenaar vim9script 38312d6b20d6SBram Moolenaar def foo#test() 38322d6b20d6SBram Moolenaar echomsg getreg('"') 38332d6b20d6SBram Moolenaar enddef 38342d6b20d6SBram Moolenaar END 38352d6b20d6SBram Moolenaar 38362d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 38372d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3838cfcd011fSBram Moolenaar var save_rtp = &rtp 38392d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 38402d6b20d6SBram Moolenaar augroup test 38412d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 38422d6b20d6SBram Moolenaar augroup END 38432d6b20d6SBram Moolenaar 38442d6b20d6SBram Moolenaar normal Y 38452d6b20d6SBram Moolenaar 38462d6b20d6SBram Moolenaar augroup test 38472d6b20d6SBram Moolenaar autocmd! 38482d6b20d6SBram Moolenaar augroup END 38492d6b20d6SBram Moolenaar delete('Xdir', 'rf') 38502d6b20d6SBram Moolenaar &rtp = save_rtp 38512d6b20d6SBram Moolenaarenddef 38522d6b20d6SBram Moolenaar 385377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 385477e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3855cfcd011fSBram Moolenaar var lines =<< trim END 385677e5dcc3SBram Moolenaar vim9script 385777e5dcc3SBram Moolenaar def crash#func() 385877e5dcc3SBram Moolenaar try 385977e5dcc3SBram Moolenaar for x in List() 386077e5dcc3SBram Moolenaar endfor 386177e5dcc3SBram Moolenaar catch 386277e5dcc3SBram Moolenaar endtry 386377e5dcc3SBram Moolenaar g:ok = true 386477e5dcc3SBram Moolenaar enddef 386577e5dcc3SBram Moolenaar fu List() 386677e5dcc3SBram Moolenaar invalid 386777e5dcc3SBram Moolenaar endfu 386877e5dcc3SBram Moolenaar try 386948e11c10SBram Moolenaar alsoinvalid 387077e5dcc3SBram Moolenaar catch /wontmatch/ 387177e5dcc3SBram Moolenaar endtry 387277e5dcc3SBram Moolenaar END 387377e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 387477e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 387577e5dcc3SBram Moolenaar 387677e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 387777e5dcc3SBram Moolenaar lines =<< trim END 387877e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 387977e5dcc3SBram Moolenaar call crash#func() 388077e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 38819c4f5520SBram Moolenaar qall! 388277e5dcc3SBram Moolenaar END 388377e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 388477e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 388577e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 388677e5dcc3SBram Moolenaar 388777e5dcc3SBram Moolenaar delete('Xdidit') 388877e5dcc3SBram Moolenaar delete('Xscript') 388977e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 389003290b84SBram Moolenaar 389103290b84SBram Moolenaar lines =<< trim END 389203290b84SBram Moolenaar vim9script 389303290b84SBram Moolenaar var foo#bar = 'asdf' 389403290b84SBram Moolenaar END 389503290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 389677e5dcc3SBram Moolenaarenddef 389777e5dcc3SBram Moolenaar 389881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 389981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 390081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3901cfcd011fSBram Moolenaar var lines =<< trim END 390281e17fbeSBram Moolenaar let s:counter = 1 390381e17fbeSBram Moolenaar def s:Func() 390481e17fbeSBram Moolenaar au! CursorHold 390581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 390681e17fbeSBram Moolenaar enddef 390781e17fbeSBram Moolenaar call s:Func() 390881e17fbeSBram Moolenaar doau CursorHold 390981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 391081e17fbeSBram Moolenaar au! CursorHold 391181e17fbeSBram Moolenaar END 391281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 391381e17fbeSBram Moolenaarenddef 391481e17fbeSBram Moolenaar 3915b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3916b5841b99SBram Moolenaar var save_rtp = &rtp 3917b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3918b5841b99SBram Moolenaar &rtp = dir 3919b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 3920b5841b99SBram Moolenaar 3921b5841b99SBram Moolenaar var lines =<< trim END 3922b5841b99SBram Moolenaar vim9script noclear 3923b5841b99SBram Moolenaar def script#autoloaded() 3924b5841b99SBram Moolenaar enddef 3925b5841b99SBram Moolenaar def Broken() 3926b5841b99SBram Moolenaar var x: any = '' 3927b5841b99SBram Moolenaar eval x != 0 3928b5841b99SBram Moolenaar enddef 3929b5841b99SBram Moolenaar Broken() 3930b5841b99SBram Moolenaar END 3931b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 3932b5841b99SBram Moolenaar 3933b5841b99SBram Moolenaar lines =<< trim END 3934b5841b99SBram Moolenaar vim9script 3935b5841b99SBram Moolenaar def CallAutoloaded() 3936b5841b99SBram Moolenaar script#autoloaded() 3937b5841b99SBram Moolenaar enddef 3938b5841b99SBram Moolenaar 3939b5841b99SBram Moolenaar function Legacy() 3940b5841b99SBram Moolenaar try 3941b5841b99SBram Moolenaar call s:CallAutoloaded() 3942b5841b99SBram Moolenaar catch 3943b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 3944b5841b99SBram Moolenaar endtry 3945b5841b99SBram Moolenaar endfunction 3946b5841b99SBram Moolenaar 3947b5841b99SBram Moolenaar Legacy() 3948b5841b99SBram Moolenaar END 3949b5841b99SBram Moolenaar CheckScriptSuccess(lines) 3950b5841b99SBram Moolenaar 3951b5841b99SBram Moolenaar &rtp = save_rtp 3952b5841b99SBram Moolenaar delete(dir, 'rf') 3953b5841b99SBram Moolenaarenddef 3954b5841b99SBram Moolenaar 39553896a105SBram Moolenaardef Test_cmdline_win() 39563896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 39573896a105SBram Moolenaar # the command line window. 39583896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 3959cfcd011fSBram Moolenaar var export_lines =<< trim END 39603896a105SBram Moolenaar vim9script 3961cfcd011fSBram Moolenaar export var That = 'yes' 39623896a105SBram Moolenaar END 39633896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 3964cfcd011fSBram Moolenaar var import_lines =<< trim END 39653896a105SBram Moolenaar vim9script 39663896a105SBram Moolenaar import That from './Xexport.vim' 39673896a105SBram Moolenaar END 39683896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 3969cfcd011fSBram Moolenaar var save_rtp = &rtp 39703896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 39713896a105SBram Moolenaar syntax on 39723896a105SBram Moolenaar augroup CmdWin 39733896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 39743896a105SBram Moolenaar augroup END 39753896a105SBram Moolenaar # this will open and also close the cmdline window 39763896a105SBram Moolenaar feedkeys('q:', 'xt') 39773896a105SBram Moolenaar assert_equal('yes', g:got_there) 39783896a105SBram Moolenaar 39793896a105SBram Moolenaar augroup CmdWin 39803896a105SBram Moolenaar au! 39813896a105SBram Moolenaar augroup END 39823896a105SBram Moolenaar &rtp = save_rtp 39833896a105SBram Moolenaar delete('rtp', 'rf') 39843896a105SBram Moolenaarenddef 39853896a105SBram Moolenaar 3986e3d4685fSBram Moolenaardef Test_invalid_sid() 3987e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 398825859dd7SBram Moolenaar 39899c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 3990d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 3991e3d4685fSBram Moolenaar endif 3992e3d4685fSBram Moolenaar delete('Xdidit') 3993e3d4685fSBram Moolenaarenddef 3994e3d4685fSBram Moolenaar 39959ec7026fSBram Moolenaardef Test_restoring_cpo() 39969ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 39979ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 39989ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 39999ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 40009ec7026fSBram Moolenaar endif 40019ec7026fSBram Moolenaar delete('Xsourced') 40029ec7026fSBram Moolenaar delete('Xclose') 4003090728adSBram Moolenaar delete('Xdone') 40040123cc1eSBram Moolenaar 40050123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 40060123cc1eSBram Moolenaar set cpo=aABceFsMny> 40070123cc1eSBram Moolenaar edit XanotherScript 40080123cc1eSBram Moolenaar so % 40090123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 40100123cc1eSBram Moolenaar :1del 40110123cc1eSBram Moolenaar w 40120123cc1eSBram Moolenaar so % 40130123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 40140123cc1eSBram Moolenaar 40150123cc1eSBram Moolenaar delete('XanotherScript') 40160123cc1eSBram Moolenaar set cpo&vim 40179ec7026fSBram Moolenaarenddef 40189ec7026fSBram Moolenaar 4019ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 4020ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 402137294bd6SBram Moolenaar CheckScreendump 4022ffb7dcdbSBram Moolenaar CheckFeature timers 402337294bd6SBram Moolenaar 4024ffb7dcdbSBram Moolenaar let lines =<< trim END 402537294bd6SBram Moolenaar vim9script 402637294bd6SBram Moolenaar def script#func() 402737294bd6SBram Moolenaar enddef 402837294bd6SBram Moolenaar END 4029ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 4030ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 403137294bd6SBram Moolenaar 4032ffb7dcdbSBram Moolenaar let lines =<< trim END 403337294bd6SBram Moolenaar vim9script 403437294bd6SBram Moolenaar set cpo+=M 403537294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 4036767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 403737294bd6SBram Moolenaar setline(1, 'some text') 403837294bd6SBram Moolenaar END 4039ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 4040ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 4041ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 4042ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 404337294bd6SBram Moolenaar 4044ffb7dcdbSBram Moolenaar " clean up 4045ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 4046ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 4047ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 4048ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 4049ffb7dcdbSBram Moolenaarendfunc 405037294bd6SBram Moolenaar 40519ec7026fSBram Moolenaar 4052f0afd9e1SBram Moolenaardef Test_unset_any_variable() 4053cfcd011fSBram Moolenaar var lines =<< trim END 4054cfcd011fSBram Moolenaar var name: any 4055cfcd011fSBram Moolenaar assert_equal(0, name) 4056f0afd9e1SBram Moolenaar END 4057f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 4058f0afd9e1SBram Moolenaarenddef 4059f0afd9e1SBram Moolenaar 40607e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 406158dbef33SBram Moolenaar CheckRunVimInTerminal 406258dbef33SBram Moolenaar 40637e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 40647e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 40657e9210eaSBram Moolenaarendfunc 40667e9210eaSBram Moolenaar 40677e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 40689c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 4069cfcd011fSBram Moolenaar var lines =<< trim END 40709c4f5520SBram Moolenaar func CheckAndQuit() 40719c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 40729c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 40739c4f5520SBram Moolenaar endfunc 40749c4f5520SBram Moolenaar END 40759c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 40769c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 4077e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 40789c4f5520SBram Moolenaar # define Afunc() on the command line 40799c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 40809c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 40812949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 40829c4f5520SBram Moolenaar 40839c4f5520SBram Moolenaar call StopVimInTerminal(buf) 40849c4f5520SBram Moolenaar delete('XcallFunc') 40859c4f5520SBram Moolenaar delete('Xdidcmd') 40869c4f5520SBram Moolenaarenddef 40879c4f5520SBram Moolenaar 4088fcdc5d83SBram Moolenaardef Test_script_var_scope() 4089fcdc5d83SBram Moolenaar var lines =<< trim END 4090fcdc5d83SBram Moolenaar vim9script 4091fcdc5d83SBram Moolenaar if true 4092fcdc5d83SBram Moolenaar if true 4093fcdc5d83SBram Moolenaar var one = 'one' 4094fcdc5d83SBram Moolenaar echo one 4095fcdc5d83SBram Moolenaar endif 4096fcdc5d83SBram Moolenaar echo one 4097fcdc5d83SBram Moolenaar endif 4098fcdc5d83SBram Moolenaar END 4099fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4100fcdc5d83SBram Moolenaar 4101fcdc5d83SBram Moolenaar lines =<< trim END 4102fcdc5d83SBram Moolenaar vim9script 4103fcdc5d83SBram Moolenaar if true 4104fcdc5d83SBram Moolenaar if false 4105fcdc5d83SBram Moolenaar var one = 'one' 4106fcdc5d83SBram Moolenaar echo one 4107fcdc5d83SBram Moolenaar else 4108fcdc5d83SBram Moolenaar var one = 'one' 4109fcdc5d83SBram Moolenaar echo one 4110fcdc5d83SBram Moolenaar endif 4111fcdc5d83SBram Moolenaar echo one 4112fcdc5d83SBram Moolenaar endif 4113fcdc5d83SBram Moolenaar END 4114fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4115fcdc5d83SBram Moolenaar 4116fcdc5d83SBram Moolenaar lines =<< trim END 4117fcdc5d83SBram Moolenaar vim9script 4118fcdc5d83SBram Moolenaar while true 4119fcdc5d83SBram Moolenaar var one = 'one' 4120fcdc5d83SBram Moolenaar echo one 4121fcdc5d83SBram Moolenaar break 4122fcdc5d83SBram Moolenaar endwhile 4123fcdc5d83SBram Moolenaar echo one 4124fcdc5d83SBram Moolenaar END 4125fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4126fcdc5d83SBram Moolenaar 4127fcdc5d83SBram Moolenaar lines =<< trim END 4128fcdc5d83SBram Moolenaar vim9script 4129fcdc5d83SBram Moolenaar for i in range(1) 4130fcdc5d83SBram Moolenaar var one = 'one' 4131fcdc5d83SBram Moolenaar echo one 4132fcdc5d83SBram Moolenaar endfor 4133fcdc5d83SBram Moolenaar echo one 4134fcdc5d83SBram Moolenaar END 4135fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 41369becdf2bSBram Moolenaar 41379becdf2bSBram Moolenaar lines =<< trim END 41389becdf2bSBram Moolenaar vim9script 41399becdf2bSBram Moolenaar { 41409becdf2bSBram Moolenaar var one = 'one' 41419becdf2bSBram Moolenaar assert_equal('one', one) 41429becdf2bSBram Moolenaar } 41439becdf2bSBram Moolenaar assert_false(exists('one')) 41449becdf2bSBram Moolenaar assert_false(exists('s:one')) 41459becdf2bSBram Moolenaar END 41469becdf2bSBram Moolenaar CheckScriptSuccess(lines) 41479becdf2bSBram Moolenaar 41489becdf2bSBram Moolenaar lines =<< trim END 41499becdf2bSBram Moolenaar vim9script 41509becdf2bSBram Moolenaar { 41519becdf2bSBram Moolenaar var one = 'one' 41529becdf2bSBram Moolenaar echo one 41539becdf2bSBram Moolenaar } 41549becdf2bSBram Moolenaar echo one 41559becdf2bSBram Moolenaar END 41569becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4157fcdc5d83SBram Moolenaarenddef 4158fcdc5d83SBram Moolenaar 4159352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4160352134bbSBram Moolenaar var lines =<< trim END 4161352134bbSBram Moolenaar vim9script 41622a38908bSBram Moolenaar def Callback(...l: list<any>) 4163352134bbSBram Moolenaar try 4164352134bbSBram Moolenaar var x: string 4165352134bbSBram Moolenaar var y: string 4166352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4167352134bbSBram Moolenaar [x, y] = [''] 4168352134bbSBram Moolenaar catch 4169352134bbSBram Moolenaar g:caught = 'yes' 4170352134bbSBram Moolenaar endtry 4171352134bbSBram Moolenaar enddef 4172e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4173352134bbSBram Moolenaar feedkeys("\r", 'xt') 4174352134bbSBram Moolenaar END 4175352134bbSBram Moolenaar CheckScriptSuccess(lines) 4176352134bbSBram Moolenaar 4177352134bbSBram Moolenaar unlet g:caught 4178352134bbSBram Moolenaarenddef 4179352134bbSBram Moolenaar 4180631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4181631e8f93SBram Moolenaar if !has('unix') || !has('job') 4182631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4183631e8f93SBram Moolenaar endif 4184631e8f93SBram Moolenaar var lines =<< trim END 4185631e8f93SBram Moolenaar vim9script 4186631e8f93SBram Moolenaar var source: list<number> 41872a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4188631e8f93SBram Moolenaar eval [][0] 4189631e8f93SBram Moolenaar enddef 41902a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4191631e8f93SBram Moolenaar sleep 1m 4192631e8f93SBram Moolenaar source += l 4193631e8f93SBram Moolenaar enddef 4194e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 41956f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 41966f17a3f0SBram Moolenaar sleep 10m 41976f17a3f0SBram Moolenaar endwhile 4198206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4199fe95b94fSBram Moolenaar sleep 200m 4200631e8f93SBram Moolenaar END 4201631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4202631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4203631e8f93SBram Moolenaar delete('Xdef') 4204631e8f93SBram Moolenaarenddef 4205631e8f93SBram Moolenaar 42064324d87aSBram Moolenaardef InvokeNormal() 42074324d87aSBram Moolenaar exe "norm! :m+1\r" 42084324d87aSBram Moolenaarenddef 42094324d87aSBram Moolenaar 42104324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 42114324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 42124324d87aSBram Moolenaar new 42134324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 42144324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 42154324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 42164324d87aSBram Moolenaar xunmap <F3> 4217b5b9480eSBram Moolenaarenddef 4218b5b9480eSBram Moolenaar 4219b5b9480eSBram Moolenaardef Test_white_space_after_command() 4220b5b9480eSBram Moolenaar var lines =<< trim END 4221b5b9480eSBram Moolenaar exit_cb: Func}) 4222b5b9480eSBram Moolenaar END 4223b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4224f8103f27SBram Moolenaar 4225f8103f27SBram Moolenaar lines =<< trim END 4226f8103f27SBram Moolenaar e# 4227f8103f27SBram Moolenaar END 4228f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 42294324d87aSBram Moolenaarenddef 42304324d87aSBram Moolenaar 42314aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 42324aab88d9SBram Moolenaar var lines =<< trim END 42334aab88d9SBram Moolenaar vim9script 42344aab88d9SBram Moolenaar if exists('g:guard') 42354aab88d9SBram Moolenaar finish 42364aab88d9SBram Moolenaar endif 42374aab88d9SBram Moolenaar g:guard = 1 42384aab88d9SBram Moolenaar var name = 'thename' 42394aab88d9SBram Moolenaar def g:GetName(): string 42404aab88d9SBram Moolenaar return name 42414aab88d9SBram Moolenaar enddef 42424aab88d9SBram Moolenaar def g:SetName(arg: string) 42434aab88d9SBram Moolenaar name = arg 42444aab88d9SBram Moolenaar enddef 42454aab88d9SBram Moolenaar END 42464aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 42474aab88d9SBram Moolenaar so XscriptTwice.vim 42484aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 42494aab88d9SBram Moolenaar g:SetName('newname') 42504aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 42514aab88d9SBram Moolenaar so XscriptTwice.vim 42524aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 42534aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 42544aab88d9SBram Moolenaar 42554aab88d9SBram Moolenaar delfunc g:GetName 42564aab88d9SBram Moolenaar delfunc g:SetName 42574aab88d9SBram Moolenaar delete('XscriptTwice.vim') 42584aab88d9SBram Moolenaar unlet g:guard 42594aab88d9SBram Moolenaarenddef 42604aab88d9SBram Moolenaar 42614aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 42624aab88d9SBram Moolenaar var exportlines =<< trim END 42634aab88d9SBram Moolenaar vim9script 42644aab88d9SBram Moolenaar if exists('g:guard') 42654aab88d9SBram Moolenaar finish 42664aab88d9SBram Moolenaar endif 42674aab88d9SBram Moolenaar g:guard = 1 42684aab88d9SBram Moolenaar export var name = 'someName' 42694aab88d9SBram Moolenaar END 42704aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 42714aab88d9SBram Moolenaar 42724aab88d9SBram Moolenaar var lines =<< trim END 42734aab88d9SBram Moolenaar vim9script 42744aab88d9SBram Moolenaar import name from './XexportScript.vim' 42754aab88d9SBram Moolenaar def g:GetName(): string 42764aab88d9SBram Moolenaar return name 42774aab88d9SBram Moolenaar enddef 42784aab88d9SBram Moolenaar END 42794aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 42804aab88d9SBram Moolenaar so XscriptImport.vim 42814aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 42824aab88d9SBram Moolenaar 42834aab88d9SBram Moolenaar so XexportScript.vim 42844aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 42854aab88d9SBram Moolenaar 42864aab88d9SBram Moolenaar delfunc g:GetName 42874aab88d9SBram Moolenaar delete('XexportScript.vim') 42884aab88d9SBram Moolenaar delete('XscriptImport.vim') 42894aab88d9SBram Moolenaar unlet g:guard 42904aab88d9SBram Moolenaarenddef 42914aab88d9SBram Moolenaar 429210b9421fSBram Moolenaardef Test_unsupported_commands() 429310b9421fSBram Moolenaar var lines =<< trim END 429410b9421fSBram Moolenaar ka 429510b9421fSBram Moolenaar END 42967d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 42977d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 429810b9421fSBram Moolenaar 429910b9421fSBram Moolenaar lines =<< trim END 4300ada1d870SBram Moolenaar :1ka 4301ada1d870SBram Moolenaar END 43027d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 43037d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4304ada1d870SBram Moolenaar 4305ada1d870SBram Moolenaar lines =<< trim END 430610b9421fSBram Moolenaar t 430710b9421fSBram Moolenaar END 430810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 430910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 431010b9421fSBram Moolenaar 431110b9421fSBram Moolenaar lines =<< trim END 431210b9421fSBram Moolenaar x 431310b9421fSBram Moolenaar END 431410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 431510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 431610b9421fSBram Moolenaar 431710b9421fSBram Moolenaar lines =<< trim END 431810b9421fSBram Moolenaar xit 431910b9421fSBram Moolenaar END 432010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 432110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 432210b9421fSBram Moolenaarenddef 432310b9421fSBram Moolenaar 4324c70fe460SBram Moolenaardef Test_mapping_line_number() 4325c70fe460SBram Moolenaar var lines =<< trim END 4326c70fe460SBram Moolenaar vim9script 4327c70fe460SBram Moolenaar def g:FuncA() 4328c70fe460SBram Moolenaar # Some comment 4329c70fe460SBram Moolenaar FuncB(0) 4330c70fe460SBram Moolenaar enddef 4331c70fe460SBram Moolenaar # Some comment 4332c70fe460SBram Moolenaar def FuncB( 4333c70fe460SBram Moolenaar # Some comment 4334c70fe460SBram Moolenaar n: number 4335c70fe460SBram Moolenaar ) 4336c70fe460SBram Moolenaar exe 'nno ' 4337c70fe460SBram Moolenaar # Some comment 4338c70fe460SBram Moolenaar .. '<F3> a' 4339c70fe460SBram Moolenaar .. 'b' 4340c70fe460SBram Moolenaar .. 'c' 4341c70fe460SBram Moolenaar enddef 4342c70fe460SBram Moolenaar END 4343c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4344c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4345c70fe460SBram Moolenaar assert_match('No mapping found', res) 4346c70fe460SBram Moolenaar 4347c70fe460SBram Moolenaar g:FuncA() 4348c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4349c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4350c70fe460SBram Moolenaar 4351c70fe460SBram Moolenaar nunmap <F3> 4352c70fe460SBram Moolenaar delfunc g:FuncA 4353c70fe460SBram Moolenaarenddef 4354c70fe460SBram Moolenaar 4355deb108baSBram Moolenaardef Test_option_set() 4356deb108baSBram Moolenaar # legacy script allows for white space 4357deb108baSBram Moolenaar var lines =<< trim END 4358deb108baSBram Moolenaar set foldlevel =11 4359deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4360deb108baSBram Moolenaar END 4361deb108baSBram Moolenaar CheckScriptSuccess(lines) 4362deb108baSBram Moolenaar 4363deb108baSBram Moolenaar set foldlevel 4364deb108baSBram Moolenaar set foldlevel=12 4365deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4366deb108baSBram Moolenaar set foldlevel+=2 4367deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4368deb108baSBram Moolenaar set foldlevel-=3 4369deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4370deb108baSBram Moolenaar 4371deb108baSBram Moolenaar lines =<< trim END 4372deb108baSBram Moolenaar set foldlevel =1 4373deb108baSBram Moolenaar END 4374deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4375deb108baSBram Moolenaar 4376deb108baSBram Moolenaar lines =<< trim END 4377deb108baSBram Moolenaar set foldlevel +=1 4378deb108baSBram Moolenaar END 4379deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4380deb108baSBram Moolenaar 4381deb108baSBram Moolenaar lines =<< trim END 4382deb108baSBram Moolenaar set foldlevel ^=1 4383deb108baSBram Moolenaar END 4384deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4385deb108baSBram Moolenaar 4386deb108baSBram Moolenaar lines =<< trim END 4387deb108baSBram Moolenaar set foldlevel -=1 4388deb108baSBram Moolenaar END 4389deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4390deb108baSBram Moolenaar 4391deb108baSBram Moolenaar set foldlevel& 4392deb108baSBram Moolenaarenddef 4393deb108baSBram Moolenaar 4394208f0b48SBram Moolenaardef Test_option_modifier() 43951594f313SBram Moolenaar # legacy script allows for white space 4396208f0b48SBram Moolenaar var lines =<< trim END 4397208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4398208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4399208f0b48SBram Moolenaar END 4400208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4401208f0b48SBram Moolenaar 44021594f313SBram Moolenaar set hlsearch 44031594f313SBram Moolenaar set hlsearch! 44041594f313SBram Moolenaar assert_equal(false, &hlsearch) 44051594f313SBram Moolenaar 44061594f313SBram Moolenaar set hlsearch 4407208f0b48SBram Moolenaar set hlsearch& 44081594f313SBram Moolenaar assert_equal(false, &hlsearch) 4409208f0b48SBram Moolenaar 4410208f0b48SBram Moolenaar lines =<< trim END 44111594f313SBram Moolenaar set hlsearch & 4412208f0b48SBram Moolenaar END 44131594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 44141594f313SBram Moolenaar 44151594f313SBram Moolenaar lines =<< trim END 44161594f313SBram Moolenaar set hlsearch ! 44171594f313SBram Moolenaar END 44181594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 44191594f313SBram Moolenaar 44201594f313SBram Moolenaar set hlsearch& 4421208f0b48SBram Moolenaarenddef 4422208f0b48SBram Moolenaar 4423c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4424c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4425c03fe66aSBram Moolenaar var lines =<< trim END 4426c03fe66aSBram Moolenaar echoerr 'some' 4427c03fe66aSBram Moolenaar .. ' error' 4428c03fe66aSBram Moolenaar .. ' continued' 4429c03fe66aSBram Moolenaar END 4430c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4431c03fe66aSBram Moolenaarenddef 4432c03fe66aSBram Moolenaar 4433648594eaSBram Moolenaardef ProfiledWithLambda() 4434d9162550SBram Moolenaar var n = 3 4435d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4436d9162550SBram Moolenaarenddef 4437d9162550SBram Moolenaar 4438648594eaSBram Moolenaardef ProfiledNested() 4439648594eaSBram Moolenaar var x = 0 4440648594eaSBram Moolenaar def Nested(): any 4441648594eaSBram Moolenaar return x 4442648594eaSBram Moolenaar enddef 4443648594eaSBram Moolenaar Nested() 4444648594eaSBram Moolenaarenddef 4445648594eaSBram Moolenaar 4446ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4447ffcfddc7SBram Moolenaar var x = 0 4448ffcfddc7SBram Moolenaar def Nested(): any 4449ffcfddc7SBram Moolenaar return x 4450ffcfddc7SBram Moolenaar enddef 4451ffcfddc7SBram Moolenaar Nested() 4452ffcfddc7SBram Moolenaarenddef 4453ffcfddc7SBram Moolenaar 4454d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4455d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4456d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 44574ece152aSBram Moolenaar CheckFeature profile 44584ece152aSBram Moolenaar 4459d9162550SBram Moolenaar profile start Xprofile.log 4460648594eaSBram Moolenaar profile func ProfiledWithLambda 4461648594eaSBram Moolenaar ProfiledWithLambda() 4462ffcfddc7SBram Moolenaar 4463648594eaSBram Moolenaar profile func ProfiledNested 4464648594eaSBram Moolenaar ProfiledNested() 4465ffcfddc7SBram Moolenaar 4466ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4467ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4468ffcfddc7SBram Moolenaar profile func * 4469ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4470ffcfddc7SBram Moolenaar 4471ffcfddc7SBram Moolenaar profdel func * 4472ffcfddc7SBram Moolenaar profile pause 4473d9162550SBram Moolenaarenddef 4474d9162550SBram Moolenaar 4475585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4476585fea7bSBram Moolenaardef Test_substitute_cmd() 4477585fea7bSBram Moolenaar new 4478585fea7bSBram Moolenaar setline(1, 'something') 4479585fea7bSBram Moolenaar :substitute(some(other( 4480585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4481585fea7bSBram Moolenaar bwipe! 4482585fea7bSBram Moolenaar 4483f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4484cfcd011fSBram Moolenaar var lines =<< trim END 4485585fea7bSBram Moolenaar vim9script 4486585fea7bSBram Moolenaar new 4487585fea7bSBram Moolenaar setline(1, 'something') 4488585fea7bSBram Moolenaar :substitute(some(other( 4489585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4490585fea7bSBram Moolenaar bwipe! 4491585fea7bSBram Moolenaar END 4492585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4493585fea7bSBram Moolenaar source Xvim9lines 4494585fea7bSBram Moolenaar 4495585fea7bSBram Moolenaar delete('Xvim9lines') 4496585fea7bSBram Moolenaarenddef 4497585fea7bSBram Moolenaar 44988a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4499