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 1483af2d5d2cSBram 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 1489af2d5d2cSBram Moolenaar import * as foo from './Xfoo.vim' 14906853c38bSBram Moolenaar var that = foo 14916853c38bSBram Moolenaar END 14926853c38bSBram Moolenaar CheckScriptFailure(lines, 'E1029: Expected ''.''') 1493a9e3d560SBram Moolenaar 1494a9e3d560SBram Moolenaar lines =<< trim END 1495a9e3d560SBram Moolenaar vim9script 1496a9e3d560SBram Moolenaar import * as 9foo from './Xfoo.vim' 1497a9e3d560SBram Moolenaar END 1498a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1499a9e3d560SBram Moolenaar lines =<< trim END 1500a9e3d560SBram Moolenaar vim9script 1501a9e3d560SBram Moolenaar import * as the#foo from './Xfoo.vim' 1502a9e3d560SBram Moolenaar END 1503a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1504a9e3d560SBram Moolenaar lines =<< trim END 1505a9e3d560SBram Moolenaar vim9script 1506a9e3d560SBram Moolenaar import * as g:foo from './Xfoo.vim' 1507a9e3d560SBram Moolenaar END 1508a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1509a9e3d560SBram Moolenaar 1510af2d5d2cSBram Moolenaar delete('Xfoo.vim') 15116853c38bSBram Moolenaarenddef 15126853c38bSBram Moolenaar 15130a84284eSBram Moolenaardef Test_import_as() 15140a84284eSBram Moolenaar var export_lines =<< trim END 15150a84284eSBram Moolenaar vim9script 15160a84284eSBram Moolenaar export var one = 1 15170a84284eSBram Moolenaar export var yes = 'yes' 1518c967d57aSBram Moolenaar export var slist: list<string> 15190a84284eSBram Moolenaar END 15200a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 15210a84284eSBram Moolenaar 15220a84284eSBram Moolenaar var import_lines =<< trim END 15230a84284eSBram Moolenaar vim9script 15246c7cc347SBram Moolenaar var one = 'notused' 15256c7cc347SBram Moolenaar var yes = 777 15260a84284eSBram Moolenaar import one as thatOne from './XexportAs' 15270a84284eSBram Moolenaar assert_equal(1, thatOne) 15280a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 15290a84284eSBram Moolenaar assert_equal('yes', yesYes) 15300a84284eSBram Moolenaar END 15310a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15320a84284eSBram Moolenaar 15330a84284eSBram Moolenaar import_lines =<< trim END 15340a84284eSBram Moolenaar vim9script 15350a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 15360a84284eSBram Moolenaar assert_equal(1, thatOne) 15370a84284eSBram Moolenaar assert_equal('yes', yesYes) 15380a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 15390a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 15400a84284eSBram Moolenaar END 15410a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15420a84284eSBram Moolenaar 1543c967d57aSBram Moolenaar import_lines =<< trim END 1544c967d57aSBram Moolenaar vim9script 1545c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1546c967d57aSBram Moolenaar impSlist->add(123) 1547c967d57aSBram Moolenaar END 1548c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1549c967d57aSBram Moolenaar 15500a84284eSBram Moolenaar delete('XexportAs') 15510a84284eSBram Moolenaarenddef 15520a84284eSBram Moolenaar 1553803af686SBram Moolenaarfunc g:Trigger() 1554803af686SBram Moolenaar source Ximport.vim 1555803af686SBram Moolenaar return "echo 'yes'\<CR>" 1556803af686SBram Moolenaarendfunc 1557803af686SBram Moolenaar 1558803af686SBram Moolenaardef Test_import_export_expr_map() 1559803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1560cfcd011fSBram Moolenaar var export_lines =<< trim END 1561803af686SBram Moolenaar vim9script 1562803af686SBram Moolenaar export def That(): string 1563803af686SBram Moolenaar return 'yes' 1564803af686SBram Moolenaar enddef 1565803af686SBram Moolenaar END 1566803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1567803af686SBram Moolenaar 1568cfcd011fSBram Moolenaar var import_lines =<< trim END 1569803af686SBram Moolenaar vim9script 1570803af686SBram Moolenaar import That from './Xexport_that.vim' 1571803af686SBram Moolenaar assert_equal('yes', That()) 1572803af686SBram Moolenaar END 1573803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1574803af686SBram Moolenaar 1575803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1576803af686SBram Moolenaar feedkeys('trigger', "xt") 1577803af686SBram Moolenaar 1578730b2483SBram Moolenaar delete('Xexport_that.vim') 1579803af686SBram Moolenaar delete('Ximport.vim') 1580803af686SBram Moolenaar nunmap trigger 1581803af686SBram Moolenaarenddef 1582803af686SBram Moolenaar 15838e1986e3SBram Moolenaardef Test_import_in_filetype() 15848e1986e3SBram Moolenaar # check that :import works when the buffer is locked 15858e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1586cfcd011fSBram Moolenaar var export_lines =<< trim END 15878e1986e3SBram Moolenaar vim9script 1588cfcd011fSBram Moolenaar export var That = 'yes' 15898e1986e3SBram Moolenaar END 1590730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 15918e1986e3SBram Moolenaar 1592cfcd011fSBram Moolenaar var import_lines =<< trim END 15938e1986e3SBram Moolenaar vim9script 1594730b2483SBram Moolenaar import That from './Xexport_ft.vim' 15958e1986e3SBram Moolenaar assert_equal('yes', That) 15968e1986e3SBram Moolenaar g:did_load_mytpe = 1 15978e1986e3SBram Moolenaar END 15988e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 15998e1986e3SBram Moolenaar 1600cfcd011fSBram Moolenaar var save_rtp = &rtp 16018e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 16028e1986e3SBram Moolenaar 16038e1986e3SBram Moolenaar filetype plugin on 16048e1986e3SBram Moolenaar copen 16058e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 16068e1986e3SBram Moolenaar 16078e1986e3SBram Moolenaar quit! 1608730b2483SBram Moolenaar delete('Xexport_ft.vim') 16098e1986e3SBram Moolenaar delete('ftplugin', 'rf') 16108e1986e3SBram Moolenaar &rtp = save_rtp 16118e1986e3SBram Moolenaarenddef 16128e1986e3SBram Moolenaar 1613efa94447SBram Moolenaardef Test_use_import_in_mapping() 1614cfcd011fSBram Moolenaar var lines =<< trim END 1615efa94447SBram Moolenaar vim9script 1616efa94447SBram Moolenaar export def Funcx() 1617efa94447SBram Moolenaar g:result = 42 1618efa94447SBram Moolenaar enddef 1619efa94447SBram Moolenaar END 1620efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1621efa94447SBram Moolenaar lines =<< trim END 1622efa94447SBram Moolenaar vim9script 1623efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1624b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1625efa94447SBram Moolenaar END 1626efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1627efa94447SBram Moolenaar 1628efa94447SBram Moolenaar source Xmapscript.vim 1629b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1630efa94447SBram Moolenaar assert_equal(42, g:result) 1631efa94447SBram Moolenaar 1632efa94447SBram Moolenaar unlet g:result 1633efa94447SBram Moolenaar delete('XsomeExport.vim') 1634efa94447SBram Moolenaar delete('Xmapscript.vim') 1635b3ca9824SBram Moolenaar nunmap <F3> 1636efa94447SBram Moolenaarenddef 1637efa94447SBram Moolenaar 1638d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1639d3f8a9eeSBram Moolenaar var lines =<< trim END 1640d3f8a9eeSBram Moolenaar if has(g:feature) 1641d3f8a9eeSBram Moolenaar " legacy script 1642d3f8a9eeSBram Moolenaar let g:legacy = 1 1643d3f8a9eeSBram Moolenaar finish 1644d3f8a9eeSBram Moolenaar endif 1645d3f8a9eeSBram Moolenaar vim9script 1646d3f8a9eeSBram Moolenaar g:legacy = 0 1647d3f8a9eeSBram Moolenaar END 1648d3f8a9eeSBram Moolenaar g:feature = 'eval' 1649d3f8a9eeSBram Moolenaar g:legacy = -1 1650d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1651d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1652d3f8a9eeSBram Moolenaar 1653d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1654d3f8a9eeSBram Moolenaar g:legacy = -1 1655d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1656d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1657d3f8a9eeSBram Moolenaarenddef 1658d3f8a9eeSBram Moolenaar 1659750802b5SBram Moolenaardef Test_vim9script_fails() 16608a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16618a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1662cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16639721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1664cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1665750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1666750802b5SBram Moolenaar 1667cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1668c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1669c785b9a7SBram Moolenaar 1670e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1671e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16728a7d6542SBram Moolenaarenddef 16738a7d6542SBram Moolenaar 1674f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1675101f4810SBram Moolenaar CheckRunVimInTerminal 1676101f4810SBram Moolenaar 16779bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1678c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 16799bb3eb3eSBram Moolenaarendfunc 16809bb3eb3eSBram Moolenaar 1681c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1682cfcd011fSBram Moolenaar var export =<< trim END 1683101f4810SBram Moolenaar vim9script 1684101f4810SBram Moolenaar export def Foo(): number 1685101f4810SBram Moolenaar return 0 1686101f4810SBram Moolenaar enddef 1687101f4810SBram Moolenaar END 1688730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1689101f4810SBram Moolenaar 1690e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 16919bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 16922949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1693101f4810SBram Moolenaar 1694730b2483SBram Moolenaar delete('XexportCmd.vim') 16959bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 16969bb3eb3eSBram Moolenaarenddef 1697101f4810SBram Moolenaar 16982b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 16992b32700dSBram Moolenaar var lines =<< trim END 1700a6294955SBram Moolenaar vim9script 1701a6294955SBram Moolenaar export var exported = 'thexport' 170260dc8274SBram Moolenaar 170360dc8274SBram Moolenaar export def TheFunc(x = 0) 170460dc8274SBram Moolenaar enddef 1705a6294955SBram Moolenaar END 1706a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1707a6294955SBram Moolenaar lines =<< trim END 17082b32700dSBram Moolenaar vim9script noclear 17092b32700dSBram Moolenaar g:loadCount += 1 17102b32700dSBram Moolenaar var s:reloaded = 'init' 1711a6294955SBram Moolenaar import exported from './XExportReload' 17122b32700dSBram Moolenaar 17132b32700dSBram Moolenaar def Again(): string 17142b32700dSBram Moolenaar return 'again' 17152b32700dSBram Moolenaar enddef 17162b32700dSBram Moolenaar 171760dc8274SBram Moolenaar import TheFunc from './XExportReload' 171860dc8274SBram Moolenaar TheFunc() 171960dc8274SBram Moolenaar 17202b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 17212b32700dSBram Moolenaar var s:loaded = true 17222b32700dSBram Moolenaar 17232b32700dSBram Moolenaar var s:notReloaded = 'yes' 17242b32700dSBram Moolenaar s:reloaded = 'first' 17252b32700dSBram Moolenaar def g:Values(): list<string> 1726a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 17272b32700dSBram Moolenaar enddef 17282b32700dSBram Moolenaar 17292b32700dSBram Moolenaar def Once(): string 17302b32700dSBram Moolenaar return 'once' 17312b32700dSBram Moolenaar enddef 17322b32700dSBram Moolenaar END 17332b32700dSBram Moolenaar writefile(lines, 'XReloaded') 17342b32700dSBram Moolenaar g:loadCount = 0 17352b32700dSBram Moolenaar source XReloaded 17362b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1737a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 17382b32700dSBram Moolenaar source XReloaded 17392b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1740a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17412b32700dSBram Moolenaar source XReloaded 17422b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1743a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17442b32700dSBram Moolenaar 174548e11c10SBram Moolenaar delete('XReloaded') 1746a6294955SBram Moolenaar delete('XExportReload') 17472b32700dSBram Moolenaar delfunc g:Values 17482b32700dSBram Moolenaar unlet g:loadCount 1749577dc93dSBram Moolenaar 1750577dc93dSBram Moolenaar lines =<< trim END 1751577dc93dSBram Moolenaar vim9script 1752577dc93dSBram Moolenaar def Inner() 1753577dc93dSBram Moolenaar enddef 1754577dc93dSBram Moolenaar END 1755577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1756577dc93dSBram Moolenaar source XreloadScript.vim 1757577dc93dSBram Moolenaar 1758577dc93dSBram Moolenaar lines =<< trim END 1759577dc93dSBram Moolenaar vim9script 1760577dc93dSBram Moolenaar def Outer() 1761577dc93dSBram Moolenaar def Inner() 1762577dc93dSBram Moolenaar enddef 1763577dc93dSBram Moolenaar enddef 1764577dc93dSBram Moolenaar defcompile 1765577dc93dSBram Moolenaar END 1766577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1767577dc93dSBram Moolenaar source XreloadScript.vim 1768577dc93dSBram Moolenaar 1769577dc93dSBram Moolenaar delete('XreloadScript.vim') 17702b32700dSBram Moolenaarenddef 17712b32700dSBram Moolenaar 17724c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1773cfcd011fSBram Moolenaar var lines =<< trim END 17748a7d6542SBram Moolenaar vim9script 17758a7d6542SBram Moolenaar const var = '' 1776cfcd011fSBram Moolenaar var valone = 1234 17778a7d6542SBram Moolenaar def MyFunc(arg: string) 17788a7d6542SBram Moolenaar valone = 5678 17798a7d6542SBram Moolenaar enddef 17808a7d6542SBram Moolenaar END 1781cfcd011fSBram Moolenaar var morelines =<< trim END 1782cfcd011fSBram Moolenaar var valtwo = 222 17838a7d6542SBram Moolenaar export def GetValtwo(): number 17848a7d6542SBram Moolenaar return valtwo 17858a7d6542SBram Moolenaar enddef 17868a7d6542SBram Moolenaar END 178703afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 17888a7d6542SBram Moolenaar source Xreload.vim 17898a7d6542SBram Moolenaar source Xreload.vim 17908a7d6542SBram Moolenaar source Xreload.vim 17918a7d6542SBram Moolenaar 1792f5be8cdbSBram Moolenaar # cannot declare a var twice 17938a7d6542SBram Moolenaar lines =<< trim END 17948a7d6542SBram Moolenaar vim9script 1795cfcd011fSBram Moolenaar var valone = 1234 1796cfcd011fSBram Moolenaar var valone = 5678 17978a7d6542SBram Moolenaar END 17988a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 179944d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 18008a7d6542SBram Moolenaar 18018a7d6542SBram Moolenaar delete('Xreload.vim') 18028a7d6542SBram Moolenaar delete('Ximport.vim') 18038a7d6542SBram Moolenaarenddef 18048a7d6542SBram Moolenaar 180507a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 180607a65d26SBram Moolenaar" compiled function using that variable must fail. 180707a65d26SBram Moolenaardef Test_script_reload_change_type() 180807a65d26SBram Moolenaar var lines =<< trim END 180907a65d26SBram Moolenaar vim9script noclear 181007a65d26SBram Moolenaar var str = 'string' 181107a65d26SBram Moolenaar def g:GetStr(): string 181207a65d26SBram Moolenaar return str .. 'xxx' 181307a65d26SBram Moolenaar enddef 181407a65d26SBram Moolenaar END 181507a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 181607a65d26SBram Moolenaar source Xreload.vim 181707a65d26SBram Moolenaar echo g:GetStr() 181807a65d26SBram Moolenaar 181907a65d26SBram Moolenaar lines =<< trim END 182007a65d26SBram Moolenaar vim9script noclear 182107a65d26SBram Moolenaar var str = 1234 182207a65d26SBram Moolenaar END 182307a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 182407a65d26SBram Moolenaar source Xreload.vim 182507a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 182607a65d26SBram Moolenaar 182707a65d26SBram Moolenaar delfunc g:GetStr 182807a65d26SBram Moolenaar delete('Xreload.vim') 182907a65d26SBram Moolenaarenddef 183007a65d26SBram Moolenaar 1831c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1832c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1833c970e422SBram Moolenaar 1834c970e422SBram Moolenaardef Test_script_reload_from_function() 1835c970e422SBram Moolenaar var lines =<< trim END 1836c970e422SBram Moolenaar vim9script 1837c970e422SBram Moolenaar 1838c970e422SBram Moolenaar if exists('g:loaded') 1839c970e422SBram Moolenaar finish 1840c970e422SBram Moolenaar endif 1841c970e422SBram Moolenaar g:loaded = 1 1842c970e422SBram Moolenaar delcommand CallFunc 1843c970e422SBram Moolenaar command CallFunc Func() 1844c970e422SBram Moolenaar def Func() 1845a4c81beaSBram Moolenaar so XreloadFunc.vim 1846c970e422SBram Moolenaar g:didTheFunc = 1 1847c970e422SBram Moolenaar enddef 1848c970e422SBram Moolenaar END 1849c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1850c970e422SBram Moolenaar source XreloadFunc.vim 1851c970e422SBram Moolenaar CallFunc 1852c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1853c970e422SBram Moolenaar 1854c970e422SBram Moolenaar delete('XreloadFunc.vim') 1855c970e422SBram Moolenaar delcommand CallFunc 1856c970e422SBram Moolenaar unlet g:loaded 1857c970e422SBram Moolenaar unlet g:didTheFunc 1858c970e422SBram Moolenaarenddef 1859c970e422SBram Moolenaar 18606c3843caSBram Moolenaardef Test_script_var_shadows_function() 18616c3843caSBram Moolenaar var lines =<< trim END 18626c3843caSBram Moolenaar vim9script 18636c3843caSBram Moolenaar def Func(): number 18646c3843caSBram Moolenaar return 123 18656c3843caSBram Moolenaar enddef 18666c3843caSBram Moolenaar var Func = 1 18676c3843caSBram Moolenaar END 18686c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18696c3843caSBram Moolenaarenddef 18706c3843caSBram Moolenaar 1871c323527dSBram Moolenaardef Test_script_var_shadows_command() 1872c323527dSBram Moolenaar var lines =<< trim END 1873c323527dSBram Moolenaar var undo = 1 1874c323527dSBram Moolenaar undo = 2 1875c323527dSBram Moolenaar assert_equal(2, undo) 1876c323527dSBram Moolenaar END 1877c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1878c323527dSBram Moolenaar 1879c323527dSBram Moolenaar lines =<< trim END 1880c323527dSBram Moolenaar var undo = 1 1881c323527dSBram Moolenaar undo 1882c323527dSBram Moolenaar END 1883c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1884c323527dSBram Moolenaarenddef 1885c323527dSBram Moolenaar 188695006e3dSBram Moolenaardef s:RetSome(): string 188795006e3dSBram Moolenaar return 'some' 188895006e3dSBram Moolenaarenddef 188995006e3dSBram Moolenaar 1890fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1891fe465a01SBram Moolenaar" script-local name. 1892fe465a01SBram Moolenaardef Test_vim9script_funcref() 1893cfcd011fSBram Moolenaar var sortlines =<< trim END 1894fe465a01SBram Moolenaar vim9script 1895fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1896bed36b93SBram Moolenaar return i2 - i1 1897fe465a01SBram Moolenaar enddef 1898fe465a01SBram Moolenaar 1899fe465a01SBram Moolenaar export def FastSort(): list<number> 1900fe465a01SBram Moolenaar return range(5)->sort(Compare) 1901fe465a01SBram Moolenaar enddef 1902529fb5a5SBram Moolenaar 1903529fb5a5SBram Moolenaar export def GetString(arg: string): string 1904529fb5a5SBram Moolenaar return arg 1905529fb5a5SBram Moolenaar enddef 1906fe465a01SBram Moolenaar END 1907fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1908fe465a01SBram Moolenaar 1909cfcd011fSBram Moolenaar var lines =<< trim END 1910fe465a01SBram Moolenaar vim9script 1911fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1912fe465a01SBram Moolenaar def Test() 1913fe465a01SBram Moolenaar g:result = FastSort() 1914fe465a01SBram Moolenaar enddef 1915fe465a01SBram Moolenaar Test() 1916529fb5a5SBram Moolenaar 1917529fb5a5SBram Moolenaar # using a function imported with "as" 1918529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1919529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1920529fb5a5SBram Moolenaar 1921529fb5a5SBram Moolenaar # using the function from a compiled function 1922529fb5a5SBram Moolenaar def TestMore(): string 1923ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1924ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1925529fb5a5SBram Moolenaar enddef 1926ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1927529fb5a5SBram Moolenaar 1928529fb5a5SBram Moolenaar # error when using a function that isn't exported 1929529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1930fe465a01SBram Moolenaar END 1931fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1932fe465a01SBram Moolenaar 1933fe465a01SBram Moolenaar source Xscript.vim 1934fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1935fe465a01SBram Moolenaar 1936fe465a01SBram Moolenaar unlet g:result 1937fe465a01SBram Moolenaar delete('Xsort.vim') 1938fe465a01SBram Moolenaar delete('Xscript.vim') 193995006e3dSBram Moolenaar 1940cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 194195006e3dSBram Moolenaar assert_equal('some', Funcref()) 1942fe465a01SBram Moolenaarenddef 1943fe465a01SBram Moolenaar 1944601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1945601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1946601e76acSBram Moolenaar" function reference. 1947c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1948cfcd011fSBram Moolenaar var filterLines =<< trim END 1949c620c055SBram Moolenaar vim9script 1950c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1951c620c055SBram Moolenaar return idx % 2 == 1 1952c620c055SBram Moolenaar enddef 1953c620c055SBram Moolenaar export def FastFilter(): list<number> 1954c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1955c620c055SBram Moolenaar enddef 1956601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1957601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1958601e76acSBram Moolenaar enddef 1959c620c055SBram Moolenaar END 1960c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1961c620c055SBram Moolenaar 1962cfcd011fSBram Moolenaar var lines =<< trim END 1963c620c055SBram Moolenaar vim9script 1964601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1965c620c055SBram Moolenaar def Test() 1966cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1967c620c055SBram Moolenaar enddef 1968c620c055SBram Moolenaar Test() 1969601e76acSBram Moolenaar def TestDirect() 1970cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1971601e76acSBram Moolenaar enddef 1972601e76acSBram Moolenaar TestDirect() 1973c620c055SBram Moolenaar END 1974601e76acSBram Moolenaar CheckScriptSuccess(lines) 1975c620c055SBram Moolenaar delete('Xfilter.vim') 1976c620c055SBram Moolenaarenddef 1977c620c055SBram Moolenaar 19784c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1979cfcd011fSBram Moolenaar var first_lines =<< trim END 19804c17ad94SBram Moolenaar vim9script 19814c17ad94SBram Moolenaar def FuncYes(): string 19824c17ad94SBram Moolenaar return 'yes' 19834c17ad94SBram Moolenaar enddef 19844c17ad94SBram Moolenaar END 1985cfcd011fSBram Moolenaar var withno_lines =<< trim END 19864c17ad94SBram Moolenaar def FuncNo(): string 19874c17ad94SBram Moolenaar return 'no' 19884c17ad94SBram Moolenaar enddef 19894c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 19904c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 19914c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 199203afdcf1SBram Moolenaar enddef 199303afdcf1SBram Moolenaar END 1994cfcd011fSBram Moolenaar var nono_lines =<< trim END 199503afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 199603afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 199744d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 19984c17ad94SBram Moolenaar enddef 19994c17ad94SBram Moolenaar END 20004c17ad94SBram Moolenaar 20014c17ad94SBram Moolenaar # FuncNo() is defined 200203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 20034c17ad94SBram Moolenaar source Xreloaded.vim 20044c17ad94SBram Moolenaar g:DoCheck(true) 20054c17ad94SBram Moolenaar 20064c17ad94SBram Moolenaar # FuncNo() is not redefined 200703afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 20084c17ad94SBram Moolenaar source Xreloaded.vim 20095082471fSBram Moolenaar g:DoCheck(false) 20104c17ad94SBram Moolenaar 20114c17ad94SBram Moolenaar # FuncNo() is back 201203afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 20134c17ad94SBram Moolenaar source Xreloaded.vim 20145082471fSBram Moolenaar g:DoCheck(false) 20154c17ad94SBram Moolenaar 20164c17ad94SBram Moolenaar delete('Xreloaded.vim') 20174c17ad94SBram Moolenaarenddef 20184c17ad94SBram Moolenaar 201989483d40SBram Moolenaardef Test_vim9script_reload_delvar() 202089483d40SBram Moolenaar # write the script with a script-local variable 2021cfcd011fSBram Moolenaar var lines =<< trim END 202289483d40SBram Moolenaar vim9script 2023cfcd011fSBram Moolenaar var name = 'string' 202489483d40SBram Moolenaar END 202589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 202689483d40SBram Moolenaar source XreloadVar.vim 202789483d40SBram Moolenaar 202889483d40SBram Moolenaar # now write the script using the same variable locally - works 202989483d40SBram Moolenaar lines =<< trim END 203089483d40SBram Moolenaar vim9script 203189483d40SBram Moolenaar def Func() 2032cfcd011fSBram Moolenaar var name = 'string' 203389483d40SBram Moolenaar enddef 203489483d40SBram Moolenaar END 203589483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 203689483d40SBram Moolenaar source XreloadVar.vim 203789483d40SBram Moolenaar 203889483d40SBram Moolenaar delete('XreloadVar.vim') 203989483d40SBram Moolenaarenddef 204089483d40SBram Moolenaar 20418a7d6542SBram Moolenaardef Test_import_absolute() 2042cfcd011fSBram Moolenaar var import_lines = [ 2043e6085c53SBram Moolenaar 'vim9script', 2044e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 2045e6085c53SBram Moolenaar 'def UseExported()', 2046e6085c53SBram Moolenaar ' g:imported_abs = exported', 2047e6085c53SBram Moolenaar ' exported = 8888', 2048e6085c53SBram Moolenaar ' g:imported_after = exported', 2049e6085c53SBram Moolenaar 'enddef', 2050e6085c53SBram Moolenaar 'UseExported()', 2051e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2052e6085c53SBram Moolenaar ] 20538a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20548a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20558a7d6542SBram Moolenaar 20568a7d6542SBram Moolenaar source Ximport_abs.vim 20578a7d6542SBram Moolenaar 20588a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20594e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2060fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2061fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2062fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2063fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2064fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2065fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2066fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2067fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2068fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2069fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2070e6085c53SBram Moolenaar g:import_disassembled) 2071b3ca9824SBram Moolenaar 2072b3ca9824SBram Moolenaar Undo_export_script_lines() 20738a7d6542SBram Moolenaar unlet g:imported_abs 20744e12a5dfSBram Moolenaar unlet g:import_disassembled 20758a7d6542SBram Moolenaar 20768a7d6542SBram Moolenaar delete('Ximport_abs.vim') 20778a7d6542SBram Moolenaar delete('Xexport_abs.vim') 20788a7d6542SBram Moolenaarenddef 20798a7d6542SBram Moolenaar 20808a7d6542SBram Moolenaardef Test_import_rtp() 2081cfcd011fSBram Moolenaar var import_lines = [ 2082e6085c53SBram Moolenaar 'vim9script', 2083e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2084e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2085e6085c53SBram Moolenaar ] 20868a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2087b885a7c7SBram Moolenaar mkdir('import', 'p') 2088b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 20898a7d6542SBram Moolenaar 2090cfcd011fSBram Moolenaar var save_rtp = &rtp 20918a7d6542SBram Moolenaar &rtp = getcwd() 20928a7d6542SBram Moolenaar source Ximport_rtp.vim 20938a7d6542SBram Moolenaar &rtp = save_rtp 20948a7d6542SBram Moolenaar 20958a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 20968a7d6542SBram Moolenaar 2097b3ca9824SBram Moolenaar Undo_export_script_lines() 2098b3ca9824SBram Moolenaar unlet g:imported_rtp 20998a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2100b885a7c7SBram Moolenaar delete('import', 'rf') 21018a7d6542SBram Moolenaarenddef 21028a7d6542SBram Moolenaar 210325e0f586SBram Moolenaardef Test_import_compile_error() 2104cfcd011fSBram Moolenaar var export_lines = [ 210525e0f586SBram Moolenaar 'vim9script', 210625e0f586SBram Moolenaar 'export def ExpFunc(): string', 210725e0f586SBram Moolenaar ' return notDefined', 210825e0f586SBram Moolenaar 'enddef', 210925e0f586SBram Moolenaar ] 211025e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 211125e0f586SBram Moolenaar 2112cfcd011fSBram Moolenaar var import_lines = [ 211325e0f586SBram Moolenaar 'vim9script', 211425e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 211525e0f586SBram Moolenaar 'def ImpFunc()', 211625e0f586SBram Moolenaar ' echo ExpFunc()', 211725e0f586SBram Moolenaar 'enddef', 211825e0f586SBram Moolenaar 'defcompile', 211925e0f586SBram Moolenaar ] 212025e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 212125e0f586SBram Moolenaar 212225e0f586SBram Moolenaar try 212325e0f586SBram Moolenaar source Ximport.vim 212425e0f586SBram Moolenaar catch /E1001/ 2125f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 21267707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 212725e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 212825e0f586SBram Moolenaar endtry 212925e0f586SBram Moolenaar 213025e0f586SBram Moolenaar delete('Xexported.vim') 213125e0f586SBram Moolenaar delete('Ximport.vim') 213225e0f586SBram Moolenaarenddef 213325e0f586SBram Moolenaar 2134c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2135cfcd011fSBram Moolenaar var lines = [ 2136c4ce36d4SBram Moolenaar 'vim9script', 2137c4ce36d4SBram Moolenaar 'def Func()', 2138c4ce36d4SBram Moolenaar ' eval [][0]', 2139c4ce36d4SBram Moolenaar 'enddef', 2140c4ce36d4SBram Moolenaar 'Func()', 2141c4ce36d4SBram Moolenaar ] 2142c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2143c4ce36d4SBram Moolenaar 2144c4ce36d4SBram Moolenaar for count in range(3) 2145c4ce36d4SBram Moolenaar try 2146c4ce36d4SBram Moolenaar source Xtestscript.vim 2147c4ce36d4SBram Moolenaar catch /E684/ 2148c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2149c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2150c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2151c4ce36d4SBram Moolenaar endtry 2152c4ce36d4SBram Moolenaar endfor 2153c4ce36d4SBram Moolenaar 2154c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2155c4ce36d4SBram Moolenaarenddef 2156c4ce36d4SBram Moolenaar 2157eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2158cfcd011fSBram Moolenaar var export_lines =<< trim END 2159eef2102eSBram Moolenaar vim9script 2160eef2102eSBram Moolenaar export def Func() 2161eef2102eSBram Moolenaar echo 'imported' 2162eef2102eSBram Moolenaar enddef 2163eef2102eSBram Moolenaar END 2164eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2165eef2102eSBram Moolenaar 2166cfcd011fSBram Moolenaar var lines =<< trim END 2167eef2102eSBram Moolenaar vim9script 2168eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2169eef2102eSBram Moolenaar def Func() 2170eef2102eSBram Moolenaar echo 'local to function' 2171eef2102eSBram Moolenaar enddef 2172eef2102eSBram Moolenaar END 2173eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2174eef2102eSBram Moolenaar 2175eef2102eSBram Moolenaar lines =<< trim END 2176eef2102eSBram Moolenaar vim9script 2177eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2178eef2102eSBram Moolenaar def Outer() 2179eef2102eSBram Moolenaar def Func() 2180eef2102eSBram Moolenaar echo 'local to function' 2181eef2102eSBram Moolenaar enddef 2182eef2102eSBram Moolenaar enddef 2183eef2102eSBram Moolenaar defcompile 2184eef2102eSBram Moolenaar END 2185eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2186eef2102eSBram Moolenaar 2187eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2188eef2102eSBram Moolenaarenddef 2189eef2102eSBram Moolenaar 2190b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2191cfcd011fSBram Moolenaar var lines =<< trim END 2192b9a2cac3SBram Moolenaar vim9script 2193b9a2cac3SBram Moolenaar def Func() 2194b9a2cac3SBram Moolenaar echo 'one' 2195b9a2cac3SBram Moolenaar enddef 2196b9a2cac3SBram Moolenaar def Func() 2197b9a2cac3SBram Moolenaar echo 'two' 2198b9a2cac3SBram Moolenaar enddef 2199b9a2cac3SBram Moolenaar END 2200b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2201fa211f3cSBram Moolenaar 2202fa211f3cSBram Moolenaar lines =<< trim END 2203fa211f3cSBram Moolenaar vim9script 2204fa211f3cSBram Moolenaar def Foo(): string 2205fa211f3cSBram Moolenaar return 'foo' 2206fa211f3cSBram Moolenaar enddef 2207fa211f3cSBram Moolenaar def Func() 2208cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2209fa211f3cSBram Moolenaar enddef 2210fa211f3cSBram Moolenaar defcompile 2211fa211f3cSBram Moolenaar END 2212fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2213b9a2cac3SBram Moolenaarenddef 2214b9a2cac3SBram Moolenaar 22158a7d6542SBram Moolenaardef Test_fixed_size_list() 2216f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2217cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 22188a7d6542SBram Moolenaar l->remove(0) 22198a7d6542SBram Moolenaar l->add(5) 22208a7d6542SBram Moolenaar l->insert(99, 1) 22210f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 22228a7d6542SBram Moolenaarenddef 22238a7d6542SBram Moolenaar 2224ae616494SBram Moolenaardef Test_no_insert_xit() 2225d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2226d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2227d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2228d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2229d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2230ae616494SBram Moolenaar 2231ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2232ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2233ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2234ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2235f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2236f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 22376508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 22386508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2239f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2240f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2241f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2242ae616494SBram Moolenaarenddef 2243ae616494SBram Moolenaar 2244158906cfSBram Moolenaardef IfElse(what: number): string 2245cfcd011fSBram Moolenaar var res = '' 2246158906cfSBram Moolenaar if what == 1 2247158906cfSBram Moolenaar res = "one" 2248158906cfSBram Moolenaar elseif what == 2 2249158906cfSBram Moolenaar res = "two" 2250a259d8d3SBram Moolenaar else 2251158906cfSBram Moolenaar res = "three" 2252a259d8d3SBram Moolenaar endif 2253158906cfSBram Moolenaar return res 2254a259d8d3SBram Moolenaarenddef 2255a259d8d3SBram Moolenaar 2256158906cfSBram Moolenaardef Test_if_elseif_else() 2257158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2258158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2259158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22600f18b6d1SBram Moolenaarenddef 22610f18b6d1SBram Moolenaar 2262e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2263d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2264d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2265d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2266ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2267d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22686628b7ebSBram Moolenaar 22696628b7ebSBram Moolenaar var lines =<< trim END 22706628b7ebSBram Moolenaar var s = '' 22716628b7ebSBram Moolenaar if s = '' 22726628b7ebSBram Moolenaar endif 22736628b7ebSBram Moolenaar END 22746628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 22756628b7ebSBram Moolenaar 22766628b7ebSBram Moolenaar lines =<< trim END 22776628b7ebSBram Moolenaar var s = '' 22786628b7ebSBram Moolenaar if s == '' 22796628b7ebSBram Moolenaar elseif s = '' 22806628b7ebSBram Moolenaar endif 22816628b7ebSBram Moolenaar END 22826628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2283e8c4abbbSBram Moolenaarenddef 2284e8c4abbbSBram Moolenaar 22856d69bf60SBram Moolenaarlet g:bool_true = v:true 22866d69bf60SBram Moolenaarlet g:bool_false = v:false 22876d69bf60SBram Moolenaar 22886d69bf60SBram Moolenaardef Test_if_const_expr() 2289cfcd011fSBram Moolenaar var res = false 22906d69bf60SBram Moolenaar if true ? true : false 22916d69bf60SBram Moolenaar res = true 22926d69bf60SBram Moolenaar endif 22936d69bf60SBram Moolenaar assert_equal(true, res) 22946d69bf60SBram Moolenaar 2295585fea7bSBram Moolenaar g:glob = 2 2296585fea7bSBram Moolenaar if false 22976797966dSBram Moolenaar execute('g:glob = 3') 2298585fea7bSBram Moolenaar endif 2299585fea7bSBram Moolenaar assert_equal(2, g:glob) 2300585fea7bSBram Moolenaar if true 23016797966dSBram Moolenaar execute('g:glob = 3') 2302585fea7bSBram Moolenaar endif 2303585fea7bSBram Moolenaar assert_equal(3, g:glob) 2304585fea7bSBram Moolenaar 23056d69bf60SBram Moolenaar res = false 23066d69bf60SBram Moolenaar if g:bool_true ? true : false 23076d69bf60SBram Moolenaar res = true 23086d69bf60SBram Moolenaar endif 23096d69bf60SBram Moolenaar assert_equal(true, res) 23106d69bf60SBram Moolenaar 23116d69bf60SBram Moolenaar res = false 23126d69bf60SBram Moolenaar if true ? g:bool_true : false 23136d69bf60SBram Moolenaar res = true 23146d69bf60SBram Moolenaar endif 23156d69bf60SBram Moolenaar assert_equal(true, res) 23166d69bf60SBram Moolenaar 23176d69bf60SBram Moolenaar res = false 23186d69bf60SBram Moolenaar if true ? true : g:bool_false 23196d69bf60SBram Moolenaar res = true 23206d69bf60SBram Moolenaar endif 23216d69bf60SBram Moolenaar assert_equal(true, res) 23226d69bf60SBram Moolenaar 23236d69bf60SBram Moolenaar res = false 23246d69bf60SBram Moolenaar if true ? false : true 23256d69bf60SBram Moolenaar res = true 23266d69bf60SBram Moolenaar endif 23276d69bf60SBram Moolenaar assert_equal(false, res) 23286d69bf60SBram Moolenaar 23296d69bf60SBram Moolenaar res = false 23306d69bf60SBram Moolenaar if false ? false : true 23316d69bf60SBram Moolenaar res = true 23326d69bf60SBram Moolenaar endif 23336d69bf60SBram Moolenaar assert_equal(true, res) 23346d69bf60SBram Moolenaar 23356d69bf60SBram Moolenaar res = false 23366d69bf60SBram Moolenaar if false ? true : false 23376d69bf60SBram Moolenaar res = true 23386d69bf60SBram Moolenaar endif 23396d69bf60SBram Moolenaar assert_equal(false, res) 23406d69bf60SBram Moolenaar 23416d69bf60SBram Moolenaar res = false 2342e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2343e8c4abbbSBram Moolenaar res = true 2344e8c4abbbSBram Moolenaar endif 2345e8c4abbbSBram Moolenaar assert_equal(false, res) 2346e8c4abbbSBram Moolenaar 2347e8c4abbbSBram Moolenaar res = false 23486d69bf60SBram Moolenaar if true && true 23496d69bf60SBram Moolenaar res = true 23506d69bf60SBram Moolenaar endif 23516d69bf60SBram Moolenaar assert_equal(true, res) 23526d69bf60SBram Moolenaar 23536d69bf60SBram Moolenaar res = false 23546d69bf60SBram Moolenaar if true && false 23556d69bf60SBram Moolenaar res = true 23566d69bf60SBram Moolenaar endif 23576d69bf60SBram Moolenaar assert_equal(false, res) 23586d69bf60SBram Moolenaar 23596d69bf60SBram Moolenaar res = false 23606d69bf60SBram Moolenaar if g:bool_true && false 23616d69bf60SBram Moolenaar res = true 23626d69bf60SBram Moolenaar endif 23636d69bf60SBram Moolenaar assert_equal(false, res) 23646d69bf60SBram Moolenaar 23656d69bf60SBram Moolenaar res = false 23666d69bf60SBram Moolenaar if true && g:bool_false 23676d69bf60SBram Moolenaar res = true 23686d69bf60SBram Moolenaar endif 23696d69bf60SBram Moolenaar assert_equal(false, res) 23706d69bf60SBram Moolenaar 23716d69bf60SBram Moolenaar res = false 23726d69bf60SBram Moolenaar if false && false 23736d69bf60SBram Moolenaar res = true 23746d69bf60SBram Moolenaar endif 23756d69bf60SBram Moolenaar assert_equal(false, res) 23766d69bf60SBram Moolenaar 23776d69bf60SBram Moolenaar res = false 23786d69bf60SBram Moolenaar if true || false 23796d69bf60SBram Moolenaar res = true 23806d69bf60SBram Moolenaar endif 23816d69bf60SBram Moolenaar assert_equal(true, res) 23826d69bf60SBram Moolenaar 23836d69bf60SBram Moolenaar res = false 23846d69bf60SBram Moolenaar if g:bool_true || false 23856d69bf60SBram Moolenaar res = true 23866d69bf60SBram Moolenaar endif 23876d69bf60SBram Moolenaar assert_equal(true, res) 23886d69bf60SBram Moolenaar 23896d69bf60SBram Moolenaar res = false 23906d69bf60SBram Moolenaar if true || g:bool_false 23916d69bf60SBram Moolenaar res = true 23926d69bf60SBram Moolenaar endif 23936d69bf60SBram Moolenaar assert_equal(true, res) 23946d69bf60SBram Moolenaar 23956d69bf60SBram Moolenaar res = false 23966d69bf60SBram Moolenaar if false || false 23976d69bf60SBram Moolenaar res = true 23986d69bf60SBram Moolenaar endif 23996d69bf60SBram Moolenaar assert_equal(false, res) 24003988f64fSBram Moolenaar 24013988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2402c323527dSBram Moolenaar if false | eval 1 + 2 | endif 24033988f64fSBram Moolenaar if false | eval burp + 234 | endif 24043988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 24053988f64fSBram Moolenaar if false 24063988f64fSBram Moolenaar burp 24073988f64fSBram Moolenaar endif 2408e525bddaSBram Moolenaar 2409e525bddaSBram Moolenaar # expression with line breaks skipped 2410e525bddaSBram Moolenaar if false 2411e525bddaSBram Moolenaar ('aaa' 2412e525bddaSBram Moolenaar .. 'bbb' 2413e525bddaSBram Moolenaar .. 'ccc' 2414e525bddaSBram Moolenaar )->setline(1) 2415e525bddaSBram Moolenaar endif 241680c34ca3SBram Moolenaarenddef 24176d69bf60SBram Moolenaar 241880c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2419d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2420d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2421d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2422d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 24236d69bf60SBram Moolenaarenddef 24246d69bf60SBram Moolenaar 242572abcf42SBram Moolenaardef RunNested(i: number): number 2426cfcd011fSBram Moolenaar var x: number = 0 242772abcf42SBram Moolenaar if i % 2 242872abcf42SBram Moolenaar if 1 2429f5be8cdbSBram Moolenaar # comment 243072abcf42SBram Moolenaar else 2431f5be8cdbSBram Moolenaar # comment 243272abcf42SBram Moolenaar endif 243372abcf42SBram Moolenaar x += 1 243472abcf42SBram Moolenaar else 243572abcf42SBram Moolenaar x += 1000 243672abcf42SBram Moolenaar endif 243772abcf42SBram Moolenaar return x 243872abcf42SBram Moolenaarenddef 243972abcf42SBram Moolenaar 244072abcf42SBram Moolenaardef Test_nested_if() 244172abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 244272abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 244372abcf42SBram Moolenaarenddef 244472abcf42SBram Moolenaar 2445ad39c094SBram Moolenaardef Test_execute_cmd() 2446e4984290SBram Moolenaar # missing argument is ignored 2447e4984290SBram Moolenaar execute 2448e4984290SBram Moolenaar execute # comment 2449e4984290SBram Moolenaar 2450ad39c094SBram Moolenaar new 2451ad39c094SBram Moolenaar setline(1, 'default') 2452d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2453ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2454a72cfb80SBram Moolenaar 2455d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2456a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2457a72cfb80SBram Moolenaar 2458cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2459cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2460a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2461ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2462a72cfb80SBram Moolenaar 2463d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2464ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2465a72cfb80SBram Moolenaar 2466cfcd011fSBram Moolenaar var cmd_first = 'call ' 2467cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2468ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2469ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2470ad39c094SBram Moolenaar bwipe! 2471585fea7bSBram Moolenaar 2472cfcd011fSBram Moolenaar var n = true 24732d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 24742d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 24752d6b20d6SBram Moolenaar 2476e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2477e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2478e5abf7afSBram Moolenaar 2479d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2480d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2481d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2482ad39c094SBram Moolenaarenddef 2483ad39c094SBram Moolenaar 248447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2485f5be8cdbSBram Moolenaar # only checks line continuation 2486cfcd011fSBram Moolenaar var lines =<< trim END 248747e880d6SBram Moolenaar vim9script 248847e880d6SBram Moolenaar execute 'g:someVar' 248947e880d6SBram Moolenaar .. ' = ' .. 249047e880d6SBram Moolenaar '28' 249147e880d6SBram Moolenaar assert_equal(28, g:someVar) 249247e880d6SBram Moolenaar unlet g:someVar 249347e880d6SBram Moolenaar END 249447e880d6SBram Moolenaar CheckScriptSuccess(lines) 249547e880d6SBram Moolenaarenddef 249647e880d6SBram Moolenaar 2497ad39c094SBram Moolenaardef Test_echo_cmd() 2498a72cfb80SBram Moolenaar echo 'some' # comment 2499585fea7bSBram Moolenaar echon 'thing' 2500ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2501ad39c094SBram Moolenaar 2502a72cfb80SBram Moolenaar echo "some" # comment 2503a72cfb80SBram Moolenaar echon "thing" 2504a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2505a72cfb80SBram Moolenaar 2506cfcd011fSBram Moolenaar var str1 = 'some' 2507cfcd011fSBram Moolenaar var str2 = 'more' 2508ad39c094SBram Moolenaar echo str1 str2 2509ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2510a72cfb80SBram Moolenaar 2511d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2512ad39c094SBram Moolenaarenddef 2513ad39c094SBram Moolenaar 2514f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2515f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2516f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2517f93c7feaSBram Moolenaar echo 'clear' 2518df069eecSBram Moolenaar :1messages 2519f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2520f93c7feaSBram Moolenaar 2521d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2522f93c7feaSBram Moolenaarenddef 2523f93c7feaSBram Moolenaar 252447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2525f5be8cdbSBram Moolenaar # only checks line continuation 2526cfcd011fSBram Moolenaar var lines =<< trim END 252747e880d6SBram Moolenaar vim9script 252847e880d6SBram Moolenaar echomsg 'here' 252947e880d6SBram Moolenaar .. ' is ' .. 253047e880d6SBram Moolenaar 'a message' 253147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 253247e880d6SBram Moolenaar END 253347e880d6SBram Moolenaar CheckScriptSuccess(lines) 253447e880d6SBram Moolenaarenddef 253547e880d6SBram Moolenaar 2536f93c7feaSBram Moolenaardef Test_echoerr_cmd() 25377de62623SBram Moolenaar var local = 'local' 253840ee466cSBram Moolenaar try 25397de62623SBram Moolenaar echoerr 'something' local 'wrong' # comment 254040ee466cSBram Moolenaar catch 25417de62623SBram Moolenaar assert_match('something local wrong', v:exception) 254240ee466cSBram Moolenaar endtry 2543f93c7feaSBram Moolenaarenddef 2544f93c7feaSBram Moolenaar 254547e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2546f5be8cdbSBram Moolenaar # only checks line continuation 2547cfcd011fSBram Moolenaar var lines =<< trim END 254847e880d6SBram Moolenaar vim9script 254947e880d6SBram Moolenaar try 255047e880d6SBram Moolenaar echoerr 'this' 255147e880d6SBram Moolenaar .. ' is ' .. 255247e880d6SBram Moolenaar 'wrong' 255347e880d6SBram Moolenaar catch 255447e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 255547e880d6SBram Moolenaar endtry 255647e880d6SBram Moolenaar END 255747e880d6SBram Moolenaar CheckScriptSuccess(lines) 255847e880d6SBram Moolenaarenddef 255947e880d6SBram Moolenaar 25607de62623SBram Moolenaardef Test_echoconsole_cmd() 25617de62623SBram Moolenaar var local = 'local' 25627de62623SBram Moolenaar echoconsole 'something' local # comment 25637de62623SBram Moolenaar # output goes anywhere 25647de62623SBram Moolenaarenddef 25657de62623SBram Moolenaar 256641fe0617SBram Moolenaardef Test_for_outside_of_function() 2567cfcd011fSBram Moolenaar var lines =<< trim END 256841fe0617SBram Moolenaar vim9script 256941fe0617SBram Moolenaar new 257041fe0617SBram Moolenaar for var in range(0, 3) 257141fe0617SBram Moolenaar append(line('$'), var) 257241fe0617SBram Moolenaar endfor 257341fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 257441fe0617SBram Moolenaar bwipe! 2575522eefd9SBram Moolenaar 2576522eefd9SBram Moolenaar var result = '' 2577522eefd9SBram Moolenaar for i in [1, 2, 3] 2578522eefd9SBram Moolenaar var loop = ' loop ' .. i 2579522eefd9SBram Moolenaar result ..= loop 2580522eefd9SBram Moolenaar endfor 2581522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 258241fe0617SBram Moolenaar END 258341fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 258441fe0617SBram Moolenaar source Xvim9for.vim 258541fe0617SBram Moolenaar delete('Xvim9for.vim') 258641fe0617SBram Moolenaarenddef 25878a7d6542SBram Moolenaar 2588bebf0695Srbtnndef Test_for_skipped_block() 2589bebf0695Srbtnn # test skipped blocks at outside of function 2590bebf0695Srbtnn var lines =<< trim END 2591bebf0695Srbtnn var result = [] 2592bebf0695Srbtnn if true 2593bebf0695Srbtnn for n in [1, 2] 2594bebf0695Srbtnn result += [n] 2595bebf0695Srbtnn endfor 2596bebf0695Srbtnn else 2597bebf0695Srbtnn for n in [3, 4] 2598bebf0695Srbtnn result += [n] 2599bebf0695Srbtnn endfor 2600bebf0695Srbtnn endif 2601bebf0695Srbtnn assert_equal([1, 2], result) 2602bebf0695Srbtnn 2603bebf0695Srbtnn result = [] 2604bebf0695Srbtnn if false 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([3, 4], result) 2614bebf0695Srbtnn END 2615bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2616bebf0695Srbtnn 2617bebf0695Srbtnn # test skipped blocks at inside of function 2618bebf0695Srbtnn lines =<< trim END 2619bebf0695Srbtnn def DefTrue() 2620bebf0695Srbtnn var result = [] 2621bebf0695Srbtnn if true 2622bebf0695Srbtnn for n in [1, 2] 2623bebf0695Srbtnn result += [n] 2624bebf0695Srbtnn endfor 2625bebf0695Srbtnn else 2626bebf0695Srbtnn for n in [3, 4] 2627bebf0695Srbtnn result += [n] 2628bebf0695Srbtnn endfor 2629bebf0695Srbtnn endif 2630bebf0695Srbtnn assert_equal([1, 2], result) 2631bebf0695Srbtnn enddef 2632bebf0695Srbtnn DefTrue() 2633bebf0695Srbtnn 2634bebf0695Srbtnn def DefFalse() 2635bebf0695Srbtnn var result = [] 2636bebf0695Srbtnn if false 2637bebf0695Srbtnn for n in [1, 2] 2638bebf0695Srbtnn result += [n] 2639bebf0695Srbtnn endfor 2640bebf0695Srbtnn else 2641bebf0695Srbtnn for n in [3, 4] 2642bebf0695Srbtnn result += [n] 2643bebf0695Srbtnn endfor 2644bebf0695Srbtnn endif 2645bebf0695Srbtnn assert_equal([3, 4], result) 2646bebf0695Srbtnn enddef 2647bebf0695Srbtnn DefFalse() 2648bebf0695Srbtnn END 2649bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2650bebf0695Srbtnnenddef 2651bebf0695Srbtnn 2652e8c4abbbSBram Moolenaardef Test_for_loop() 2653f2253963SBram Moolenaar var lines =<< trim END 2654cfcd011fSBram Moolenaar var result = '' 2655e8c4abbbSBram Moolenaar for cnt in range(7) 2656e8c4abbbSBram Moolenaar if cnt == 4 2657e8c4abbbSBram Moolenaar break 2658e8c4abbbSBram Moolenaar endif 2659e8c4abbbSBram Moolenaar if cnt == 2 2660e8c4abbbSBram Moolenaar continue 2661e8c4abbbSBram Moolenaar endif 2662e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2663e8c4abbbSBram Moolenaar endfor 2664e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 26650ad3e894SBram Moolenaar 2666cfcd011fSBram Moolenaar var concat = '' 26670ad3e894SBram Moolenaar for str in eval('["one", "two"]') 26680ad3e894SBram Moolenaar concat ..= str 26690ad3e894SBram Moolenaar endfor 26700ad3e894SBram Moolenaar assert_equal('onetwo', concat) 267138bd8de5SBram Moolenaar 267238bd8de5SBram Moolenaar var total = 0 267338bd8de5SBram Moolenaar for nr in 267438bd8de5SBram Moolenaar [1, 2, 3] 267538bd8de5SBram Moolenaar total += nr 267638bd8de5SBram Moolenaar endfor 267738bd8de5SBram Moolenaar assert_equal(6, total) 267838bd8de5SBram Moolenaar 267938bd8de5SBram Moolenaar total = 0 268038bd8de5SBram Moolenaar for nr 268138bd8de5SBram Moolenaar in [1, 2, 3] 268238bd8de5SBram Moolenaar total += nr 268338bd8de5SBram Moolenaar endfor 268438bd8de5SBram Moolenaar assert_equal(6, total) 268538bd8de5SBram Moolenaar 268638bd8de5SBram Moolenaar total = 0 268738bd8de5SBram Moolenaar for nr 268838bd8de5SBram Moolenaar in 268938bd8de5SBram Moolenaar [1, 2, 3] 269038bd8de5SBram Moolenaar total += nr 269138bd8de5SBram Moolenaar endfor 269238bd8de5SBram Moolenaar assert_equal(6, total) 2693036d0714SBram Moolenaar 2694a3589a0dSBram Moolenaar # with type 2695a3589a0dSBram Moolenaar total = 0 2696a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2697a3589a0dSBram Moolenaar total += n 2698a3589a0dSBram Moolenaar endfor 2699a3589a0dSBram Moolenaar assert_equal(6, total) 2700a3589a0dSBram Moolenaar 2701fe090eb5SBram Moolenaar var chars = '' 2702fe090eb5SBram Moolenaar for s: string in 'foobar' 2703fe090eb5SBram Moolenaar chars ..= s 2704fe090eb5SBram Moolenaar endfor 2705fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2706fe090eb5SBram Moolenaar 27075ede5b23SBram Moolenaar chars = '' 27085ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 27095ede5b23SBram Moolenaar chars ..= x 27105ede5b23SBram Moolenaar endfor 27115ede5b23SBram Moolenaar assert_equal('ab', chars) 27125ede5b23SBram Moolenaar 2713a3589a0dSBram Moolenaar # unpack with type 2714f2253963SBram Moolenaar var res = '' 2715a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2716a3589a0dSBram Moolenaar res ..= n .. s 2717a3589a0dSBram Moolenaar endfor 2718a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2719a3589a0dSBram Moolenaar 2720444d8783SBram Moolenaar # unpack with one var 2721444d8783SBram Moolenaar var reslist = [] 2722444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2723444d8783SBram Moolenaar reslist->add(x) 2724444d8783SBram Moolenaar endfor 2725444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2726444d8783SBram Moolenaar 2727a3589a0dSBram Moolenaar # loop over string 2728a3589a0dSBram Moolenaar res = '' 272974e54fcbSBram Moolenaar for c in 'aéc̀d' 273074e54fcbSBram Moolenaar res ..= c .. '-' 273174e54fcbSBram Moolenaar endfor 273274e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 273374e54fcbSBram Moolenaar 273474e54fcbSBram Moolenaar res = '' 273574e54fcbSBram Moolenaar for c in '' 273674e54fcbSBram Moolenaar res ..= c .. '-' 273774e54fcbSBram Moolenaar endfor 273874e54fcbSBram Moolenaar assert_equal('', res) 273974e54fcbSBram Moolenaar 274074e54fcbSBram Moolenaar res = '' 274174e54fcbSBram Moolenaar for c in test_null_string() 274274e54fcbSBram Moolenaar res ..= c .. '-' 274374e54fcbSBram Moolenaar endfor 274474e54fcbSBram Moolenaar assert_equal('', res) 2745f2253963SBram Moolenaar 2746f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2747f2253963SBram Moolenaar {a: 'Cat'} 2748f2253963SBram Moolenaar ] 2749f2253963SBram Moolenaar for dd in foo 2750f2253963SBram Moolenaar dd.counter = 12 2751f2253963SBram Moolenaar endfor 2752f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2753ad2d4969SBram Moolenaar 2754ad2d4969SBram Moolenaar reslist = [] 2755ad2d4969SBram Moolenaar for _ in range(3) 2756ad2d4969SBram Moolenaar reslist->add('x') 2757ad2d4969SBram Moolenaar endfor 2758ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2759f2253963SBram Moolenaar END 2760f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2761e8c4abbbSBram Moolenaarenddef 2762e8c4abbbSBram Moolenaar 27632eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 27642eb6fc3bSBram Moolenaar var lines =<< trim END 27652eb6fc3bSBram Moolenaar var flist: list<func> 27662eb6fc3bSBram Moolenaar for i in range(5) 27672eb6fc3bSBram Moolenaar var inloop = i 27682eb6fc3bSBram Moolenaar flist[i] = () => inloop 27692eb6fc3bSBram Moolenaar endfor 27702eb6fc3bSBram Moolenaar for i in range(5) 27712eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 27722eb6fc3bSBram Moolenaar endfor 27732eb6fc3bSBram Moolenaar END 27742eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 27752eb6fc3bSBram Moolenaar 27762eb6fc3bSBram Moolenaar lines =<< trim END 27772eb6fc3bSBram Moolenaar var flist: list<func> 27782eb6fc3bSBram Moolenaar for i in range(5) 27792eb6fc3bSBram Moolenaar var inloop = i 27802eb6fc3bSBram Moolenaar flist[i] = () => { 27812eb6fc3bSBram Moolenaar return inloop 27822eb6fc3bSBram Moolenaar } 27832eb6fc3bSBram Moolenaar endfor 27842eb6fc3bSBram Moolenaar for i in range(5) 27852eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 27862eb6fc3bSBram Moolenaar endfor 27872eb6fc3bSBram Moolenaar END 27882eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 27892eb6fc3bSBram Moolenaarenddef 27902eb6fc3bSBram Moolenaar 2791e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2792442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2793442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2794442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2795442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2796442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2797442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2798d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2799822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 28002d870f8dSBram Moolenaar delfunc! g:Func 2801675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2802675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2803675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 280474e54fcbSBram Moolenaar 280574e54fcbSBram Moolenaar # wrong type detected at compile time 280674e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 280774e54fcbSBram Moolenaar 280874e54fcbSBram Moolenaar # wrong type detected at runtime 280974e54fcbSBram Moolenaar g:adict = {a: 1} 281074e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 281174e54fcbSBram Moolenaar unlet g:adict 2812f6a8d420SBram Moolenaar 2813f6a8d420SBram Moolenaar var lines =<< trim END 2814f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2815f6a8d420SBram Moolenaar for e in d 2816f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2817f6a8d420SBram Moolenaar endfor 2818f6a8d420SBram Moolenaar END 2819f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2820fe090eb5SBram Moolenaar 2821fe090eb5SBram Moolenaar lines =<< trim END 2822fe090eb5SBram Moolenaar for nr: number in ['foo'] 2823fe090eb5SBram Moolenaar endfor 2824fe090eb5SBram Moolenaar END 2825fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2826404557e6SBram Moolenaar 2827404557e6SBram Moolenaar lines =<< trim END 2828404557e6SBram Moolenaar for n : number in [1, 2] 2829404557e6SBram Moolenaar echo n 2830404557e6SBram Moolenaar endfor 2831404557e6SBram Moolenaar END 2832404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2833efc5db52SBram Moolenaar 2834efc5db52SBram Moolenaar lines =<< trim END 2835efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2836efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2837efc5db52SBram Moolenaar echo k v 2838efc5db52SBram Moolenaar endfor 2839efc5db52SBram Moolenaar END 2840efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2841e8c4abbbSBram Moolenaarenddef 2842e8c4abbbSBram Moolenaar 2843ea87069dSBram Moolenaardef Test_for_loop_script_var() 2844ea87069dSBram Moolenaar # cannot use s:var in a :def function 2845ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2846ea87069dSBram Moolenaar 2847ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2848ea87069dSBram Moolenaar var lines =<< trim END 2849ea87069dSBram Moolenaar vim9script 2850ea87069dSBram Moolenaar var total = 0 2851ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2852ea87069dSBram Moolenaar total += s:var 2853ea87069dSBram Moolenaar endfor 2854ea87069dSBram Moolenaar assert_equal(6, total) 2855ea87069dSBram Moolenaar 2856ea87069dSBram Moolenaar total = 0 2857ea87069dSBram Moolenaar for var in [1, 2, 3] 2858ea87069dSBram Moolenaar total += var 2859ea87069dSBram Moolenaar endfor 2860ea87069dSBram Moolenaar assert_equal(6, total) 2861ea87069dSBram Moolenaar END 2862ea87069dSBram Moolenaarenddef 2863ea87069dSBram Moolenaar 2864792f786aSBram Moolenaardef Test_for_loop_unpack() 28654b8a0651SBram Moolenaar var lines =<< trim END 2866792f786aSBram Moolenaar var result = [] 2867792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2868792f786aSBram Moolenaar result->add(v1) 2869792f786aSBram Moolenaar result->add(v2) 2870792f786aSBram Moolenaar endfor 2871792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2872792f786aSBram Moolenaar 2873792f786aSBram Moolenaar result = [] 2874792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2875792f786aSBram Moolenaar result->add(v1) 2876792f786aSBram Moolenaar result->add(v2) 2877792f786aSBram Moolenaar result->add(v3) 2878792f786aSBram Moolenaar endfor 2879792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2880792f786aSBram Moolenaar 28814b8a0651SBram Moolenaar result = [] 28824b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 28834b8a0651SBram Moolenaar result->add(&ts) 28844b8a0651SBram Moolenaar result->add(&sw) 28854b8a0651SBram Moolenaar endfor 28864b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 28874b8a0651SBram Moolenaar 28884b8a0651SBram Moolenaar var slist: list<string> 28894b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 28904b8a0651SBram Moolenaar slist->add($LOOPVAR) 28914b8a0651SBram Moolenaar slist->add(@r) 28924b8a0651SBram Moolenaar slist->add(v:errmsg) 28934b8a0651SBram Moolenaar endfor 28944b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 28954b8a0651SBram Moolenaar 28964b8a0651SBram Moolenaar slist = [] 28974b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 28984b8a0651SBram Moolenaar slist->add(g:globalvar) 28994b8a0651SBram Moolenaar slist->add(b:bufvar) 29004b8a0651SBram Moolenaar slist->add(w:winvar) 29014b8a0651SBram Moolenaar slist->add(t:tabvar) 29024b8a0651SBram Moolenaar endfor 29034b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2904f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2905b777da9bSBram Moolenaar 2906b777da9bSBram Moolenaar var res = [] 2907b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2908b777da9bSBram Moolenaar res->add(n) 2909b777da9bSBram Moolenaar endfor 2910b777da9bSBram Moolenaar assert_equal([2, 5], res) 29114b8a0651SBram Moolenaar END 29124b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 29134b8a0651SBram Moolenaar 29144b8a0651SBram Moolenaar lines =<< trim END 2915792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2916792f786aSBram Moolenaar echo v1 v2 2917792f786aSBram Moolenaar endfor 2918792f786aSBram Moolenaar END 2919792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2920792f786aSBram Moolenaar 2921792f786aSBram Moolenaar lines =<< trim END 2922792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2923792f786aSBram Moolenaar echo v1 v2 2924792f786aSBram Moolenaar endfor 2925792f786aSBram Moolenaar END 2926792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2927792f786aSBram Moolenaar 2928792f786aSBram Moolenaar lines =<< trim END 2929792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2930792f786aSBram Moolenaar echo v1 2931792f786aSBram Moolenaar endfor 2932792f786aSBram Moolenaar END 2933792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2934792f786aSBram Moolenaarenddef 2935792f786aSBram Moolenaar 2936c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2937f2253963SBram Moolenaar var lines =<< trim END 2938c150c09eSBram Moolenaar var looped = 0 2939c150c09eSBram Moolenaar var cleanup = 0 2940c150c09eSBram Moolenaar for i in range(3) 2941c150c09eSBram Moolenaar looped += 1 2942c150c09eSBram Moolenaar try 2943c150c09eSBram Moolenaar eval [][0] 2944c150c09eSBram Moolenaar catch 2945c150c09eSBram Moolenaar continue 2946c150c09eSBram Moolenaar finally 2947c150c09eSBram Moolenaar cleanup += 1 2948c150c09eSBram Moolenaar endtry 2949c150c09eSBram Moolenaar endfor 2950c150c09eSBram Moolenaar assert_equal(3, looped) 2951c150c09eSBram Moolenaar assert_equal(3, cleanup) 2952f2253963SBram Moolenaar END 2953f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2954c150c09eSBram Moolenaarenddef 2955c150c09eSBram Moolenaar 2956d895b1d9Srbtnndef Test_while_skipped_block() 2957d895b1d9Srbtnn # test skipped blocks at outside of function 2958d895b1d9Srbtnn var lines =<< trim END 2959d895b1d9Srbtnn var result = [] 2960d895b1d9Srbtnn var n = 0 2961d895b1d9Srbtnn if true 2962d895b1d9Srbtnn n = 1 2963d895b1d9Srbtnn while n < 3 2964d895b1d9Srbtnn result += [n] 2965d895b1d9Srbtnn n += 1 2966d895b1d9Srbtnn endwhile 2967d895b1d9Srbtnn else 2968d895b1d9Srbtnn n = 3 2969d895b1d9Srbtnn while n < 5 2970d895b1d9Srbtnn result += [n] 2971d895b1d9Srbtnn n += 1 2972d895b1d9Srbtnn endwhile 2973d895b1d9Srbtnn endif 2974d895b1d9Srbtnn assert_equal([1, 2], result) 2975d895b1d9Srbtnn 2976d895b1d9Srbtnn result = [] 2977d895b1d9Srbtnn if false 2978d895b1d9Srbtnn n = 1 2979d895b1d9Srbtnn while n < 3 2980d895b1d9Srbtnn result += [n] 2981d895b1d9Srbtnn n += 1 2982d895b1d9Srbtnn endwhile 2983d895b1d9Srbtnn else 2984d895b1d9Srbtnn n = 3 2985d895b1d9Srbtnn while n < 5 2986d895b1d9Srbtnn result += [n] 2987d895b1d9Srbtnn n += 1 2988d895b1d9Srbtnn endwhile 2989d895b1d9Srbtnn endif 2990d895b1d9Srbtnn assert_equal([3, 4], result) 2991d895b1d9Srbtnn END 2992d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 2993d895b1d9Srbtnn 2994d895b1d9Srbtnn # test skipped blocks at inside of function 2995d895b1d9Srbtnn lines =<< trim END 2996d895b1d9Srbtnn def DefTrue() 2997d895b1d9Srbtnn var result = [] 2998d895b1d9Srbtnn var n = 0 2999d895b1d9Srbtnn if true 3000d895b1d9Srbtnn n = 1 3001d895b1d9Srbtnn while n < 3 3002d895b1d9Srbtnn result += [n] 3003d895b1d9Srbtnn n += 1 3004d895b1d9Srbtnn endwhile 3005d895b1d9Srbtnn else 3006d895b1d9Srbtnn n = 3 3007d895b1d9Srbtnn while n < 5 3008d895b1d9Srbtnn result += [n] 3009d895b1d9Srbtnn n += 1 3010d895b1d9Srbtnn endwhile 3011d895b1d9Srbtnn endif 3012d895b1d9Srbtnn assert_equal([1, 2], result) 3013d895b1d9Srbtnn enddef 3014d895b1d9Srbtnn DefTrue() 3015d895b1d9Srbtnn 3016d895b1d9Srbtnn def DefFalse() 3017d895b1d9Srbtnn var result = [] 3018d895b1d9Srbtnn var n = 0 3019d895b1d9Srbtnn if false 3020d895b1d9Srbtnn n = 1 3021d895b1d9Srbtnn while n < 3 3022d895b1d9Srbtnn result += [n] 3023d895b1d9Srbtnn n += 1 3024d895b1d9Srbtnn endwhile 3025d895b1d9Srbtnn else 3026d895b1d9Srbtnn n = 3 3027d895b1d9Srbtnn while n < 5 3028d895b1d9Srbtnn result += [n] 3029d895b1d9Srbtnn n += 1 3030d895b1d9Srbtnn endwhile 3031d895b1d9Srbtnn endif 3032d895b1d9Srbtnn assert_equal([3, 4], result) 3033d895b1d9Srbtnn enddef 3034d895b1d9Srbtnn DefFalse() 3035d895b1d9Srbtnn END 3036d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 3037d895b1d9Srbtnnenddef 3038d895b1d9Srbtnn 3039d0df1aacSBram Moolenaardef Test_while_loop() 3040cfcd011fSBram Moolenaar var result = '' 3041cfcd011fSBram Moolenaar var cnt = 0 3042d0df1aacSBram Moolenaar while cnt < 555 3043d0df1aacSBram Moolenaar if cnt == 3 3044d0df1aacSBram Moolenaar break 3045d0df1aacSBram Moolenaar endif 3046d0df1aacSBram Moolenaar cnt += 1 3047d0df1aacSBram Moolenaar if cnt == 2 3048d0df1aacSBram Moolenaar continue 3049d0df1aacSBram Moolenaar endif 3050d0df1aacSBram Moolenaar result ..= cnt .. '_' 3051d0df1aacSBram Moolenaar endwhile 3052d0df1aacSBram Moolenaar assert_equal('1_3_', result) 3053dee37dc7SBram Moolenaar 3054dee37dc7SBram Moolenaar var s = '' 30550123cc1eSBram Moolenaar while s == 'x' # {comment} 3056dee37dc7SBram Moolenaar endwhile 3057d0df1aacSBram Moolenaarenddef 3058d0df1aacSBram Moolenaar 3059e8c4abbbSBram Moolenaardef Test_while_loop_fails() 3060675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 3061675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 3062675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 3063675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 3064675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 3065675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 3066675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 30676628b7ebSBram Moolenaar 30686628b7ebSBram Moolenaar var lines =<< trim END 30696628b7ebSBram Moolenaar var s = '' 30706628b7ebSBram Moolenaar while s = '' 30716628b7ebSBram Moolenaar endwhile 30726628b7ebSBram Moolenaar END 30736628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 3074bd5da371SBram Moolenaarenddef 3075bd5da371SBram Moolenaar 30769645e2d9SBram Moolenaardef Test_interrupt_loop() 3077cfcd011fSBram Moolenaar var caught = false 3078cfcd011fSBram Moolenaar var x = 0 307997acfc78SBram Moolenaar try 30809645e2d9SBram Moolenaar while 1 30819645e2d9SBram Moolenaar x += 1 30829645e2d9SBram Moolenaar if x == 100 30839645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 30849645e2d9SBram Moolenaar endif 30859645e2d9SBram Moolenaar endwhile 308697acfc78SBram Moolenaar catch 308797acfc78SBram Moolenaar caught = true 308897acfc78SBram Moolenaar assert_equal(100, x) 308997acfc78SBram Moolenaar endtry 309097acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 309125859dd7SBram Moolenaar # consume the CTRL-C 309225859dd7SBram Moolenaar getchar(0) 30939645e2d9SBram Moolenaarenddef 309420431c9dSBram Moolenaar 30954fdae999SBram Moolenaardef Test_automatic_line_continuation() 3096cfcd011fSBram Moolenaar var mylist = [ 30974fdae999SBram Moolenaar 'one', 30984fdae999SBram Moolenaar 'two', 30994fdae999SBram Moolenaar 'three', 3100f5be8cdbSBram Moolenaar ] # comment 31014fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 31024fdae999SBram Moolenaar 3103cfcd011fSBram Moolenaar var mydict = { 3104e0de171eSBram Moolenaar ['one']: 1, 3105e0de171eSBram Moolenaar ['two']: 2, 3106e0de171eSBram Moolenaar ['three']: 31074fdae999SBram Moolenaar 3, 3108f5be8cdbSBram Moolenaar } # comment 3109e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3110e0de171eSBram Moolenaar mydict = { 31112c330432SBram Moolenaar one: 1, # comment 31122c330432SBram Moolenaar two: # comment 31132c330432SBram Moolenaar 2, # comment 31142c330432SBram Moolenaar three: 3 # comment 31152c330432SBram Moolenaar } 3116e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3117e0de171eSBram Moolenaar mydict = { 31182c330432SBram Moolenaar one: 1, 31194fdae999SBram Moolenaar two: 31204fdae999SBram Moolenaar 2, 31212c330432SBram Moolenaar three: 3 31224fdae999SBram Moolenaar } 3123e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3124e6085c53SBram Moolenaar 3125e6085c53SBram Moolenaar assert_equal( 3126e6085c53SBram Moolenaar ['one', 'two', 'three'], 3127e6085c53SBram Moolenaar split('one two three') 3128e6085c53SBram Moolenaar ) 31294fdae999SBram Moolenaarenddef 31304fdae999SBram Moolenaar 31317a092245SBram Moolenaardef Test_vim9_comment() 31327a092245SBram Moolenaar CheckScriptSuccess([ 31337a092245SBram Moolenaar 'vim9script', 31347a092245SBram Moolenaar '# something', 313593f82cbeSBram Moolenaar '#something', 313693f82cbeSBram Moolenaar '#{something', 31377a092245SBram Moolenaar ]) 313893f82cbeSBram Moolenaar 313993f82cbeSBram Moolenaar split Xfile 314093f82cbeSBram Moolenaar CheckScriptSuccess([ 314193f82cbeSBram Moolenaar 'vim9script', 314293f82cbeSBram Moolenaar 'edit #something', 314393f82cbeSBram Moolenaar ]) 314493f82cbeSBram Moolenaar CheckScriptSuccess([ 314593f82cbeSBram Moolenaar 'vim9script', 314693f82cbeSBram Moolenaar 'edit #{something', 314793f82cbeSBram Moolenaar ]) 314893f82cbeSBram Moolenaar close 314993f82cbeSBram Moolenaar 31507a092245SBram Moolenaar CheckScriptFailure([ 31517a092245SBram Moolenaar 'vim9script', 31527a092245SBram Moolenaar ':# something', 31537a092245SBram Moolenaar ], 'E488:') 31547a092245SBram Moolenaar CheckScriptFailure([ 31557a092245SBram Moolenaar '# something', 31567a092245SBram Moolenaar ], 'E488:') 31577a092245SBram Moolenaar CheckScriptFailure([ 31587a092245SBram Moolenaar ':# something', 31597a092245SBram Moolenaar ], 'E488:') 31607a092245SBram Moolenaar 31614a8d9f2eSBram Moolenaar { # block start 31624a8d9f2eSBram Moolenaar } # block end 31634a8d9f2eSBram Moolenaar CheckDefFailure([ 31644a8d9f2eSBram Moolenaar '{# comment', 31654a8d9f2eSBram Moolenaar ], 'E488:') 31664a8d9f2eSBram Moolenaar CheckDefFailure([ 31674a8d9f2eSBram Moolenaar '{', 31684a8d9f2eSBram Moolenaar '}# comment', 31694a8d9f2eSBram Moolenaar ], 'E488:') 31704a8d9f2eSBram Moolenaar 31714a8d9f2eSBram Moolenaar echo "yes" # comment 31724a8d9f2eSBram Moolenaar CheckDefFailure([ 31734a8d9f2eSBram Moolenaar 'echo "yes"# comment', 31744a8d9f2eSBram Moolenaar ], 'E488:') 31757a092245SBram Moolenaar CheckScriptSuccess([ 31767a092245SBram Moolenaar 'vim9script', 31777a092245SBram Moolenaar 'echo "yes" # something', 31787a092245SBram Moolenaar ]) 31797a092245SBram Moolenaar CheckScriptFailure([ 31807a092245SBram Moolenaar 'vim9script', 31817a092245SBram Moolenaar 'echo "yes"# something', 31827a092245SBram Moolenaar ], 'E121:') 31837a092245SBram Moolenaar CheckScriptFailure([ 31847a092245SBram Moolenaar 'vim9script', 31857a092245SBram Moolenaar 'echo# something', 3186f8103f27SBram Moolenaar ], 'E1144:') 31877a092245SBram Moolenaar CheckScriptFailure([ 31887a092245SBram Moolenaar 'echo "yes" # something', 31897a092245SBram Moolenaar ], 'E121:') 31907a092245SBram Moolenaar 31914a8d9f2eSBram Moolenaar exe "echo" # comment 31924a8d9f2eSBram Moolenaar CheckDefFailure([ 31934a8d9f2eSBram Moolenaar 'exe "echo"# comment', 31944a8d9f2eSBram Moolenaar ], 'E488:') 31954a8d9f2eSBram Moolenaar CheckScriptSuccess([ 31964a8d9f2eSBram Moolenaar 'vim9script', 31974a8d9f2eSBram Moolenaar 'exe "echo" # something', 31984a8d9f2eSBram Moolenaar ]) 31994a8d9f2eSBram Moolenaar CheckScriptFailure([ 32004a8d9f2eSBram Moolenaar 'vim9script', 32014a8d9f2eSBram Moolenaar 'exe "echo"# something', 32024a8d9f2eSBram Moolenaar ], 'E121:') 32034a8d9f2eSBram Moolenaar CheckScriptFailure([ 32044a8d9f2eSBram Moolenaar 'vim9script', 32054a8d9f2eSBram Moolenaar 'exe# something', 3206f8103f27SBram Moolenaar ], 'E1144:') 32074a8d9f2eSBram Moolenaar CheckScriptFailure([ 32084a8d9f2eSBram Moolenaar 'exe "echo" # something', 32094a8d9f2eSBram Moolenaar ], 'E121:') 32104a8d9f2eSBram Moolenaar 32117a092245SBram Moolenaar CheckDefFailure([ 32127a092245SBram Moolenaar 'try# comment', 32137a092245SBram Moolenaar ' echo "yes"', 32147a092245SBram Moolenaar 'catch', 32157a092245SBram Moolenaar 'endtry', 3216f8103f27SBram Moolenaar ], 'E1144:') 32172c5ed4e3SBram Moolenaar CheckScriptFailure([ 32182c5ed4e3SBram Moolenaar 'vim9script', 32192c5ed4e3SBram Moolenaar 'try# comment', 32202c5ed4e3SBram Moolenaar 'echo "yes"', 3221f8103f27SBram Moolenaar ], 'E1144:') 32227a092245SBram Moolenaar CheckDefFailure([ 32237a092245SBram Moolenaar 'try', 3224a72cfb80SBram Moolenaar ' throw#comment', 3225a72cfb80SBram Moolenaar 'catch', 3226a72cfb80SBram Moolenaar 'endtry', 3227f8103f27SBram Moolenaar ], 'E1144:') 3228a72cfb80SBram Moolenaar CheckDefFailure([ 3229a72cfb80SBram Moolenaar 'try', 3230a72cfb80SBram Moolenaar ' throw "yes"#comment', 3231a72cfb80SBram Moolenaar 'catch', 3232a72cfb80SBram Moolenaar 'endtry', 3233a72cfb80SBram Moolenaar ], 'E488:') 3234a72cfb80SBram Moolenaar CheckDefFailure([ 3235a72cfb80SBram Moolenaar 'try', 32367a092245SBram Moolenaar ' echo "yes"', 32377a092245SBram Moolenaar 'catch# comment', 32387a092245SBram Moolenaar 'endtry', 3239f8103f27SBram Moolenaar ], 'E1144:') 32402c5ed4e3SBram Moolenaar CheckScriptFailure([ 32412c5ed4e3SBram Moolenaar 'vim9script', 32422c5ed4e3SBram Moolenaar 'try', 32432c5ed4e3SBram Moolenaar ' echo "yes"', 32442c5ed4e3SBram Moolenaar 'catch# comment', 32452c5ed4e3SBram Moolenaar 'endtry', 3246f8103f27SBram Moolenaar ], 'E1144:') 32472c5ed4e3SBram Moolenaar CheckDefFailure([ 32482c5ed4e3SBram Moolenaar 'try', 32492c5ed4e3SBram Moolenaar ' echo "yes"', 32502c5ed4e3SBram Moolenaar 'catch /pat/# comment', 32512c5ed4e3SBram Moolenaar 'endtry', 32522c5ed4e3SBram Moolenaar ], 'E488:') 32537a092245SBram Moolenaar CheckDefFailure([ 32547a092245SBram Moolenaar 'try', 32557a092245SBram Moolenaar 'echo "yes"', 32567a092245SBram Moolenaar 'catch', 32577a092245SBram Moolenaar 'endtry# comment', 3258f8103f27SBram Moolenaar ], 'E1144:') 32592c5ed4e3SBram Moolenaar CheckScriptFailure([ 32602c5ed4e3SBram Moolenaar 'vim9script', 32612c5ed4e3SBram Moolenaar 'try', 32622c5ed4e3SBram Moolenaar ' echo "yes"', 32632c5ed4e3SBram Moolenaar 'catch', 32642c5ed4e3SBram Moolenaar 'endtry# comment', 3265f8103f27SBram Moolenaar ], 'E1144:') 32662c5ed4e3SBram Moolenaar 32672c5ed4e3SBram Moolenaar CheckScriptSuccess([ 32682c5ed4e3SBram Moolenaar 'vim9script', 32692c5ed4e3SBram Moolenaar 'hi # comment', 32702c5ed4e3SBram Moolenaar ]) 32712c5ed4e3SBram Moolenaar CheckScriptFailure([ 32722c5ed4e3SBram Moolenaar 'vim9script', 32732c5ed4e3SBram Moolenaar 'hi# comment', 3274f8103f27SBram Moolenaar ], 'E1144:') 32751966c248SBram Moolenaar CheckScriptSuccess([ 32761966c248SBram Moolenaar 'vim9script', 32771966c248SBram Moolenaar 'hi Search # comment', 32781966c248SBram Moolenaar ]) 32791966c248SBram Moolenaar CheckScriptFailure([ 32801966c248SBram Moolenaar 'vim9script', 32811966c248SBram Moolenaar 'hi Search# comment', 32821966c248SBram Moolenaar ], 'E416:') 32831966c248SBram Moolenaar CheckScriptSuccess([ 32841966c248SBram Moolenaar 'vim9script', 32851966c248SBram Moolenaar 'hi link This Search # comment', 32861966c248SBram Moolenaar ]) 32871966c248SBram Moolenaar CheckScriptFailure([ 32881966c248SBram Moolenaar 'vim9script', 32891966c248SBram Moolenaar 'hi link This That# comment', 32901966c248SBram Moolenaar ], 'E413:') 32911966c248SBram Moolenaar CheckScriptSuccess([ 32921966c248SBram Moolenaar 'vim9script', 32931966c248SBram Moolenaar 'hi clear This # comment', 32941966c248SBram Moolenaar 'hi clear # comment', 32951966c248SBram Moolenaar ]) 3296f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3297f5be8cdbSBram Moolenaar # hi clear This# comment', 32981966c248SBram Moolenaar CheckScriptFailure([ 32991966c248SBram Moolenaar 'vim9script', 33001966c248SBram Moolenaar 'hi clear# comment', 33011966c248SBram Moolenaar ], 'E416:') 33021966c248SBram Moolenaar 33031966c248SBram Moolenaar CheckScriptSuccess([ 33041966c248SBram Moolenaar 'vim9script', 33051966c248SBram Moolenaar 'hi Group term=bold', 33061966c248SBram Moolenaar 'match Group /todo/ # comment', 33071966c248SBram Moolenaar ]) 33081966c248SBram Moolenaar CheckScriptFailure([ 33091966c248SBram Moolenaar 'vim9script', 33101966c248SBram Moolenaar 'hi Group term=bold', 33111966c248SBram Moolenaar 'match Group /todo/# comment', 33121966c248SBram Moolenaar ], 'E488:') 33131966c248SBram Moolenaar CheckScriptSuccess([ 33141966c248SBram Moolenaar 'vim9script', 33151966c248SBram Moolenaar 'match # comment', 33161966c248SBram Moolenaar ]) 33171966c248SBram Moolenaar CheckScriptFailure([ 33181966c248SBram Moolenaar 'vim9script', 33191966c248SBram Moolenaar 'match# comment', 3320f8103f27SBram Moolenaar ], 'E1144:') 33211966c248SBram Moolenaar CheckScriptSuccess([ 33221966c248SBram Moolenaar 'vim9script', 33231966c248SBram Moolenaar 'match none # comment', 33241966c248SBram Moolenaar ]) 33251966c248SBram Moolenaar CheckScriptFailure([ 33261966c248SBram Moolenaar 'vim9script', 33271966c248SBram Moolenaar 'match none# comment', 33281966c248SBram Moolenaar ], 'E475:') 33291966c248SBram Moolenaar 33301966c248SBram Moolenaar CheckScriptSuccess([ 33311966c248SBram Moolenaar 'vim9script', 33321966c248SBram Moolenaar 'menutrans clear # comment', 33331966c248SBram Moolenaar ]) 33341966c248SBram Moolenaar CheckScriptFailure([ 33351966c248SBram Moolenaar 'vim9script', 33361966c248SBram Moolenaar 'menutrans clear# comment text', 33371966c248SBram Moolenaar ], 'E474:') 33381966c248SBram Moolenaar 33391966c248SBram Moolenaar CheckScriptSuccess([ 33401966c248SBram Moolenaar 'vim9script', 33411966c248SBram Moolenaar 'syntax clear # comment', 33421966c248SBram Moolenaar ]) 33431966c248SBram Moolenaar CheckScriptFailure([ 33441966c248SBram Moolenaar 'vim9script', 33451966c248SBram Moolenaar 'syntax clear# comment text', 33461966c248SBram Moolenaar ], 'E28:') 33471966c248SBram Moolenaar CheckScriptSuccess([ 33481966c248SBram Moolenaar 'vim9script', 33491966c248SBram Moolenaar 'syntax keyword Word some', 33501966c248SBram Moolenaar 'syntax clear Word # comment', 33511966c248SBram Moolenaar ]) 33521966c248SBram Moolenaar CheckScriptFailure([ 33531966c248SBram Moolenaar 'vim9script', 33541966c248SBram Moolenaar 'syntax keyword Word some', 33551966c248SBram Moolenaar 'syntax clear Word# comment text', 33561966c248SBram Moolenaar ], 'E28:') 33571966c248SBram Moolenaar 33581966c248SBram Moolenaar CheckScriptSuccess([ 33591966c248SBram Moolenaar 'vim9script', 33601966c248SBram Moolenaar 'syntax list # comment', 33611966c248SBram Moolenaar ]) 33621966c248SBram Moolenaar CheckScriptFailure([ 33631966c248SBram Moolenaar 'vim9script', 33641966c248SBram Moolenaar 'syntax list# comment text', 33651966c248SBram Moolenaar ], 'E28:') 33661966c248SBram Moolenaar 33671966c248SBram Moolenaar CheckScriptSuccess([ 33681966c248SBram Moolenaar 'vim9script', 33691966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 33701966c248SBram Moolenaar ]) 33711966c248SBram Moolenaar CheckScriptFailure([ 33721966c248SBram Moolenaar 'vim9script', 33731966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 33741966c248SBram Moolenaar ], 'E475:') 33751966c248SBram Moolenaar 33761966c248SBram Moolenaar CheckScriptSuccess([ 33771966c248SBram Moolenaar 'vim9script', 33781966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 33791966c248SBram Moolenaar ]) 33801966c248SBram Moolenaar CheckScriptFailure([ 33811966c248SBram Moolenaar 'vim9script', 33821966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 33831966c248SBram Moolenaar ], 'E789:') 33841966c248SBram Moolenaar 33851966c248SBram Moolenaar CheckScriptSuccess([ 33861966c248SBram Moolenaar 'vim9script', 33871966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 33881966c248SBram Moolenaar ]) 33891966c248SBram Moolenaar CheckScriptFailure([ 33901966c248SBram Moolenaar 'vim9script', 33911966c248SBram Moolenaar 'syntax match Word /pat/# comment', 33921966c248SBram Moolenaar ], 'E402:') 33931966c248SBram Moolenaar 33941966c248SBram Moolenaar CheckScriptSuccess([ 33951966c248SBram Moolenaar 'vim9script', 33961966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 33971966c248SBram Moolenaar ]) 33981966c248SBram Moolenaar CheckScriptFailure([ 33991966c248SBram Moolenaar 'vim9script', 34001966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 34011966c248SBram Moolenaar ], 'E475:') 34021966c248SBram Moolenaar CheckScriptFailure([ 34031966c248SBram Moolenaar 'vim9script', 34041966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 34051966c248SBram Moolenaar ], 'E406:') 34061966c248SBram Moolenaar CheckScriptFailure([ 34071966c248SBram Moolenaar 'vim9script', 34081966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 34091966c248SBram Moolenaar ], 'E475:') 34101966c248SBram Moolenaar 34111966c248SBram Moolenaar CheckScriptSuccess([ 34121966c248SBram Moolenaar 'vim9script', 34131966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 34141966c248SBram Moolenaar ]) 34151966c248SBram Moolenaar CheckScriptFailure([ 34161966c248SBram Moolenaar 'vim9script', 34171966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3418d032f34aSBram Moolenaar ], 'E402:') 34191966c248SBram Moolenaar 34201966c248SBram Moolenaar CheckScriptSuccess([ 34211966c248SBram Moolenaar 'vim9script', 34221966c248SBram Moolenaar 'syntax sync # comment', 34231966c248SBram Moolenaar ]) 34241966c248SBram Moolenaar CheckScriptFailure([ 34251966c248SBram Moolenaar 'vim9script', 34261966c248SBram Moolenaar 'syntax sync# comment', 34271966c248SBram Moolenaar ], 'E404:') 34281966c248SBram Moolenaar CheckScriptSuccess([ 34291966c248SBram Moolenaar 'vim9script', 34301966c248SBram Moolenaar 'syntax sync ccomment # comment', 34311966c248SBram Moolenaar ]) 34321966c248SBram Moolenaar CheckScriptFailure([ 34331966c248SBram Moolenaar 'vim9script', 34341966c248SBram Moolenaar 'syntax sync ccomment# comment', 34351966c248SBram Moolenaar ], 'E404:') 34361966c248SBram Moolenaar 34371966c248SBram Moolenaar CheckScriptSuccess([ 34381966c248SBram Moolenaar 'vim9script', 34391966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 34401966c248SBram Moolenaar ]) 34411966c248SBram Moolenaar CheckScriptFailure([ 34421966c248SBram Moolenaar 'vim9script', 34431966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 34441966c248SBram Moolenaar ], 'E475:') 3445a72cfb80SBram Moolenaar 3446a72cfb80SBram Moolenaar CheckScriptSuccess([ 3447a72cfb80SBram Moolenaar 'vim9script', 3448a72cfb80SBram Moolenaar 'command Echo echo # comment', 3449a72cfb80SBram Moolenaar 'command Echo # comment', 34502d870f8dSBram Moolenaar 'delcommand Echo', 3451a72cfb80SBram Moolenaar ]) 3452a72cfb80SBram Moolenaar CheckScriptFailure([ 3453a72cfb80SBram Moolenaar 'vim9script', 3454a72cfb80SBram Moolenaar 'command Echo echo# comment', 3455a72cfb80SBram Moolenaar 'Echo', 3456f8103f27SBram Moolenaar ], 'E1144:') 34572d870f8dSBram Moolenaar delcommand Echo 345870249ee8SBram Moolenaar 345970249ee8SBram Moolenaar var curdir = getcwd() 346070249ee8SBram Moolenaar CheckScriptSuccess([ 346170249ee8SBram Moolenaar 'command Echo cd " comment', 346270249ee8SBram Moolenaar 'Echo', 346370249ee8SBram Moolenaar 'delcommand Echo', 346470249ee8SBram Moolenaar ]) 346570249ee8SBram Moolenaar CheckScriptSuccess([ 3466090728adSBram Moolenaar 'vim9script', 346770249ee8SBram Moolenaar 'command Echo cd # comment', 346870249ee8SBram Moolenaar 'Echo', 346970249ee8SBram Moolenaar 'delcommand Echo', 347070249ee8SBram Moolenaar ]) 347170249ee8SBram Moolenaar CheckScriptFailure([ 347270249ee8SBram Moolenaar 'vim9script', 347370249ee8SBram Moolenaar 'command Echo cd " comment', 347470249ee8SBram Moolenaar 'Echo', 347570249ee8SBram Moolenaar ], 'E344:') 347670249ee8SBram Moolenaar delcommand Echo 347770249ee8SBram Moolenaar chdir(curdir) 347870249ee8SBram Moolenaar 3479a72cfb80SBram Moolenaar CheckScriptFailure([ 3480a72cfb80SBram Moolenaar 'vim9script', 3481a72cfb80SBram Moolenaar 'command Echo# comment', 3482a72cfb80SBram Moolenaar ], 'E182:') 3483a72cfb80SBram Moolenaar CheckScriptFailure([ 3484a72cfb80SBram Moolenaar 'vim9script', 3485a72cfb80SBram Moolenaar 'command Echo echo', 3486a72cfb80SBram Moolenaar 'command Echo# comment', 3487a72cfb80SBram Moolenaar ], 'E182:') 34882d870f8dSBram Moolenaar delcommand Echo 3489a72cfb80SBram Moolenaar 3490a72cfb80SBram Moolenaar CheckScriptSuccess([ 3491a72cfb80SBram Moolenaar 'vim9script', 3492a72cfb80SBram Moolenaar 'function # comment', 3493a72cfb80SBram Moolenaar ]) 3494a72cfb80SBram Moolenaar CheckScriptFailure([ 3495a72cfb80SBram Moolenaar 'vim9script', 34969898107fSBram Moolenaar 'function " comment', 34979898107fSBram Moolenaar ], 'E129:') 34989898107fSBram Moolenaar CheckScriptFailure([ 34999898107fSBram Moolenaar 'vim9script', 3500a72cfb80SBram Moolenaar 'function# comment', 3501f8103f27SBram Moolenaar ], 'E1144:') 3502a72cfb80SBram Moolenaar CheckScriptSuccess([ 3503a72cfb80SBram Moolenaar 'vim9script', 3504a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3505a72cfb80SBram Moolenaar ]) 3506a72cfb80SBram Moolenaar CheckScriptFailure([ 3507a72cfb80SBram Moolenaar 'vim9script', 3508a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3509a72cfb80SBram Moolenaar ], 'E488:') 3510a72cfb80SBram Moolenaar 3511a72cfb80SBram Moolenaar CheckScriptSuccess([ 3512a72cfb80SBram Moolenaar 'vim9script', 35134c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3514a72cfb80SBram Moolenaar 'endfunc', 35154c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3516a72cfb80SBram Moolenaar ]) 3517a72cfb80SBram Moolenaar CheckScriptFailure([ 3518a72cfb80SBram Moolenaar 'vim9script', 35194c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3520a72cfb80SBram Moolenaar 'endfunc', 35214c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3522a72cfb80SBram Moolenaar ], 'E488:') 3523a72cfb80SBram Moolenaar 3524a72cfb80SBram Moolenaar CheckScriptSuccess([ 3525a72cfb80SBram Moolenaar 'vim9script', 3526a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3527a72cfb80SBram Moolenaar ]) 3528a72cfb80SBram Moolenaar CheckScriptFailure([ 3529a72cfb80SBram Moolenaar 'vim9script', 3530a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3531a72cfb80SBram Moolenaar ], 'E488:') 3532e7e4838fSBram Moolenaar 3533e7e4838fSBram Moolenaar CheckScriptFailure([ 3534e7e4838fSBram Moolenaar 'def Test() " comment', 3535e7e4838fSBram Moolenaar 'enddef', 3536e7e4838fSBram Moolenaar ], 'E488:') 3537e7e4838fSBram Moolenaar CheckScriptFailure([ 3538e7e4838fSBram Moolenaar 'vim9script', 3539e7e4838fSBram Moolenaar 'def Test() " comment', 3540e7e4838fSBram Moolenaar 'enddef', 3541e7e4838fSBram Moolenaar ], 'E488:') 3542e7e4838fSBram Moolenaar 3543e7e4838fSBram Moolenaar CheckScriptSuccess([ 3544e7e4838fSBram Moolenaar 'func Test() " comment', 3545e7e4838fSBram Moolenaar 'endfunc', 35462d870f8dSBram Moolenaar 'delfunc Test', 3547e7e4838fSBram Moolenaar ]) 35489898107fSBram Moolenaar CheckScriptSuccess([ 3549e7e4838fSBram Moolenaar 'vim9script', 3550e7e4838fSBram Moolenaar 'func Test() " comment', 3551e7e4838fSBram Moolenaar 'endfunc', 35529898107fSBram Moolenaar ]) 3553e7e4838fSBram Moolenaar 3554e7e4838fSBram Moolenaar CheckScriptSuccess([ 3555e7e4838fSBram Moolenaar 'def Test() # comment', 3556e7e4838fSBram Moolenaar 'enddef', 3557e7e4838fSBram Moolenaar ]) 3558e7e4838fSBram Moolenaar CheckScriptFailure([ 3559e7e4838fSBram Moolenaar 'func Test() # comment', 3560e7e4838fSBram Moolenaar 'endfunc', 3561e7e4838fSBram Moolenaar ], 'E488:') 35620f37e356SBram Moolenaar 35630f37e356SBram Moolenaar var lines =<< trim END 35640f37e356SBram Moolenaar vim9script 35650f37e356SBram Moolenaar syn region Text 35660f37e356SBram Moolenaar \ start='foo' 35670f37e356SBram Moolenaar #\ comment 35680f37e356SBram Moolenaar \ end='bar' 35695072b47aSBram Moolenaar syn region Text start='foo' 35705072b47aSBram Moolenaar #\ comment 35715072b47aSBram Moolenaar \ end='bar' 35720f37e356SBram Moolenaar END 35730f37e356SBram Moolenaar CheckScriptSuccess(lines) 35740f37e356SBram Moolenaar 35750f37e356SBram Moolenaar lines =<< trim END 35760f37e356SBram Moolenaar vim9script 35770f37e356SBram Moolenaar syn region Text 35780f37e356SBram Moolenaar \ start='foo' 35790f37e356SBram Moolenaar "\ comment 35800f37e356SBram Moolenaar \ end='bar' 35810f37e356SBram Moolenaar END 35820f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 35832c5ed4e3SBram Moolenaarenddef 35842c5ed4e3SBram Moolenaar 35852c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 35862c5ed4e3SBram Moolenaar CheckCanRunGui 35872c5ed4e3SBram Moolenaar 35882c5ed4e3SBram Moolenaar CheckScriptFailure([ 35892c5ed4e3SBram Moolenaar 'vim9script', 35902c5ed4e3SBram Moolenaar 'gui#comment' 3591f8103f27SBram Moolenaar ], 'E1144:') 35922c5ed4e3SBram Moolenaar CheckScriptFailure([ 35932c5ed4e3SBram Moolenaar 'vim9script', 35942c5ed4e3SBram Moolenaar 'gui -f#comment' 3595b8bd2e6eSBram Moolenaar ], 'E194:') 35967a092245SBram Moolenaarenddef 35977a092245SBram Moolenaar 3598a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 35996797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 36006797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3601a26b9700SBram Moolenaar 3602a26b9700SBram Moolenaar edit test.vim 3603a26b9700SBram Moolenaar doautocmd TabEnter #comment 3604a26b9700SBram Moolenaar assert_equal(1, g:entered) 3605a26b9700SBram Moolenaar 3606a26b9700SBram Moolenaar doautocmd TabEnter f.x 3607a26b9700SBram Moolenaar assert_equal(2, g:entered) 3608a26b9700SBram Moolenaar 3609a26b9700SBram Moolenaar g:entered = 0 3610a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3611a26b9700SBram Moolenaar assert_equal(2, g:entered) 3612a26b9700SBram Moolenaar 3613a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3614a26b9700SBram Moolenaar 3615a26b9700SBram Moolenaar au! TabEnter 3616a26b9700SBram Moolenaar unlet g:entered 3617d72c1bf0SBram Moolenaar 3618d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3619d72c1bf0SBram Moolenaar 'vim9script', 36206797966dSBram Moolenaar 'g:var = 123', 3621e55b1c09SBram Moolenaar 'b:var = 456', 3622e55b1c09SBram Moolenaar 'w:var = 777', 3623e55b1c09SBram Moolenaar 't:var = 888', 3624d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3625d72c1bf0SBram Moolenaar ]) 3626d72c1bf0SBram Moolenaar 3627d72c1bf0SBram Moolenaar CheckScriptFailure([ 3628d72c1bf0SBram Moolenaar 'vim9script', 3629cfcd011fSBram Moolenaar 'let var = 123', 3630cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3631cfcd011fSBram Moolenaar 3632cfcd011fSBram Moolenaar CheckScriptFailure([ 3633cfcd011fSBram Moolenaar 'vim9script', 3634cfcd011fSBram Moolenaar 'var g:var = 123', 3635e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3636e55b1c09SBram Moolenaar 3637e55b1c09SBram Moolenaar CheckScriptFailure([ 3638e55b1c09SBram Moolenaar 'vim9script', 3639cfcd011fSBram Moolenaar 'var b:var = 123', 3640e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3641e55b1c09SBram Moolenaar 3642e55b1c09SBram Moolenaar CheckScriptFailure([ 3643e55b1c09SBram Moolenaar 'vim9script', 3644cfcd011fSBram Moolenaar 'var w:var = 123', 3645e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3646e55b1c09SBram Moolenaar 3647e55b1c09SBram Moolenaar CheckScriptFailure([ 3648e55b1c09SBram Moolenaar 'vim9script', 3649cfcd011fSBram Moolenaar 'var t:var = 123', 3650e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3651e55b1c09SBram Moolenaar 3652e55b1c09SBram Moolenaar CheckScriptFailure([ 3653e55b1c09SBram Moolenaar 'vim9script', 3654cfcd011fSBram Moolenaar 'var v:version = 123', 3655e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3656e55b1c09SBram Moolenaar 3657e55b1c09SBram Moolenaar CheckScriptFailure([ 3658e55b1c09SBram Moolenaar 'vim9script', 3659cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3660e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 36616797966dSBram Moolenaar 36626797966dSBram Moolenaar CheckScriptFailure([ 36636797966dSBram Moolenaar 'vim9script', 36646797966dSBram Moolenaar 'g:var = 123', 366532e35117SBram Moolenaar 'unlet g:var# comment1', 3666d72c1bf0SBram Moolenaar ], 'E108:') 3667d72c1bf0SBram Moolenaar 3668d72c1bf0SBram Moolenaar CheckScriptFailure([ 3669d72c1bf0SBram Moolenaar 'let g:var = 123', 3670d72c1bf0SBram Moolenaar 'unlet g:var # something', 3671d72c1bf0SBram Moolenaar ], 'E488:') 3672faac4104SBram Moolenaar 3673faac4104SBram Moolenaar CheckScriptSuccess([ 3674faac4104SBram Moolenaar 'vim9script', 367532e35117SBram Moolenaar 'if 1 # comment2', 3676faac4104SBram Moolenaar ' echo "yes"', 3677faac4104SBram Moolenaar 'elseif 2 #comment', 3678faac4104SBram Moolenaar ' echo "no"', 3679faac4104SBram Moolenaar 'endif', 3680faac4104SBram Moolenaar ]) 3681faac4104SBram Moolenaar 3682faac4104SBram Moolenaar CheckScriptFailure([ 3683faac4104SBram Moolenaar 'vim9script', 368432e35117SBram Moolenaar 'if 1# comment3', 3685faac4104SBram Moolenaar ' echo "yes"', 3686faac4104SBram Moolenaar 'endif', 3687fae55a9cSBram Moolenaar ], 'E488:') 3688faac4104SBram Moolenaar 3689faac4104SBram Moolenaar CheckScriptFailure([ 3690faac4104SBram Moolenaar 'vim9script', 369132e35117SBram Moolenaar 'if 0 # comment4', 3692faac4104SBram Moolenaar ' echo "yes"', 3693faac4104SBram Moolenaar 'elseif 2#comment', 3694faac4104SBram Moolenaar ' echo "no"', 3695faac4104SBram Moolenaar 'endif', 3696fae55a9cSBram Moolenaar ], 'E488:') 3697faac4104SBram Moolenaar 3698faac4104SBram Moolenaar CheckScriptSuccess([ 3699faac4104SBram Moolenaar 'vim9script', 3700cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3701faac4104SBram Moolenaar ]) 3702faac4104SBram Moolenaar 3703faac4104SBram Moolenaar CheckScriptFailure([ 3704faac4104SBram Moolenaar 'vim9script', 3705cfcd011fSBram Moolenaar 'var v = 1# comment6', 3706fae55a9cSBram Moolenaar ], 'E488:') 3707faac4104SBram Moolenaar 3708faac4104SBram Moolenaar CheckScriptSuccess([ 3709faac4104SBram Moolenaar 'vim9script', 3710faac4104SBram Moolenaar 'new' 3711d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3712df069eecSBram Moolenaar ':$', 3713faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3714faac4104SBram Moolenaar 'bwipe!', 3715faac4104SBram Moolenaar ]) 3716faac4104SBram Moolenaar 3717f5be8cdbSBram Moolenaar CheckScriptFailure([ 3718f5be8cdbSBram Moolenaar 'vim9script', 3719f5be8cdbSBram Moolenaar 'new' 3720d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3721f5be8cdbSBram Moolenaar ':$', 3722f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3723f5be8cdbSBram Moolenaar 'bwipe!', 3724f5be8cdbSBram Moolenaar ], 'E488:') 3725f5be8cdbSBram Moolenaar 3726f5be8cdbSBram Moolenaar CheckScriptFailure([ 3727f5be8cdbSBram Moolenaar 'vim9script', 3728f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3729f5be8cdbSBram Moolenaar ], 'E477:') 3730a26b9700SBram Moolenaarenddef 3731a26b9700SBram Moolenaar 37327e5bd91dSBram Moolenaardef Test_finish() 3733cfcd011fSBram Moolenaar var lines =<< trim END 37347e5bd91dSBram Moolenaar vim9script 37356797966dSBram Moolenaar g:res = 'one' 37367e5bd91dSBram Moolenaar if v:false | finish | endif 37376797966dSBram Moolenaar g:res = 'two' 37387e5bd91dSBram Moolenaar finish 37396797966dSBram Moolenaar g:res = 'three' 37407e5bd91dSBram Moolenaar END 37417e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 37427e5bd91dSBram Moolenaar source Xfinished 37437e5bd91dSBram Moolenaar assert_equal('two', g:res) 37447e5bd91dSBram Moolenaar 37457e5bd91dSBram Moolenaar unlet g:res 37467e5bd91dSBram Moolenaar delete('Xfinished') 37477e5bd91dSBram Moolenaarenddef 37487e5bd91dSBram Moolenaar 3749a5d0077eSBram Moolenaardef Test_forward_declaration() 3750cfcd011fSBram Moolenaar var lines =<< trim END 3751a5d0077eSBram Moolenaar vim9script 3752a5d0077eSBram Moolenaar def GetValue(): string 3753a5d0077eSBram Moolenaar return theVal 3754a5d0077eSBram Moolenaar enddef 3755cfcd011fSBram Moolenaar var theVal = 'something' 3756822ba247SBram Moolenaar g:initVal = GetValue() 3757a5d0077eSBram Moolenaar theVal = 'else' 3758a5d0077eSBram Moolenaar g:laterVal = GetValue() 3759a5d0077eSBram Moolenaar END 3760a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3761a5d0077eSBram Moolenaar source Xforward 3762a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3763a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3764a5d0077eSBram Moolenaar 3765a5d0077eSBram Moolenaar unlet g:initVal 3766a5d0077eSBram Moolenaar unlet g:laterVal 3767a5d0077eSBram Moolenaar delete('Xforward') 3768a5d0077eSBram Moolenaarenddef 3769a5d0077eSBram Moolenaar 37709721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3771a6294955SBram Moolenaar var vim9_lines =<< trim END 3772a6294955SBram Moolenaar vim9script 3773a6294955SBram Moolenaar var local = 'local' 3774a6294955SBram Moolenaar g:global = 'global' 3775a6294955SBram Moolenaar export var exported = 'exported' 3776a6294955SBram Moolenaar export def GetText(): string 3777a6294955SBram Moolenaar return 'text' 3778a6294955SBram Moolenaar enddef 3779a6294955SBram Moolenaar END 3780a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3781a6294955SBram Moolenaar 3782cfcd011fSBram Moolenaar var legacy_lines =<< trim END 37839721fb4eSBram Moolenaar source Xvim9_script.vim 37849721fb4eSBram Moolenaar 37859721fb4eSBram Moolenaar call assert_false(exists('local')) 37869721fb4eSBram Moolenaar call assert_false(exists('exported')) 37879721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 37889721fb4eSBram Moolenaar call assert_equal('global', global) 37899721fb4eSBram Moolenaar call assert_equal('global', g:global) 37909721fb4eSBram Moolenaar 37919721fb4eSBram Moolenaar " imported variable becomes script-local 37929721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 37939721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 37949721fb4eSBram Moolenaar call assert_false(exists('exported')) 37959721fb4eSBram Moolenaar 37969721fb4eSBram Moolenaar " imported function becomes script-local 37979721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 37989721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 37999721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 38009721fb4eSBram Moolenaar END 38019721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 38029721fb4eSBram Moolenaar 38039721fb4eSBram Moolenaar source Xlegacy_script.vim 38049721fb4eSBram Moolenaar assert_equal('global', g:global) 3805f5be8cdbSBram Moolenaar unlet g:global 38069721fb4eSBram Moolenaar 38079721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 38089721fb4eSBram Moolenaar delete('Xvim9_script.vim') 38099721fb4eSBram Moolenaarenddef 3810a5d0077eSBram Moolenaar 3811e535db86SBram Moolenaardef Test_declare_script_in_func() 3812e535db86SBram Moolenaar var lines =<< trim END 3813e535db86SBram Moolenaar vim9script 3814e535db86SBram Moolenaar func Declare() 3815e535db86SBram Moolenaar let s:local = 123 3816e535db86SBram Moolenaar endfunc 3817e535db86SBram Moolenaar Declare() 3818e535db86SBram Moolenaar assert_equal(123, local) 3819e535db86SBram Moolenaar 3820e535db86SBram Moolenaar var error: string 3821e535db86SBram Moolenaar try 3822e535db86SBram Moolenaar local = 'asdf' 3823e535db86SBram Moolenaar catch 3824e535db86SBram Moolenaar error = v:exception 3825e535db86SBram Moolenaar endtry 3826e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3827e535db86SBram Moolenaar 3828e535db86SBram Moolenaar lockvar local 3829e535db86SBram Moolenaar try 3830e535db86SBram Moolenaar local = 999 3831e535db86SBram Moolenaar catch 3832e535db86SBram Moolenaar error = v:exception 3833e535db86SBram Moolenaar endtry 3834e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3835e535db86SBram Moolenaar END 3836e535db86SBram Moolenaar CheckScriptSuccess(lines) 3837e535db86SBram Moolenaarenddef 3838e535db86SBram Moolenaar 3839e535db86SBram Moolenaar 38407d699701SBram Moolenaarfunc Test_vim9script_not_global() 38417d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 38427d699701SBram Moolenaar let vim9lines =<< trim END 38437d699701SBram Moolenaar vim9script 3844cfcd011fSBram Moolenaar var name = 'local' 38457d699701SBram Moolenaar func TheFunc() 38467d699701SBram Moolenaar echo 'local' 38477d699701SBram Moolenaar endfunc 38487d699701SBram Moolenaar def DefFunc() 38497d699701SBram Moolenaar echo 'local' 38507d699701SBram Moolenaar enddef 38517d699701SBram Moolenaar END 38527d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 38537d699701SBram Moolenaar source Xvim9script.vim 38547d699701SBram Moolenaar try 38557d699701SBram Moolenaar echo g:var 38567d699701SBram Moolenaar assert_report('did not fail') 38577d699701SBram Moolenaar catch /E121:/ 38587d699701SBram Moolenaar " caught 38597d699701SBram Moolenaar endtry 38607d699701SBram Moolenaar try 38617d699701SBram Moolenaar call TheFunc() 38627d699701SBram Moolenaar assert_report('did not fail') 38637d699701SBram Moolenaar catch /E117:/ 38647d699701SBram Moolenaar " caught 38657d699701SBram Moolenaar endtry 38667d699701SBram Moolenaar try 38677d699701SBram Moolenaar call DefFunc() 38687d699701SBram Moolenaar assert_report('did not fail') 38697d699701SBram Moolenaar catch /E117:/ 38707d699701SBram Moolenaar " caught 38717d699701SBram Moolenaar endtry 38727d699701SBram Moolenaar 387325859dd7SBram Moolenaar call delete('Xvim9script.vim') 38747d699701SBram Moolenaarendfunc 38757d699701SBram Moolenaar 3876eeb27bfeSBram Moolenaardef Test_vim9_copen() 3877eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3878eeb27bfeSBram Moolenaar copen 3879eeb27bfeSBram Moolenaar quit 3880eeb27bfeSBram Moolenaarenddef 3881eeb27bfeSBram Moolenaar 388203290b84SBram Moolenaar" test using an auto-loaded function and variable 38832d6b20d6SBram Moolenaardef Test_vim9_autoload() 3884cfcd011fSBram Moolenaar var lines =<< trim END 38852d6b20d6SBram Moolenaar vim9script 388603290b84SBram Moolenaar def some#gettest(): string 388703290b84SBram Moolenaar return 'test' 388803290b84SBram Moolenaar enddef 388903290b84SBram Moolenaar g:some#name = 'name' 3890227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3891e3ffcd99SBram Moolenaar 3892e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3893e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3894e3ffcd99SBram Moolenaar enddef 389503290b84SBram Moolenaar END 389603290b84SBram Moolenaar 389703290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 389803290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 389903290b84SBram Moolenaar var save_rtp = &rtp 390003290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 390103290b84SBram Moolenaar 390203290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 390303290b84SBram Moolenaar assert_equal('name', g:some#name) 3904227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 390503290b84SBram Moolenaar g:some#other = 'other' 390603290b84SBram Moolenaar assert_equal('other', g:some#other) 390703290b84SBram Moolenaar 3908e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3909e3ffcd99SBram Moolenaar 391017f700acSBram Moolenaar # upper case script name works 391117f700acSBram Moolenaar lines =<< trim END 391217f700acSBram Moolenaar vim9script 391317f700acSBram Moolenaar def Other#getOther(): string 391417f700acSBram Moolenaar return 'other' 391517f700acSBram Moolenaar enddef 391617f700acSBram Moolenaar END 391717f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 391817f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 391917f700acSBram Moolenaar 392003290b84SBram Moolenaar delete('Xdir', 'rf') 392103290b84SBram Moolenaar &rtp = save_rtp 392203290b84SBram Moolenaarenddef 392303290b84SBram Moolenaar 392403290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 392503290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 392603290b84SBram Moolenaar var lines =<< trim END 392703290b84SBram Moolenaar vim9script 39282d6b20d6SBram Moolenaar def foo#test() 39292d6b20d6SBram Moolenaar echomsg getreg('"') 39302d6b20d6SBram Moolenaar enddef 39312d6b20d6SBram Moolenaar END 39322d6b20d6SBram Moolenaar 39332d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 39342d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3935cfcd011fSBram Moolenaar var save_rtp = &rtp 39362d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 39372d6b20d6SBram Moolenaar augroup test 39382d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 39392d6b20d6SBram Moolenaar augroup END 39402d6b20d6SBram Moolenaar 39412d6b20d6SBram Moolenaar normal Y 39422d6b20d6SBram Moolenaar 39432d6b20d6SBram Moolenaar augroup test 39442d6b20d6SBram Moolenaar autocmd! 39452d6b20d6SBram Moolenaar augroup END 39462d6b20d6SBram Moolenaar delete('Xdir', 'rf') 39472d6b20d6SBram Moolenaar &rtp = save_rtp 39482d6b20d6SBram Moolenaarenddef 39492d6b20d6SBram Moolenaar 395077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 395177e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3952cfcd011fSBram Moolenaar var lines =<< trim END 395377e5dcc3SBram Moolenaar vim9script 395477e5dcc3SBram Moolenaar def crash#func() 395577e5dcc3SBram Moolenaar try 395677e5dcc3SBram Moolenaar for x in List() 395777e5dcc3SBram Moolenaar endfor 395877e5dcc3SBram Moolenaar catch 395977e5dcc3SBram Moolenaar endtry 396077e5dcc3SBram Moolenaar g:ok = true 396177e5dcc3SBram Moolenaar enddef 396277e5dcc3SBram Moolenaar fu List() 396377e5dcc3SBram Moolenaar invalid 396477e5dcc3SBram Moolenaar endfu 396577e5dcc3SBram Moolenaar try 396648e11c10SBram Moolenaar alsoinvalid 396777e5dcc3SBram Moolenaar catch /wontmatch/ 396877e5dcc3SBram Moolenaar endtry 396977e5dcc3SBram Moolenaar END 397077e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 397177e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 397277e5dcc3SBram Moolenaar 397377e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 397477e5dcc3SBram Moolenaar lines =<< trim END 397577e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 397677e5dcc3SBram Moolenaar call crash#func() 397777e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 39789c4f5520SBram Moolenaar qall! 397977e5dcc3SBram Moolenaar END 398077e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 398177e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 398277e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 398377e5dcc3SBram Moolenaar 398477e5dcc3SBram Moolenaar delete('Xdidit') 398577e5dcc3SBram Moolenaar delete('Xscript') 398677e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 398703290b84SBram Moolenaar 398803290b84SBram Moolenaar lines =<< trim END 398903290b84SBram Moolenaar vim9script 399003290b84SBram Moolenaar var foo#bar = 'asdf' 399103290b84SBram Moolenaar END 399203290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 399377e5dcc3SBram Moolenaarenddef 399477e5dcc3SBram Moolenaar 399581e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 399681e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 399781e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 3998cfcd011fSBram Moolenaar var lines =<< trim END 399981e17fbeSBram Moolenaar let s:counter = 1 400081e17fbeSBram Moolenaar def s:Func() 400181e17fbeSBram Moolenaar au! CursorHold 400281e17fbeSBram Moolenaar au CursorHold * s:counter += 1 400381e17fbeSBram Moolenaar enddef 400481e17fbeSBram Moolenaar call s:Func() 400581e17fbeSBram Moolenaar doau CursorHold 400681e17fbeSBram Moolenaar call assert_equal(2, s:counter) 400781e17fbeSBram Moolenaar au! CursorHold 400881e17fbeSBram Moolenaar END 400981e17fbeSBram Moolenaar CheckScriptSuccess(lines) 401081e17fbeSBram Moolenaarenddef 401181e17fbeSBram Moolenaar 4012b5841b99SBram Moolenaardef Test_error_in_autoload_script() 4013b5841b99SBram Moolenaar var save_rtp = &rtp 4014b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 4015b5841b99SBram Moolenaar &rtp = dir 4016b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 4017b5841b99SBram Moolenaar 4018b5841b99SBram Moolenaar var lines =<< trim END 4019b5841b99SBram Moolenaar vim9script noclear 4020b5841b99SBram Moolenaar def script#autoloaded() 4021b5841b99SBram Moolenaar enddef 4022b5841b99SBram Moolenaar def Broken() 4023b5841b99SBram Moolenaar var x: any = '' 4024b5841b99SBram Moolenaar eval x != 0 4025b5841b99SBram Moolenaar enddef 4026b5841b99SBram Moolenaar Broken() 4027b5841b99SBram Moolenaar END 4028b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 4029b5841b99SBram Moolenaar 4030b5841b99SBram Moolenaar lines =<< trim END 4031b5841b99SBram Moolenaar vim9script 4032b5841b99SBram Moolenaar def CallAutoloaded() 4033b5841b99SBram Moolenaar script#autoloaded() 4034b5841b99SBram Moolenaar enddef 4035b5841b99SBram Moolenaar 4036b5841b99SBram Moolenaar function Legacy() 4037b5841b99SBram Moolenaar try 4038b5841b99SBram Moolenaar call s:CallAutoloaded() 4039b5841b99SBram Moolenaar catch 4040b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 4041b5841b99SBram Moolenaar endtry 4042b5841b99SBram Moolenaar endfunction 4043b5841b99SBram Moolenaar 4044b5841b99SBram Moolenaar Legacy() 4045b5841b99SBram Moolenaar END 4046b5841b99SBram Moolenaar CheckScriptSuccess(lines) 4047b5841b99SBram Moolenaar 4048b5841b99SBram Moolenaar &rtp = save_rtp 4049b5841b99SBram Moolenaar delete(dir, 'rf') 4050b5841b99SBram Moolenaarenddef 4051b5841b99SBram Moolenaar 40523896a105SBram Moolenaardef Test_cmdline_win() 40533896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 40543896a105SBram Moolenaar # the command line window. 40553896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 4056cfcd011fSBram Moolenaar var export_lines =<< trim END 40573896a105SBram Moolenaar vim9script 4058cfcd011fSBram Moolenaar export var That = 'yes' 40593896a105SBram Moolenaar END 40603896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 4061cfcd011fSBram Moolenaar var import_lines =<< trim END 40623896a105SBram Moolenaar vim9script 40633896a105SBram Moolenaar import That from './Xexport.vim' 40643896a105SBram Moolenaar END 40653896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 4066cfcd011fSBram Moolenaar var save_rtp = &rtp 40673896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 40683896a105SBram Moolenaar syntax on 40693896a105SBram Moolenaar augroup CmdWin 40703896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 40713896a105SBram Moolenaar augroup END 40723896a105SBram Moolenaar # this will open and also close the cmdline window 40733896a105SBram Moolenaar feedkeys('q:', 'xt') 40743896a105SBram Moolenaar assert_equal('yes', g:got_there) 40753896a105SBram Moolenaar 40763896a105SBram Moolenaar augroup CmdWin 40773896a105SBram Moolenaar au! 40783896a105SBram Moolenaar augroup END 40793896a105SBram Moolenaar &rtp = save_rtp 40803896a105SBram Moolenaar delete('rtp', 'rf') 40813896a105SBram Moolenaarenddef 40823896a105SBram Moolenaar 4083e3d4685fSBram Moolenaardef Test_invalid_sid() 4084e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 408525859dd7SBram Moolenaar 40869c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 4087d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 4088e3d4685fSBram Moolenaar endif 4089e3d4685fSBram Moolenaar delete('Xdidit') 4090e3d4685fSBram Moolenaarenddef 4091e3d4685fSBram Moolenaar 40929ec7026fSBram Moolenaardef Test_restoring_cpo() 40939ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 40949ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 40959ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 40969ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 40979ec7026fSBram Moolenaar endif 40989ec7026fSBram Moolenaar delete('Xsourced') 40999ec7026fSBram Moolenaar delete('Xclose') 4100090728adSBram Moolenaar delete('Xdone') 41010123cc1eSBram Moolenaar 41020123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 41030123cc1eSBram Moolenaar set cpo=aABceFsMny> 41040123cc1eSBram Moolenaar edit XanotherScript 41050123cc1eSBram Moolenaar so % 41060123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 41070123cc1eSBram Moolenaar :1del 41080123cc1eSBram Moolenaar w 41090123cc1eSBram Moolenaar so % 41100123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 41110123cc1eSBram Moolenaar 41120123cc1eSBram Moolenaar delete('XanotherScript') 41130123cc1eSBram Moolenaar set cpo&vim 41149ec7026fSBram Moolenaarenddef 41159ec7026fSBram Moolenaar 4116ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 4117ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 411837294bd6SBram Moolenaar CheckScreendump 4119ffb7dcdbSBram Moolenaar CheckFeature timers 412037294bd6SBram Moolenaar 4121ffb7dcdbSBram Moolenaar let lines =<< trim END 412237294bd6SBram Moolenaar vim9script 412337294bd6SBram Moolenaar def script#func() 412437294bd6SBram Moolenaar enddef 412537294bd6SBram Moolenaar END 4126ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 4127ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 412837294bd6SBram Moolenaar 4129ffb7dcdbSBram Moolenaar let lines =<< trim END 413037294bd6SBram Moolenaar vim9script 413137294bd6SBram Moolenaar set cpo+=M 413237294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 4133767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 413437294bd6SBram Moolenaar setline(1, 'some text') 413537294bd6SBram Moolenaar END 4136ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 4137ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 4138ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 4139ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 414037294bd6SBram Moolenaar 4141ffb7dcdbSBram Moolenaar " clean up 4142ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 4143ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 4144ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 4145ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 4146ffb7dcdbSBram Moolenaarendfunc 414737294bd6SBram Moolenaar 41489ec7026fSBram Moolenaar 4149f0afd9e1SBram Moolenaardef Test_unset_any_variable() 4150cfcd011fSBram Moolenaar var lines =<< trim END 4151cfcd011fSBram Moolenaar var name: any 4152cfcd011fSBram Moolenaar assert_equal(0, name) 4153f0afd9e1SBram Moolenaar END 4154f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 4155f0afd9e1SBram Moolenaarenddef 4156f0afd9e1SBram Moolenaar 41577e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 415858dbef33SBram Moolenaar CheckRunVimInTerminal 415958dbef33SBram Moolenaar 41607e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 41617e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 41627e9210eaSBram Moolenaarendfunc 41637e9210eaSBram Moolenaar 41647e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 41659c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 4166cfcd011fSBram Moolenaar var lines =<< trim END 41679c4f5520SBram Moolenaar func CheckAndQuit() 41689c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 41699c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 41709c4f5520SBram Moolenaar endfunc 41719c4f5520SBram Moolenaar END 41729c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 41739c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 4174e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 41759c4f5520SBram Moolenaar # define Afunc() on the command line 41769c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 41779c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 41782949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 41799c4f5520SBram Moolenaar 41809c4f5520SBram Moolenaar call StopVimInTerminal(buf) 41819c4f5520SBram Moolenaar delete('XcallFunc') 41829c4f5520SBram Moolenaar delete('Xdidcmd') 41839c4f5520SBram Moolenaarenddef 41849c4f5520SBram Moolenaar 4185fcdc5d83SBram Moolenaardef Test_script_var_scope() 4186fcdc5d83SBram Moolenaar var lines =<< trim END 4187fcdc5d83SBram Moolenaar vim9script 4188fcdc5d83SBram Moolenaar if true 4189fcdc5d83SBram Moolenaar if true 4190fcdc5d83SBram Moolenaar var one = 'one' 4191fcdc5d83SBram Moolenaar echo one 4192fcdc5d83SBram Moolenaar endif 4193fcdc5d83SBram Moolenaar echo one 4194fcdc5d83SBram Moolenaar endif 4195fcdc5d83SBram Moolenaar END 4196fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4197fcdc5d83SBram Moolenaar 4198fcdc5d83SBram Moolenaar lines =<< trim END 4199fcdc5d83SBram Moolenaar vim9script 4200fcdc5d83SBram Moolenaar if true 4201fcdc5d83SBram Moolenaar if false 4202fcdc5d83SBram Moolenaar var one = 'one' 4203fcdc5d83SBram Moolenaar echo one 4204fcdc5d83SBram Moolenaar else 4205fcdc5d83SBram Moolenaar var one = 'one' 4206fcdc5d83SBram Moolenaar echo one 4207fcdc5d83SBram Moolenaar endif 4208fcdc5d83SBram Moolenaar echo one 4209fcdc5d83SBram Moolenaar endif 4210fcdc5d83SBram Moolenaar END 4211fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4212fcdc5d83SBram Moolenaar 4213fcdc5d83SBram Moolenaar lines =<< trim END 4214fcdc5d83SBram Moolenaar vim9script 4215fcdc5d83SBram Moolenaar while true 4216fcdc5d83SBram Moolenaar var one = 'one' 4217fcdc5d83SBram Moolenaar echo one 4218fcdc5d83SBram Moolenaar break 4219fcdc5d83SBram Moolenaar endwhile 4220fcdc5d83SBram Moolenaar echo one 4221fcdc5d83SBram Moolenaar END 4222fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4223fcdc5d83SBram Moolenaar 4224fcdc5d83SBram Moolenaar lines =<< trim END 4225fcdc5d83SBram Moolenaar vim9script 4226fcdc5d83SBram Moolenaar for i in range(1) 4227fcdc5d83SBram Moolenaar var one = 'one' 4228fcdc5d83SBram Moolenaar echo one 4229fcdc5d83SBram Moolenaar endfor 4230fcdc5d83SBram Moolenaar echo one 4231fcdc5d83SBram Moolenaar END 4232fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 42339becdf2bSBram Moolenaar 42349becdf2bSBram Moolenaar lines =<< trim END 42359becdf2bSBram Moolenaar vim9script 42369becdf2bSBram Moolenaar { 42379becdf2bSBram Moolenaar var one = 'one' 42389becdf2bSBram Moolenaar assert_equal('one', one) 42399becdf2bSBram Moolenaar } 42409becdf2bSBram Moolenaar assert_false(exists('one')) 42419becdf2bSBram Moolenaar assert_false(exists('s:one')) 42429becdf2bSBram Moolenaar END 42439becdf2bSBram Moolenaar CheckScriptSuccess(lines) 42449becdf2bSBram Moolenaar 42459becdf2bSBram Moolenaar lines =<< trim END 42469becdf2bSBram Moolenaar vim9script 42479becdf2bSBram Moolenaar { 42489becdf2bSBram Moolenaar var one = 'one' 42499becdf2bSBram Moolenaar echo one 42509becdf2bSBram Moolenaar } 42519becdf2bSBram Moolenaar echo one 42529becdf2bSBram Moolenaar END 42539becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4254fcdc5d83SBram Moolenaarenddef 4255fcdc5d83SBram Moolenaar 4256352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4257352134bbSBram Moolenaar var lines =<< trim END 4258352134bbSBram Moolenaar vim9script 42592a38908bSBram Moolenaar def Callback(...l: list<any>) 4260352134bbSBram Moolenaar try 4261352134bbSBram Moolenaar var x: string 4262352134bbSBram Moolenaar var y: string 4263352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4264352134bbSBram Moolenaar [x, y] = [''] 4265352134bbSBram Moolenaar catch 4266352134bbSBram Moolenaar g:caught = 'yes' 4267352134bbSBram Moolenaar endtry 4268352134bbSBram Moolenaar enddef 4269e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4270352134bbSBram Moolenaar feedkeys("\r", 'xt') 4271352134bbSBram Moolenaar END 4272352134bbSBram Moolenaar CheckScriptSuccess(lines) 4273352134bbSBram Moolenaar 4274352134bbSBram Moolenaar unlet g:caught 4275352134bbSBram Moolenaarenddef 4276352134bbSBram Moolenaar 4277631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4278631e8f93SBram Moolenaar if !has('unix') || !has('job') 4279631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4280631e8f93SBram Moolenaar endif 4281*b16ff292SBram Moolenaar # FIXME: this check should not be needed 4282*b16ff292SBram Moolenaar if has('win32') 4283*b16ff292SBram Moolenaar throw 'Skipped: does not work on MS-Windows' 4284*b16ff292SBram Moolenaar endif 4285631e8f93SBram Moolenaar var lines =<< trim END 4286631e8f93SBram Moolenaar vim9script 4287631e8f93SBram Moolenaar var source: list<number> 42882a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4289631e8f93SBram Moolenaar eval [][0] 4290631e8f93SBram Moolenaar enddef 42912a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4292631e8f93SBram Moolenaar sleep 1m 4293631e8f93SBram Moolenaar source += l 4294631e8f93SBram Moolenaar enddef 4295e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 42966f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 42976f17a3f0SBram Moolenaar sleep 10m 42986f17a3f0SBram Moolenaar endwhile 4299206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4300fe95b94fSBram Moolenaar sleep 200m 4301631e8f93SBram Moolenaar END 4302631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4303631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4304631e8f93SBram Moolenaar delete('Xdef') 4305631e8f93SBram Moolenaarenddef 4306631e8f93SBram Moolenaar 43074324d87aSBram Moolenaardef InvokeNormal() 43084324d87aSBram Moolenaar exe "norm! :m+1\r" 43094324d87aSBram Moolenaarenddef 43104324d87aSBram Moolenaar 43114324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 43124324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 43134324d87aSBram Moolenaar new 43144324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 43154324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 43164324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 43174324d87aSBram Moolenaar xunmap <F3> 4318b5b9480eSBram Moolenaarenddef 4319b5b9480eSBram Moolenaar 4320b5b9480eSBram Moolenaardef Test_white_space_after_command() 4321b5b9480eSBram Moolenaar var lines =<< trim END 4322b5b9480eSBram Moolenaar exit_cb: Func}) 4323b5b9480eSBram Moolenaar END 4324b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4325f8103f27SBram Moolenaar 4326f8103f27SBram Moolenaar lines =<< trim END 4327f8103f27SBram Moolenaar e# 4328f8103f27SBram Moolenaar END 4329f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 43304324d87aSBram Moolenaarenddef 43314324d87aSBram Moolenaar 43324aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 43334aab88d9SBram Moolenaar var lines =<< trim END 43344aab88d9SBram Moolenaar vim9script 43354aab88d9SBram Moolenaar if exists('g:guard') 43364aab88d9SBram Moolenaar finish 43374aab88d9SBram Moolenaar endif 43384aab88d9SBram Moolenaar g:guard = 1 43394aab88d9SBram Moolenaar var name = 'thename' 43404aab88d9SBram Moolenaar def g:GetName(): string 43414aab88d9SBram Moolenaar return name 43424aab88d9SBram Moolenaar enddef 43434aab88d9SBram Moolenaar def g:SetName(arg: string) 43444aab88d9SBram Moolenaar name = arg 43454aab88d9SBram Moolenaar enddef 43464aab88d9SBram Moolenaar END 43474aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 43484aab88d9SBram Moolenaar so XscriptTwice.vim 43494aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 43504aab88d9SBram Moolenaar g:SetName('newname') 43514aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 43524aab88d9SBram Moolenaar so XscriptTwice.vim 43534aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 43544aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 43554aab88d9SBram Moolenaar 43564aab88d9SBram Moolenaar delfunc g:GetName 43574aab88d9SBram Moolenaar delfunc g:SetName 43584aab88d9SBram Moolenaar delete('XscriptTwice.vim') 43594aab88d9SBram Moolenaar unlet g:guard 43604aab88d9SBram Moolenaarenddef 43614aab88d9SBram Moolenaar 43624aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 43634aab88d9SBram Moolenaar var exportlines =<< trim END 43644aab88d9SBram Moolenaar vim9script 43654aab88d9SBram Moolenaar if exists('g:guard') 43664aab88d9SBram Moolenaar finish 43674aab88d9SBram Moolenaar endif 43684aab88d9SBram Moolenaar g:guard = 1 43694aab88d9SBram Moolenaar export var name = 'someName' 43704aab88d9SBram Moolenaar END 43714aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 43724aab88d9SBram Moolenaar 43734aab88d9SBram Moolenaar var lines =<< trim END 43744aab88d9SBram Moolenaar vim9script 43754aab88d9SBram Moolenaar import name from './XexportScript.vim' 43764aab88d9SBram Moolenaar def g:GetName(): string 43774aab88d9SBram Moolenaar return name 43784aab88d9SBram Moolenaar enddef 43794aab88d9SBram Moolenaar END 43804aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 43814aab88d9SBram Moolenaar so XscriptImport.vim 43824aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 43834aab88d9SBram Moolenaar 43844aab88d9SBram Moolenaar so XexportScript.vim 43854aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 43864aab88d9SBram Moolenaar 43874aab88d9SBram Moolenaar delfunc g:GetName 43884aab88d9SBram Moolenaar delete('XexportScript.vim') 43894aab88d9SBram Moolenaar delete('XscriptImport.vim') 43904aab88d9SBram Moolenaar unlet g:guard 43914aab88d9SBram Moolenaarenddef 43924aab88d9SBram Moolenaar 439310b9421fSBram Moolenaardef Test_unsupported_commands() 439410b9421fSBram Moolenaar var lines =<< trim END 439510b9421fSBram Moolenaar ka 439610b9421fSBram Moolenaar END 43977d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 43987d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 439910b9421fSBram Moolenaar 440010b9421fSBram Moolenaar lines =<< trim END 4401ada1d870SBram Moolenaar :1ka 4402ada1d870SBram Moolenaar END 44037d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 44047d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4405ada1d870SBram Moolenaar 4406ada1d870SBram Moolenaar lines =<< trim END 440710b9421fSBram Moolenaar t 440810b9421fSBram Moolenaar END 440910b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 441010b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 441110b9421fSBram Moolenaar 441210b9421fSBram Moolenaar lines =<< trim END 441310b9421fSBram Moolenaar x 441410b9421fSBram Moolenaar END 441510b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 441610b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 441710b9421fSBram Moolenaar 441810b9421fSBram Moolenaar lines =<< trim END 441910b9421fSBram Moolenaar xit 442010b9421fSBram Moolenaar END 442110b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 442210b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 442310b9421fSBram Moolenaarenddef 442410b9421fSBram Moolenaar 4425c70fe460SBram Moolenaardef Test_mapping_line_number() 4426c70fe460SBram Moolenaar var lines =<< trim END 4427c70fe460SBram Moolenaar vim9script 4428c70fe460SBram Moolenaar def g:FuncA() 4429c70fe460SBram Moolenaar # Some comment 4430c70fe460SBram Moolenaar FuncB(0) 4431c70fe460SBram Moolenaar enddef 4432c70fe460SBram Moolenaar # Some comment 4433c70fe460SBram Moolenaar def FuncB( 4434c70fe460SBram Moolenaar # Some comment 4435c70fe460SBram Moolenaar n: number 4436c70fe460SBram Moolenaar ) 4437c70fe460SBram Moolenaar exe 'nno ' 4438c70fe460SBram Moolenaar # Some comment 4439c70fe460SBram Moolenaar .. '<F3> a' 4440c70fe460SBram Moolenaar .. 'b' 4441c70fe460SBram Moolenaar .. 'c' 4442c70fe460SBram Moolenaar enddef 4443c70fe460SBram Moolenaar END 4444c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4445c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4446c70fe460SBram Moolenaar assert_match('No mapping found', res) 4447c70fe460SBram Moolenaar 4448c70fe460SBram Moolenaar g:FuncA() 4449c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4450c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4451c70fe460SBram Moolenaar 4452c70fe460SBram Moolenaar nunmap <F3> 4453c70fe460SBram Moolenaar delfunc g:FuncA 4454c70fe460SBram Moolenaarenddef 4455c70fe460SBram Moolenaar 4456deb108baSBram Moolenaardef Test_option_set() 4457deb108baSBram Moolenaar # legacy script allows for white space 4458deb108baSBram Moolenaar var lines =<< trim END 4459deb108baSBram Moolenaar set foldlevel =11 4460deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4461deb108baSBram Moolenaar END 4462deb108baSBram Moolenaar CheckScriptSuccess(lines) 4463deb108baSBram Moolenaar 4464deb108baSBram Moolenaar set foldlevel 4465deb108baSBram Moolenaar set foldlevel=12 4466deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4467deb108baSBram Moolenaar set foldlevel+=2 4468deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4469deb108baSBram Moolenaar set foldlevel-=3 4470deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4471deb108baSBram Moolenaar 4472deb108baSBram Moolenaar lines =<< trim END 4473deb108baSBram Moolenaar set foldlevel =1 4474deb108baSBram Moolenaar END 4475deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4476deb108baSBram Moolenaar 4477deb108baSBram Moolenaar lines =<< trim END 4478deb108baSBram Moolenaar set foldlevel +=1 4479deb108baSBram Moolenaar END 4480deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4481deb108baSBram Moolenaar 4482deb108baSBram Moolenaar lines =<< trim END 4483deb108baSBram Moolenaar set foldlevel ^=1 4484deb108baSBram Moolenaar END 4485deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4486deb108baSBram Moolenaar 4487deb108baSBram Moolenaar lines =<< trim END 4488deb108baSBram Moolenaar set foldlevel -=1 4489deb108baSBram Moolenaar END 4490deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4491deb108baSBram Moolenaar 4492deb108baSBram Moolenaar set foldlevel& 4493deb108baSBram Moolenaarenddef 4494deb108baSBram Moolenaar 4495208f0b48SBram Moolenaardef Test_option_modifier() 44961594f313SBram Moolenaar # legacy script allows for white space 4497208f0b48SBram Moolenaar var lines =<< trim END 4498208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4499208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4500208f0b48SBram Moolenaar END 4501208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4502208f0b48SBram Moolenaar 45031594f313SBram Moolenaar set hlsearch 45041594f313SBram Moolenaar set hlsearch! 45051594f313SBram Moolenaar assert_equal(false, &hlsearch) 45061594f313SBram Moolenaar 45071594f313SBram Moolenaar set hlsearch 4508208f0b48SBram Moolenaar set hlsearch& 45091594f313SBram Moolenaar assert_equal(false, &hlsearch) 4510208f0b48SBram Moolenaar 4511208f0b48SBram Moolenaar lines =<< trim END 45121594f313SBram Moolenaar set hlsearch & 4513208f0b48SBram Moolenaar END 45141594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 45151594f313SBram Moolenaar 45161594f313SBram Moolenaar lines =<< trim END 45171594f313SBram Moolenaar set hlsearch ! 45181594f313SBram Moolenaar END 45191594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 45201594f313SBram Moolenaar 45211594f313SBram Moolenaar set hlsearch& 4522208f0b48SBram Moolenaarenddef 4523208f0b48SBram Moolenaar 4524c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4525c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4526c03fe66aSBram Moolenaar var lines =<< trim END 4527c03fe66aSBram Moolenaar echoerr 'some' 4528c03fe66aSBram Moolenaar .. ' error' 4529c03fe66aSBram Moolenaar .. ' continued' 4530c03fe66aSBram Moolenaar END 4531c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4532c03fe66aSBram Moolenaarenddef 4533c03fe66aSBram Moolenaar 4534648594eaSBram Moolenaardef ProfiledWithLambda() 4535d9162550SBram Moolenaar var n = 3 4536d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4537d9162550SBram Moolenaarenddef 4538d9162550SBram Moolenaar 4539648594eaSBram Moolenaardef ProfiledNested() 4540648594eaSBram Moolenaar var x = 0 4541648594eaSBram Moolenaar def Nested(): any 4542648594eaSBram Moolenaar return x 4543648594eaSBram Moolenaar enddef 4544648594eaSBram Moolenaar Nested() 4545648594eaSBram Moolenaarenddef 4546648594eaSBram Moolenaar 4547ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4548ffcfddc7SBram Moolenaar var x = 0 4549ffcfddc7SBram Moolenaar def Nested(): any 4550ffcfddc7SBram Moolenaar return x 4551ffcfddc7SBram Moolenaar enddef 4552ffcfddc7SBram Moolenaar Nested() 4553ffcfddc7SBram Moolenaarenddef 4554ffcfddc7SBram Moolenaar 4555d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4556d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4557d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 45584ece152aSBram Moolenaar CheckFeature profile 45594ece152aSBram Moolenaar 4560d9162550SBram Moolenaar profile start Xprofile.log 4561648594eaSBram Moolenaar profile func ProfiledWithLambda 4562648594eaSBram Moolenaar ProfiledWithLambda() 4563ffcfddc7SBram Moolenaar 4564648594eaSBram Moolenaar profile func ProfiledNested 4565648594eaSBram Moolenaar ProfiledNested() 4566ffcfddc7SBram Moolenaar 4567ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4568ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4569ffcfddc7SBram Moolenaar profile func * 4570ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4571ffcfddc7SBram Moolenaar 4572ffcfddc7SBram Moolenaar profdel func * 4573ffcfddc7SBram Moolenaar profile pause 4574d9162550SBram Moolenaarenddef 4575d9162550SBram Moolenaar 4576585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4577585fea7bSBram Moolenaardef Test_substitute_cmd() 4578585fea7bSBram Moolenaar new 4579585fea7bSBram Moolenaar setline(1, 'something') 4580585fea7bSBram Moolenaar :substitute(some(other( 4581585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4582585fea7bSBram Moolenaar bwipe! 4583585fea7bSBram Moolenaar 4584f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4585cfcd011fSBram Moolenaar var lines =<< trim END 4586585fea7bSBram Moolenaar vim9script 4587585fea7bSBram Moolenaar new 4588585fea7bSBram Moolenaar setline(1, 'something') 4589585fea7bSBram Moolenaar :substitute(some(other( 4590585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4591585fea7bSBram Moolenaar bwipe! 4592585fea7bSBram Moolenaar END 4593585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4594585fea7bSBram Moolenaar source Xvim9lines 4595585fea7bSBram Moolenaar 4596585fea7bSBram Moolenaar delete('Xvim9lines') 4597585fea7bSBram Moolenaarenddef 4598585fea7bSBram Moolenaar 45998a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4600