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 14806853c38bSBram Moolenaardef Test_import_star_fails() 14816853c38bSBram Moolenaar writefile([], 'Xfoo.vim') 14826853c38bSBram Moolenaar var lines =<< trim END 1483*af2d5d2cSBram Moolenaar import * as foo from './Xfoo.vim' 14846853c38bSBram Moolenaar foo = 'bar' 14856853c38bSBram Moolenaar END 14866853c38bSBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1094:', 'E1236: Cannot use foo itself') 14876853c38bSBram Moolenaar lines =<< trim END 14886853c38bSBram Moolenaar vim9script 1489*af2d5d2cSBram Moolenaar import * as foo from './Xfoo.vim' 14906853c38bSBram Moolenaar var that = foo 14916853c38bSBram Moolenaar END 14926853c38bSBram Moolenaar CheckScriptFailure(lines, 'E1029: Expected ''.''') 1493*af2d5d2cSBram Moolenaar delete('Xfoo.vim') 14946853c38bSBram Moolenaarenddef 14956853c38bSBram Moolenaar 14960a84284eSBram Moolenaardef Test_import_as() 14970a84284eSBram Moolenaar var export_lines =<< trim END 14980a84284eSBram Moolenaar vim9script 14990a84284eSBram Moolenaar export var one = 1 15000a84284eSBram Moolenaar export var yes = 'yes' 1501c967d57aSBram Moolenaar export var slist: list<string> 15020a84284eSBram Moolenaar END 15030a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 15040a84284eSBram Moolenaar 15050a84284eSBram Moolenaar var import_lines =<< trim END 15060a84284eSBram Moolenaar vim9script 15076c7cc347SBram Moolenaar var one = 'notused' 15086c7cc347SBram Moolenaar var yes = 777 15090a84284eSBram Moolenaar import one as thatOne from './XexportAs' 15100a84284eSBram Moolenaar assert_equal(1, thatOne) 15110a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 15120a84284eSBram Moolenaar assert_equal('yes', yesYes) 15130a84284eSBram Moolenaar END 15140a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15150a84284eSBram Moolenaar 15160a84284eSBram Moolenaar import_lines =<< trim END 15170a84284eSBram Moolenaar vim9script 15180a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 15190a84284eSBram Moolenaar assert_equal(1, thatOne) 15200a84284eSBram Moolenaar assert_equal('yes', yesYes) 15210a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 15220a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 15230a84284eSBram Moolenaar END 15240a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15250a84284eSBram Moolenaar 1526c967d57aSBram Moolenaar import_lines =<< trim END 1527c967d57aSBram Moolenaar vim9script 1528c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1529c967d57aSBram Moolenaar impSlist->add(123) 1530c967d57aSBram Moolenaar END 1531c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1532c967d57aSBram Moolenaar 15330a84284eSBram Moolenaar delete('XexportAs') 15340a84284eSBram Moolenaarenddef 15350a84284eSBram Moolenaar 1536803af686SBram Moolenaarfunc g:Trigger() 1537803af686SBram Moolenaar source Ximport.vim 1538803af686SBram Moolenaar return "echo 'yes'\<CR>" 1539803af686SBram Moolenaarendfunc 1540803af686SBram Moolenaar 1541803af686SBram Moolenaardef Test_import_export_expr_map() 1542803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1543cfcd011fSBram Moolenaar var export_lines =<< trim END 1544803af686SBram Moolenaar vim9script 1545803af686SBram Moolenaar export def That(): string 1546803af686SBram Moolenaar return 'yes' 1547803af686SBram Moolenaar enddef 1548803af686SBram Moolenaar END 1549803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1550803af686SBram Moolenaar 1551cfcd011fSBram Moolenaar var import_lines =<< trim END 1552803af686SBram Moolenaar vim9script 1553803af686SBram Moolenaar import That from './Xexport_that.vim' 1554803af686SBram Moolenaar assert_equal('yes', That()) 1555803af686SBram Moolenaar END 1556803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1557803af686SBram Moolenaar 1558803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1559803af686SBram Moolenaar feedkeys('trigger', "xt") 1560803af686SBram Moolenaar 1561730b2483SBram Moolenaar delete('Xexport_that.vim') 1562803af686SBram Moolenaar delete('Ximport.vim') 1563803af686SBram Moolenaar nunmap trigger 1564803af686SBram Moolenaarenddef 1565803af686SBram Moolenaar 15668e1986e3SBram Moolenaardef Test_import_in_filetype() 15678e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15688e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1569cfcd011fSBram Moolenaar var export_lines =<< trim END 15708e1986e3SBram Moolenaar vim9script 1571cfcd011fSBram Moolenaar export var That = 'yes' 15728e1986e3SBram Moolenaar END 1573730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15748e1986e3SBram Moolenaar 1575cfcd011fSBram Moolenaar var import_lines =<< trim END 15768e1986e3SBram Moolenaar vim9script 1577730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15788e1986e3SBram Moolenaar assert_equal('yes', That) 15798e1986e3SBram Moolenaar g:did_load_mytpe = 1 15808e1986e3SBram Moolenaar END 15818e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15828e1986e3SBram Moolenaar 1583cfcd011fSBram Moolenaar var save_rtp = &rtp 15848e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 15858e1986e3SBram Moolenaar 15868e1986e3SBram Moolenaar filetype plugin on 15878e1986e3SBram Moolenaar copen 15888e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 15898e1986e3SBram Moolenaar 15908e1986e3SBram Moolenaar quit! 1591730b2483SBram Moolenaar delete('Xexport_ft.vim') 15928e1986e3SBram Moolenaar delete('ftplugin', 'rf') 15938e1986e3SBram Moolenaar &rtp = save_rtp 15948e1986e3SBram Moolenaarenddef 15958e1986e3SBram Moolenaar 1596efa94447SBram Moolenaardef Test_use_import_in_mapping() 1597cfcd011fSBram Moolenaar var lines =<< trim END 1598efa94447SBram Moolenaar vim9script 1599efa94447SBram Moolenaar export def Funcx() 1600efa94447SBram Moolenaar g:result = 42 1601efa94447SBram Moolenaar enddef 1602efa94447SBram Moolenaar END 1603efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1604efa94447SBram Moolenaar lines =<< trim END 1605efa94447SBram Moolenaar vim9script 1606efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1607b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1608efa94447SBram Moolenaar END 1609efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1610efa94447SBram Moolenaar 1611efa94447SBram Moolenaar source Xmapscript.vim 1612b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1613efa94447SBram Moolenaar assert_equal(42, g:result) 1614efa94447SBram Moolenaar 1615efa94447SBram Moolenaar unlet g:result 1616efa94447SBram Moolenaar delete('XsomeExport.vim') 1617efa94447SBram Moolenaar delete('Xmapscript.vim') 1618b3ca9824SBram Moolenaar nunmap <F3> 1619efa94447SBram Moolenaarenddef 1620efa94447SBram Moolenaar 1621d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1622d3f8a9eeSBram Moolenaar var lines =<< trim END 1623d3f8a9eeSBram Moolenaar if has(g:feature) 1624d3f8a9eeSBram Moolenaar " legacy script 1625d3f8a9eeSBram Moolenaar let g:legacy = 1 1626d3f8a9eeSBram Moolenaar finish 1627d3f8a9eeSBram Moolenaar endif 1628d3f8a9eeSBram Moolenaar vim9script 1629d3f8a9eeSBram Moolenaar g:legacy = 0 1630d3f8a9eeSBram Moolenaar END 1631d3f8a9eeSBram Moolenaar g:feature = 'eval' 1632d3f8a9eeSBram Moolenaar g:legacy = -1 1633d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1634d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1635d3f8a9eeSBram Moolenaar 1636d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1637d3f8a9eeSBram Moolenaar g:legacy = -1 1638d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1639d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1640d3f8a9eeSBram Moolenaarenddef 1641d3f8a9eeSBram Moolenaar 1642750802b5SBram Moolenaardef Test_vim9script_fails() 16438a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16448a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1645cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16469721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1647cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1648750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1649750802b5SBram Moolenaar 1650cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1651c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1652c785b9a7SBram Moolenaar 1653e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1654e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16558a7d6542SBram Moolenaarenddef 16568a7d6542SBram Moolenaar 1657f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1658101f4810SBram Moolenaar CheckRunVimInTerminal 1659101f4810SBram Moolenaar 16609bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1661c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16629bb3eb3eSBram Moolenaarendfunc 16639bb3eb3eSBram Moolenaar 1664c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1665cfcd011fSBram Moolenaar var export =<< trim END 1666101f4810SBram Moolenaar vim9script 1667101f4810SBram Moolenaar export def Foo(): number 1668101f4810SBram Moolenaar return 0 1669101f4810SBram Moolenaar enddef 1670101f4810SBram Moolenaar END 1671730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1672101f4810SBram Moolenaar 1673e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16749bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16752949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1676101f4810SBram Moolenaar 1677730b2483SBram Moolenaar delete('XexportCmd.vim') 16789bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16799bb3eb3eSBram Moolenaarenddef 1680101f4810SBram Moolenaar 16812b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16822b32700dSBram Moolenaar var lines =<< trim END 1683a6294955SBram Moolenaar vim9script 1684a6294955SBram Moolenaar export var exported = 'thexport' 168560dc8274SBram Moolenaar 168660dc8274SBram Moolenaar export def TheFunc(x = 0) 168760dc8274SBram Moolenaar enddef 1688a6294955SBram Moolenaar END 1689a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1690a6294955SBram Moolenaar lines =<< trim END 16912b32700dSBram Moolenaar vim9script noclear 16922b32700dSBram Moolenaar g:loadCount += 1 16932b32700dSBram Moolenaar var s:reloaded = 'init' 1694a6294955SBram Moolenaar import exported from './XExportReload' 16952b32700dSBram Moolenaar 16962b32700dSBram Moolenaar def Again(): string 16972b32700dSBram Moolenaar return 'again' 16982b32700dSBram Moolenaar enddef 16992b32700dSBram Moolenaar 170060dc8274SBram Moolenaar import TheFunc from './XExportReload' 170160dc8274SBram Moolenaar TheFunc() 170260dc8274SBram Moolenaar 17032b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 17042b32700dSBram Moolenaar var s:loaded = true 17052b32700dSBram Moolenaar 17062b32700dSBram Moolenaar var s:notReloaded = 'yes' 17072b32700dSBram Moolenaar s:reloaded = 'first' 17082b32700dSBram Moolenaar def g:Values(): list<string> 1709a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 17102b32700dSBram Moolenaar enddef 17112b32700dSBram Moolenaar 17122b32700dSBram Moolenaar def Once(): string 17132b32700dSBram Moolenaar return 'once' 17142b32700dSBram Moolenaar enddef 17152b32700dSBram Moolenaar END 17162b32700dSBram Moolenaar writefile(lines, 'XReloaded') 17172b32700dSBram Moolenaar g:loadCount = 0 17182b32700dSBram Moolenaar source XReloaded 17192b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1720a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 17212b32700dSBram Moolenaar source XReloaded 17222b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1723a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17242b32700dSBram Moolenaar source XReloaded 17252b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1726a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17272b32700dSBram Moolenaar 172848e11c10SBram Moolenaar delete('XReloaded') 1729a6294955SBram Moolenaar delete('XExportReload') 17302b32700dSBram Moolenaar delfunc g:Values 17312b32700dSBram Moolenaar unlet g:loadCount 1732577dc93dSBram Moolenaar 1733577dc93dSBram Moolenaar lines =<< trim END 1734577dc93dSBram Moolenaar vim9script 1735577dc93dSBram Moolenaar def Inner() 1736577dc93dSBram Moolenaar enddef 1737577dc93dSBram Moolenaar END 1738577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1739577dc93dSBram Moolenaar source XreloadScript.vim 1740577dc93dSBram Moolenaar 1741577dc93dSBram Moolenaar lines =<< trim END 1742577dc93dSBram Moolenaar vim9script 1743577dc93dSBram Moolenaar def Outer() 1744577dc93dSBram Moolenaar def Inner() 1745577dc93dSBram Moolenaar enddef 1746577dc93dSBram Moolenaar enddef 1747577dc93dSBram Moolenaar defcompile 1748577dc93dSBram Moolenaar END 1749577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1750577dc93dSBram Moolenaar source XreloadScript.vim 1751577dc93dSBram Moolenaar 1752577dc93dSBram Moolenaar delete('XreloadScript.vim') 17532b32700dSBram Moolenaarenddef 17542b32700dSBram Moolenaar 17554c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1756cfcd011fSBram Moolenaar var lines =<< trim END 17578a7d6542SBram Moolenaar vim9script 17588a7d6542SBram Moolenaar const var = '' 1759cfcd011fSBram Moolenaar var valone = 1234 17608a7d6542SBram Moolenaar def MyFunc(arg: string) 17618a7d6542SBram Moolenaar valone = 5678 17628a7d6542SBram Moolenaar enddef 17638a7d6542SBram Moolenaar END 1764cfcd011fSBram Moolenaar var morelines =<< trim END 1765cfcd011fSBram Moolenaar var valtwo = 222 17668a7d6542SBram Moolenaar export def GetValtwo(): number 17678a7d6542SBram Moolenaar return valtwo 17688a7d6542SBram Moolenaar enddef 17698a7d6542SBram Moolenaar END 177003afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17718a7d6542SBram Moolenaar source Xreload.vim 17728a7d6542SBram Moolenaar source Xreload.vim 17738a7d6542SBram Moolenaar source Xreload.vim 17748a7d6542SBram Moolenaar 1775f5be8cdbSBram Moolenaar # cannot declare a var twice 17768a7d6542SBram Moolenaar lines =<< trim END 17778a7d6542SBram Moolenaar vim9script 1778cfcd011fSBram Moolenaar var valone = 1234 1779cfcd011fSBram Moolenaar var valone = 5678 17808a7d6542SBram Moolenaar END 17818a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 178244d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 17838a7d6542SBram Moolenaar 17848a7d6542SBram Moolenaar delete('Xreload.vim') 17858a7d6542SBram Moolenaar delete('Ximport.vim') 17868a7d6542SBram Moolenaarenddef 17878a7d6542SBram Moolenaar 178807a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 178907a65d26SBram Moolenaar" compiled function using that variable must fail. 179007a65d26SBram Moolenaardef Test_script_reload_change_type() 179107a65d26SBram Moolenaar var lines =<< trim END 179207a65d26SBram Moolenaar vim9script noclear 179307a65d26SBram Moolenaar var str = 'string' 179407a65d26SBram Moolenaar def g:GetStr(): string 179507a65d26SBram Moolenaar return str .. 'xxx' 179607a65d26SBram Moolenaar enddef 179707a65d26SBram Moolenaar END 179807a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 179907a65d26SBram Moolenaar source Xreload.vim 180007a65d26SBram Moolenaar echo g:GetStr() 180107a65d26SBram Moolenaar 180207a65d26SBram Moolenaar lines =<< trim END 180307a65d26SBram Moolenaar vim9script noclear 180407a65d26SBram Moolenaar var str = 1234 180507a65d26SBram Moolenaar END 180607a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 180707a65d26SBram Moolenaar source Xreload.vim 180807a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 180907a65d26SBram Moolenaar 181007a65d26SBram Moolenaar delfunc g:GetStr 181107a65d26SBram Moolenaar delete('Xreload.vim') 181207a65d26SBram Moolenaarenddef 181307a65d26SBram Moolenaar 1814c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1815c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1816c970e422SBram Moolenaar 1817c970e422SBram Moolenaardef Test_script_reload_from_function() 1818c970e422SBram Moolenaar var lines =<< trim END 1819c970e422SBram Moolenaar vim9script 1820c970e422SBram Moolenaar 1821c970e422SBram Moolenaar if exists('g:loaded') 1822c970e422SBram Moolenaar finish 1823c970e422SBram Moolenaar endif 1824c970e422SBram Moolenaar g:loaded = 1 1825c970e422SBram Moolenaar delcommand CallFunc 1826c970e422SBram Moolenaar command CallFunc Func() 1827c970e422SBram Moolenaar def Func() 1828a4c81beaSBram Moolenaar so XreloadFunc.vim 1829c970e422SBram Moolenaar g:didTheFunc = 1 1830c970e422SBram Moolenaar enddef 1831c970e422SBram Moolenaar END 1832c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1833c970e422SBram Moolenaar source XreloadFunc.vim 1834c970e422SBram Moolenaar CallFunc 1835c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1836c970e422SBram Moolenaar 1837c970e422SBram Moolenaar delete('XreloadFunc.vim') 1838c970e422SBram Moolenaar delcommand CallFunc 1839c970e422SBram Moolenaar unlet g:loaded 1840c970e422SBram Moolenaar unlet g:didTheFunc 1841c970e422SBram Moolenaarenddef 1842c970e422SBram Moolenaar 18436c3843caSBram Moolenaardef Test_script_var_shadows_function() 18446c3843caSBram Moolenaar var lines =<< trim END 18456c3843caSBram Moolenaar vim9script 18466c3843caSBram Moolenaar def Func(): number 18476c3843caSBram Moolenaar return 123 18486c3843caSBram Moolenaar enddef 18496c3843caSBram Moolenaar var Func = 1 18506c3843caSBram Moolenaar END 18516c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18526c3843caSBram Moolenaarenddef 18536c3843caSBram Moolenaar 1854c323527dSBram Moolenaardef Test_script_var_shadows_command() 1855c323527dSBram Moolenaar var lines =<< trim END 1856c323527dSBram Moolenaar var undo = 1 1857c323527dSBram Moolenaar undo = 2 1858c323527dSBram Moolenaar assert_equal(2, undo) 1859c323527dSBram Moolenaar END 1860c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1861c323527dSBram Moolenaar 1862c323527dSBram Moolenaar lines =<< trim END 1863c323527dSBram Moolenaar var undo = 1 1864c323527dSBram Moolenaar undo 1865c323527dSBram Moolenaar END 1866c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1867c323527dSBram Moolenaarenddef 1868c323527dSBram Moolenaar 186995006e3dSBram Moolenaardef s:RetSome(): string 187095006e3dSBram Moolenaar return 'some' 187195006e3dSBram Moolenaarenddef 187295006e3dSBram Moolenaar 1873fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1874fe465a01SBram Moolenaar" script-local name. 1875fe465a01SBram Moolenaardef Test_vim9script_funcref() 1876cfcd011fSBram Moolenaar var sortlines =<< trim END 1877fe465a01SBram Moolenaar vim9script 1878fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1879bed36b93SBram Moolenaar return i2 - i1 1880fe465a01SBram Moolenaar enddef 1881fe465a01SBram Moolenaar 1882fe465a01SBram Moolenaar export def FastSort(): list<number> 1883fe465a01SBram Moolenaar return range(5)->sort(Compare) 1884fe465a01SBram Moolenaar enddef 1885529fb5a5SBram Moolenaar 1886529fb5a5SBram Moolenaar export def GetString(arg: string): string 1887529fb5a5SBram Moolenaar return arg 1888529fb5a5SBram Moolenaar enddef 1889fe465a01SBram Moolenaar END 1890fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1891fe465a01SBram Moolenaar 1892cfcd011fSBram Moolenaar var lines =<< trim END 1893fe465a01SBram Moolenaar vim9script 1894fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1895fe465a01SBram Moolenaar def Test() 1896fe465a01SBram Moolenaar g:result = FastSort() 1897fe465a01SBram Moolenaar enddef 1898fe465a01SBram Moolenaar Test() 1899529fb5a5SBram Moolenaar 1900529fb5a5SBram Moolenaar # using a function imported with "as" 1901529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1902529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1903529fb5a5SBram Moolenaar 1904529fb5a5SBram Moolenaar # using the function from a compiled function 1905529fb5a5SBram Moolenaar def TestMore(): string 1906ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1907ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1908529fb5a5SBram Moolenaar enddef 1909ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1910529fb5a5SBram Moolenaar 1911529fb5a5SBram Moolenaar # error when using a function that isn't exported 1912529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1913fe465a01SBram Moolenaar END 1914fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1915fe465a01SBram Moolenaar 1916fe465a01SBram Moolenaar source Xscript.vim 1917fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1918fe465a01SBram Moolenaar 1919fe465a01SBram Moolenaar unlet g:result 1920fe465a01SBram Moolenaar delete('Xsort.vim') 1921fe465a01SBram Moolenaar delete('Xscript.vim') 192295006e3dSBram Moolenaar 1923cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 192495006e3dSBram Moolenaar assert_equal('some', Funcref()) 1925fe465a01SBram Moolenaarenddef 1926fe465a01SBram Moolenaar 1927601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1928601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1929601e76acSBram Moolenaar" function reference. 1930c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1931cfcd011fSBram Moolenaar var filterLines =<< trim END 1932c620c055SBram Moolenaar vim9script 1933c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1934c620c055SBram Moolenaar return idx % 2 == 1 1935c620c055SBram Moolenaar enddef 1936c620c055SBram Moolenaar export def FastFilter(): list<number> 1937c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1938c620c055SBram Moolenaar enddef 1939601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1940601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1941601e76acSBram Moolenaar enddef 1942c620c055SBram Moolenaar END 1943c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1944c620c055SBram Moolenaar 1945cfcd011fSBram Moolenaar var lines =<< trim END 1946c620c055SBram Moolenaar vim9script 1947601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1948c620c055SBram Moolenaar def Test() 1949cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1950c620c055SBram Moolenaar enddef 1951c620c055SBram Moolenaar Test() 1952601e76acSBram Moolenaar def TestDirect() 1953cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1954601e76acSBram Moolenaar enddef 1955601e76acSBram Moolenaar TestDirect() 1956c620c055SBram Moolenaar END 1957601e76acSBram Moolenaar CheckScriptSuccess(lines) 1958c620c055SBram Moolenaar delete('Xfilter.vim') 1959c620c055SBram Moolenaarenddef 1960c620c055SBram Moolenaar 19614c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1962cfcd011fSBram Moolenaar var first_lines =<< trim END 19634c17ad94SBram Moolenaar vim9script 19644c17ad94SBram Moolenaar def FuncYes(): string 19654c17ad94SBram Moolenaar return 'yes' 19664c17ad94SBram Moolenaar enddef 19674c17ad94SBram Moolenaar END 1968cfcd011fSBram Moolenaar var withno_lines =<< trim END 19694c17ad94SBram Moolenaar def FuncNo(): string 19704c17ad94SBram Moolenaar return 'no' 19714c17ad94SBram Moolenaar enddef 19724c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19734c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19744c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 197503afdcf1SBram Moolenaar enddef 197603afdcf1SBram Moolenaar END 1977cfcd011fSBram Moolenaar var nono_lines =<< trim END 197803afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 197903afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 198044d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19814c17ad94SBram Moolenaar enddef 19824c17ad94SBram Moolenaar END 19834c17ad94SBram Moolenaar 19844c17ad94SBram Moolenaar # FuncNo() is defined 198503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19864c17ad94SBram Moolenaar source Xreloaded.vim 19874c17ad94SBram Moolenaar g:DoCheck(true) 19884c17ad94SBram Moolenaar 19894c17ad94SBram Moolenaar # FuncNo() is not redefined 199003afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 19914c17ad94SBram Moolenaar source Xreloaded.vim 19925082471fSBram Moolenaar g:DoCheck(false) 19934c17ad94SBram Moolenaar 19944c17ad94SBram Moolenaar # FuncNo() is back 199503afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 19964c17ad94SBram Moolenaar source Xreloaded.vim 19975082471fSBram Moolenaar g:DoCheck(false) 19984c17ad94SBram Moolenaar 19994c17ad94SBram Moolenaar delete('Xreloaded.vim') 20004c17ad94SBram Moolenaarenddef 20014c17ad94SBram Moolenaar 200289483d40SBram Moolenaardef Test_vim9script_reload_delvar() 200389483d40SBram Moolenaar # write the script with a script-local variable 2004cfcd011fSBram Moolenaar var lines =<< trim END 200589483d40SBram Moolenaar vim9script 2006cfcd011fSBram Moolenaar var name = 'string' 200789483d40SBram Moolenaar END 200889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 200989483d40SBram Moolenaar source XreloadVar.vim 201089483d40SBram Moolenaar 201189483d40SBram Moolenaar # now write the script using the same variable locally - works 201289483d40SBram Moolenaar lines =<< trim END 201389483d40SBram Moolenaar vim9script 201489483d40SBram Moolenaar def Func() 2015cfcd011fSBram Moolenaar var name = 'string' 201689483d40SBram Moolenaar enddef 201789483d40SBram Moolenaar END 201889483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 201989483d40SBram Moolenaar source XreloadVar.vim 202089483d40SBram Moolenaar 202189483d40SBram Moolenaar delete('XreloadVar.vim') 202289483d40SBram Moolenaarenddef 202389483d40SBram Moolenaar 20248a7d6542SBram Moolenaardef Test_import_absolute() 2025cfcd011fSBram Moolenaar var import_lines = [ 2026e6085c53SBram Moolenaar 'vim9script', 2027e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 2028e6085c53SBram Moolenaar 'def UseExported()', 2029e6085c53SBram Moolenaar ' g:imported_abs = exported', 2030e6085c53SBram Moolenaar ' exported = 8888', 2031e6085c53SBram Moolenaar ' g:imported_after = exported', 2032e6085c53SBram Moolenaar 'enddef', 2033e6085c53SBram Moolenaar 'UseExported()', 2034e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2035e6085c53SBram Moolenaar ] 20368a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20378a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20388a7d6542SBram Moolenaar 20398a7d6542SBram Moolenaar source Ximport_abs.vim 20408a7d6542SBram Moolenaar 20418a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20424e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2043fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2044fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2045fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2046fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2047fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2048fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2049fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2050fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2051fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2052fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2053e6085c53SBram Moolenaar g:import_disassembled) 2054b3ca9824SBram Moolenaar 2055b3ca9824SBram Moolenaar Undo_export_script_lines() 20568a7d6542SBram Moolenaar unlet g:imported_abs 20574e12a5dfSBram Moolenaar unlet g:import_disassembled 20588a7d6542SBram Moolenaar 20598a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20608a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20618a7d6542SBram Moolenaarenddef 20628a7d6542SBram Moolenaar 20638a7d6542SBram Moolenaardef Test_import_rtp() 2064cfcd011fSBram Moolenaar var import_lines = [ 2065e6085c53SBram Moolenaar 'vim9script', 2066e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2067e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2068e6085c53SBram Moolenaar ] 20698a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2070b885a7c7SBram Moolenaar mkdir('import', 'p') 2071b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20728a7d6542SBram Moolenaar 2073cfcd011fSBram Moolenaar var save_rtp = &rtp 20748a7d6542SBram Moolenaar &rtp = getcwd() 20758a7d6542SBram Moolenaar source Ximport_rtp.vim 20768a7d6542SBram Moolenaar &rtp = save_rtp 20778a7d6542SBram Moolenaar 20788a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20798a7d6542SBram Moolenaar 2080b3ca9824SBram Moolenaar Undo_export_script_lines() 2081b3ca9824SBram Moolenaar unlet g:imported_rtp 20828a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2083b885a7c7SBram Moolenaar delete('import', 'rf') 20848a7d6542SBram Moolenaarenddef 20858a7d6542SBram Moolenaar 208625e0f586SBram Moolenaardef Test_import_compile_error() 2087cfcd011fSBram Moolenaar var export_lines = [ 208825e0f586SBram Moolenaar 'vim9script', 208925e0f586SBram Moolenaar 'export def ExpFunc(): string', 209025e0f586SBram Moolenaar ' return notDefined', 209125e0f586SBram Moolenaar 'enddef', 209225e0f586SBram Moolenaar ] 209325e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 209425e0f586SBram Moolenaar 2095cfcd011fSBram Moolenaar var import_lines = [ 209625e0f586SBram Moolenaar 'vim9script', 209725e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 209825e0f586SBram Moolenaar 'def ImpFunc()', 209925e0f586SBram Moolenaar ' echo ExpFunc()', 210025e0f586SBram Moolenaar 'enddef', 210125e0f586SBram Moolenaar 'defcompile', 210225e0f586SBram Moolenaar ] 210325e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 210425e0f586SBram Moolenaar 210525e0f586SBram Moolenaar try 210625e0f586SBram Moolenaar source Ximport.vim 210725e0f586SBram Moolenaar catch /E1001/ 2108f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 21097707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 211025e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 211125e0f586SBram Moolenaar endtry 211225e0f586SBram Moolenaar 211325e0f586SBram Moolenaar delete('Xexported.vim') 211425e0f586SBram Moolenaar delete('Ximport.vim') 211525e0f586SBram Moolenaarenddef 211625e0f586SBram Moolenaar 2117c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2118cfcd011fSBram Moolenaar var lines = [ 2119c4ce36d4SBram Moolenaar 'vim9script', 2120c4ce36d4SBram Moolenaar 'def Func()', 2121c4ce36d4SBram Moolenaar ' eval [][0]', 2122c4ce36d4SBram Moolenaar 'enddef', 2123c4ce36d4SBram Moolenaar 'Func()', 2124c4ce36d4SBram Moolenaar ] 2125c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2126c4ce36d4SBram Moolenaar 2127c4ce36d4SBram Moolenaar for count in range(3) 2128c4ce36d4SBram Moolenaar try 2129c4ce36d4SBram Moolenaar source Xtestscript.vim 2130c4ce36d4SBram Moolenaar catch /E684/ 2131c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2132c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2133c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2134c4ce36d4SBram Moolenaar endtry 2135c4ce36d4SBram Moolenaar endfor 2136c4ce36d4SBram Moolenaar 2137c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2138c4ce36d4SBram Moolenaarenddef 2139c4ce36d4SBram Moolenaar 2140eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2141cfcd011fSBram Moolenaar var export_lines =<< trim END 2142eef2102eSBram Moolenaar vim9script 2143eef2102eSBram Moolenaar export def Func() 2144eef2102eSBram Moolenaar echo 'imported' 2145eef2102eSBram Moolenaar enddef 2146eef2102eSBram Moolenaar END 2147eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2148eef2102eSBram Moolenaar 2149cfcd011fSBram Moolenaar var lines =<< trim END 2150eef2102eSBram Moolenaar vim9script 2151eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2152eef2102eSBram Moolenaar def Func() 2153eef2102eSBram Moolenaar echo 'local to function' 2154eef2102eSBram Moolenaar enddef 2155eef2102eSBram Moolenaar END 2156eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2157eef2102eSBram Moolenaar 2158eef2102eSBram Moolenaar lines =<< trim END 2159eef2102eSBram Moolenaar vim9script 2160eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2161eef2102eSBram Moolenaar def Outer() 2162eef2102eSBram Moolenaar def Func() 2163eef2102eSBram Moolenaar echo 'local to function' 2164eef2102eSBram Moolenaar enddef 2165eef2102eSBram Moolenaar enddef 2166eef2102eSBram Moolenaar defcompile 2167eef2102eSBram Moolenaar END 2168eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2169eef2102eSBram Moolenaar 2170eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2171eef2102eSBram Moolenaarenddef 2172eef2102eSBram Moolenaar 2173b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2174cfcd011fSBram Moolenaar var lines =<< trim END 2175b9a2cac3SBram Moolenaar vim9script 2176b9a2cac3SBram Moolenaar def Func() 2177b9a2cac3SBram Moolenaar echo 'one' 2178b9a2cac3SBram Moolenaar enddef 2179b9a2cac3SBram Moolenaar def Func() 2180b9a2cac3SBram Moolenaar echo 'two' 2181b9a2cac3SBram Moolenaar enddef 2182b9a2cac3SBram Moolenaar END 2183b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2184fa211f3cSBram Moolenaar 2185fa211f3cSBram Moolenaar lines =<< trim END 2186fa211f3cSBram Moolenaar vim9script 2187fa211f3cSBram Moolenaar def Foo(): string 2188fa211f3cSBram Moolenaar return 'foo' 2189fa211f3cSBram Moolenaar enddef 2190fa211f3cSBram Moolenaar def Func() 2191cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2192fa211f3cSBram Moolenaar enddef 2193fa211f3cSBram Moolenaar defcompile 2194fa211f3cSBram Moolenaar END 2195fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2196b9a2cac3SBram Moolenaarenddef 2197b9a2cac3SBram Moolenaar 21988a7d6542SBram Moolenaardef Test_fixed_size_list() 2199f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2200cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 22018a7d6542SBram Moolenaar l->remove(0) 22028a7d6542SBram Moolenaar l->add(5) 22038a7d6542SBram Moolenaar l->insert(99, 1) 22040f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 22058a7d6542SBram Moolenaarenddef 22068a7d6542SBram Moolenaar 2207ae616494SBram Moolenaardef Test_no_insert_xit() 2208d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2209d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2210d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2211d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2212d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2213ae616494SBram Moolenaar 2214ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2215ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2216ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2217ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2218f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2219f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 22206508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 22216508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2222f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2223f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2224f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2225ae616494SBram Moolenaarenddef 2226ae616494SBram Moolenaar 2227158906cfSBram Moolenaardef IfElse(what: number): string 2228cfcd011fSBram Moolenaar var res = '' 2229158906cfSBram Moolenaar if what == 1 2230158906cfSBram Moolenaar res = "one" 2231158906cfSBram Moolenaar elseif what == 2 2232158906cfSBram Moolenaar res = "two" 2233a259d8d3SBram Moolenaar else 2234158906cfSBram Moolenaar res = "three" 2235a259d8d3SBram Moolenaar endif 2236158906cfSBram Moolenaar return res 2237a259d8d3SBram Moolenaarenddef 2238a259d8d3SBram Moolenaar 2239158906cfSBram Moolenaardef Test_if_elseif_else() 2240158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2241158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2242158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22430f18b6d1SBram Moolenaarenddef 22440f18b6d1SBram Moolenaar 2245e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2246d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2247d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2248d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2249ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2250d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22516628b7ebSBram Moolenaar 22526628b7ebSBram Moolenaar var lines =<< trim END 22536628b7ebSBram Moolenaar var s = '' 22546628b7ebSBram Moolenaar if s = '' 22556628b7ebSBram Moolenaar endif 22566628b7ebSBram Moolenaar END 22576628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22586628b7ebSBram Moolenaar 22596628b7ebSBram Moolenaar lines =<< trim END 22606628b7ebSBram Moolenaar var s = '' 22616628b7ebSBram Moolenaar if s == '' 22626628b7ebSBram Moolenaar elseif s = '' 22636628b7ebSBram Moolenaar endif 22646628b7ebSBram Moolenaar END 22656628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2266e8c4abbbSBram Moolenaarenddef 2267e8c4abbbSBram Moolenaar 22686d69bf60SBram Moolenaarlet g:bool_true = v:true 22696d69bf60SBram Moolenaarlet g:bool_false = v:false 22706d69bf60SBram Moolenaar 22716d69bf60SBram Moolenaardef Test_if_const_expr() 2272cfcd011fSBram Moolenaar var res = false 22736d69bf60SBram Moolenaar if true ? true : false 22746d69bf60SBram Moolenaar res = true 22756d69bf60SBram Moolenaar endif 22766d69bf60SBram Moolenaar assert_equal(true, res) 22776d69bf60SBram Moolenaar 2278585fea7bSBram Moolenaar g:glob = 2 2279585fea7bSBram Moolenaar if false 22806797966dSBram Moolenaar execute('g:glob = 3') 2281585fea7bSBram Moolenaar endif 2282585fea7bSBram Moolenaar assert_equal(2, g:glob) 2283585fea7bSBram Moolenaar if true 22846797966dSBram Moolenaar execute('g:glob = 3') 2285585fea7bSBram Moolenaar endif 2286585fea7bSBram Moolenaar assert_equal(3, g:glob) 2287585fea7bSBram Moolenaar 22886d69bf60SBram Moolenaar res = false 22896d69bf60SBram Moolenaar if g:bool_true ? true : false 22906d69bf60SBram Moolenaar res = true 22916d69bf60SBram Moolenaar endif 22926d69bf60SBram Moolenaar assert_equal(true, res) 22936d69bf60SBram Moolenaar 22946d69bf60SBram Moolenaar res = false 22956d69bf60SBram Moolenaar if true ? g:bool_true : false 22966d69bf60SBram Moolenaar res = true 22976d69bf60SBram Moolenaar endif 22986d69bf60SBram Moolenaar assert_equal(true, res) 22996d69bf60SBram Moolenaar 23006d69bf60SBram Moolenaar res = false 23016d69bf60SBram Moolenaar if true ? true : g:bool_false 23026d69bf60SBram Moolenaar res = true 23036d69bf60SBram Moolenaar endif 23046d69bf60SBram Moolenaar assert_equal(true, res) 23056d69bf60SBram Moolenaar 23066d69bf60SBram Moolenaar res = false 23076d69bf60SBram Moolenaar if true ? false : true 23086d69bf60SBram Moolenaar res = true 23096d69bf60SBram Moolenaar endif 23106d69bf60SBram Moolenaar assert_equal(false, res) 23116d69bf60SBram Moolenaar 23126d69bf60SBram Moolenaar res = false 23136d69bf60SBram Moolenaar if false ? false : true 23146d69bf60SBram Moolenaar res = true 23156d69bf60SBram Moolenaar endif 23166d69bf60SBram Moolenaar assert_equal(true, res) 23176d69bf60SBram Moolenaar 23186d69bf60SBram Moolenaar res = false 23196d69bf60SBram Moolenaar if false ? true : false 23206d69bf60SBram Moolenaar res = true 23216d69bf60SBram Moolenaar endif 23226d69bf60SBram Moolenaar assert_equal(false, res) 23236d69bf60SBram Moolenaar 23246d69bf60SBram Moolenaar res = false 2325e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2326e8c4abbbSBram Moolenaar res = true 2327e8c4abbbSBram Moolenaar endif 2328e8c4abbbSBram Moolenaar assert_equal(false, res) 2329e8c4abbbSBram Moolenaar 2330e8c4abbbSBram Moolenaar res = false 23316d69bf60SBram Moolenaar if true && true 23326d69bf60SBram Moolenaar res = true 23336d69bf60SBram Moolenaar endif 23346d69bf60SBram Moolenaar assert_equal(true, res) 23356d69bf60SBram Moolenaar 23366d69bf60SBram Moolenaar res = false 23376d69bf60SBram Moolenaar if true && false 23386d69bf60SBram Moolenaar res = true 23396d69bf60SBram Moolenaar endif 23406d69bf60SBram Moolenaar assert_equal(false, res) 23416d69bf60SBram Moolenaar 23426d69bf60SBram Moolenaar res = false 23436d69bf60SBram Moolenaar if g:bool_true && false 23446d69bf60SBram Moolenaar res = true 23456d69bf60SBram Moolenaar endif 23466d69bf60SBram Moolenaar assert_equal(false, res) 23476d69bf60SBram Moolenaar 23486d69bf60SBram Moolenaar res = false 23496d69bf60SBram Moolenaar if true && g:bool_false 23506d69bf60SBram Moolenaar res = true 23516d69bf60SBram Moolenaar endif 23526d69bf60SBram Moolenaar assert_equal(false, res) 23536d69bf60SBram Moolenaar 23546d69bf60SBram Moolenaar res = false 23556d69bf60SBram Moolenaar if false && false 23566d69bf60SBram Moolenaar res = true 23576d69bf60SBram Moolenaar endif 23586d69bf60SBram Moolenaar assert_equal(false, res) 23596d69bf60SBram Moolenaar 23606d69bf60SBram Moolenaar res = false 23616d69bf60SBram Moolenaar if true || false 23626d69bf60SBram Moolenaar res = true 23636d69bf60SBram Moolenaar endif 23646d69bf60SBram Moolenaar assert_equal(true, res) 23656d69bf60SBram Moolenaar 23666d69bf60SBram Moolenaar res = false 23676d69bf60SBram Moolenaar if g:bool_true || false 23686d69bf60SBram Moolenaar res = true 23696d69bf60SBram Moolenaar endif 23706d69bf60SBram Moolenaar assert_equal(true, res) 23716d69bf60SBram Moolenaar 23726d69bf60SBram Moolenaar res = false 23736d69bf60SBram Moolenaar if true || g:bool_false 23746d69bf60SBram Moolenaar res = true 23756d69bf60SBram Moolenaar endif 23766d69bf60SBram Moolenaar assert_equal(true, res) 23776d69bf60SBram Moolenaar 23786d69bf60SBram Moolenaar res = false 23796d69bf60SBram Moolenaar if false || false 23806d69bf60SBram Moolenaar res = true 23816d69bf60SBram Moolenaar endif 23826d69bf60SBram Moolenaar assert_equal(false, res) 23833988f64fSBram Moolenaar 23843988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2385c323527dSBram Moolenaar if false | eval 1 + 2 | endif 23863988f64fSBram Moolenaar if false | eval burp + 234 | endif 23873988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 23883988f64fSBram Moolenaar if false 23893988f64fSBram Moolenaar burp 23903988f64fSBram Moolenaar endif 2391e525bddaSBram Moolenaar 2392e525bddaSBram Moolenaar # expression with line breaks skipped 2393e525bddaSBram Moolenaar if false 2394e525bddaSBram Moolenaar ('aaa' 2395e525bddaSBram Moolenaar .. 'bbb' 2396e525bddaSBram Moolenaar .. 'ccc' 2397e525bddaSBram Moolenaar )->setline(1) 2398e525bddaSBram Moolenaar endif 239980c34ca3SBram Moolenaarenddef 24006d69bf60SBram Moolenaar 240180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2402d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2403d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2404d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2405d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 24066d69bf60SBram Moolenaarenddef 24076d69bf60SBram Moolenaar 240872abcf42SBram Moolenaardef RunNested(i: number): number 2409cfcd011fSBram Moolenaar var x: number = 0 241072abcf42SBram Moolenaar if i % 2 241172abcf42SBram Moolenaar if 1 2412f5be8cdbSBram Moolenaar # comment 241372abcf42SBram Moolenaar else 2414f5be8cdbSBram Moolenaar # comment 241572abcf42SBram Moolenaar endif 241672abcf42SBram Moolenaar x += 1 241772abcf42SBram Moolenaar else 241872abcf42SBram Moolenaar x += 1000 241972abcf42SBram Moolenaar endif 242072abcf42SBram Moolenaar return x 242172abcf42SBram Moolenaarenddef 242272abcf42SBram Moolenaar 242372abcf42SBram Moolenaardef Test_nested_if() 242472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 242572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 242672abcf42SBram Moolenaarenddef 242772abcf42SBram Moolenaar 2428ad39c094SBram Moolenaardef Test_execute_cmd() 2429e4984290SBram Moolenaar # missing argument is ignored 2430e4984290SBram Moolenaar execute 2431e4984290SBram Moolenaar execute # comment 2432e4984290SBram Moolenaar 2433ad39c094SBram Moolenaar new 2434ad39c094SBram Moolenaar setline(1, 'default') 2435d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2436ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2437a72cfb80SBram Moolenaar 2438d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2439a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2440a72cfb80SBram Moolenaar 2441cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2442cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2443a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2444ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2445a72cfb80SBram Moolenaar 2446d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2447ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2448a72cfb80SBram Moolenaar 2449cfcd011fSBram Moolenaar var cmd_first = 'call ' 2450cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2451ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2452ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2453ad39c094SBram Moolenaar bwipe! 2454585fea7bSBram Moolenaar 2455cfcd011fSBram Moolenaar var n = true 24562d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 24572d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 24582d6b20d6SBram Moolenaar 2459e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2460e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2461e5abf7afSBram Moolenaar 2462d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2463d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2464d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2465ad39c094SBram Moolenaarenddef 2466ad39c094SBram Moolenaar 246747e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2468f5be8cdbSBram Moolenaar # only checks line continuation 2469cfcd011fSBram Moolenaar var lines =<< trim END 247047e880d6SBram Moolenaar vim9script 247147e880d6SBram Moolenaar execute 'g:someVar' 247247e880d6SBram Moolenaar .. ' = ' .. 247347e880d6SBram Moolenaar '28' 247447e880d6SBram Moolenaar assert_equal(28, g:someVar) 247547e880d6SBram Moolenaar unlet g:someVar 247647e880d6SBram Moolenaar END 247747e880d6SBram Moolenaar CheckScriptSuccess(lines) 247847e880d6SBram Moolenaarenddef 247947e880d6SBram Moolenaar 2480ad39c094SBram Moolenaardef Test_echo_cmd() 2481a72cfb80SBram Moolenaar echo 'some' # comment 2482585fea7bSBram Moolenaar echon 'thing' 2483ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2484ad39c094SBram Moolenaar 2485a72cfb80SBram Moolenaar echo "some" # comment 2486a72cfb80SBram Moolenaar echon "thing" 2487a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2488a72cfb80SBram Moolenaar 2489cfcd011fSBram Moolenaar var str1 = 'some' 2490cfcd011fSBram Moolenaar var str2 = 'more' 2491ad39c094SBram Moolenaar echo str1 str2 2492ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2493a72cfb80SBram Moolenaar 2494d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2495ad39c094SBram Moolenaarenddef 2496ad39c094SBram Moolenaar 2497f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2498f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2499f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2500f93c7feaSBram Moolenaar echo 'clear' 2501df069eecSBram Moolenaar :1messages 2502f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2503f93c7feaSBram Moolenaar 2504d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2505f93c7feaSBram Moolenaarenddef 2506f93c7feaSBram Moolenaar 250747e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2508f5be8cdbSBram Moolenaar # only checks line continuation 2509cfcd011fSBram Moolenaar var lines =<< trim END 251047e880d6SBram Moolenaar vim9script 251147e880d6SBram Moolenaar echomsg 'here' 251247e880d6SBram Moolenaar .. ' is ' .. 251347e880d6SBram Moolenaar 'a message' 251447e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 251547e880d6SBram Moolenaar END 251647e880d6SBram Moolenaar CheckScriptSuccess(lines) 251747e880d6SBram Moolenaarenddef 251847e880d6SBram Moolenaar 2519f93c7feaSBram Moolenaardef Test_echoerr_cmd() 25207de62623SBram Moolenaar var local = 'local' 252140ee466cSBram Moolenaar try 25227de62623SBram Moolenaar echoerr 'something' local 'wrong' # comment 252340ee466cSBram Moolenaar catch 25247de62623SBram Moolenaar assert_match('something local wrong', v:exception) 252540ee466cSBram Moolenaar endtry 2526f93c7feaSBram Moolenaarenddef 2527f93c7feaSBram Moolenaar 252847e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2529f5be8cdbSBram Moolenaar # only checks line continuation 2530cfcd011fSBram Moolenaar var lines =<< trim END 253147e880d6SBram Moolenaar vim9script 253247e880d6SBram Moolenaar try 253347e880d6SBram Moolenaar echoerr 'this' 253447e880d6SBram Moolenaar .. ' is ' .. 253547e880d6SBram Moolenaar 'wrong' 253647e880d6SBram Moolenaar catch 253747e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 253847e880d6SBram Moolenaar endtry 253947e880d6SBram Moolenaar END 254047e880d6SBram Moolenaar CheckScriptSuccess(lines) 254147e880d6SBram Moolenaarenddef 254247e880d6SBram Moolenaar 25437de62623SBram Moolenaardef Test_echoconsole_cmd() 25447de62623SBram Moolenaar var local = 'local' 25457de62623SBram Moolenaar echoconsole 'something' local # comment 25467de62623SBram Moolenaar # output goes anywhere 25477de62623SBram Moolenaarenddef 25487de62623SBram Moolenaar 254941fe0617SBram Moolenaardef Test_for_outside_of_function() 2550cfcd011fSBram Moolenaar var lines =<< trim END 255141fe0617SBram Moolenaar vim9script 255241fe0617SBram Moolenaar new 255341fe0617SBram Moolenaar for var in range(0, 3) 255441fe0617SBram Moolenaar append(line('$'), var) 255541fe0617SBram Moolenaar endfor 255641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 255741fe0617SBram Moolenaar bwipe! 2558522eefd9SBram Moolenaar 2559522eefd9SBram Moolenaar var result = '' 2560522eefd9SBram Moolenaar for i in [1, 2, 3] 2561522eefd9SBram Moolenaar var loop = ' loop ' .. i 2562522eefd9SBram Moolenaar result ..= loop 2563522eefd9SBram Moolenaar endfor 2564522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 256541fe0617SBram Moolenaar END 256641fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 256741fe0617SBram Moolenaar source Xvim9for.vim 256841fe0617SBram Moolenaar delete('Xvim9for.vim') 256941fe0617SBram Moolenaarenddef 25708a7d6542SBram Moolenaar 2571bebf0695Srbtnndef Test_for_skipped_block() 2572bebf0695Srbtnn # test skipped blocks at outside of function 2573bebf0695Srbtnn var lines =<< trim END 2574bebf0695Srbtnn var result = [] 2575bebf0695Srbtnn if true 2576bebf0695Srbtnn for n in [1, 2] 2577bebf0695Srbtnn result += [n] 2578bebf0695Srbtnn endfor 2579bebf0695Srbtnn else 2580bebf0695Srbtnn for n in [3, 4] 2581bebf0695Srbtnn result += [n] 2582bebf0695Srbtnn endfor 2583bebf0695Srbtnn endif 2584bebf0695Srbtnn assert_equal([1, 2], result) 2585bebf0695Srbtnn 2586bebf0695Srbtnn result = [] 2587bebf0695Srbtnn if false 2588bebf0695Srbtnn for n in [1, 2] 2589bebf0695Srbtnn result += [n] 2590bebf0695Srbtnn endfor 2591bebf0695Srbtnn else 2592bebf0695Srbtnn for n in [3, 4] 2593bebf0695Srbtnn result += [n] 2594bebf0695Srbtnn endfor 2595bebf0695Srbtnn endif 2596bebf0695Srbtnn assert_equal([3, 4], result) 2597bebf0695Srbtnn END 2598bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2599bebf0695Srbtnn 2600bebf0695Srbtnn # test skipped blocks at inside of function 2601bebf0695Srbtnn lines =<< trim END 2602bebf0695Srbtnn def DefTrue() 2603bebf0695Srbtnn var result = [] 2604bebf0695Srbtnn if true 2605bebf0695Srbtnn for n in [1, 2] 2606bebf0695Srbtnn result += [n] 2607bebf0695Srbtnn endfor 2608bebf0695Srbtnn else 2609bebf0695Srbtnn for n in [3, 4] 2610bebf0695Srbtnn result += [n] 2611bebf0695Srbtnn endfor 2612bebf0695Srbtnn endif 2613bebf0695Srbtnn assert_equal([1, 2], result) 2614bebf0695Srbtnn enddef 2615bebf0695Srbtnn DefTrue() 2616bebf0695Srbtnn 2617bebf0695Srbtnn def DefFalse() 2618bebf0695Srbtnn var result = [] 2619bebf0695Srbtnn if false 2620bebf0695Srbtnn for n in [1, 2] 2621bebf0695Srbtnn result += [n] 2622bebf0695Srbtnn endfor 2623bebf0695Srbtnn else 2624bebf0695Srbtnn for n in [3, 4] 2625bebf0695Srbtnn result += [n] 2626bebf0695Srbtnn endfor 2627bebf0695Srbtnn endif 2628bebf0695Srbtnn assert_equal([3, 4], result) 2629bebf0695Srbtnn enddef 2630bebf0695Srbtnn DefFalse() 2631bebf0695Srbtnn END 2632bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2633bebf0695Srbtnnenddef 2634bebf0695Srbtnn 2635e8c4abbbSBram Moolenaardef Test_for_loop() 2636f2253963SBram Moolenaar var lines =<< trim END 2637cfcd011fSBram Moolenaar var result = '' 2638e8c4abbbSBram Moolenaar for cnt in range(7) 2639e8c4abbbSBram Moolenaar if cnt == 4 2640e8c4abbbSBram Moolenaar break 2641e8c4abbbSBram Moolenaar endif 2642e8c4abbbSBram Moolenaar if cnt == 2 2643e8c4abbbSBram Moolenaar continue 2644e8c4abbbSBram Moolenaar endif 2645e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2646e8c4abbbSBram Moolenaar endfor 2647e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 26480ad3e894SBram Moolenaar 2649cfcd011fSBram Moolenaar var concat = '' 26500ad3e894SBram Moolenaar for str in eval('["one", "two"]') 26510ad3e894SBram Moolenaar concat ..= str 26520ad3e894SBram Moolenaar endfor 26530ad3e894SBram Moolenaar assert_equal('onetwo', concat) 265438bd8de5SBram Moolenaar 265538bd8de5SBram Moolenaar var total = 0 265638bd8de5SBram Moolenaar for nr in 265738bd8de5SBram Moolenaar [1, 2, 3] 265838bd8de5SBram Moolenaar total += nr 265938bd8de5SBram Moolenaar endfor 266038bd8de5SBram Moolenaar assert_equal(6, total) 266138bd8de5SBram Moolenaar 266238bd8de5SBram Moolenaar total = 0 266338bd8de5SBram Moolenaar for nr 266438bd8de5SBram Moolenaar in [1, 2, 3] 266538bd8de5SBram Moolenaar total += nr 266638bd8de5SBram Moolenaar endfor 266738bd8de5SBram Moolenaar assert_equal(6, total) 266838bd8de5SBram Moolenaar 266938bd8de5SBram Moolenaar total = 0 267038bd8de5SBram Moolenaar for nr 267138bd8de5SBram Moolenaar in 267238bd8de5SBram Moolenaar [1, 2, 3] 267338bd8de5SBram Moolenaar total += nr 267438bd8de5SBram Moolenaar endfor 267538bd8de5SBram Moolenaar assert_equal(6, total) 2676036d0714SBram Moolenaar 2677a3589a0dSBram Moolenaar # with type 2678a3589a0dSBram Moolenaar total = 0 2679a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2680a3589a0dSBram Moolenaar total += n 2681a3589a0dSBram Moolenaar endfor 2682a3589a0dSBram Moolenaar assert_equal(6, total) 2683a3589a0dSBram Moolenaar 2684fe090eb5SBram Moolenaar var chars = '' 2685fe090eb5SBram Moolenaar for s: string in 'foobar' 2686fe090eb5SBram Moolenaar chars ..= s 2687fe090eb5SBram Moolenaar endfor 2688fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2689fe090eb5SBram Moolenaar 26905ede5b23SBram Moolenaar chars = '' 26915ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 26925ede5b23SBram Moolenaar chars ..= x 26935ede5b23SBram Moolenaar endfor 26945ede5b23SBram Moolenaar assert_equal('ab', chars) 26955ede5b23SBram Moolenaar 2696a3589a0dSBram Moolenaar # unpack with type 2697f2253963SBram Moolenaar var res = '' 2698a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2699a3589a0dSBram Moolenaar res ..= n .. s 2700a3589a0dSBram Moolenaar endfor 2701a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2702a3589a0dSBram Moolenaar 2703444d8783SBram Moolenaar # unpack with one var 2704444d8783SBram Moolenaar var reslist = [] 2705444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2706444d8783SBram Moolenaar reslist->add(x) 2707444d8783SBram Moolenaar endfor 2708444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2709444d8783SBram Moolenaar 2710a3589a0dSBram Moolenaar # loop over string 2711a3589a0dSBram Moolenaar res = '' 271274e54fcbSBram Moolenaar for c in 'aéc̀d' 271374e54fcbSBram Moolenaar res ..= c .. '-' 271474e54fcbSBram Moolenaar endfor 271574e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 271674e54fcbSBram Moolenaar 271774e54fcbSBram Moolenaar res = '' 271874e54fcbSBram Moolenaar for c in '' 271974e54fcbSBram Moolenaar res ..= c .. '-' 272074e54fcbSBram Moolenaar endfor 272174e54fcbSBram Moolenaar assert_equal('', res) 272274e54fcbSBram Moolenaar 272374e54fcbSBram Moolenaar res = '' 272474e54fcbSBram Moolenaar for c in test_null_string() 272574e54fcbSBram Moolenaar res ..= c .. '-' 272674e54fcbSBram Moolenaar endfor 272774e54fcbSBram Moolenaar assert_equal('', res) 2728f2253963SBram Moolenaar 2729f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2730f2253963SBram Moolenaar {a: 'Cat'} 2731f2253963SBram Moolenaar ] 2732f2253963SBram Moolenaar for dd in foo 2733f2253963SBram Moolenaar dd.counter = 12 2734f2253963SBram Moolenaar endfor 2735f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2736ad2d4969SBram Moolenaar 2737ad2d4969SBram Moolenaar reslist = [] 2738ad2d4969SBram Moolenaar for _ in range(3) 2739ad2d4969SBram Moolenaar reslist->add('x') 2740ad2d4969SBram Moolenaar endfor 2741ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2742f2253963SBram Moolenaar END 2743f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2744e8c4abbbSBram Moolenaarenddef 2745e8c4abbbSBram Moolenaar 27462eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 27472eb6fc3bSBram Moolenaar var lines =<< trim END 27482eb6fc3bSBram Moolenaar var flist: list<func> 27492eb6fc3bSBram Moolenaar for i in range(5) 27502eb6fc3bSBram Moolenaar var inloop = i 27512eb6fc3bSBram Moolenaar flist[i] = () => inloop 27522eb6fc3bSBram Moolenaar endfor 27532eb6fc3bSBram Moolenaar for i in range(5) 27542eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 27552eb6fc3bSBram Moolenaar endfor 27562eb6fc3bSBram Moolenaar END 27572eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 27582eb6fc3bSBram Moolenaar 27592eb6fc3bSBram Moolenaar lines =<< trim END 27602eb6fc3bSBram Moolenaar var flist: list<func> 27612eb6fc3bSBram Moolenaar for i in range(5) 27622eb6fc3bSBram Moolenaar var inloop = i 27632eb6fc3bSBram Moolenaar flist[i] = () => { 27642eb6fc3bSBram Moolenaar return inloop 27652eb6fc3bSBram Moolenaar } 27662eb6fc3bSBram Moolenaar endfor 27672eb6fc3bSBram Moolenaar for i in range(5) 27682eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 27692eb6fc3bSBram Moolenaar endfor 27702eb6fc3bSBram Moolenaar END 27712eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 27722eb6fc3bSBram Moolenaarenddef 27732eb6fc3bSBram Moolenaar 2774e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2775442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2776442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2777442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2778442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2779442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2780442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2781d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2782822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 27832d870f8dSBram Moolenaar delfunc! g:Func 2784675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2785675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2786675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 278774e54fcbSBram Moolenaar 278874e54fcbSBram Moolenaar # wrong type detected at compile time 278974e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 279074e54fcbSBram Moolenaar 279174e54fcbSBram Moolenaar # wrong type detected at runtime 279274e54fcbSBram Moolenaar g:adict = {a: 1} 279374e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 279474e54fcbSBram Moolenaar unlet g:adict 2795f6a8d420SBram Moolenaar 2796f6a8d420SBram Moolenaar var lines =<< trim END 2797f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2798f6a8d420SBram Moolenaar for e in d 2799f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2800f6a8d420SBram Moolenaar endfor 2801f6a8d420SBram Moolenaar END 2802f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2803fe090eb5SBram Moolenaar 2804fe090eb5SBram Moolenaar lines =<< trim END 2805fe090eb5SBram Moolenaar for nr: number in ['foo'] 2806fe090eb5SBram Moolenaar endfor 2807fe090eb5SBram Moolenaar END 2808fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2809404557e6SBram Moolenaar 2810404557e6SBram Moolenaar lines =<< trim END 2811404557e6SBram Moolenaar for n : number in [1, 2] 2812404557e6SBram Moolenaar echo n 2813404557e6SBram Moolenaar endfor 2814404557e6SBram Moolenaar END 2815404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2816efc5db52SBram Moolenaar 2817efc5db52SBram Moolenaar lines =<< trim END 2818efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2819efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2820efc5db52SBram Moolenaar echo k v 2821efc5db52SBram Moolenaar endfor 2822efc5db52SBram Moolenaar END 2823efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2824e8c4abbbSBram Moolenaarenddef 2825e8c4abbbSBram Moolenaar 2826ea87069dSBram Moolenaardef Test_for_loop_script_var() 2827ea87069dSBram Moolenaar # cannot use s:var in a :def function 2828ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2829ea87069dSBram Moolenaar 2830ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2831ea87069dSBram Moolenaar var lines =<< trim END 2832ea87069dSBram Moolenaar vim9script 2833ea87069dSBram Moolenaar var total = 0 2834ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2835ea87069dSBram Moolenaar total += s:var 2836ea87069dSBram Moolenaar endfor 2837ea87069dSBram Moolenaar assert_equal(6, total) 2838ea87069dSBram Moolenaar 2839ea87069dSBram Moolenaar total = 0 2840ea87069dSBram Moolenaar for var in [1, 2, 3] 2841ea87069dSBram Moolenaar total += var 2842ea87069dSBram Moolenaar endfor 2843ea87069dSBram Moolenaar assert_equal(6, total) 2844ea87069dSBram Moolenaar END 2845ea87069dSBram Moolenaarenddef 2846ea87069dSBram Moolenaar 2847792f786aSBram Moolenaardef Test_for_loop_unpack() 28484b8a0651SBram Moolenaar var lines =<< trim END 2849792f786aSBram Moolenaar var result = [] 2850792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2851792f786aSBram Moolenaar result->add(v1) 2852792f786aSBram Moolenaar result->add(v2) 2853792f786aSBram Moolenaar endfor 2854792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2855792f786aSBram Moolenaar 2856792f786aSBram Moolenaar result = [] 2857792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2858792f786aSBram Moolenaar result->add(v1) 2859792f786aSBram Moolenaar result->add(v2) 2860792f786aSBram Moolenaar result->add(v3) 2861792f786aSBram Moolenaar endfor 2862792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2863792f786aSBram Moolenaar 28644b8a0651SBram Moolenaar result = [] 28654b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 28664b8a0651SBram Moolenaar result->add(&ts) 28674b8a0651SBram Moolenaar result->add(&sw) 28684b8a0651SBram Moolenaar endfor 28694b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 28704b8a0651SBram Moolenaar 28714b8a0651SBram Moolenaar var slist: list<string> 28724b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 28734b8a0651SBram Moolenaar slist->add($LOOPVAR) 28744b8a0651SBram Moolenaar slist->add(@r) 28754b8a0651SBram Moolenaar slist->add(v:errmsg) 28764b8a0651SBram Moolenaar endfor 28774b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 28784b8a0651SBram Moolenaar 28794b8a0651SBram Moolenaar slist = [] 28804b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 28814b8a0651SBram Moolenaar slist->add(g:globalvar) 28824b8a0651SBram Moolenaar slist->add(b:bufvar) 28834b8a0651SBram Moolenaar slist->add(w:winvar) 28844b8a0651SBram Moolenaar slist->add(t:tabvar) 28854b8a0651SBram Moolenaar endfor 28864b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2887f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2888b777da9bSBram Moolenaar 2889b777da9bSBram Moolenaar var res = [] 2890b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2891b777da9bSBram Moolenaar res->add(n) 2892b777da9bSBram Moolenaar endfor 2893b777da9bSBram Moolenaar assert_equal([2, 5], res) 28944b8a0651SBram Moolenaar END 28954b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 28964b8a0651SBram Moolenaar 28974b8a0651SBram Moolenaar lines =<< trim END 2898792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2899792f786aSBram Moolenaar echo v1 v2 2900792f786aSBram Moolenaar endfor 2901792f786aSBram Moolenaar END 2902792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2903792f786aSBram Moolenaar 2904792f786aSBram Moolenaar lines =<< trim END 2905792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2906792f786aSBram Moolenaar echo v1 v2 2907792f786aSBram Moolenaar endfor 2908792f786aSBram Moolenaar END 2909792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2910792f786aSBram Moolenaar 2911792f786aSBram Moolenaar lines =<< trim END 2912792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2913792f786aSBram Moolenaar echo v1 2914792f786aSBram Moolenaar endfor 2915792f786aSBram Moolenaar END 2916792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2917792f786aSBram Moolenaarenddef 2918792f786aSBram Moolenaar 2919c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2920f2253963SBram Moolenaar var lines =<< trim END 2921c150c09eSBram Moolenaar var looped = 0 2922c150c09eSBram Moolenaar var cleanup = 0 2923c150c09eSBram Moolenaar for i in range(3) 2924c150c09eSBram Moolenaar looped += 1 2925c150c09eSBram Moolenaar try 2926c150c09eSBram Moolenaar eval [][0] 2927c150c09eSBram Moolenaar catch 2928c150c09eSBram Moolenaar continue 2929c150c09eSBram Moolenaar finally 2930c150c09eSBram Moolenaar cleanup += 1 2931c150c09eSBram Moolenaar endtry 2932c150c09eSBram Moolenaar endfor 2933c150c09eSBram Moolenaar assert_equal(3, looped) 2934c150c09eSBram Moolenaar assert_equal(3, cleanup) 2935f2253963SBram Moolenaar END 2936f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2937c150c09eSBram Moolenaarenddef 2938c150c09eSBram Moolenaar 2939d895b1d9Srbtnndef Test_while_skipped_block() 2940d895b1d9Srbtnn # test skipped blocks at outside of function 2941d895b1d9Srbtnn var lines =<< trim END 2942d895b1d9Srbtnn var result = [] 2943d895b1d9Srbtnn var n = 0 2944d895b1d9Srbtnn if true 2945d895b1d9Srbtnn n = 1 2946d895b1d9Srbtnn while n < 3 2947d895b1d9Srbtnn result += [n] 2948d895b1d9Srbtnn n += 1 2949d895b1d9Srbtnn endwhile 2950d895b1d9Srbtnn else 2951d895b1d9Srbtnn n = 3 2952d895b1d9Srbtnn while n < 5 2953d895b1d9Srbtnn result += [n] 2954d895b1d9Srbtnn n += 1 2955d895b1d9Srbtnn endwhile 2956d895b1d9Srbtnn endif 2957d895b1d9Srbtnn assert_equal([1, 2], result) 2958d895b1d9Srbtnn 2959d895b1d9Srbtnn result = [] 2960d895b1d9Srbtnn if false 2961d895b1d9Srbtnn n = 1 2962d895b1d9Srbtnn while n < 3 2963d895b1d9Srbtnn result += [n] 2964d895b1d9Srbtnn n += 1 2965d895b1d9Srbtnn endwhile 2966d895b1d9Srbtnn else 2967d895b1d9Srbtnn n = 3 2968d895b1d9Srbtnn while n < 5 2969d895b1d9Srbtnn result += [n] 2970d895b1d9Srbtnn n += 1 2971d895b1d9Srbtnn endwhile 2972d895b1d9Srbtnn endif 2973d895b1d9Srbtnn assert_equal([3, 4], result) 2974d895b1d9Srbtnn END 2975d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 2976d895b1d9Srbtnn 2977d895b1d9Srbtnn # test skipped blocks at inside of function 2978d895b1d9Srbtnn lines =<< trim END 2979d895b1d9Srbtnn def DefTrue() 2980d895b1d9Srbtnn var result = [] 2981d895b1d9Srbtnn var n = 0 2982d895b1d9Srbtnn if true 2983d895b1d9Srbtnn n = 1 2984d895b1d9Srbtnn while n < 3 2985d895b1d9Srbtnn result += [n] 2986d895b1d9Srbtnn n += 1 2987d895b1d9Srbtnn endwhile 2988d895b1d9Srbtnn else 2989d895b1d9Srbtnn n = 3 2990d895b1d9Srbtnn while n < 5 2991d895b1d9Srbtnn result += [n] 2992d895b1d9Srbtnn n += 1 2993d895b1d9Srbtnn endwhile 2994d895b1d9Srbtnn endif 2995d895b1d9Srbtnn assert_equal([1, 2], result) 2996d895b1d9Srbtnn enddef 2997d895b1d9Srbtnn DefTrue() 2998d895b1d9Srbtnn 2999d895b1d9Srbtnn def DefFalse() 3000d895b1d9Srbtnn var result = [] 3001d895b1d9Srbtnn var n = 0 3002d895b1d9Srbtnn if false 3003d895b1d9Srbtnn n = 1 3004d895b1d9Srbtnn while n < 3 3005d895b1d9Srbtnn result += [n] 3006d895b1d9Srbtnn n += 1 3007d895b1d9Srbtnn endwhile 3008d895b1d9Srbtnn else 3009d895b1d9Srbtnn n = 3 3010d895b1d9Srbtnn while n < 5 3011d895b1d9Srbtnn result += [n] 3012d895b1d9Srbtnn n += 1 3013d895b1d9Srbtnn endwhile 3014d895b1d9Srbtnn endif 3015d895b1d9Srbtnn assert_equal([3, 4], result) 3016d895b1d9Srbtnn enddef 3017d895b1d9Srbtnn DefFalse() 3018d895b1d9Srbtnn END 3019d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 3020d895b1d9Srbtnnenddef 3021d895b1d9Srbtnn 3022d0df1aacSBram Moolenaardef Test_while_loop() 3023cfcd011fSBram Moolenaar var result = '' 3024cfcd011fSBram Moolenaar var cnt = 0 3025d0df1aacSBram Moolenaar while cnt < 555 3026d0df1aacSBram Moolenaar if cnt == 3 3027d0df1aacSBram Moolenaar break 3028d0df1aacSBram Moolenaar endif 3029d0df1aacSBram Moolenaar cnt += 1 3030d0df1aacSBram Moolenaar if cnt == 2 3031d0df1aacSBram Moolenaar continue 3032d0df1aacSBram Moolenaar endif 3033d0df1aacSBram Moolenaar result ..= cnt .. '_' 3034d0df1aacSBram Moolenaar endwhile 3035d0df1aacSBram Moolenaar assert_equal('1_3_', result) 3036dee37dc7SBram Moolenaar 3037dee37dc7SBram Moolenaar var s = '' 30380123cc1eSBram Moolenaar while s == 'x' # {comment} 3039dee37dc7SBram Moolenaar endwhile 3040d0df1aacSBram Moolenaarenddef 3041d0df1aacSBram Moolenaar 3042e8c4abbbSBram Moolenaardef Test_while_loop_fails() 3043675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 3044675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 3045675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 3046675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 3047675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 3048675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 3049675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 30506628b7ebSBram Moolenaar 30516628b7ebSBram Moolenaar var lines =<< trim END 30526628b7ebSBram Moolenaar var s = '' 30536628b7ebSBram Moolenaar while s = '' 30546628b7ebSBram Moolenaar endwhile 30556628b7ebSBram Moolenaar END 30566628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 3057bd5da371SBram Moolenaarenddef 3058bd5da371SBram Moolenaar 30599645e2d9SBram Moolenaardef Test_interrupt_loop() 3060cfcd011fSBram Moolenaar var caught = false 3061cfcd011fSBram Moolenaar var x = 0 306297acfc78SBram Moolenaar try 30639645e2d9SBram Moolenaar while 1 30649645e2d9SBram Moolenaar x += 1 30659645e2d9SBram Moolenaar if x == 100 30669645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 30679645e2d9SBram Moolenaar endif 30689645e2d9SBram Moolenaar endwhile 306997acfc78SBram Moolenaar catch 307097acfc78SBram Moolenaar caught = true 307197acfc78SBram Moolenaar assert_equal(100, x) 307297acfc78SBram Moolenaar endtry 307397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 307425859dd7SBram Moolenaar # consume the CTRL-C 307525859dd7SBram Moolenaar getchar(0) 30769645e2d9SBram Moolenaarenddef 307720431c9dSBram Moolenaar 30784fdae999SBram Moolenaardef Test_automatic_line_continuation() 3079cfcd011fSBram Moolenaar var mylist = [ 30804fdae999SBram Moolenaar 'one', 30814fdae999SBram Moolenaar 'two', 30824fdae999SBram Moolenaar 'three', 3083f5be8cdbSBram Moolenaar ] # comment 30844fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 30854fdae999SBram Moolenaar 3086cfcd011fSBram Moolenaar var mydict = { 3087e0de171eSBram Moolenaar ['one']: 1, 3088e0de171eSBram Moolenaar ['two']: 2, 3089e0de171eSBram Moolenaar ['three']: 30904fdae999SBram Moolenaar 3, 3091f5be8cdbSBram Moolenaar } # comment 3092e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3093e0de171eSBram Moolenaar mydict = { 30942c330432SBram Moolenaar one: 1, # comment 30952c330432SBram Moolenaar two: # comment 30962c330432SBram Moolenaar 2, # comment 30972c330432SBram Moolenaar three: 3 # comment 30982c330432SBram Moolenaar } 3099e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3100e0de171eSBram Moolenaar mydict = { 31012c330432SBram Moolenaar one: 1, 31024fdae999SBram Moolenaar two: 31034fdae999SBram Moolenaar 2, 31042c330432SBram Moolenaar three: 3 31054fdae999SBram Moolenaar } 3106e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3107e6085c53SBram Moolenaar 3108e6085c53SBram Moolenaar assert_equal( 3109e6085c53SBram Moolenaar ['one', 'two', 'three'], 3110e6085c53SBram Moolenaar split('one two three') 3111e6085c53SBram Moolenaar ) 31124fdae999SBram Moolenaarenddef 31134fdae999SBram Moolenaar 31147a092245SBram Moolenaardef Test_vim9_comment() 31157a092245SBram Moolenaar CheckScriptSuccess([ 31167a092245SBram Moolenaar 'vim9script', 31177a092245SBram Moolenaar '# something', 311893f82cbeSBram Moolenaar '#something', 311993f82cbeSBram Moolenaar '#{something', 31207a092245SBram Moolenaar ]) 312193f82cbeSBram Moolenaar 312293f82cbeSBram Moolenaar split Xfile 312393f82cbeSBram Moolenaar CheckScriptSuccess([ 312493f82cbeSBram Moolenaar 'vim9script', 312593f82cbeSBram Moolenaar 'edit #something', 312693f82cbeSBram Moolenaar ]) 312793f82cbeSBram Moolenaar CheckScriptSuccess([ 312893f82cbeSBram Moolenaar 'vim9script', 312993f82cbeSBram Moolenaar 'edit #{something', 313093f82cbeSBram Moolenaar ]) 313193f82cbeSBram Moolenaar close 313293f82cbeSBram Moolenaar 31337a092245SBram Moolenaar CheckScriptFailure([ 31347a092245SBram Moolenaar 'vim9script', 31357a092245SBram Moolenaar ':# something', 31367a092245SBram Moolenaar ], 'E488:') 31377a092245SBram Moolenaar CheckScriptFailure([ 31387a092245SBram Moolenaar '# something', 31397a092245SBram Moolenaar ], 'E488:') 31407a092245SBram Moolenaar CheckScriptFailure([ 31417a092245SBram Moolenaar ':# something', 31427a092245SBram Moolenaar ], 'E488:') 31437a092245SBram Moolenaar 31444a8d9f2eSBram Moolenaar { # block start 31454a8d9f2eSBram Moolenaar } # block end 31464a8d9f2eSBram Moolenaar CheckDefFailure([ 31474a8d9f2eSBram Moolenaar '{# comment', 31484a8d9f2eSBram Moolenaar ], 'E488:') 31494a8d9f2eSBram Moolenaar CheckDefFailure([ 31504a8d9f2eSBram Moolenaar '{', 31514a8d9f2eSBram Moolenaar '}# comment', 31524a8d9f2eSBram Moolenaar ], 'E488:') 31534a8d9f2eSBram Moolenaar 31544a8d9f2eSBram Moolenaar echo "yes" # comment 31554a8d9f2eSBram Moolenaar CheckDefFailure([ 31564a8d9f2eSBram Moolenaar 'echo "yes"# comment', 31574a8d9f2eSBram Moolenaar ], 'E488:') 31587a092245SBram Moolenaar CheckScriptSuccess([ 31597a092245SBram Moolenaar 'vim9script', 31607a092245SBram Moolenaar 'echo "yes" # something', 31617a092245SBram Moolenaar ]) 31627a092245SBram Moolenaar CheckScriptFailure([ 31637a092245SBram Moolenaar 'vim9script', 31647a092245SBram Moolenaar 'echo "yes"# something', 31657a092245SBram Moolenaar ], 'E121:') 31667a092245SBram Moolenaar CheckScriptFailure([ 31677a092245SBram Moolenaar 'vim9script', 31687a092245SBram Moolenaar 'echo# something', 3169f8103f27SBram Moolenaar ], 'E1144:') 31707a092245SBram Moolenaar CheckScriptFailure([ 31717a092245SBram Moolenaar 'echo "yes" # something', 31727a092245SBram Moolenaar ], 'E121:') 31737a092245SBram Moolenaar 31744a8d9f2eSBram Moolenaar exe "echo" # comment 31754a8d9f2eSBram Moolenaar CheckDefFailure([ 31764a8d9f2eSBram Moolenaar 'exe "echo"# comment', 31774a8d9f2eSBram Moolenaar ], 'E488:') 31784a8d9f2eSBram Moolenaar CheckScriptSuccess([ 31794a8d9f2eSBram Moolenaar 'vim9script', 31804a8d9f2eSBram Moolenaar 'exe "echo" # something', 31814a8d9f2eSBram Moolenaar ]) 31824a8d9f2eSBram Moolenaar CheckScriptFailure([ 31834a8d9f2eSBram Moolenaar 'vim9script', 31844a8d9f2eSBram Moolenaar 'exe "echo"# something', 31854a8d9f2eSBram Moolenaar ], 'E121:') 31864a8d9f2eSBram Moolenaar CheckScriptFailure([ 31874a8d9f2eSBram Moolenaar 'vim9script', 31884a8d9f2eSBram Moolenaar 'exe# something', 3189f8103f27SBram Moolenaar ], 'E1144:') 31904a8d9f2eSBram Moolenaar CheckScriptFailure([ 31914a8d9f2eSBram Moolenaar 'exe "echo" # something', 31924a8d9f2eSBram Moolenaar ], 'E121:') 31934a8d9f2eSBram Moolenaar 31947a092245SBram Moolenaar CheckDefFailure([ 31957a092245SBram Moolenaar 'try# comment', 31967a092245SBram Moolenaar ' echo "yes"', 31977a092245SBram Moolenaar 'catch', 31987a092245SBram Moolenaar 'endtry', 3199f8103f27SBram Moolenaar ], 'E1144:') 32002c5ed4e3SBram Moolenaar CheckScriptFailure([ 32012c5ed4e3SBram Moolenaar 'vim9script', 32022c5ed4e3SBram Moolenaar 'try# comment', 32032c5ed4e3SBram Moolenaar 'echo "yes"', 3204f8103f27SBram Moolenaar ], 'E1144:') 32057a092245SBram Moolenaar CheckDefFailure([ 32067a092245SBram Moolenaar 'try', 3207a72cfb80SBram Moolenaar ' throw#comment', 3208a72cfb80SBram Moolenaar 'catch', 3209a72cfb80SBram Moolenaar 'endtry', 3210f8103f27SBram Moolenaar ], 'E1144:') 3211a72cfb80SBram Moolenaar CheckDefFailure([ 3212a72cfb80SBram Moolenaar 'try', 3213a72cfb80SBram Moolenaar ' throw "yes"#comment', 3214a72cfb80SBram Moolenaar 'catch', 3215a72cfb80SBram Moolenaar 'endtry', 3216a72cfb80SBram Moolenaar ], 'E488:') 3217a72cfb80SBram Moolenaar CheckDefFailure([ 3218a72cfb80SBram Moolenaar 'try', 32197a092245SBram Moolenaar ' echo "yes"', 32207a092245SBram Moolenaar 'catch# comment', 32217a092245SBram Moolenaar 'endtry', 3222f8103f27SBram Moolenaar ], 'E1144:') 32232c5ed4e3SBram Moolenaar CheckScriptFailure([ 32242c5ed4e3SBram Moolenaar 'vim9script', 32252c5ed4e3SBram Moolenaar 'try', 32262c5ed4e3SBram Moolenaar ' echo "yes"', 32272c5ed4e3SBram Moolenaar 'catch# comment', 32282c5ed4e3SBram Moolenaar 'endtry', 3229f8103f27SBram Moolenaar ], 'E1144:') 32302c5ed4e3SBram Moolenaar CheckDefFailure([ 32312c5ed4e3SBram Moolenaar 'try', 32322c5ed4e3SBram Moolenaar ' echo "yes"', 32332c5ed4e3SBram Moolenaar 'catch /pat/# comment', 32342c5ed4e3SBram Moolenaar 'endtry', 32352c5ed4e3SBram Moolenaar ], 'E488:') 32367a092245SBram Moolenaar CheckDefFailure([ 32377a092245SBram Moolenaar 'try', 32387a092245SBram Moolenaar 'echo "yes"', 32397a092245SBram Moolenaar 'catch', 32407a092245SBram Moolenaar 'endtry# comment', 3241f8103f27SBram Moolenaar ], 'E1144:') 32422c5ed4e3SBram Moolenaar CheckScriptFailure([ 32432c5ed4e3SBram Moolenaar 'vim9script', 32442c5ed4e3SBram Moolenaar 'try', 32452c5ed4e3SBram Moolenaar ' echo "yes"', 32462c5ed4e3SBram Moolenaar 'catch', 32472c5ed4e3SBram Moolenaar 'endtry# comment', 3248f8103f27SBram Moolenaar ], 'E1144:') 32492c5ed4e3SBram Moolenaar 32502c5ed4e3SBram Moolenaar CheckScriptSuccess([ 32512c5ed4e3SBram Moolenaar 'vim9script', 32522c5ed4e3SBram Moolenaar 'hi # comment', 32532c5ed4e3SBram Moolenaar ]) 32542c5ed4e3SBram Moolenaar CheckScriptFailure([ 32552c5ed4e3SBram Moolenaar 'vim9script', 32562c5ed4e3SBram Moolenaar 'hi# comment', 3257f8103f27SBram Moolenaar ], 'E1144:') 32581966c248SBram Moolenaar CheckScriptSuccess([ 32591966c248SBram Moolenaar 'vim9script', 32601966c248SBram Moolenaar 'hi Search # comment', 32611966c248SBram Moolenaar ]) 32621966c248SBram Moolenaar CheckScriptFailure([ 32631966c248SBram Moolenaar 'vim9script', 32641966c248SBram Moolenaar 'hi Search# comment', 32651966c248SBram Moolenaar ], 'E416:') 32661966c248SBram Moolenaar CheckScriptSuccess([ 32671966c248SBram Moolenaar 'vim9script', 32681966c248SBram Moolenaar 'hi link This Search # comment', 32691966c248SBram Moolenaar ]) 32701966c248SBram Moolenaar CheckScriptFailure([ 32711966c248SBram Moolenaar 'vim9script', 32721966c248SBram Moolenaar 'hi link This That# comment', 32731966c248SBram Moolenaar ], 'E413:') 32741966c248SBram Moolenaar CheckScriptSuccess([ 32751966c248SBram Moolenaar 'vim9script', 32761966c248SBram Moolenaar 'hi clear This # comment', 32771966c248SBram Moolenaar 'hi clear # comment', 32781966c248SBram Moolenaar ]) 3279f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3280f5be8cdbSBram Moolenaar # hi clear This# comment', 32811966c248SBram Moolenaar CheckScriptFailure([ 32821966c248SBram Moolenaar 'vim9script', 32831966c248SBram Moolenaar 'hi clear# comment', 32841966c248SBram Moolenaar ], 'E416:') 32851966c248SBram Moolenaar 32861966c248SBram Moolenaar CheckScriptSuccess([ 32871966c248SBram Moolenaar 'vim9script', 32881966c248SBram Moolenaar 'hi Group term=bold', 32891966c248SBram Moolenaar 'match Group /todo/ # comment', 32901966c248SBram Moolenaar ]) 32911966c248SBram Moolenaar CheckScriptFailure([ 32921966c248SBram Moolenaar 'vim9script', 32931966c248SBram Moolenaar 'hi Group term=bold', 32941966c248SBram Moolenaar 'match Group /todo/# comment', 32951966c248SBram Moolenaar ], 'E488:') 32961966c248SBram Moolenaar CheckScriptSuccess([ 32971966c248SBram Moolenaar 'vim9script', 32981966c248SBram Moolenaar 'match # comment', 32991966c248SBram Moolenaar ]) 33001966c248SBram Moolenaar CheckScriptFailure([ 33011966c248SBram Moolenaar 'vim9script', 33021966c248SBram Moolenaar 'match# comment', 3303f8103f27SBram Moolenaar ], 'E1144:') 33041966c248SBram Moolenaar CheckScriptSuccess([ 33051966c248SBram Moolenaar 'vim9script', 33061966c248SBram Moolenaar 'match none # comment', 33071966c248SBram Moolenaar ]) 33081966c248SBram Moolenaar CheckScriptFailure([ 33091966c248SBram Moolenaar 'vim9script', 33101966c248SBram Moolenaar 'match none# comment', 33111966c248SBram Moolenaar ], 'E475:') 33121966c248SBram Moolenaar 33131966c248SBram Moolenaar CheckScriptSuccess([ 33141966c248SBram Moolenaar 'vim9script', 33151966c248SBram Moolenaar 'menutrans clear # comment', 33161966c248SBram Moolenaar ]) 33171966c248SBram Moolenaar CheckScriptFailure([ 33181966c248SBram Moolenaar 'vim9script', 33191966c248SBram Moolenaar 'menutrans clear# comment text', 33201966c248SBram Moolenaar ], 'E474:') 33211966c248SBram Moolenaar 33221966c248SBram Moolenaar CheckScriptSuccess([ 33231966c248SBram Moolenaar 'vim9script', 33241966c248SBram Moolenaar 'syntax clear # comment', 33251966c248SBram Moolenaar ]) 33261966c248SBram Moolenaar CheckScriptFailure([ 33271966c248SBram Moolenaar 'vim9script', 33281966c248SBram Moolenaar 'syntax clear# comment text', 33291966c248SBram Moolenaar ], 'E28:') 33301966c248SBram Moolenaar CheckScriptSuccess([ 33311966c248SBram Moolenaar 'vim9script', 33321966c248SBram Moolenaar 'syntax keyword Word some', 33331966c248SBram Moolenaar 'syntax clear Word # comment', 33341966c248SBram Moolenaar ]) 33351966c248SBram Moolenaar CheckScriptFailure([ 33361966c248SBram Moolenaar 'vim9script', 33371966c248SBram Moolenaar 'syntax keyword Word some', 33381966c248SBram Moolenaar 'syntax clear Word# comment text', 33391966c248SBram Moolenaar ], 'E28:') 33401966c248SBram Moolenaar 33411966c248SBram Moolenaar CheckScriptSuccess([ 33421966c248SBram Moolenaar 'vim9script', 33431966c248SBram Moolenaar 'syntax list # comment', 33441966c248SBram Moolenaar ]) 33451966c248SBram Moolenaar CheckScriptFailure([ 33461966c248SBram Moolenaar 'vim9script', 33471966c248SBram Moolenaar 'syntax list# comment text', 33481966c248SBram Moolenaar ], 'E28:') 33491966c248SBram Moolenaar 33501966c248SBram Moolenaar CheckScriptSuccess([ 33511966c248SBram Moolenaar 'vim9script', 33521966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 33531966c248SBram Moolenaar ]) 33541966c248SBram Moolenaar CheckScriptFailure([ 33551966c248SBram Moolenaar 'vim9script', 33561966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 33571966c248SBram Moolenaar ], 'E475:') 33581966c248SBram Moolenaar 33591966c248SBram Moolenaar CheckScriptSuccess([ 33601966c248SBram Moolenaar 'vim9script', 33611966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 33621966c248SBram Moolenaar ]) 33631966c248SBram Moolenaar CheckScriptFailure([ 33641966c248SBram Moolenaar 'vim9script', 33651966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 33661966c248SBram Moolenaar ], 'E789:') 33671966c248SBram Moolenaar 33681966c248SBram Moolenaar CheckScriptSuccess([ 33691966c248SBram Moolenaar 'vim9script', 33701966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 33711966c248SBram Moolenaar ]) 33721966c248SBram Moolenaar CheckScriptFailure([ 33731966c248SBram Moolenaar 'vim9script', 33741966c248SBram Moolenaar 'syntax match Word /pat/# comment', 33751966c248SBram Moolenaar ], 'E402:') 33761966c248SBram Moolenaar 33771966c248SBram Moolenaar CheckScriptSuccess([ 33781966c248SBram Moolenaar 'vim9script', 33791966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 33801966c248SBram Moolenaar ]) 33811966c248SBram Moolenaar CheckScriptFailure([ 33821966c248SBram Moolenaar 'vim9script', 33831966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 33841966c248SBram Moolenaar ], 'E475:') 33851966c248SBram Moolenaar CheckScriptFailure([ 33861966c248SBram Moolenaar 'vim9script', 33871966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 33881966c248SBram Moolenaar ], 'E406:') 33891966c248SBram Moolenaar CheckScriptFailure([ 33901966c248SBram Moolenaar 'vim9script', 33911966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 33921966c248SBram Moolenaar ], 'E475:') 33931966c248SBram Moolenaar 33941966c248SBram Moolenaar CheckScriptSuccess([ 33951966c248SBram Moolenaar 'vim9script', 33961966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 33971966c248SBram Moolenaar ]) 33981966c248SBram Moolenaar CheckScriptFailure([ 33991966c248SBram Moolenaar 'vim9script', 34001966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3401d032f34aSBram Moolenaar ], 'E402:') 34021966c248SBram Moolenaar 34031966c248SBram Moolenaar CheckScriptSuccess([ 34041966c248SBram Moolenaar 'vim9script', 34051966c248SBram Moolenaar 'syntax sync # comment', 34061966c248SBram Moolenaar ]) 34071966c248SBram Moolenaar CheckScriptFailure([ 34081966c248SBram Moolenaar 'vim9script', 34091966c248SBram Moolenaar 'syntax sync# comment', 34101966c248SBram Moolenaar ], 'E404:') 34111966c248SBram Moolenaar CheckScriptSuccess([ 34121966c248SBram Moolenaar 'vim9script', 34131966c248SBram Moolenaar 'syntax sync ccomment # comment', 34141966c248SBram Moolenaar ]) 34151966c248SBram Moolenaar CheckScriptFailure([ 34161966c248SBram Moolenaar 'vim9script', 34171966c248SBram Moolenaar 'syntax sync ccomment# comment', 34181966c248SBram Moolenaar ], 'E404:') 34191966c248SBram Moolenaar 34201966c248SBram Moolenaar CheckScriptSuccess([ 34211966c248SBram Moolenaar 'vim9script', 34221966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 34231966c248SBram Moolenaar ]) 34241966c248SBram Moolenaar CheckScriptFailure([ 34251966c248SBram Moolenaar 'vim9script', 34261966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 34271966c248SBram Moolenaar ], 'E475:') 3428a72cfb80SBram Moolenaar 3429a72cfb80SBram Moolenaar CheckScriptSuccess([ 3430a72cfb80SBram Moolenaar 'vim9script', 3431a72cfb80SBram Moolenaar 'command Echo echo # comment', 3432a72cfb80SBram Moolenaar 'command Echo # comment', 34332d870f8dSBram Moolenaar 'delcommand Echo', 3434a72cfb80SBram Moolenaar ]) 3435a72cfb80SBram Moolenaar CheckScriptFailure([ 3436a72cfb80SBram Moolenaar 'vim9script', 3437a72cfb80SBram Moolenaar 'command Echo echo# comment', 3438a72cfb80SBram Moolenaar 'Echo', 3439f8103f27SBram Moolenaar ], 'E1144:') 34402d870f8dSBram Moolenaar delcommand Echo 344170249ee8SBram Moolenaar 344270249ee8SBram Moolenaar var curdir = getcwd() 344370249ee8SBram Moolenaar CheckScriptSuccess([ 344470249ee8SBram Moolenaar 'command Echo cd " comment', 344570249ee8SBram Moolenaar 'Echo', 344670249ee8SBram Moolenaar 'delcommand Echo', 344770249ee8SBram Moolenaar ]) 344870249ee8SBram Moolenaar CheckScriptSuccess([ 3449090728adSBram Moolenaar 'vim9script', 345070249ee8SBram Moolenaar 'command Echo cd # comment', 345170249ee8SBram Moolenaar 'Echo', 345270249ee8SBram Moolenaar 'delcommand Echo', 345370249ee8SBram Moolenaar ]) 345470249ee8SBram Moolenaar CheckScriptFailure([ 345570249ee8SBram Moolenaar 'vim9script', 345670249ee8SBram Moolenaar 'command Echo cd " comment', 345770249ee8SBram Moolenaar 'Echo', 345870249ee8SBram Moolenaar ], 'E344:') 345970249ee8SBram Moolenaar delcommand Echo 346070249ee8SBram Moolenaar chdir(curdir) 346170249ee8SBram Moolenaar 3462a72cfb80SBram Moolenaar CheckScriptFailure([ 3463a72cfb80SBram Moolenaar 'vim9script', 3464a72cfb80SBram Moolenaar 'command Echo# comment', 3465a72cfb80SBram Moolenaar ], 'E182:') 3466a72cfb80SBram Moolenaar CheckScriptFailure([ 3467a72cfb80SBram Moolenaar 'vim9script', 3468a72cfb80SBram Moolenaar 'command Echo echo', 3469a72cfb80SBram Moolenaar 'command Echo# comment', 3470a72cfb80SBram Moolenaar ], 'E182:') 34712d870f8dSBram Moolenaar delcommand Echo 3472a72cfb80SBram Moolenaar 3473a72cfb80SBram Moolenaar CheckScriptSuccess([ 3474a72cfb80SBram Moolenaar 'vim9script', 3475a72cfb80SBram Moolenaar 'function # comment', 3476a72cfb80SBram Moolenaar ]) 3477a72cfb80SBram Moolenaar CheckScriptFailure([ 3478a72cfb80SBram Moolenaar 'vim9script', 34799898107fSBram Moolenaar 'function " comment', 34809898107fSBram Moolenaar ], 'E129:') 34819898107fSBram Moolenaar CheckScriptFailure([ 34829898107fSBram Moolenaar 'vim9script', 3483a72cfb80SBram Moolenaar 'function# comment', 3484f8103f27SBram Moolenaar ], 'E1144:') 3485a72cfb80SBram Moolenaar CheckScriptSuccess([ 3486a72cfb80SBram Moolenaar 'vim9script', 3487a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3488a72cfb80SBram Moolenaar ]) 3489a72cfb80SBram Moolenaar CheckScriptFailure([ 3490a72cfb80SBram Moolenaar 'vim9script', 3491a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3492a72cfb80SBram Moolenaar ], 'E488:') 3493a72cfb80SBram Moolenaar 3494a72cfb80SBram Moolenaar CheckScriptSuccess([ 3495a72cfb80SBram Moolenaar 'vim9script', 34964c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3497a72cfb80SBram Moolenaar 'endfunc', 34984c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3499a72cfb80SBram Moolenaar ]) 3500a72cfb80SBram Moolenaar CheckScriptFailure([ 3501a72cfb80SBram Moolenaar 'vim9script', 35024c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3503a72cfb80SBram Moolenaar 'endfunc', 35044c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3505a72cfb80SBram Moolenaar ], 'E488:') 3506a72cfb80SBram Moolenaar 3507a72cfb80SBram Moolenaar CheckScriptSuccess([ 3508a72cfb80SBram Moolenaar 'vim9script', 3509a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3510a72cfb80SBram Moolenaar ]) 3511a72cfb80SBram Moolenaar CheckScriptFailure([ 3512a72cfb80SBram Moolenaar 'vim9script', 3513a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3514a72cfb80SBram Moolenaar ], 'E488:') 3515e7e4838fSBram Moolenaar 3516e7e4838fSBram Moolenaar CheckScriptFailure([ 3517e7e4838fSBram Moolenaar 'def Test() " comment', 3518e7e4838fSBram Moolenaar 'enddef', 3519e7e4838fSBram Moolenaar ], 'E488:') 3520e7e4838fSBram Moolenaar CheckScriptFailure([ 3521e7e4838fSBram Moolenaar 'vim9script', 3522e7e4838fSBram Moolenaar 'def Test() " comment', 3523e7e4838fSBram Moolenaar 'enddef', 3524e7e4838fSBram Moolenaar ], 'E488:') 3525e7e4838fSBram Moolenaar 3526e7e4838fSBram Moolenaar CheckScriptSuccess([ 3527e7e4838fSBram Moolenaar 'func Test() " comment', 3528e7e4838fSBram Moolenaar 'endfunc', 35292d870f8dSBram Moolenaar 'delfunc Test', 3530e7e4838fSBram Moolenaar ]) 35319898107fSBram Moolenaar CheckScriptSuccess([ 3532e7e4838fSBram Moolenaar 'vim9script', 3533e7e4838fSBram Moolenaar 'func Test() " comment', 3534e7e4838fSBram Moolenaar 'endfunc', 35359898107fSBram Moolenaar ]) 3536e7e4838fSBram Moolenaar 3537e7e4838fSBram Moolenaar CheckScriptSuccess([ 3538e7e4838fSBram Moolenaar 'def Test() # comment', 3539e7e4838fSBram Moolenaar 'enddef', 3540e7e4838fSBram Moolenaar ]) 3541e7e4838fSBram Moolenaar CheckScriptFailure([ 3542e7e4838fSBram Moolenaar 'func Test() # comment', 3543e7e4838fSBram Moolenaar 'endfunc', 3544e7e4838fSBram Moolenaar ], 'E488:') 35450f37e356SBram Moolenaar 35460f37e356SBram Moolenaar var lines =<< trim END 35470f37e356SBram Moolenaar vim9script 35480f37e356SBram Moolenaar syn region Text 35490f37e356SBram Moolenaar \ start='foo' 35500f37e356SBram Moolenaar #\ comment 35510f37e356SBram Moolenaar \ end='bar' 35525072b47aSBram Moolenaar syn region Text start='foo' 35535072b47aSBram Moolenaar #\ comment 35545072b47aSBram Moolenaar \ end='bar' 35550f37e356SBram Moolenaar END 35560f37e356SBram Moolenaar CheckScriptSuccess(lines) 35570f37e356SBram Moolenaar 35580f37e356SBram Moolenaar lines =<< trim END 35590f37e356SBram Moolenaar vim9script 35600f37e356SBram Moolenaar syn region Text 35610f37e356SBram Moolenaar \ start='foo' 35620f37e356SBram Moolenaar "\ comment 35630f37e356SBram Moolenaar \ end='bar' 35640f37e356SBram Moolenaar END 35650f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 35662c5ed4e3SBram Moolenaarenddef 35672c5ed4e3SBram Moolenaar 35682c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 35692c5ed4e3SBram Moolenaar CheckCanRunGui 35702c5ed4e3SBram Moolenaar 35712c5ed4e3SBram Moolenaar CheckScriptFailure([ 35722c5ed4e3SBram Moolenaar 'vim9script', 35732c5ed4e3SBram Moolenaar 'gui#comment' 3574f8103f27SBram Moolenaar ], 'E1144:') 35752c5ed4e3SBram Moolenaar CheckScriptFailure([ 35762c5ed4e3SBram Moolenaar 'vim9script', 35772c5ed4e3SBram Moolenaar 'gui -f#comment' 3578b8bd2e6eSBram Moolenaar ], 'E194:') 35797a092245SBram Moolenaarenddef 35807a092245SBram Moolenaar 3581a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 35826797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 35836797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3584a26b9700SBram Moolenaar 3585a26b9700SBram Moolenaar edit test.vim 3586a26b9700SBram Moolenaar doautocmd TabEnter #comment 3587a26b9700SBram Moolenaar assert_equal(1, g:entered) 3588a26b9700SBram Moolenaar 3589a26b9700SBram Moolenaar doautocmd TabEnter f.x 3590a26b9700SBram Moolenaar assert_equal(2, g:entered) 3591a26b9700SBram Moolenaar 3592a26b9700SBram Moolenaar g:entered = 0 3593a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3594a26b9700SBram Moolenaar assert_equal(2, g:entered) 3595a26b9700SBram Moolenaar 3596a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3597a26b9700SBram Moolenaar 3598a26b9700SBram Moolenaar au! TabEnter 3599a26b9700SBram Moolenaar unlet g:entered 3600d72c1bf0SBram Moolenaar 3601d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3602d72c1bf0SBram Moolenaar 'vim9script', 36036797966dSBram Moolenaar 'g:var = 123', 3604e55b1c09SBram Moolenaar 'b:var = 456', 3605e55b1c09SBram Moolenaar 'w:var = 777', 3606e55b1c09SBram Moolenaar 't:var = 888', 3607d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3608d72c1bf0SBram Moolenaar ]) 3609d72c1bf0SBram Moolenaar 3610d72c1bf0SBram Moolenaar CheckScriptFailure([ 3611d72c1bf0SBram Moolenaar 'vim9script', 3612cfcd011fSBram Moolenaar 'let var = 123', 3613cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3614cfcd011fSBram Moolenaar 3615cfcd011fSBram Moolenaar CheckScriptFailure([ 3616cfcd011fSBram Moolenaar 'vim9script', 3617cfcd011fSBram Moolenaar 'var g:var = 123', 3618e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3619e55b1c09SBram Moolenaar 3620e55b1c09SBram Moolenaar CheckScriptFailure([ 3621e55b1c09SBram Moolenaar 'vim9script', 3622cfcd011fSBram Moolenaar 'var b:var = 123', 3623e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3624e55b1c09SBram Moolenaar 3625e55b1c09SBram Moolenaar CheckScriptFailure([ 3626e55b1c09SBram Moolenaar 'vim9script', 3627cfcd011fSBram Moolenaar 'var w:var = 123', 3628e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3629e55b1c09SBram Moolenaar 3630e55b1c09SBram Moolenaar CheckScriptFailure([ 3631e55b1c09SBram Moolenaar 'vim9script', 3632cfcd011fSBram Moolenaar 'var t:var = 123', 3633e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3634e55b1c09SBram Moolenaar 3635e55b1c09SBram Moolenaar CheckScriptFailure([ 3636e55b1c09SBram Moolenaar 'vim9script', 3637cfcd011fSBram Moolenaar 'var v:version = 123', 3638e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3639e55b1c09SBram Moolenaar 3640e55b1c09SBram Moolenaar CheckScriptFailure([ 3641e55b1c09SBram Moolenaar 'vim9script', 3642cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3643e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 36446797966dSBram Moolenaar 36456797966dSBram Moolenaar CheckScriptFailure([ 36466797966dSBram Moolenaar 'vim9script', 36476797966dSBram Moolenaar 'g:var = 123', 364832e35117SBram Moolenaar 'unlet g:var# comment1', 3649d72c1bf0SBram Moolenaar ], 'E108:') 3650d72c1bf0SBram Moolenaar 3651d72c1bf0SBram Moolenaar CheckScriptFailure([ 3652d72c1bf0SBram Moolenaar 'let g:var = 123', 3653d72c1bf0SBram Moolenaar 'unlet g:var # something', 3654d72c1bf0SBram Moolenaar ], 'E488:') 3655faac4104SBram Moolenaar 3656faac4104SBram Moolenaar CheckScriptSuccess([ 3657faac4104SBram Moolenaar 'vim9script', 365832e35117SBram Moolenaar 'if 1 # comment2', 3659faac4104SBram Moolenaar ' echo "yes"', 3660faac4104SBram Moolenaar 'elseif 2 #comment', 3661faac4104SBram Moolenaar ' echo "no"', 3662faac4104SBram Moolenaar 'endif', 3663faac4104SBram Moolenaar ]) 3664faac4104SBram Moolenaar 3665faac4104SBram Moolenaar CheckScriptFailure([ 3666faac4104SBram Moolenaar 'vim9script', 366732e35117SBram Moolenaar 'if 1# comment3', 3668faac4104SBram Moolenaar ' echo "yes"', 3669faac4104SBram Moolenaar 'endif', 3670fae55a9cSBram Moolenaar ], 'E488:') 3671faac4104SBram Moolenaar 3672faac4104SBram Moolenaar CheckScriptFailure([ 3673faac4104SBram Moolenaar 'vim9script', 367432e35117SBram Moolenaar 'if 0 # comment4', 3675faac4104SBram Moolenaar ' echo "yes"', 3676faac4104SBram Moolenaar 'elseif 2#comment', 3677faac4104SBram Moolenaar ' echo "no"', 3678faac4104SBram Moolenaar 'endif', 3679fae55a9cSBram Moolenaar ], 'E488:') 3680faac4104SBram Moolenaar 3681faac4104SBram Moolenaar CheckScriptSuccess([ 3682faac4104SBram Moolenaar 'vim9script', 3683cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3684faac4104SBram Moolenaar ]) 3685faac4104SBram Moolenaar 3686faac4104SBram Moolenaar CheckScriptFailure([ 3687faac4104SBram Moolenaar 'vim9script', 3688cfcd011fSBram Moolenaar 'var v = 1# comment6', 3689fae55a9cSBram Moolenaar ], 'E488:') 3690faac4104SBram Moolenaar 3691faac4104SBram Moolenaar CheckScriptSuccess([ 3692faac4104SBram Moolenaar 'vim9script', 3693faac4104SBram Moolenaar 'new' 3694d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3695df069eecSBram Moolenaar ':$', 3696faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3697faac4104SBram Moolenaar 'bwipe!', 3698faac4104SBram Moolenaar ]) 3699faac4104SBram Moolenaar 3700f5be8cdbSBram Moolenaar CheckScriptFailure([ 3701f5be8cdbSBram Moolenaar 'vim9script', 3702f5be8cdbSBram Moolenaar 'new' 3703d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3704f5be8cdbSBram Moolenaar ':$', 3705f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3706f5be8cdbSBram Moolenaar 'bwipe!', 3707f5be8cdbSBram Moolenaar ], 'E488:') 3708f5be8cdbSBram Moolenaar 3709f5be8cdbSBram Moolenaar CheckScriptFailure([ 3710f5be8cdbSBram Moolenaar 'vim9script', 3711f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3712f5be8cdbSBram Moolenaar ], 'E477:') 3713a26b9700SBram Moolenaarenddef 3714a26b9700SBram Moolenaar 37157e5bd91dSBram Moolenaardef Test_finish() 3716cfcd011fSBram Moolenaar var lines =<< trim END 37177e5bd91dSBram Moolenaar vim9script 37186797966dSBram Moolenaar g:res = 'one' 37197e5bd91dSBram Moolenaar if v:false | finish | endif 37206797966dSBram Moolenaar g:res = 'two' 37217e5bd91dSBram Moolenaar finish 37226797966dSBram Moolenaar g:res = 'three' 37237e5bd91dSBram Moolenaar END 37247e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 37257e5bd91dSBram Moolenaar source Xfinished 37267e5bd91dSBram Moolenaar assert_equal('two', g:res) 37277e5bd91dSBram Moolenaar 37287e5bd91dSBram Moolenaar unlet g:res 37297e5bd91dSBram Moolenaar delete('Xfinished') 37307e5bd91dSBram Moolenaarenddef 37317e5bd91dSBram Moolenaar 3732a5d0077eSBram Moolenaardef Test_forward_declaration() 3733cfcd011fSBram Moolenaar var lines =<< trim END 3734a5d0077eSBram Moolenaar vim9script 3735a5d0077eSBram Moolenaar def GetValue(): string 3736a5d0077eSBram Moolenaar return theVal 3737a5d0077eSBram Moolenaar enddef 3738cfcd011fSBram Moolenaar var theVal = 'something' 3739822ba247SBram Moolenaar g:initVal = GetValue() 3740a5d0077eSBram Moolenaar theVal = 'else' 3741a5d0077eSBram Moolenaar g:laterVal = GetValue() 3742a5d0077eSBram Moolenaar END 3743a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3744a5d0077eSBram Moolenaar source Xforward 3745a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3746a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3747a5d0077eSBram Moolenaar 3748a5d0077eSBram Moolenaar unlet g:initVal 3749a5d0077eSBram Moolenaar unlet g:laterVal 3750a5d0077eSBram Moolenaar delete('Xforward') 3751a5d0077eSBram Moolenaarenddef 3752a5d0077eSBram Moolenaar 37539721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3754a6294955SBram Moolenaar var vim9_lines =<< trim END 3755a6294955SBram Moolenaar vim9script 3756a6294955SBram Moolenaar var local = 'local' 3757a6294955SBram Moolenaar g:global = 'global' 3758a6294955SBram Moolenaar export var exported = 'exported' 3759a6294955SBram Moolenaar export def GetText(): string 3760a6294955SBram Moolenaar return 'text' 3761a6294955SBram Moolenaar enddef 3762a6294955SBram Moolenaar END 3763a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3764a6294955SBram Moolenaar 3765cfcd011fSBram Moolenaar var legacy_lines =<< trim END 37669721fb4eSBram Moolenaar source Xvim9_script.vim 37679721fb4eSBram Moolenaar 37689721fb4eSBram Moolenaar call assert_false(exists('local')) 37699721fb4eSBram Moolenaar call assert_false(exists('exported')) 37709721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 37719721fb4eSBram Moolenaar call assert_equal('global', global) 37729721fb4eSBram Moolenaar call assert_equal('global', g:global) 37739721fb4eSBram Moolenaar 37749721fb4eSBram Moolenaar " imported variable becomes script-local 37759721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 37769721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 37779721fb4eSBram Moolenaar call assert_false(exists('exported')) 37789721fb4eSBram Moolenaar 37799721fb4eSBram Moolenaar " imported function becomes script-local 37809721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 37819721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 37829721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 37839721fb4eSBram Moolenaar END 37849721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 37859721fb4eSBram Moolenaar 37869721fb4eSBram Moolenaar source Xlegacy_script.vim 37879721fb4eSBram Moolenaar assert_equal('global', g:global) 3788f5be8cdbSBram Moolenaar unlet g:global 37899721fb4eSBram Moolenaar 37909721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 37919721fb4eSBram Moolenaar delete('Xvim9_script.vim') 37929721fb4eSBram Moolenaarenddef 3793a5d0077eSBram Moolenaar 3794e535db86SBram Moolenaardef Test_declare_script_in_func() 3795e535db86SBram Moolenaar var lines =<< trim END 3796e535db86SBram Moolenaar vim9script 3797e535db86SBram Moolenaar func Declare() 3798e535db86SBram Moolenaar let s:local = 123 3799e535db86SBram Moolenaar endfunc 3800e535db86SBram Moolenaar Declare() 3801e535db86SBram Moolenaar assert_equal(123, local) 3802e535db86SBram Moolenaar 3803e535db86SBram Moolenaar var error: string 3804e535db86SBram Moolenaar try 3805e535db86SBram Moolenaar local = 'asdf' 3806e535db86SBram Moolenaar catch 3807e535db86SBram Moolenaar error = v:exception 3808e535db86SBram Moolenaar endtry 3809e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3810e535db86SBram Moolenaar 3811e535db86SBram Moolenaar lockvar local 3812e535db86SBram Moolenaar try 3813e535db86SBram Moolenaar local = 999 3814e535db86SBram Moolenaar catch 3815e535db86SBram Moolenaar error = v:exception 3816e535db86SBram Moolenaar endtry 3817e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3818e535db86SBram Moolenaar END 3819e535db86SBram Moolenaar CheckScriptSuccess(lines) 3820e535db86SBram Moolenaarenddef 3821e535db86SBram Moolenaar 3822e535db86SBram Moolenaar 38237d699701SBram Moolenaarfunc Test_vim9script_not_global() 38247d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 38257d699701SBram Moolenaar let vim9lines =<< trim END 38267d699701SBram Moolenaar vim9script 3827cfcd011fSBram Moolenaar var name = 'local' 38287d699701SBram Moolenaar func TheFunc() 38297d699701SBram Moolenaar echo 'local' 38307d699701SBram Moolenaar endfunc 38317d699701SBram Moolenaar def DefFunc() 38327d699701SBram Moolenaar echo 'local' 38337d699701SBram Moolenaar enddef 38347d699701SBram Moolenaar END 38357d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 38367d699701SBram Moolenaar source Xvim9script.vim 38377d699701SBram Moolenaar try 38387d699701SBram Moolenaar echo g:var 38397d699701SBram Moolenaar assert_report('did not fail') 38407d699701SBram Moolenaar catch /E121:/ 38417d699701SBram Moolenaar " caught 38427d699701SBram Moolenaar endtry 38437d699701SBram Moolenaar try 38447d699701SBram Moolenaar call TheFunc() 38457d699701SBram Moolenaar assert_report('did not fail') 38467d699701SBram Moolenaar catch /E117:/ 38477d699701SBram Moolenaar " caught 38487d699701SBram Moolenaar endtry 38497d699701SBram Moolenaar try 38507d699701SBram Moolenaar call DefFunc() 38517d699701SBram Moolenaar assert_report('did not fail') 38527d699701SBram Moolenaar catch /E117:/ 38537d699701SBram Moolenaar " caught 38547d699701SBram Moolenaar endtry 38557d699701SBram Moolenaar 385625859dd7SBram Moolenaar call delete('Xvim9script.vim') 38577d699701SBram Moolenaarendfunc 38587d699701SBram Moolenaar 3859eeb27bfeSBram Moolenaardef Test_vim9_copen() 3860eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3861eeb27bfeSBram Moolenaar copen 3862eeb27bfeSBram Moolenaar quit 3863eeb27bfeSBram Moolenaarenddef 3864eeb27bfeSBram Moolenaar 386503290b84SBram Moolenaar" test using an auto-loaded function and variable 38662d6b20d6SBram Moolenaardef Test_vim9_autoload() 3867cfcd011fSBram Moolenaar var lines =<< trim END 38682d6b20d6SBram Moolenaar vim9script 386903290b84SBram Moolenaar def some#gettest(): string 387003290b84SBram Moolenaar return 'test' 387103290b84SBram Moolenaar enddef 387203290b84SBram Moolenaar g:some#name = 'name' 3873227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3874e3ffcd99SBram Moolenaar 3875e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3876e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3877e3ffcd99SBram Moolenaar enddef 387803290b84SBram Moolenaar END 387903290b84SBram Moolenaar 388003290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 388103290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 388203290b84SBram Moolenaar var save_rtp = &rtp 388303290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 388403290b84SBram Moolenaar 388503290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 388603290b84SBram Moolenaar assert_equal('name', g:some#name) 3887227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 388803290b84SBram Moolenaar g:some#other = 'other' 388903290b84SBram Moolenaar assert_equal('other', g:some#other) 389003290b84SBram Moolenaar 3891e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3892e3ffcd99SBram Moolenaar 389317f700acSBram Moolenaar # upper case script name works 389417f700acSBram Moolenaar lines =<< trim END 389517f700acSBram Moolenaar vim9script 389617f700acSBram Moolenaar def Other#getOther(): string 389717f700acSBram Moolenaar return 'other' 389817f700acSBram Moolenaar enddef 389917f700acSBram Moolenaar END 390017f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 390117f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 390217f700acSBram Moolenaar 390303290b84SBram Moolenaar delete('Xdir', 'rf') 390403290b84SBram Moolenaar &rtp = save_rtp 390503290b84SBram Moolenaarenddef 390603290b84SBram Moolenaar 390703290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 390803290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 390903290b84SBram Moolenaar var lines =<< trim END 391003290b84SBram Moolenaar vim9script 39112d6b20d6SBram Moolenaar def foo#test() 39122d6b20d6SBram Moolenaar echomsg getreg('"') 39132d6b20d6SBram Moolenaar enddef 39142d6b20d6SBram Moolenaar END 39152d6b20d6SBram Moolenaar 39162d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 39172d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3918cfcd011fSBram Moolenaar var save_rtp = &rtp 39192d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 39202d6b20d6SBram Moolenaar augroup test 39212d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 39222d6b20d6SBram Moolenaar augroup END 39232d6b20d6SBram Moolenaar 39242d6b20d6SBram Moolenaar normal Y 39252d6b20d6SBram Moolenaar 39262d6b20d6SBram Moolenaar augroup test 39272d6b20d6SBram Moolenaar autocmd! 39282d6b20d6SBram Moolenaar augroup END 39292d6b20d6SBram Moolenaar delete('Xdir', 'rf') 39302d6b20d6SBram Moolenaar &rtp = save_rtp 39312d6b20d6SBram Moolenaarenddef 39322d6b20d6SBram Moolenaar 393377e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 393477e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3935cfcd011fSBram Moolenaar var lines =<< trim END 393677e5dcc3SBram Moolenaar vim9script 393777e5dcc3SBram Moolenaar def crash#func() 393877e5dcc3SBram Moolenaar try 393977e5dcc3SBram Moolenaar for x in List() 394077e5dcc3SBram Moolenaar endfor 394177e5dcc3SBram Moolenaar catch 394277e5dcc3SBram Moolenaar endtry 394377e5dcc3SBram Moolenaar g:ok = true 394477e5dcc3SBram Moolenaar enddef 394577e5dcc3SBram Moolenaar fu List() 394677e5dcc3SBram Moolenaar invalid 394777e5dcc3SBram Moolenaar endfu 394877e5dcc3SBram Moolenaar try 394948e11c10SBram Moolenaar alsoinvalid 395077e5dcc3SBram Moolenaar catch /wontmatch/ 395177e5dcc3SBram Moolenaar endtry 395277e5dcc3SBram Moolenaar END 395377e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 395477e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 395577e5dcc3SBram Moolenaar 395677e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 395777e5dcc3SBram Moolenaar lines =<< trim END 395877e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 395977e5dcc3SBram Moolenaar call crash#func() 396077e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 39619c4f5520SBram Moolenaar qall! 396277e5dcc3SBram Moolenaar END 396377e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 396477e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 396577e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 396677e5dcc3SBram Moolenaar 396777e5dcc3SBram Moolenaar delete('Xdidit') 396877e5dcc3SBram Moolenaar delete('Xscript') 396977e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 397003290b84SBram Moolenaar 397103290b84SBram Moolenaar lines =<< trim END 397203290b84SBram Moolenaar vim9script 397303290b84SBram Moolenaar var foo#bar = 'asdf' 397403290b84SBram Moolenaar END 397503290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 397677e5dcc3SBram Moolenaarenddef 397777e5dcc3SBram Moolenaar 397881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 397981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 398081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3981cfcd011fSBram Moolenaar var lines =<< trim END 398281e17fbeSBram Moolenaar let s:counter = 1 398381e17fbeSBram Moolenaar def s:Func() 398481e17fbeSBram Moolenaar au! CursorHold 398581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 398681e17fbeSBram Moolenaar enddef 398781e17fbeSBram Moolenaar call s:Func() 398881e17fbeSBram Moolenaar doau CursorHold 398981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 399081e17fbeSBram Moolenaar au! CursorHold 399181e17fbeSBram Moolenaar END 399281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 399381e17fbeSBram Moolenaarenddef 399481e17fbeSBram Moolenaar 3995b5841b99SBram Moolenaardef Test_error_in_autoload_script() 3996b5841b99SBram Moolenaar var save_rtp = &rtp 3997b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 3998b5841b99SBram Moolenaar &rtp = dir 3999b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 4000b5841b99SBram Moolenaar 4001b5841b99SBram Moolenaar var lines =<< trim END 4002b5841b99SBram Moolenaar vim9script noclear 4003b5841b99SBram Moolenaar def script#autoloaded() 4004b5841b99SBram Moolenaar enddef 4005b5841b99SBram Moolenaar def Broken() 4006b5841b99SBram Moolenaar var x: any = '' 4007b5841b99SBram Moolenaar eval x != 0 4008b5841b99SBram Moolenaar enddef 4009b5841b99SBram Moolenaar Broken() 4010b5841b99SBram Moolenaar END 4011b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 4012b5841b99SBram Moolenaar 4013b5841b99SBram Moolenaar lines =<< trim END 4014b5841b99SBram Moolenaar vim9script 4015b5841b99SBram Moolenaar def CallAutoloaded() 4016b5841b99SBram Moolenaar script#autoloaded() 4017b5841b99SBram Moolenaar enddef 4018b5841b99SBram Moolenaar 4019b5841b99SBram Moolenaar function Legacy() 4020b5841b99SBram Moolenaar try 4021b5841b99SBram Moolenaar call s:CallAutoloaded() 4022b5841b99SBram Moolenaar catch 4023b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 4024b5841b99SBram Moolenaar endtry 4025b5841b99SBram Moolenaar endfunction 4026b5841b99SBram Moolenaar 4027b5841b99SBram Moolenaar Legacy() 4028b5841b99SBram Moolenaar END 4029b5841b99SBram Moolenaar CheckScriptSuccess(lines) 4030b5841b99SBram Moolenaar 4031b5841b99SBram Moolenaar &rtp = save_rtp 4032b5841b99SBram Moolenaar delete(dir, 'rf') 4033b5841b99SBram Moolenaarenddef 4034b5841b99SBram Moolenaar 40353896a105SBram Moolenaardef Test_cmdline_win() 40363896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 40373896a105SBram Moolenaar # the command line window. 40383896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 4039cfcd011fSBram Moolenaar var export_lines =<< trim END 40403896a105SBram Moolenaar vim9script 4041cfcd011fSBram Moolenaar export var That = 'yes' 40423896a105SBram Moolenaar END 40433896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 4044cfcd011fSBram Moolenaar var import_lines =<< trim END 40453896a105SBram Moolenaar vim9script 40463896a105SBram Moolenaar import That from './Xexport.vim' 40473896a105SBram Moolenaar END 40483896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 4049cfcd011fSBram Moolenaar var save_rtp = &rtp 40503896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 40513896a105SBram Moolenaar syntax on 40523896a105SBram Moolenaar augroup CmdWin 40533896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 40543896a105SBram Moolenaar augroup END 40553896a105SBram Moolenaar # this will open and also close the cmdline window 40563896a105SBram Moolenaar feedkeys('q:', 'xt') 40573896a105SBram Moolenaar assert_equal('yes', g:got_there) 40583896a105SBram Moolenaar 40593896a105SBram Moolenaar augroup CmdWin 40603896a105SBram Moolenaar au! 40613896a105SBram Moolenaar augroup END 40623896a105SBram Moolenaar &rtp = save_rtp 40633896a105SBram Moolenaar delete('rtp', 'rf') 40643896a105SBram Moolenaarenddef 40653896a105SBram Moolenaar 4066e3d4685fSBram Moolenaardef Test_invalid_sid() 4067e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 406825859dd7SBram Moolenaar 40699c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 4070d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 4071e3d4685fSBram Moolenaar endif 4072e3d4685fSBram Moolenaar delete('Xdidit') 4073e3d4685fSBram Moolenaarenddef 4074e3d4685fSBram Moolenaar 40759ec7026fSBram Moolenaardef Test_restoring_cpo() 40769ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 40779ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 40789ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 40799ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 40809ec7026fSBram Moolenaar endif 40819ec7026fSBram Moolenaar delete('Xsourced') 40829ec7026fSBram Moolenaar delete('Xclose') 4083090728adSBram Moolenaar delete('Xdone') 40840123cc1eSBram Moolenaar 40850123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 40860123cc1eSBram Moolenaar set cpo=aABceFsMny> 40870123cc1eSBram Moolenaar edit XanotherScript 40880123cc1eSBram Moolenaar so % 40890123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 40900123cc1eSBram Moolenaar :1del 40910123cc1eSBram Moolenaar w 40920123cc1eSBram Moolenaar so % 40930123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 40940123cc1eSBram Moolenaar 40950123cc1eSBram Moolenaar delete('XanotherScript') 40960123cc1eSBram Moolenaar set cpo&vim 40979ec7026fSBram Moolenaarenddef 40989ec7026fSBram Moolenaar 4099ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 4100ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 410137294bd6SBram Moolenaar CheckScreendump 4102ffb7dcdbSBram Moolenaar CheckFeature timers 410337294bd6SBram Moolenaar 4104ffb7dcdbSBram Moolenaar let lines =<< trim END 410537294bd6SBram Moolenaar vim9script 410637294bd6SBram Moolenaar def script#func() 410737294bd6SBram Moolenaar enddef 410837294bd6SBram Moolenaar END 4109ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 4110ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 411137294bd6SBram Moolenaar 4112ffb7dcdbSBram Moolenaar let lines =<< trim END 411337294bd6SBram Moolenaar vim9script 411437294bd6SBram Moolenaar set cpo+=M 411537294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 4116767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 411737294bd6SBram Moolenaar setline(1, 'some text') 411837294bd6SBram Moolenaar END 4119ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 4120ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 4121ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 4122ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 412337294bd6SBram Moolenaar 4124ffb7dcdbSBram Moolenaar " clean up 4125ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 4126ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 4127ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 4128ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 4129ffb7dcdbSBram Moolenaarendfunc 413037294bd6SBram Moolenaar 41319ec7026fSBram Moolenaar 4132f0afd9e1SBram Moolenaardef Test_unset_any_variable() 4133cfcd011fSBram Moolenaar var lines =<< trim END 4134cfcd011fSBram Moolenaar var name: any 4135cfcd011fSBram Moolenaar assert_equal(0, name) 4136f0afd9e1SBram Moolenaar END 4137f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 4138f0afd9e1SBram Moolenaarenddef 4139f0afd9e1SBram Moolenaar 41407e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 414158dbef33SBram Moolenaar CheckRunVimInTerminal 414258dbef33SBram Moolenaar 41437e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 41447e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 41457e9210eaSBram Moolenaarendfunc 41467e9210eaSBram Moolenaar 41477e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 41489c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 4149cfcd011fSBram Moolenaar var lines =<< trim END 41509c4f5520SBram Moolenaar func CheckAndQuit() 41519c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 41529c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 41539c4f5520SBram Moolenaar endfunc 41549c4f5520SBram Moolenaar END 41559c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 41569c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 4157e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 41589c4f5520SBram Moolenaar # define Afunc() on the command line 41599c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 41609c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 41612949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 41629c4f5520SBram Moolenaar 41639c4f5520SBram Moolenaar call StopVimInTerminal(buf) 41649c4f5520SBram Moolenaar delete('XcallFunc') 41659c4f5520SBram Moolenaar delete('Xdidcmd') 41669c4f5520SBram Moolenaarenddef 41679c4f5520SBram Moolenaar 4168fcdc5d83SBram Moolenaardef Test_script_var_scope() 4169fcdc5d83SBram Moolenaar var lines =<< trim END 4170fcdc5d83SBram Moolenaar vim9script 4171fcdc5d83SBram Moolenaar if true 4172fcdc5d83SBram Moolenaar if true 4173fcdc5d83SBram Moolenaar var one = 'one' 4174fcdc5d83SBram Moolenaar echo one 4175fcdc5d83SBram Moolenaar endif 4176fcdc5d83SBram Moolenaar echo one 4177fcdc5d83SBram Moolenaar endif 4178fcdc5d83SBram Moolenaar END 4179fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4180fcdc5d83SBram Moolenaar 4181fcdc5d83SBram Moolenaar lines =<< trim END 4182fcdc5d83SBram Moolenaar vim9script 4183fcdc5d83SBram Moolenaar if true 4184fcdc5d83SBram Moolenaar if false 4185fcdc5d83SBram Moolenaar var one = 'one' 4186fcdc5d83SBram Moolenaar echo one 4187fcdc5d83SBram Moolenaar else 4188fcdc5d83SBram Moolenaar var one = 'one' 4189fcdc5d83SBram Moolenaar echo one 4190fcdc5d83SBram Moolenaar endif 4191fcdc5d83SBram Moolenaar echo one 4192fcdc5d83SBram Moolenaar endif 4193fcdc5d83SBram Moolenaar END 4194fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4195fcdc5d83SBram Moolenaar 4196fcdc5d83SBram Moolenaar lines =<< trim END 4197fcdc5d83SBram Moolenaar vim9script 4198fcdc5d83SBram Moolenaar while true 4199fcdc5d83SBram Moolenaar var one = 'one' 4200fcdc5d83SBram Moolenaar echo one 4201fcdc5d83SBram Moolenaar break 4202fcdc5d83SBram Moolenaar endwhile 4203fcdc5d83SBram Moolenaar echo one 4204fcdc5d83SBram Moolenaar END 4205fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4206fcdc5d83SBram Moolenaar 4207fcdc5d83SBram Moolenaar lines =<< trim END 4208fcdc5d83SBram Moolenaar vim9script 4209fcdc5d83SBram Moolenaar for i in range(1) 4210fcdc5d83SBram Moolenaar var one = 'one' 4211fcdc5d83SBram Moolenaar echo one 4212fcdc5d83SBram Moolenaar endfor 4213fcdc5d83SBram Moolenaar echo one 4214fcdc5d83SBram Moolenaar END 4215fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 42169becdf2bSBram Moolenaar 42179becdf2bSBram Moolenaar lines =<< trim END 42189becdf2bSBram Moolenaar vim9script 42199becdf2bSBram Moolenaar { 42209becdf2bSBram Moolenaar var one = 'one' 42219becdf2bSBram Moolenaar assert_equal('one', one) 42229becdf2bSBram Moolenaar } 42239becdf2bSBram Moolenaar assert_false(exists('one')) 42249becdf2bSBram Moolenaar assert_false(exists('s:one')) 42259becdf2bSBram Moolenaar END 42269becdf2bSBram Moolenaar CheckScriptSuccess(lines) 42279becdf2bSBram Moolenaar 42289becdf2bSBram Moolenaar lines =<< trim END 42299becdf2bSBram Moolenaar vim9script 42309becdf2bSBram Moolenaar { 42319becdf2bSBram Moolenaar var one = 'one' 42329becdf2bSBram Moolenaar echo one 42339becdf2bSBram Moolenaar } 42349becdf2bSBram Moolenaar echo one 42359becdf2bSBram Moolenaar END 42369becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4237fcdc5d83SBram Moolenaarenddef 4238fcdc5d83SBram Moolenaar 4239352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4240352134bbSBram Moolenaar var lines =<< trim END 4241352134bbSBram Moolenaar vim9script 42422a38908bSBram Moolenaar def Callback(...l: list<any>) 4243352134bbSBram Moolenaar try 4244352134bbSBram Moolenaar var x: string 4245352134bbSBram Moolenaar var y: string 4246352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4247352134bbSBram Moolenaar [x, y] = [''] 4248352134bbSBram Moolenaar catch 4249352134bbSBram Moolenaar g:caught = 'yes' 4250352134bbSBram Moolenaar endtry 4251352134bbSBram Moolenaar enddef 4252e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4253352134bbSBram Moolenaar feedkeys("\r", 'xt') 4254352134bbSBram Moolenaar END 4255352134bbSBram Moolenaar CheckScriptSuccess(lines) 4256352134bbSBram Moolenaar 4257352134bbSBram Moolenaar unlet g:caught 4258352134bbSBram Moolenaarenddef 4259352134bbSBram Moolenaar 4260631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4261631e8f93SBram Moolenaar if !has('unix') || !has('job') 4262631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4263631e8f93SBram Moolenaar endif 4264631e8f93SBram Moolenaar var lines =<< trim END 4265631e8f93SBram Moolenaar vim9script 4266631e8f93SBram Moolenaar var source: list<number> 42672a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4268631e8f93SBram Moolenaar eval [][0] 4269631e8f93SBram Moolenaar enddef 42702a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4271631e8f93SBram Moolenaar sleep 1m 4272631e8f93SBram Moolenaar source += l 4273631e8f93SBram Moolenaar enddef 4274e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 42756f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 42766f17a3f0SBram Moolenaar sleep 10m 42776f17a3f0SBram Moolenaar endwhile 4278206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4279fe95b94fSBram Moolenaar sleep 200m 4280631e8f93SBram Moolenaar END 4281631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4282631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4283631e8f93SBram Moolenaar delete('Xdef') 4284631e8f93SBram Moolenaarenddef 4285631e8f93SBram Moolenaar 42864324d87aSBram Moolenaardef InvokeNormal() 42874324d87aSBram Moolenaar exe "norm! :m+1\r" 42884324d87aSBram Moolenaarenddef 42894324d87aSBram Moolenaar 42904324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 42914324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 42924324d87aSBram Moolenaar new 42934324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 42944324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 42954324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 42964324d87aSBram Moolenaar xunmap <F3> 4297b5b9480eSBram Moolenaarenddef 4298b5b9480eSBram Moolenaar 4299b5b9480eSBram Moolenaardef Test_white_space_after_command() 4300b5b9480eSBram Moolenaar var lines =<< trim END 4301b5b9480eSBram Moolenaar exit_cb: Func}) 4302b5b9480eSBram Moolenaar END 4303b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4304f8103f27SBram Moolenaar 4305f8103f27SBram Moolenaar lines =<< trim END 4306f8103f27SBram Moolenaar e# 4307f8103f27SBram Moolenaar END 4308f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 43094324d87aSBram Moolenaarenddef 43104324d87aSBram Moolenaar 43114aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 43124aab88d9SBram Moolenaar var lines =<< trim END 43134aab88d9SBram Moolenaar vim9script 43144aab88d9SBram Moolenaar if exists('g:guard') 43154aab88d9SBram Moolenaar finish 43164aab88d9SBram Moolenaar endif 43174aab88d9SBram Moolenaar g:guard = 1 43184aab88d9SBram Moolenaar var name = 'thename' 43194aab88d9SBram Moolenaar def g:GetName(): string 43204aab88d9SBram Moolenaar return name 43214aab88d9SBram Moolenaar enddef 43224aab88d9SBram Moolenaar def g:SetName(arg: string) 43234aab88d9SBram Moolenaar name = arg 43244aab88d9SBram Moolenaar enddef 43254aab88d9SBram Moolenaar END 43264aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 43274aab88d9SBram Moolenaar so XscriptTwice.vim 43284aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 43294aab88d9SBram Moolenaar g:SetName('newname') 43304aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 43314aab88d9SBram Moolenaar so XscriptTwice.vim 43324aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 43334aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 43344aab88d9SBram Moolenaar 43354aab88d9SBram Moolenaar delfunc g:GetName 43364aab88d9SBram Moolenaar delfunc g:SetName 43374aab88d9SBram Moolenaar delete('XscriptTwice.vim') 43384aab88d9SBram Moolenaar unlet g:guard 43394aab88d9SBram Moolenaarenddef 43404aab88d9SBram Moolenaar 43414aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 43424aab88d9SBram Moolenaar var exportlines =<< trim END 43434aab88d9SBram Moolenaar vim9script 43444aab88d9SBram Moolenaar if exists('g:guard') 43454aab88d9SBram Moolenaar finish 43464aab88d9SBram Moolenaar endif 43474aab88d9SBram Moolenaar g:guard = 1 43484aab88d9SBram Moolenaar export var name = 'someName' 43494aab88d9SBram Moolenaar END 43504aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 43514aab88d9SBram Moolenaar 43524aab88d9SBram Moolenaar var lines =<< trim END 43534aab88d9SBram Moolenaar vim9script 43544aab88d9SBram Moolenaar import name from './XexportScript.vim' 43554aab88d9SBram Moolenaar def g:GetName(): string 43564aab88d9SBram Moolenaar return name 43574aab88d9SBram Moolenaar enddef 43584aab88d9SBram Moolenaar END 43594aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 43604aab88d9SBram Moolenaar so XscriptImport.vim 43614aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 43624aab88d9SBram Moolenaar 43634aab88d9SBram Moolenaar so XexportScript.vim 43644aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 43654aab88d9SBram Moolenaar 43664aab88d9SBram Moolenaar delfunc g:GetName 43674aab88d9SBram Moolenaar delete('XexportScript.vim') 43684aab88d9SBram Moolenaar delete('XscriptImport.vim') 43694aab88d9SBram Moolenaar unlet g:guard 43704aab88d9SBram Moolenaarenddef 43714aab88d9SBram Moolenaar 437210b9421fSBram Moolenaardef Test_unsupported_commands() 437310b9421fSBram Moolenaar var lines =<< trim END 437410b9421fSBram Moolenaar ka 437510b9421fSBram Moolenaar END 43767d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 43777d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 437810b9421fSBram Moolenaar 437910b9421fSBram Moolenaar lines =<< trim END 4380ada1d870SBram Moolenaar :1ka 4381ada1d870SBram Moolenaar END 43827d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 43837d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4384ada1d870SBram Moolenaar 4385ada1d870SBram Moolenaar lines =<< trim END 438610b9421fSBram Moolenaar t 438710b9421fSBram Moolenaar END 438810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 438910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 439010b9421fSBram Moolenaar 439110b9421fSBram Moolenaar lines =<< trim END 439210b9421fSBram Moolenaar x 439310b9421fSBram Moolenaar END 439410b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 439510b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 439610b9421fSBram Moolenaar 439710b9421fSBram Moolenaar lines =<< trim END 439810b9421fSBram Moolenaar xit 439910b9421fSBram Moolenaar END 440010b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 440110b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 440210b9421fSBram Moolenaarenddef 440310b9421fSBram Moolenaar 4404c70fe460SBram Moolenaardef Test_mapping_line_number() 4405c70fe460SBram Moolenaar var lines =<< trim END 4406c70fe460SBram Moolenaar vim9script 4407c70fe460SBram Moolenaar def g:FuncA() 4408c70fe460SBram Moolenaar # Some comment 4409c70fe460SBram Moolenaar FuncB(0) 4410c70fe460SBram Moolenaar enddef 4411c70fe460SBram Moolenaar # Some comment 4412c70fe460SBram Moolenaar def FuncB( 4413c70fe460SBram Moolenaar # Some comment 4414c70fe460SBram Moolenaar n: number 4415c70fe460SBram Moolenaar ) 4416c70fe460SBram Moolenaar exe 'nno ' 4417c70fe460SBram Moolenaar # Some comment 4418c70fe460SBram Moolenaar .. '<F3> a' 4419c70fe460SBram Moolenaar .. 'b' 4420c70fe460SBram Moolenaar .. 'c' 4421c70fe460SBram Moolenaar enddef 4422c70fe460SBram Moolenaar END 4423c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4424c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4425c70fe460SBram Moolenaar assert_match('No mapping found', res) 4426c70fe460SBram Moolenaar 4427c70fe460SBram Moolenaar g:FuncA() 4428c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4429c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4430c70fe460SBram Moolenaar 4431c70fe460SBram Moolenaar nunmap <F3> 4432c70fe460SBram Moolenaar delfunc g:FuncA 4433c70fe460SBram Moolenaarenddef 4434c70fe460SBram Moolenaar 4435deb108baSBram Moolenaardef Test_option_set() 4436deb108baSBram Moolenaar # legacy script allows for white space 4437deb108baSBram Moolenaar var lines =<< trim END 4438deb108baSBram Moolenaar set foldlevel =11 4439deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4440deb108baSBram Moolenaar END 4441deb108baSBram Moolenaar CheckScriptSuccess(lines) 4442deb108baSBram Moolenaar 4443deb108baSBram Moolenaar set foldlevel 4444deb108baSBram Moolenaar set foldlevel=12 4445deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4446deb108baSBram Moolenaar set foldlevel+=2 4447deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4448deb108baSBram Moolenaar set foldlevel-=3 4449deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4450deb108baSBram Moolenaar 4451deb108baSBram Moolenaar lines =<< trim END 4452deb108baSBram Moolenaar set foldlevel =1 4453deb108baSBram Moolenaar END 4454deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4455deb108baSBram Moolenaar 4456deb108baSBram Moolenaar lines =<< trim END 4457deb108baSBram Moolenaar set foldlevel +=1 4458deb108baSBram Moolenaar END 4459deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4460deb108baSBram Moolenaar 4461deb108baSBram Moolenaar lines =<< trim END 4462deb108baSBram Moolenaar set foldlevel ^=1 4463deb108baSBram Moolenaar END 4464deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4465deb108baSBram Moolenaar 4466deb108baSBram Moolenaar lines =<< trim END 4467deb108baSBram Moolenaar set foldlevel -=1 4468deb108baSBram Moolenaar END 4469deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4470deb108baSBram Moolenaar 4471deb108baSBram Moolenaar set foldlevel& 4472deb108baSBram Moolenaarenddef 4473deb108baSBram Moolenaar 4474208f0b48SBram Moolenaardef Test_option_modifier() 44751594f313SBram Moolenaar # legacy script allows for white space 4476208f0b48SBram Moolenaar var lines =<< trim END 4477208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4478208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4479208f0b48SBram Moolenaar END 4480208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4481208f0b48SBram Moolenaar 44821594f313SBram Moolenaar set hlsearch 44831594f313SBram Moolenaar set hlsearch! 44841594f313SBram Moolenaar assert_equal(false, &hlsearch) 44851594f313SBram Moolenaar 44861594f313SBram Moolenaar set hlsearch 4487208f0b48SBram Moolenaar set hlsearch& 44881594f313SBram Moolenaar assert_equal(false, &hlsearch) 4489208f0b48SBram Moolenaar 4490208f0b48SBram Moolenaar lines =<< trim END 44911594f313SBram Moolenaar set hlsearch & 4492208f0b48SBram Moolenaar END 44931594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 44941594f313SBram Moolenaar 44951594f313SBram Moolenaar lines =<< trim END 44961594f313SBram Moolenaar set hlsearch ! 44971594f313SBram Moolenaar END 44981594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 44991594f313SBram Moolenaar 45001594f313SBram Moolenaar set hlsearch& 4501208f0b48SBram Moolenaarenddef 4502208f0b48SBram Moolenaar 4503c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4504c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4505c03fe66aSBram Moolenaar var lines =<< trim END 4506c03fe66aSBram Moolenaar echoerr 'some' 4507c03fe66aSBram Moolenaar .. ' error' 4508c03fe66aSBram Moolenaar .. ' continued' 4509c03fe66aSBram Moolenaar END 4510c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4511c03fe66aSBram Moolenaarenddef 4512c03fe66aSBram Moolenaar 4513648594eaSBram Moolenaardef ProfiledWithLambda() 4514d9162550SBram Moolenaar var n = 3 4515d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4516d9162550SBram Moolenaarenddef 4517d9162550SBram Moolenaar 4518648594eaSBram Moolenaardef ProfiledNested() 4519648594eaSBram Moolenaar var x = 0 4520648594eaSBram Moolenaar def Nested(): any 4521648594eaSBram Moolenaar return x 4522648594eaSBram Moolenaar enddef 4523648594eaSBram Moolenaar Nested() 4524648594eaSBram Moolenaarenddef 4525648594eaSBram Moolenaar 4526ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4527ffcfddc7SBram Moolenaar var x = 0 4528ffcfddc7SBram Moolenaar def Nested(): any 4529ffcfddc7SBram Moolenaar return x 4530ffcfddc7SBram Moolenaar enddef 4531ffcfddc7SBram Moolenaar Nested() 4532ffcfddc7SBram Moolenaarenddef 4533ffcfddc7SBram Moolenaar 4534d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4535d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4536d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 45374ece152aSBram Moolenaar CheckFeature profile 45384ece152aSBram Moolenaar 4539d9162550SBram Moolenaar profile start Xprofile.log 4540648594eaSBram Moolenaar profile func ProfiledWithLambda 4541648594eaSBram Moolenaar ProfiledWithLambda() 4542ffcfddc7SBram Moolenaar 4543648594eaSBram Moolenaar profile func ProfiledNested 4544648594eaSBram Moolenaar ProfiledNested() 4545ffcfddc7SBram Moolenaar 4546ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4547ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4548ffcfddc7SBram Moolenaar profile func * 4549ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4550ffcfddc7SBram Moolenaar 4551ffcfddc7SBram Moolenaar profdel func * 4552ffcfddc7SBram Moolenaar profile pause 4553d9162550SBram Moolenaarenddef 4554d9162550SBram Moolenaar 4555585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4556585fea7bSBram Moolenaardef Test_substitute_cmd() 4557585fea7bSBram Moolenaar new 4558585fea7bSBram Moolenaar setline(1, 'something') 4559585fea7bSBram Moolenaar :substitute(some(other( 4560585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4561585fea7bSBram Moolenaar bwipe! 4562585fea7bSBram Moolenaar 4563f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4564cfcd011fSBram Moolenaar var lines =<< trim END 4565585fea7bSBram Moolenaar vim9script 4566585fea7bSBram Moolenaar new 4567585fea7bSBram Moolenaar setline(1, 'something') 4568585fea7bSBram Moolenaar :substitute(some(other( 4569585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4570585fea7bSBram Moolenaar bwipe! 4571585fea7bSBram Moolenaar END 4572585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4573585fea7bSBram Moolenaar source Xvim9lines 4574585fea7bSBram Moolenaar 4575585fea7bSBram Moolenaar delete('Xvim9lines') 4576585fea7bSBram Moolenaarenddef 4577585fea7bSBram Moolenaar 45788a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4579