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 14805fe07d2eSBram Moolenaardef Test_import_funcref() 14815fe07d2eSBram Moolenaar var lines =<< trim END 14825fe07d2eSBram Moolenaar vim9script 14835fe07d2eSBram Moolenaar export def F(): number 14845fe07d2eSBram Moolenaar return 42 14855fe07d2eSBram Moolenaar enddef 14865fe07d2eSBram Moolenaar export const G = F 14875fe07d2eSBram Moolenaar END 14885fe07d2eSBram Moolenaar writefile(lines, 'Xlib.vim') 14895fe07d2eSBram Moolenaar 14905fe07d2eSBram Moolenaar lines =<< trim END 14915fe07d2eSBram Moolenaar vim9script 14925fe07d2eSBram Moolenaar import {G} from './Xlib.vim' 14935fe07d2eSBram Moolenaar const Foo = G() 14945fe07d2eSBram Moolenaar assert_equal(42, Foo) 14955fe07d2eSBram Moolenaar 14965fe07d2eSBram Moolenaar def DoTest() 14975fe07d2eSBram Moolenaar const Goo = G() 1498*06ca48a4SBram Moolenaar assert_equal(42, Goo) 14995fe07d2eSBram Moolenaar enddef 15005fe07d2eSBram Moolenaar DoTest() 15015fe07d2eSBram Moolenaar END 15025fe07d2eSBram Moolenaar CheckScriptSuccess(lines) 15035fe07d2eSBram Moolenaar 15045fe07d2eSBram Moolenaar delete('Xlib.vim') 15055fe07d2eSBram Moolenaarenddef 15065fe07d2eSBram Moolenaar 15076853c38bSBram Moolenaardef Test_import_star_fails() 15086853c38bSBram Moolenaar writefile([], 'Xfoo.vim') 15096853c38bSBram Moolenaar var lines =<< trim END 1510af2d5d2cSBram Moolenaar import * as foo from './Xfoo.vim' 15116853c38bSBram Moolenaar foo = 'bar' 15126853c38bSBram Moolenaar END 15136853c38bSBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1094:', 'E1236: Cannot use foo itself') 15146853c38bSBram Moolenaar lines =<< trim END 15156853c38bSBram Moolenaar vim9script 1516af2d5d2cSBram Moolenaar import * as foo from './Xfoo.vim' 15176853c38bSBram Moolenaar var that = foo 15186853c38bSBram Moolenaar END 15196853c38bSBram Moolenaar CheckScriptFailure(lines, 'E1029: Expected ''.''') 1520a9e3d560SBram Moolenaar 1521a9e3d560SBram Moolenaar lines =<< trim END 1522a9e3d560SBram Moolenaar vim9script 1523a9e3d560SBram Moolenaar import * as 9foo from './Xfoo.vim' 1524a9e3d560SBram Moolenaar END 1525a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1526a9e3d560SBram Moolenaar lines =<< trim END 1527a9e3d560SBram Moolenaar vim9script 1528a9e3d560SBram Moolenaar import * as the#foo from './Xfoo.vim' 1529a9e3d560SBram Moolenaar END 1530a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1531a9e3d560SBram Moolenaar lines =<< trim END 1532a9e3d560SBram Moolenaar vim9script 1533a9e3d560SBram Moolenaar import * as g:foo from './Xfoo.vim' 1534a9e3d560SBram Moolenaar END 1535a9e3d560SBram Moolenaar CheckScriptFailure(lines, 'E1047:') 1536a9e3d560SBram Moolenaar 1537af2d5d2cSBram Moolenaar delete('Xfoo.vim') 15386853c38bSBram Moolenaarenddef 15396853c38bSBram Moolenaar 15400a84284eSBram Moolenaardef Test_import_as() 15410a84284eSBram Moolenaar var export_lines =<< trim END 15420a84284eSBram Moolenaar vim9script 15430a84284eSBram Moolenaar export var one = 1 15440a84284eSBram Moolenaar export var yes = 'yes' 1545c967d57aSBram Moolenaar export var slist: list<string> 15460a84284eSBram Moolenaar END 15470a84284eSBram Moolenaar writefile(export_lines, 'XexportAs') 15480a84284eSBram Moolenaar 15490a84284eSBram Moolenaar var import_lines =<< trim END 15500a84284eSBram Moolenaar vim9script 15516c7cc347SBram Moolenaar var one = 'notused' 15526c7cc347SBram Moolenaar var yes = 777 15530a84284eSBram Moolenaar import one as thatOne from './XexportAs' 15540a84284eSBram Moolenaar assert_equal(1, thatOne) 15550a84284eSBram Moolenaar import yes as yesYes from './XexportAs' 15560a84284eSBram Moolenaar assert_equal('yes', yesYes) 15570a84284eSBram Moolenaar END 15580a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15590a84284eSBram Moolenaar 15600a84284eSBram Moolenaar import_lines =<< trim END 15610a84284eSBram Moolenaar vim9script 15620a84284eSBram Moolenaar import {one as thatOne, yes as yesYes} from './XexportAs' 15630a84284eSBram Moolenaar assert_equal(1, thatOne) 15640a84284eSBram Moolenaar assert_equal('yes', yesYes) 15650a84284eSBram Moolenaar assert_fails('echo one', 'E121:') 15660a84284eSBram Moolenaar assert_fails('echo yes', 'E121:') 15670a84284eSBram Moolenaar END 15680a84284eSBram Moolenaar CheckScriptSuccess(import_lines) 15690a84284eSBram Moolenaar 1570c967d57aSBram Moolenaar import_lines =<< trim END 1571c967d57aSBram Moolenaar vim9script 1572c967d57aSBram Moolenaar import {slist as impSlist} from './XexportAs' 1573c967d57aSBram Moolenaar impSlist->add(123) 1574c967d57aSBram Moolenaar END 1575c967d57aSBram Moolenaar CheckScriptFailure(import_lines, 'E1012: Type mismatch; expected string but got number') 1576c967d57aSBram Moolenaar 15770a84284eSBram Moolenaar delete('XexportAs') 15780a84284eSBram Moolenaarenddef 15790a84284eSBram Moolenaar 1580803af686SBram Moolenaarfunc g:Trigger() 1581803af686SBram Moolenaar source Ximport.vim 1582803af686SBram Moolenaar return "echo 'yes'\<CR>" 1583803af686SBram Moolenaarendfunc 1584803af686SBram Moolenaar 1585803af686SBram Moolenaardef Test_import_export_expr_map() 1586803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1587cfcd011fSBram Moolenaar var export_lines =<< trim END 1588803af686SBram Moolenaar vim9script 1589803af686SBram Moolenaar export def That(): string 1590803af686SBram Moolenaar return 'yes' 1591803af686SBram Moolenaar enddef 1592803af686SBram Moolenaar END 1593803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1594803af686SBram Moolenaar 1595cfcd011fSBram Moolenaar var import_lines =<< trim END 1596803af686SBram Moolenaar vim9script 1597803af686SBram Moolenaar import That from './Xexport_that.vim' 1598803af686SBram Moolenaar assert_equal('yes', That()) 1599803af686SBram Moolenaar END 1600803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1601803af686SBram Moolenaar 1602803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1603803af686SBram Moolenaar feedkeys('trigger', "xt") 1604803af686SBram Moolenaar 1605730b2483SBram Moolenaar delete('Xexport_that.vim') 1606803af686SBram Moolenaar delete('Ximport.vim') 1607803af686SBram Moolenaar nunmap trigger 1608803af686SBram Moolenaarenddef 1609803af686SBram Moolenaar 16108e1986e3SBram Moolenaardef Test_import_in_filetype() 16118e1986e3SBram Moolenaar # check that :import works when the buffer is locked 16128e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1613cfcd011fSBram Moolenaar var export_lines =<< trim END 16148e1986e3SBram Moolenaar vim9script 1615cfcd011fSBram Moolenaar export var That = 'yes' 16168e1986e3SBram Moolenaar END 1617730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 16188e1986e3SBram Moolenaar 1619cfcd011fSBram Moolenaar var import_lines =<< trim END 16208e1986e3SBram Moolenaar vim9script 1621730b2483SBram Moolenaar import That from './Xexport_ft.vim' 16228e1986e3SBram Moolenaar assert_equal('yes', That) 16238e1986e3SBram Moolenaar g:did_load_mytpe = 1 16248e1986e3SBram Moolenaar END 16258e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 16268e1986e3SBram Moolenaar 1627cfcd011fSBram Moolenaar var save_rtp = &rtp 16288e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 16298e1986e3SBram Moolenaar 16308e1986e3SBram Moolenaar filetype plugin on 16318e1986e3SBram Moolenaar copen 16328e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 16338e1986e3SBram Moolenaar 16348e1986e3SBram Moolenaar quit! 1635730b2483SBram Moolenaar delete('Xexport_ft.vim') 16368e1986e3SBram Moolenaar delete('ftplugin', 'rf') 16378e1986e3SBram Moolenaar &rtp = save_rtp 16388e1986e3SBram Moolenaarenddef 16398e1986e3SBram Moolenaar 1640efa94447SBram Moolenaardef Test_use_import_in_mapping() 1641cfcd011fSBram Moolenaar var lines =<< trim END 1642efa94447SBram Moolenaar vim9script 1643efa94447SBram Moolenaar export def Funcx() 1644efa94447SBram Moolenaar g:result = 42 1645efa94447SBram Moolenaar enddef 1646efa94447SBram Moolenaar END 1647efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1648efa94447SBram Moolenaar lines =<< trim END 1649efa94447SBram Moolenaar vim9script 1650efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1651b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1652efa94447SBram Moolenaar END 1653efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1654efa94447SBram Moolenaar 1655efa94447SBram Moolenaar source Xmapscript.vim 1656b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1657efa94447SBram Moolenaar assert_equal(42, g:result) 1658efa94447SBram Moolenaar 1659efa94447SBram Moolenaar unlet g:result 1660efa94447SBram Moolenaar delete('XsomeExport.vim') 1661efa94447SBram Moolenaar delete('Xmapscript.vim') 1662b3ca9824SBram Moolenaar nunmap <F3> 1663efa94447SBram Moolenaarenddef 1664efa94447SBram Moolenaar 1665d3f8a9eeSBram Moolenaardef Test_vim9script_mix() 1666d3f8a9eeSBram Moolenaar var lines =<< trim END 1667d3f8a9eeSBram Moolenaar if has(g:feature) 1668d3f8a9eeSBram Moolenaar " legacy script 1669d3f8a9eeSBram Moolenaar let g:legacy = 1 1670d3f8a9eeSBram Moolenaar finish 1671d3f8a9eeSBram Moolenaar endif 1672d3f8a9eeSBram Moolenaar vim9script 1673d3f8a9eeSBram Moolenaar g:legacy = 0 1674d3f8a9eeSBram Moolenaar END 1675d3f8a9eeSBram Moolenaar g:feature = 'eval' 1676d3f8a9eeSBram Moolenaar g:legacy = -1 1677d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1678d3f8a9eeSBram Moolenaar assert_equal(1, g:legacy) 1679d3f8a9eeSBram Moolenaar 1680d3f8a9eeSBram Moolenaar g:feature = 'noteval' 1681d3f8a9eeSBram Moolenaar g:legacy = -1 1682d3f8a9eeSBram Moolenaar CheckScriptSuccess(lines) 1683d3f8a9eeSBram Moolenaar assert_equal(0, g:legacy) 1684d3f8a9eeSBram Moolenaarenddef 1685d3f8a9eeSBram Moolenaar 1686750802b5SBram Moolenaardef Test_vim9script_fails() 16878a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 16888a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1689cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 16909721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1691cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1692750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1693750802b5SBram Moolenaar 1694cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1695c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1696c785b9a7SBram Moolenaar 1697e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1698e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 16998a7d6542SBram Moolenaarenddef 17008a7d6542SBram Moolenaar 1701f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1702101f4810SBram Moolenaar CheckRunVimInTerminal 1703101f4810SBram Moolenaar 17049bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1705c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 17069bb3eb3eSBram Moolenaarendfunc 17079bb3eb3eSBram Moolenaar 1708c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1709cfcd011fSBram Moolenaar var export =<< trim END 1710101f4810SBram Moolenaar vim9script 1711101f4810SBram Moolenaar export def Foo(): number 1712101f4810SBram Moolenaar return 0 1713101f4810SBram Moolenaar enddef 1714101f4810SBram Moolenaar END 1715730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1716101f4810SBram Moolenaar 1717e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 17189bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 17192949cfdbSBram Moolenaar WaitForAssert(() => assert_match('^E1094:', term_getline(buf, 5))) 1720101f4810SBram Moolenaar 1721730b2483SBram Moolenaar delete('XexportCmd.vim') 17229bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 17239bb3eb3eSBram Moolenaarenddef 1724101f4810SBram Moolenaar 17252b32700dSBram Moolenaardef Test_vim9script_reload_noclear() 17262b32700dSBram Moolenaar var lines =<< trim END 1727a6294955SBram Moolenaar vim9script 1728a6294955SBram Moolenaar export var exported = 'thexport' 172960dc8274SBram Moolenaar 173060dc8274SBram Moolenaar export def TheFunc(x = 0) 173160dc8274SBram Moolenaar enddef 1732a6294955SBram Moolenaar END 1733a6294955SBram Moolenaar writefile(lines, 'XExportReload') 1734a6294955SBram Moolenaar lines =<< trim END 17352b32700dSBram Moolenaar vim9script noclear 17362b32700dSBram Moolenaar g:loadCount += 1 17372b32700dSBram Moolenaar var s:reloaded = 'init' 1738a6294955SBram Moolenaar import exported from './XExportReload' 17392b32700dSBram Moolenaar 17402b32700dSBram Moolenaar def Again(): string 17412b32700dSBram Moolenaar return 'again' 17422b32700dSBram Moolenaar enddef 17432b32700dSBram Moolenaar 174460dc8274SBram Moolenaar import TheFunc from './XExportReload' 174560dc8274SBram Moolenaar TheFunc() 174660dc8274SBram Moolenaar 17472b32700dSBram Moolenaar if exists('s:loaded') | finish | endif 17482b32700dSBram Moolenaar var s:loaded = true 17492b32700dSBram Moolenaar 17502b32700dSBram Moolenaar var s:notReloaded = 'yes' 17512b32700dSBram Moolenaar s:reloaded = 'first' 17522b32700dSBram Moolenaar def g:Values(): list<string> 1753a6294955SBram Moolenaar return [s:reloaded, s:notReloaded, Again(), Once(), exported] 17542b32700dSBram Moolenaar enddef 17552b32700dSBram Moolenaar 17562b32700dSBram Moolenaar def Once(): string 17572b32700dSBram Moolenaar return 'once' 17582b32700dSBram Moolenaar enddef 17592b32700dSBram Moolenaar END 17602b32700dSBram Moolenaar writefile(lines, 'XReloaded') 17612b32700dSBram Moolenaar g:loadCount = 0 17622b32700dSBram Moolenaar source XReloaded 17632b32700dSBram Moolenaar assert_equal(1, g:loadCount) 1764a6294955SBram Moolenaar assert_equal(['first', 'yes', 'again', 'once', 'thexport'], g:Values()) 17652b32700dSBram Moolenaar source XReloaded 17662b32700dSBram Moolenaar assert_equal(2, g:loadCount) 1767a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17682b32700dSBram Moolenaar source XReloaded 17692b32700dSBram Moolenaar assert_equal(3, g:loadCount) 1770a6294955SBram Moolenaar assert_equal(['init', 'yes', 'again', 'once', 'thexport'], g:Values()) 17712b32700dSBram Moolenaar 177248e11c10SBram Moolenaar delete('XReloaded') 1773a6294955SBram Moolenaar delete('XExportReload') 17742b32700dSBram Moolenaar delfunc g:Values 17752b32700dSBram Moolenaar unlet g:loadCount 1776577dc93dSBram Moolenaar 1777577dc93dSBram Moolenaar lines =<< trim END 1778577dc93dSBram Moolenaar vim9script 1779577dc93dSBram Moolenaar def Inner() 1780577dc93dSBram Moolenaar enddef 1781577dc93dSBram Moolenaar END 1782577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1783577dc93dSBram Moolenaar source XreloadScript.vim 1784577dc93dSBram Moolenaar 1785577dc93dSBram Moolenaar lines =<< trim END 1786577dc93dSBram Moolenaar vim9script 1787577dc93dSBram Moolenaar def Outer() 1788577dc93dSBram Moolenaar def Inner() 1789577dc93dSBram Moolenaar enddef 1790577dc93dSBram Moolenaar enddef 1791577dc93dSBram Moolenaar defcompile 1792577dc93dSBram Moolenaar END 1793577dc93dSBram Moolenaar lines->writefile('XreloadScript.vim') 1794577dc93dSBram Moolenaar source XreloadScript.vim 1795577dc93dSBram Moolenaar 1796577dc93dSBram Moolenaar delete('XreloadScript.vim') 17972b32700dSBram Moolenaarenddef 17982b32700dSBram Moolenaar 17994c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1800cfcd011fSBram Moolenaar var lines =<< trim END 18018a7d6542SBram Moolenaar vim9script 18028a7d6542SBram Moolenaar const var = '' 1803cfcd011fSBram Moolenaar var valone = 1234 18048a7d6542SBram Moolenaar def MyFunc(arg: string) 18058a7d6542SBram Moolenaar valone = 5678 18068a7d6542SBram Moolenaar enddef 18078a7d6542SBram Moolenaar END 1808cfcd011fSBram Moolenaar var morelines =<< trim END 1809cfcd011fSBram Moolenaar var valtwo = 222 18108a7d6542SBram Moolenaar export def GetValtwo(): number 18118a7d6542SBram Moolenaar return valtwo 18128a7d6542SBram Moolenaar enddef 18138a7d6542SBram Moolenaar END 181403afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 18158a7d6542SBram Moolenaar source Xreload.vim 18168a7d6542SBram Moolenaar source Xreload.vim 18178a7d6542SBram Moolenaar source Xreload.vim 18188a7d6542SBram Moolenaar 1819f5be8cdbSBram Moolenaar # cannot declare a var twice 18208a7d6542SBram Moolenaar lines =<< trim END 18218a7d6542SBram Moolenaar vim9script 1822cfcd011fSBram Moolenaar var valone = 1234 1823cfcd011fSBram Moolenaar var valone = 5678 18248a7d6542SBram Moolenaar END 18258a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 182644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 18278a7d6542SBram Moolenaar 18288a7d6542SBram Moolenaar delete('Xreload.vim') 18298a7d6542SBram Moolenaar delete('Ximport.vim') 18308a7d6542SBram Moolenaarenddef 18318a7d6542SBram Moolenaar 183207a65d26SBram Moolenaar" if a script is reloaded with a script-local variable that changed its type, a 183307a65d26SBram Moolenaar" compiled function using that variable must fail. 183407a65d26SBram Moolenaardef Test_script_reload_change_type() 183507a65d26SBram Moolenaar var lines =<< trim END 183607a65d26SBram Moolenaar vim9script noclear 183707a65d26SBram Moolenaar var str = 'string' 183807a65d26SBram Moolenaar def g:GetStr(): string 183907a65d26SBram Moolenaar return str .. 'xxx' 184007a65d26SBram Moolenaar enddef 184107a65d26SBram Moolenaar END 184207a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 184307a65d26SBram Moolenaar source Xreload.vim 184407a65d26SBram Moolenaar echo g:GetStr() 184507a65d26SBram Moolenaar 184607a65d26SBram Moolenaar lines =<< trim END 184707a65d26SBram Moolenaar vim9script noclear 184807a65d26SBram Moolenaar var str = 1234 184907a65d26SBram Moolenaar END 185007a65d26SBram Moolenaar writefile(lines, 'Xreload.vim') 185107a65d26SBram Moolenaar source Xreload.vim 185207a65d26SBram Moolenaar assert_fails('echo g:GetStr()', 'E1150:') 185307a65d26SBram Moolenaar 185407a65d26SBram Moolenaar delfunc g:GetStr 185507a65d26SBram Moolenaar delete('Xreload.vim') 185607a65d26SBram Moolenaarenddef 185707a65d26SBram Moolenaar 1858c970e422SBram Moolenaar" Define CallFunc so that the test can be compiled 1859c970e422SBram Moolenaarcommand CallFunc echo 'nop' 1860c970e422SBram Moolenaar 1861c970e422SBram Moolenaardef Test_script_reload_from_function() 1862c970e422SBram Moolenaar var lines =<< trim END 1863c970e422SBram Moolenaar vim9script 1864c970e422SBram Moolenaar 1865c970e422SBram Moolenaar if exists('g:loaded') 1866c970e422SBram Moolenaar finish 1867c970e422SBram Moolenaar endif 1868c970e422SBram Moolenaar g:loaded = 1 1869c970e422SBram Moolenaar delcommand CallFunc 1870c970e422SBram Moolenaar command CallFunc Func() 1871c970e422SBram Moolenaar def Func() 1872a4c81beaSBram Moolenaar so XreloadFunc.vim 1873c970e422SBram Moolenaar g:didTheFunc = 1 1874c970e422SBram Moolenaar enddef 1875c970e422SBram Moolenaar END 1876c970e422SBram Moolenaar writefile(lines, 'XreloadFunc.vim') 1877c970e422SBram Moolenaar source XreloadFunc.vim 1878c970e422SBram Moolenaar CallFunc 1879c970e422SBram Moolenaar assert_equal(1, g:didTheFunc) 1880c970e422SBram Moolenaar 1881c970e422SBram Moolenaar delete('XreloadFunc.vim') 1882c970e422SBram Moolenaar delcommand CallFunc 1883c970e422SBram Moolenaar unlet g:loaded 1884c970e422SBram Moolenaar unlet g:didTheFunc 1885c970e422SBram Moolenaarenddef 1886c970e422SBram Moolenaar 18876c3843caSBram Moolenaardef Test_script_var_shadows_function() 18886c3843caSBram Moolenaar var lines =<< trim END 18896c3843caSBram Moolenaar vim9script 18906c3843caSBram Moolenaar def Func(): number 18916c3843caSBram Moolenaar return 123 18926c3843caSBram Moolenaar enddef 18936c3843caSBram Moolenaar var Func = 1 18946c3843caSBram Moolenaar END 18956c3843caSBram Moolenaar CheckScriptFailure(lines, 'E1041:', 5) 18966c3843caSBram Moolenaarenddef 18976c3843caSBram Moolenaar 1898c323527dSBram Moolenaardef Test_script_var_shadows_command() 1899c323527dSBram Moolenaar var lines =<< trim END 1900c323527dSBram Moolenaar var undo = 1 1901c323527dSBram Moolenaar undo = 2 1902c323527dSBram Moolenaar assert_equal(2, undo) 1903c323527dSBram Moolenaar END 1904c323527dSBram Moolenaar CheckDefAndScriptSuccess(lines) 1905c323527dSBram Moolenaar 1906c323527dSBram Moolenaar lines =<< trim END 1907c323527dSBram Moolenaar var undo = 1 1908c323527dSBram Moolenaar undo 1909c323527dSBram Moolenaar END 1910c323527dSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1207:', 2) 1911c323527dSBram Moolenaarenddef 1912c323527dSBram Moolenaar 191395006e3dSBram Moolenaardef s:RetSome(): string 191495006e3dSBram Moolenaar return 'some' 191595006e3dSBram Moolenaarenddef 191695006e3dSBram Moolenaar 1917fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1918fe465a01SBram Moolenaar" script-local name. 1919fe465a01SBram Moolenaardef Test_vim9script_funcref() 1920cfcd011fSBram Moolenaar var sortlines =<< trim END 1921fe465a01SBram Moolenaar vim9script 1922fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1923bed36b93SBram Moolenaar return i2 - i1 1924fe465a01SBram Moolenaar enddef 1925fe465a01SBram Moolenaar 1926fe465a01SBram Moolenaar export def FastSort(): list<number> 1927fe465a01SBram Moolenaar return range(5)->sort(Compare) 1928fe465a01SBram Moolenaar enddef 1929529fb5a5SBram Moolenaar 1930529fb5a5SBram Moolenaar export def GetString(arg: string): string 1931529fb5a5SBram Moolenaar return arg 1932529fb5a5SBram Moolenaar enddef 1933fe465a01SBram Moolenaar END 1934fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1935fe465a01SBram Moolenaar 1936cfcd011fSBram Moolenaar var lines =<< trim END 1937fe465a01SBram Moolenaar vim9script 1938fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1939fe465a01SBram Moolenaar def Test() 1940fe465a01SBram Moolenaar g:result = FastSort() 1941fe465a01SBram Moolenaar enddef 1942fe465a01SBram Moolenaar Test() 1943529fb5a5SBram Moolenaar 1944529fb5a5SBram Moolenaar # using a function imported with "as" 1945529fb5a5SBram Moolenaar import * as anAlias from './Xsort.vim' 1946529fb5a5SBram Moolenaar assert_equal('yes', anAlias.GetString('yes')) 1947529fb5a5SBram Moolenaar 1948529fb5a5SBram Moolenaar # using the function from a compiled function 1949529fb5a5SBram Moolenaar def TestMore(): string 1950ca51cc0aSBram Moolenaar var s = s:anAlias.GetString('foo') 1951ca51cc0aSBram Moolenaar return s .. anAlias.GetString('bar') 1952529fb5a5SBram Moolenaar enddef 1953ca51cc0aSBram Moolenaar assert_equal('foobar', TestMore()) 1954529fb5a5SBram Moolenaar 1955529fb5a5SBram Moolenaar # error when using a function that isn't exported 1956529fb5a5SBram Moolenaar assert_fails('anAlias.Compare(1, 2)', 'E1049:') 1957fe465a01SBram Moolenaar END 1958fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1959fe465a01SBram Moolenaar 1960fe465a01SBram Moolenaar source Xscript.vim 1961fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1962fe465a01SBram Moolenaar 1963fe465a01SBram Moolenaar unlet g:result 1964fe465a01SBram Moolenaar delete('Xsort.vim') 1965fe465a01SBram Moolenaar delete('Xscript.vim') 196695006e3dSBram Moolenaar 1967cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 196895006e3dSBram Moolenaar assert_equal('some', Funcref()) 1969fe465a01SBram Moolenaarenddef 1970fe465a01SBram Moolenaar 1971601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1972601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1973601e76acSBram Moolenaar" function reference. 1974c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1975cfcd011fSBram Moolenaar var filterLines =<< trim END 1976c620c055SBram Moolenaar vim9script 1977c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1978c620c055SBram Moolenaar return idx % 2 == 1 1979c620c055SBram Moolenaar enddef 1980c620c055SBram Moolenaar export def FastFilter(): list<number> 1981c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1982c620c055SBram Moolenaar enddef 1983601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1984601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1985601e76acSBram Moolenaar enddef 1986c620c055SBram Moolenaar END 1987c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1988c620c055SBram Moolenaar 1989cfcd011fSBram Moolenaar var lines =<< trim END 1990c620c055SBram Moolenaar vim9script 1991601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1992c620c055SBram Moolenaar def Test() 1993cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1994c620c055SBram Moolenaar enddef 1995c620c055SBram Moolenaar Test() 1996601e76acSBram Moolenaar def TestDirect() 1997cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1998601e76acSBram Moolenaar enddef 1999601e76acSBram Moolenaar TestDirect() 2000c620c055SBram Moolenaar END 2001601e76acSBram Moolenaar CheckScriptSuccess(lines) 2002c620c055SBram Moolenaar delete('Xfilter.vim') 2003c620c055SBram Moolenaarenddef 2004c620c055SBram Moolenaar 20054c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 2006cfcd011fSBram Moolenaar var first_lines =<< trim END 20074c17ad94SBram Moolenaar vim9script 20084c17ad94SBram Moolenaar def FuncYes(): string 20094c17ad94SBram Moolenaar return 'yes' 20104c17ad94SBram Moolenaar enddef 20114c17ad94SBram Moolenaar END 2012cfcd011fSBram Moolenaar var withno_lines =<< trim END 20134c17ad94SBram Moolenaar def FuncNo(): string 20144c17ad94SBram Moolenaar return 'no' 20154c17ad94SBram Moolenaar enddef 20164c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 20174c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 20184c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 201903afdcf1SBram Moolenaar enddef 202003afdcf1SBram Moolenaar END 2021cfcd011fSBram Moolenaar var nono_lines =<< trim END 202203afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 202303afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 202444d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 20254c17ad94SBram Moolenaar enddef 20264c17ad94SBram Moolenaar END 20274c17ad94SBram Moolenaar 20284c17ad94SBram Moolenaar # FuncNo() is defined 202903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 20304c17ad94SBram Moolenaar source Xreloaded.vim 20314c17ad94SBram Moolenaar g:DoCheck(true) 20324c17ad94SBram Moolenaar 20334c17ad94SBram Moolenaar # FuncNo() is not redefined 203403afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 20354c17ad94SBram Moolenaar source Xreloaded.vim 20365082471fSBram Moolenaar g:DoCheck(false) 20374c17ad94SBram Moolenaar 20384c17ad94SBram Moolenaar # FuncNo() is back 203903afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 20404c17ad94SBram Moolenaar source Xreloaded.vim 20415082471fSBram Moolenaar g:DoCheck(false) 20424c17ad94SBram Moolenaar 20434c17ad94SBram Moolenaar delete('Xreloaded.vim') 20444c17ad94SBram Moolenaarenddef 20454c17ad94SBram Moolenaar 204689483d40SBram Moolenaardef Test_vim9script_reload_delvar() 204789483d40SBram Moolenaar # write the script with a script-local variable 2048cfcd011fSBram Moolenaar var lines =<< trim END 204989483d40SBram Moolenaar vim9script 2050cfcd011fSBram Moolenaar var name = 'string' 205189483d40SBram Moolenaar END 205289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 205389483d40SBram Moolenaar source XreloadVar.vim 205489483d40SBram Moolenaar 205589483d40SBram Moolenaar # now write the script using the same variable locally - works 205689483d40SBram Moolenaar lines =<< trim END 205789483d40SBram Moolenaar vim9script 205889483d40SBram Moolenaar def Func() 2059cfcd011fSBram Moolenaar var name = 'string' 206089483d40SBram Moolenaar enddef 206189483d40SBram Moolenaar END 206289483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 206389483d40SBram Moolenaar source XreloadVar.vim 206489483d40SBram Moolenaar 206589483d40SBram Moolenaar delete('XreloadVar.vim') 206689483d40SBram Moolenaarenddef 206789483d40SBram Moolenaar 20688a7d6542SBram Moolenaardef Test_import_absolute() 2069cfcd011fSBram Moolenaar var import_lines = [ 2070e6085c53SBram Moolenaar 'vim9script', 2071e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 2072e6085c53SBram Moolenaar 'def UseExported()', 2073e6085c53SBram Moolenaar ' g:imported_abs = exported', 2074e6085c53SBram Moolenaar ' exported = 8888', 2075e6085c53SBram Moolenaar ' g:imported_after = exported', 2076e6085c53SBram Moolenaar 'enddef', 2077e6085c53SBram Moolenaar 'UseExported()', 2078e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 2079e6085c53SBram Moolenaar ] 20808a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 20818a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 20828a7d6542SBram Moolenaar 20838a7d6542SBram Moolenaar source Ximport_abs.vim 20848a7d6542SBram Moolenaar 20858a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 20864e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 2087fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 2088fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 2089fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2090fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 2091fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 2092fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 2093fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 2094fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 2095fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 2096fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 2097e6085c53SBram Moolenaar g:import_disassembled) 2098b3ca9824SBram Moolenaar 2099b3ca9824SBram Moolenaar Undo_export_script_lines() 21008a7d6542SBram Moolenaar unlet g:imported_abs 21014e12a5dfSBram Moolenaar unlet g:import_disassembled 21028a7d6542SBram Moolenaar 21038a7d6542SBram Moolenaar delete('Ximport_abs.vim') 21048a7d6542SBram Moolenaar delete('Xexport_abs.vim') 21058a7d6542SBram Moolenaarenddef 21068a7d6542SBram Moolenaar 21078a7d6542SBram Moolenaardef Test_import_rtp() 2108cfcd011fSBram Moolenaar var import_lines = [ 2109e6085c53SBram Moolenaar 'vim9script', 2110e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 2111e6085c53SBram Moolenaar 'g:imported_rtp = exported', 2112e6085c53SBram Moolenaar ] 21138a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 2114b885a7c7SBram Moolenaar mkdir('import', 'p') 2115b885a7c7SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 21168a7d6542SBram Moolenaar 2117cfcd011fSBram Moolenaar var save_rtp = &rtp 21188a7d6542SBram Moolenaar &rtp = getcwd() 21198a7d6542SBram Moolenaar source Ximport_rtp.vim 21208a7d6542SBram Moolenaar &rtp = save_rtp 21218a7d6542SBram Moolenaar 21228a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 21238a7d6542SBram Moolenaar 2124b3ca9824SBram Moolenaar Undo_export_script_lines() 2125b3ca9824SBram Moolenaar unlet g:imported_rtp 21268a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 2127b885a7c7SBram Moolenaar delete('import', 'rf') 21288a7d6542SBram Moolenaarenddef 21298a7d6542SBram Moolenaar 213025e0f586SBram Moolenaardef Test_import_compile_error() 2131cfcd011fSBram Moolenaar var export_lines = [ 213225e0f586SBram Moolenaar 'vim9script', 213325e0f586SBram Moolenaar 'export def ExpFunc(): string', 213425e0f586SBram Moolenaar ' return notDefined', 213525e0f586SBram Moolenaar 'enddef', 213625e0f586SBram Moolenaar ] 213725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 213825e0f586SBram Moolenaar 2139cfcd011fSBram Moolenaar var import_lines = [ 214025e0f586SBram Moolenaar 'vim9script', 214125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 214225e0f586SBram Moolenaar 'def ImpFunc()', 214325e0f586SBram Moolenaar ' echo ExpFunc()', 214425e0f586SBram Moolenaar 'enddef', 214525e0f586SBram Moolenaar 'defcompile', 214625e0f586SBram Moolenaar ] 214725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 214825e0f586SBram Moolenaar 214925e0f586SBram Moolenaar try 215025e0f586SBram Moolenaar source Ximport.vim 215125e0f586SBram Moolenaar catch /E1001/ 2152f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 21537707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 215425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 215525e0f586SBram Moolenaar endtry 215625e0f586SBram Moolenaar 215725e0f586SBram Moolenaar delete('Xexported.vim') 215825e0f586SBram Moolenaar delete('Ximport.vim') 215925e0f586SBram Moolenaarenddef 216025e0f586SBram Moolenaar 2161c4ce36d4SBram Moolenaardef Test_func_redefine_error() 2162cfcd011fSBram Moolenaar var lines = [ 2163c4ce36d4SBram Moolenaar 'vim9script', 2164c4ce36d4SBram Moolenaar 'def Func()', 2165c4ce36d4SBram Moolenaar ' eval [][0]', 2166c4ce36d4SBram Moolenaar 'enddef', 2167c4ce36d4SBram Moolenaar 'Func()', 2168c4ce36d4SBram Moolenaar ] 2169c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 2170c4ce36d4SBram Moolenaar 2171c4ce36d4SBram Moolenaar for count in range(3) 2172c4ce36d4SBram Moolenaar try 2173c4ce36d4SBram Moolenaar source Xtestscript.vim 2174c4ce36d4SBram Moolenaar catch /E684/ 2175c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 2176c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 2177c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 2178c4ce36d4SBram Moolenaar endtry 2179c4ce36d4SBram Moolenaar endfor 2180c4ce36d4SBram Moolenaar 2181c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 2182c4ce36d4SBram Moolenaarenddef 2183c4ce36d4SBram Moolenaar 2184eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 2185cfcd011fSBram Moolenaar var export_lines =<< trim END 2186eef2102eSBram Moolenaar vim9script 2187eef2102eSBram Moolenaar export def Func() 2188eef2102eSBram Moolenaar echo 'imported' 2189eef2102eSBram Moolenaar enddef 2190eef2102eSBram Moolenaar END 2191eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 2192eef2102eSBram Moolenaar 2193cfcd011fSBram Moolenaar var lines =<< trim END 2194eef2102eSBram Moolenaar vim9script 2195eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2196eef2102eSBram Moolenaar def Func() 2197eef2102eSBram Moolenaar echo 'local to function' 2198eef2102eSBram Moolenaar enddef 2199eef2102eSBram Moolenaar END 2200eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2201eef2102eSBram Moolenaar 2202eef2102eSBram Moolenaar lines =<< trim END 2203eef2102eSBram Moolenaar vim9script 2204eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 2205eef2102eSBram Moolenaar def Outer() 2206eef2102eSBram Moolenaar def Func() 2207eef2102eSBram Moolenaar echo 'local to function' 2208eef2102eSBram Moolenaar enddef 2209eef2102eSBram Moolenaar enddef 2210eef2102eSBram Moolenaar defcompile 2211eef2102eSBram Moolenaar END 2212eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2213eef2102eSBram Moolenaar 2214eef2102eSBram Moolenaar delete('XexportedFunc.vim') 2215eef2102eSBram Moolenaarenddef 2216eef2102eSBram Moolenaar 2217b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 2218cfcd011fSBram Moolenaar var lines =<< trim END 2219b9a2cac3SBram Moolenaar vim9script 2220b9a2cac3SBram Moolenaar def Func() 2221b9a2cac3SBram Moolenaar echo 'one' 2222b9a2cac3SBram Moolenaar enddef 2223b9a2cac3SBram Moolenaar def Func() 2224b9a2cac3SBram Moolenaar echo 'two' 2225b9a2cac3SBram Moolenaar enddef 2226b9a2cac3SBram Moolenaar END 2227b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2228fa211f3cSBram Moolenaar 2229fa211f3cSBram Moolenaar lines =<< trim END 2230fa211f3cSBram Moolenaar vim9script 2231fa211f3cSBram Moolenaar def Foo(): string 2232fa211f3cSBram Moolenaar return 'foo' 2233fa211f3cSBram Moolenaar enddef 2234fa211f3cSBram Moolenaar def Func() 2235cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 2236fa211f3cSBram Moolenaar enddef 2237fa211f3cSBram Moolenaar defcompile 2238fa211f3cSBram Moolenaar END 2239fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 2240b9a2cac3SBram Moolenaarenddef 2241b9a2cac3SBram Moolenaar 22428a7d6542SBram Moolenaardef Test_fixed_size_list() 2243f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 2244cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 22458a7d6542SBram Moolenaar l->remove(0) 22468a7d6542SBram Moolenaar l->add(5) 22478a7d6542SBram Moolenaar l->insert(99, 1) 22480f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 22498a7d6542SBram Moolenaarenddef 22508a7d6542SBram Moolenaar 2251ae616494SBram Moolenaardef Test_no_insert_xit() 2252d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 2253d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 2254d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 2255d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 2256d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 2257ae616494SBram Moolenaar 2258ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 2259ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 2260ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 2261ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 2262f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 2263f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 22646508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o = 1'], 'E1100:') 22656508880dSBram Moolenaar CheckScriptFailure(['vim9script', 'o'], 'E1100:') 2266f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 2267f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 2268f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 2269ae616494SBram Moolenaarenddef 2270ae616494SBram Moolenaar 2271158906cfSBram Moolenaardef IfElse(what: number): string 2272cfcd011fSBram Moolenaar var res = '' 2273158906cfSBram Moolenaar if what == 1 2274158906cfSBram Moolenaar res = "one" 2275158906cfSBram Moolenaar elseif what == 2 2276158906cfSBram Moolenaar res = "two" 2277a259d8d3SBram Moolenaar else 2278158906cfSBram Moolenaar res = "three" 2279a259d8d3SBram Moolenaar endif 2280158906cfSBram Moolenaar return res 2281a259d8d3SBram Moolenaarenddef 2282a259d8d3SBram Moolenaar 2283158906cfSBram Moolenaardef Test_if_elseif_else() 2284158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 2285158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 2286158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 22870f18b6d1SBram Moolenaarenddef 22880f18b6d1SBram Moolenaar 2289e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 2290d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 2291d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 2292d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 2293ced68a00SBram Moolenaar CheckDefFailure(['if g:abool', 'elseif xxx'], 'E1001:') 2294d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 22956628b7ebSBram Moolenaar 22966628b7ebSBram Moolenaar var lines =<< trim END 22976628b7ebSBram Moolenaar var s = '' 22986628b7ebSBram Moolenaar if s = '' 22996628b7ebSBram Moolenaar endif 23006628b7ebSBram Moolenaar END 23016628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 23026628b7ebSBram Moolenaar 23036628b7ebSBram Moolenaar lines =<< trim END 23046628b7ebSBram Moolenaar var s = '' 23056628b7ebSBram Moolenaar if s == '' 23066628b7ebSBram Moolenaar elseif s = '' 23076628b7ebSBram Moolenaar endif 23086628b7ebSBram Moolenaar END 23096628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 2310e8c4abbbSBram Moolenaarenddef 2311e8c4abbbSBram Moolenaar 23126d69bf60SBram Moolenaarlet g:bool_true = v:true 23136d69bf60SBram Moolenaarlet g:bool_false = v:false 23146d69bf60SBram Moolenaar 23156d69bf60SBram Moolenaardef Test_if_const_expr() 2316cfcd011fSBram Moolenaar var res = false 23176d69bf60SBram Moolenaar if true ? true : false 23186d69bf60SBram Moolenaar res = true 23196d69bf60SBram Moolenaar endif 23206d69bf60SBram Moolenaar assert_equal(true, res) 23216d69bf60SBram Moolenaar 2322585fea7bSBram Moolenaar g:glob = 2 2323585fea7bSBram Moolenaar if false 23246797966dSBram Moolenaar execute('g:glob = 3') 2325585fea7bSBram Moolenaar endif 2326585fea7bSBram Moolenaar assert_equal(2, g:glob) 2327585fea7bSBram Moolenaar if true 23286797966dSBram Moolenaar execute('g:glob = 3') 2329585fea7bSBram Moolenaar endif 2330585fea7bSBram Moolenaar assert_equal(3, g:glob) 2331585fea7bSBram Moolenaar 23326d69bf60SBram Moolenaar res = false 23336d69bf60SBram Moolenaar if g:bool_true ? true : false 23346d69bf60SBram Moolenaar res = true 23356d69bf60SBram Moolenaar endif 23366d69bf60SBram Moolenaar assert_equal(true, res) 23376d69bf60SBram Moolenaar 23386d69bf60SBram Moolenaar res = false 23396d69bf60SBram Moolenaar if true ? g:bool_true : false 23406d69bf60SBram Moolenaar res = true 23416d69bf60SBram Moolenaar endif 23426d69bf60SBram Moolenaar assert_equal(true, res) 23436d69bf60SBram Moolenaar 23446d69bf60SBram Moolenaar res = false 23456d69bf60SBram Moolenaar if true ? true : g:bool_false 23466d69bf60SBram Moolenaar res = true 23476d69bf60SBram Moolenaar endif 23486d69bf60SBram Moolenaar assert_equal(true, res) 23496d69bf60SBram Moolenaar 23506d69bf60SBram Moolenaar res = false 23516d69bf60SBram Moolenaar if true ? false : true 23526d69bf60SBram Moolenaar res = true 23536d69bf60SBram Moolenaar endif 23546d69bf60SBram Moolenaar assert_equal(false, res) 23556d69bf60SBram Moolenaar 23566d69bf60SBram Moolenaar res = false 23576d69bf60SBram Moolenaar if false ? false : true 23586d69bf60SBram Moolenaar res = true 23596d69bf60SBram Moolenaar endif 23606d69bf60SBram Moolenaar assert_equal(true, res) 23616d69bf60SBram Moolenaar 23626d69bf60SBram Moolenaar res = false 23636d69bf60SBram Moolenaar if false ? true : false 23646d69bf60SBram Moolenaar res = true 23656d69bf60SBram Moolenaar endif 23666d69bf60SBram Moolenaar assert_equal(false, res) 23676d69bf60SBram Moolenaar 23686d69bf60SBram Moolenaar res = false 2369e8c4abbbSBram Moolenaar if has('xyz') ? true : false 2370e8c4abbbSBram Moolenaar res = true 2371e8c4abbbSBram Moolenaar endif 2372e8c4abbbSBram Moolenaar assert_equal(false, res) 2373e8c4abbbSBram Moolenaar 2374e8c4abbbSBram Moolenaar res = false 23756d69bf60SBram Moolenaar if true && true 23766d69bf60SBram Moolenaar res = true 23776d69bf60SBram Moolenaar endif 23786d69bf60SBram Moolenaar assert_equal(true, res) 23796d69bf60SBram Moolenaar 23806d69bf60SBram Moolenaar res = false 23816d69bf60SBram Moolenaar if true && false 23826d69bf60SBram Moolenaar res = true 23836d69bf60SBram Moolenaar endif 23846d69bf60SBram Moolenaar assert_equal(false, res) 23856d69bf60SBram Moolenaar 23866d69bf60SBram Moolenaar res = false 23876d69bf60SBram Moolenaar if g:bool_true && false 23886d69bf60SBram Moolenaar res = true 23896d69bf60SBram Moolenaar endif 23906d69bf60SBram Moolenaar assert_equal(false, res) 23916d69bf60SBram Moolenaar 23926d69bf60SBram Moolenaar res = false 23936d69bf60SBram Moolenaar if true && g:bool_false 23946d69bf60SBram Moolenaar res = true 23956d69bf60SBram Moolenaar endif 23966d69bf60SBram Moolenaar assert_equal(false, res) 23976d69bf60SBram Moolenaar 23986d69bf60SBram Moolenaar res = false 23996d69bf60SBram Moolenaar if false && false 24006d69bf60SBram Moolenaar res = true 24016d69bf60SBram Moolenaar endif 24026d69bf60SBram Moolenaar assert_equal(false, res) 24036d69bf60SBram Moolenaar 24046d69bf60SBram Moolenaar res = false 24056d69bf60SBram Moolenaar if true || false 24066d69bf60SBram Moolenaar res = true 24076d69bf60SBram Moolenaar endif 24086d69bf60SBram Moolenaar assert_equal(true, res) 24096d69bf60SBram Moolenaar 24106d69bf60SBram Moolenaar res = false 24116d69bf60SBram Moolenaar if g:bool_true || false 24126d69bf60SBram Moolenaar res = true 24136d69bf60SBram Moolenaar endif 24146d69bf60SBram Moolenaar assert_equal(true, res) 24156d69bf60SBram Moolenaar 24166d69bf60SBram Moolenaar res = false 24176d69bf60SBram Moolenaar if true || g:bool_false 24186d69bf60SBram Moolenaar res = true 24196d69bf60SBram Moolenaar endif 24206d69bf60SBram Moolenaar assert_equal(true, res) 24216d69bf60SBram Moolenaar 24226d69bf60SBram Moolenaar res = false 24236d69bf60SBram Moolenaar if false || false 24246d69bf60SBram Moolenaar res = true 24256d69bf60SBram Moolenaar endif 24266d69bf60SBram Moolenaar assert_equal(false, res) 24273988f64fSBram Moolenaar 24283988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 2429c323527dSBram Moolenaar if false | eval 1 + 2 | endif 24303988f64fSBram Moolenaar if false | eval burp + 234 | endif 24313988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 24323988f64fSBram Moolenaar if false 24333988f64fSBram Moolenaar burp 24343988f64fSBram Moolenaar endif 2435e525bddaSBram Moolenaar 2436e525bddaSBram Moolenaar # expression with line breaks skipped 2437e525bddaSBram Moolenaar if false 2438e525bddaSBram Moolenaar ('aaa' 2439e525bddaSBram Moolenaar .. 'bbb' 2440e525bddaSBram Moolenaar .. 'ccc' 2441e525bddaSBram Moolenaar )->setline(1) 2442e525bddaSBram Moolenaar endif 244380c34ca3SBram Moolenaarenddef 24446d69bf60SBram Moolenaar 244580c34ca3SBram Moolenaardef Test_if_const_expr_fails() 2446d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 2447d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 2448d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 2449d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 24506d69bf60SBram Moolenaarenddef 24516d69bf60SBram Moolenaar 245272abcf42SBram Moolenaardef RunNested(i: number): number 2453cfcd011fSBram Moolenaar var x: number = 0 245472abcf42SBram Moolenaar if i % 2 245572abcf42SBram Moolenaar if 1 2456f5be8cdbSBram Moolenaar # comment 245772abcf42SBram Moolenaar else 2458f5be8cdbSBram Moolenaar # comment 245972abcf42SBram Moolenaar endif 246072abcf42SBram Moolenaar x += 1 246172abcf42SBram Moolenaar else 246272abcf42SBram Moolenaar x += 1000 246372abcf42SBram Moolenaar endif 246472abcf42SBram Moolenaar return x 246572abcf42SBram Moolenaarenddef 246672abcf42SBram Moolenaar 246772abcf42SBram Moolenaardef Test_nested_if() 246872abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 246972abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 247072abcf42SBram Moolenaarenddef 247172abcf42SBram Moolenaar 2472ad39c094SBram Moolenaardef Test_execute_cmd() 2473e4984290SBram Moolenaar # missing argument is ignored 2474e4984290SBram Moolenaar execute 2475e4984290SBram Moolenaar execute # comment 2476e4984290SBram Moolenaar 2477ad39c094SBram Moolenaar new 2478ad39c094SBram Moolenaar setline(1, 'default') 2479d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 2480ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 2481a72cfb80SBram Moolenaar 2482d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 2483a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 2484a72cfb80SBram Moolenaar 2485cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 2486cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 2487a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 2488ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 2489a72cfb80SBram Moolenaar 2490d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 2491ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 2492a72cfb80SBram Moolenaar 2493cfcd011fSBram Moolenaar var cmd_first = 'call ' 2494cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 2495ad39c094SBram Moolenaar execute cmd_first .. cmd_last 2496ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 2497ad39c094SBram Moolenaar bwipe! 2498585fea7bSBram Moolenaar 2499cfcd011fSBram Moolenaar var n = true 25002d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 25012d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 25022d6b20d6SBram Moolenaar 2503e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 2504e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 2505e5abf7afSBram Moolenaar 2506d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 2507d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 2508d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 2509ad39c094SBram Moolenaarenddef 2510ad39c094SBram Moolenaar 251147e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 2512f5be8cdbSBram Moolenaar # only checks line continuation 2513cfcd011fSBram Moolenaar var lines =<< trim END 251447e880d6SBram Moolenaar vim9script 251547e880d6SBram Moolenaar execute 'g:someVar' 251647e880d6SBram Moolenaar .. ' = ' .. 251747e880d6SBram Moolenaar '28' 251847e880d6SBram Moolenaar assert_equal(28, g:someVar) 251947e880d6SBram Moolenaar unlet g:someVar 252047e880d6SBram Moolenaar END 252147e880d6SBram Moolenaar CheckScriptSuccess(lines) 252247e880d6SBram Moolenaarenddef 252347e880d6SBram Moolenaar 2524ad39c094SBram Moolenaardef Test_echo_cmd() 2525a72cfb80SBram Moolenaar echo 'some' # comment 2526585fea7bSBram Moolenaar echon 'thing' 2527ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2528ad39c094SBram Moolenaar 2529a72cfb80SBram Moolenaar echo "some" # comment 2530a72cfb80SBram Moolenaar echon "thing" 2531a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 2532a72cfb80SBram Moolenaar 2533cfcd011fSBram Moolenaar var str1 = 'some' 2534cfcd011fSBram Moolenaar var str2 = 'more' 2535ad39c094SBram Moolenaar echo str1 str2 2536ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2537a72cfb80SBram Moolenaar 2538d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 2539ad39c094SBram Moolenaarenddef 2540ad39c094SBram Moolenaar 2541f93c7feaSBram Moolenaardef Test_echomsg_cmd() 2542f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 2543f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2544f93c7feaSBram Moolenaar echo 'clear' 2545df069eecSBram Moolenaar :1messages 2546f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 2547f93c7feaSBram Moolenaar 2548d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 2549f93c7feaSBram Moolenaarenddef 2550f93c7feaSBram Moolenaar 255147e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 2552f5be8cdbSBram Moolenaar # only checks line continuation 2553cfcd011fSBram Moolenaar var lines =<< trim END 255447e880d6SBram Moolenaar vim9script 255547e880d6SBram Moolenaar echomsg 'here' 255647e880d6SBram Moolenaar .. ' is ' .. 255747e880d6SBram Moolenaar 'a message' 255847e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 255947e880d6SBram Moolenaar END 256047e880d6SBram Moolenaar CheckScriptSuccess(lines) 256147e880d6SBram Moolenaarenddef 256247e880d6SBram Moolenaar 2563f93c7feaSBram Moolenaardef Test_echoerr_cmd() 25647de62623SBram Moolenaar var local = 'local' 256540ee466cSBram Moolenaar try 25667de62623SBram Moolenaar echoerr 'something' local 'wrong' # comment 256740ee466cSBram Moolenaar catch 25687de62623SBram Moolenaar assert_match('something local wrong', v:exception) 256940ee466cSBram Moolenaar endtry 2570f93c7feaSBram Moolenaarenddef 2571f93c7feaSBram Moolenaar 257247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 2573f5be8cdbSBram Moolenaar # only checks line continuation 2574cfcd011fSBram Moolenaar var lines =<< trim END 257547e880d6SBram Moolenaar vim9script 257647e880d6SBram Moolenaar try 257747e880d6SBram Moolenaar echoerr 'this' 257847e880d6SBram Moolenaar .. ' is ' .. 257947e880d6SBram Moolenaar 'wrong' 258047e880d6SBram Moolenaar catch 258147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 258247e880d6SBram Moolenaar endtry 258347e880d6SBram Moolenaar END 258447e880d6SBram Moolenaar CheckScriptSuccess(lines) 258547e880d6SBram Moolenaarenddef 258647e880d6SBram Moolenaar 25877de62623SBram Moolenaardef Test_echoconsole_cmd() 25887de62623SBram Moolenaar var local = 'local' 25897de62623SBram Moolenaar echoconsole 'something' local # comment 25907de62623SBram Moolenaar # output goes anywhere 25917de62623SBram Moolenaarenddef 25927de62623SBram Moolenaar 259341fe0617SBram Moolenaardef Test_for_outside_of_function() 2594cfcd011fSBram Moolenaar var lines =<< trim END 259541fe0617SBram Moolenaar vim9script 259641fe0617SBram Moolenaar new 259741fe0617SBram Moolenaar for var in range(0, 3) 259841fe0617SBram Moolenaar append(line('$'), var) 259941fe0617SBram Moolenaar endfor 260041fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 260141fe0617SBram Moolenaar bwipe! 2602522eefd9SBram Moolenaar 2603522eefd9SBram Moolenaar var result = '' 2604522eefd9SBram Moolenaar for i in [1, 2, 3] 2605522eefd9SBram Moolenaar var loop = ' loop ' .. i 2606522eefd9SBram Moolenaar result ..= loop 2607522eefd9SBram Moolenaar endfor 2608522eefd9SBram Moolenaar assert_equal(' loop 1 loop 2 loop 3', result) 260941fe0617SBram Moolenaar END 261041fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 261141fe0617SBram Moolenaar source Xvim9for.vim 261241fe0617SBram Moolenaar delete('Xvim9for.vim') 261341fe0617SBram Moolenaarenddef 26148a7d6542SBram Moolenaar 2615bebf0695Srbtnndef Test_for_skipped_block() 2616bebf0695Srbtnn # test skipped blocks at outside of function 2617bebf0695Srbtnn var lines =<< trim END 2618bebf0695Srbtnn var result = [] 2619bebf0695Srbtnn if true 2620bebf0695Srbtnn for n in [1, 2] 2621bebf0695Srbtnn result += [n] 2622bebf0695Srbtnn endfor 2623bebf0695Srbtnn else 2624bebf0695Srbtnn for n in [3, 4] 2625bebf0695Srbtnn result += [n] 2626bebf0695Srbtnn endfor 2627bebf0695Srbtnn endif 2628bebf0695Srbtnn assert_equal([1, 2], result) 2629bebf0695Srbtnn 2630bebf0695Srbtnn result = [] 2631bebf0695Srbtnn if false 2632bebf0695Srbtnn for n in [1, 2] 2633bebf0695Srbtnn result += [n] 2634bebf0695Srbtnn endfor 2635bebf0695Srbtnn else 2636bebf0695Srbtnn for n in [3, 4] 2637bebf0695Srbtnn result += [n] 2638bebf0695Srbtnn endfor 2639bebf0695Srbtnn endif 2640bebf0695Srbtnn assert_equal([3, 4], result) 2641bebf0695Srbtnn END 2642bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2643bebf0695Srbtnn 2644bebf0695Srbtnn # test skipped blocks at inside of function 2645bebf0695Srbtnn lines =<< trim END 2646bebf0695Srbtnn def DefTrue() 2647bebf0695Srbtnn var result = [] 2648bebf0695Srbtnn if true 2649bebf0695Srbtnn for n in [1, 2] 2650bebf0695Srbtnn result += [n] 2651bebf0695Srbtnn endfor 2652bebf0695Srbtnn else 2653bebf0695Srbtnn for n in [3, 4] 2654bebf0695Srbtnn result += [n] 2655bebf0695Srbtnn endfor 2656bebf0695Srbtnn endif 2657bebf0695Srbtnn assert_equal([1, 2], result) 2658bebf0695Srbtnn enddef 2659bebf0695Srbtnn DefTrue() 2660bebf0695Srbtnn 2661bebf0695Srbtnn def DefFalse() 2662bebf0695Srbtnn var result = [] 2663bebf0695Srbtnn if false 2664bebf0695Srbtnn for n in [1, 2] 2665bebf0695Srbtnn result += [n] 2666bebf0695Srbtnn endfor 2667bebf0695Srbtnn else 2668bebf0695Srbtnn for n in [3, 4] 2669bebf0695Srbtnn result += [n] 2670bebf0695Srbtnn endfor 2671bebf0695Srbtnn endif 2672bebf0695Srbtnn assert_equal([3, 4], result) 2673bebf0695Srbtnn enddef 2674bebf0695Srbtnn DefFalse() 2675bebf0695Srbtnn END 2676bebf0695Srbtnn CheckDefAndScriptSuccess(lines) 2677bebf0695Srbtnnenddef 2678bebf0695Srbtnn 2679e8c4abbbSBram Moolenaardef Test_for_loop() 2680f2253963SBram Moolenaar var lines =<< trim END 2681cfcd011fSBram Moolenaar var result = '' 2682e8c4abbbSBram Moolenaar for cnt in range(7) 2683e8c4abbbSBram Moolenaar if cnt == 4 2684e8c4abbbSBram Moolenaar break 2685e8c4abbbSBram Moolenaar endif 2686e8c4abbbSBram Moolenaar if cnt == 2 2687e8c4abbbSBram Moolenaar continue 2688e8c4abbbSBram Moolenaar endif 2689e8c4abbbSBram Moolenaar result ..= cnt .. '_' 2690e8c4abbbSBram Moolenaar endfor 2691e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 26920ad3e894SBram Moolenaar 2693cfcd011fSBram Moolenaar var concat = '' 26940ad3e894SBram Moolenaar for str in eval('["one", "two"]') 26950ad3e894SBram Moolenaar concat ..= str 26960ad3e894SBram Moolenaar endfor 26970ad3e894SBram Moolenaar assert_equal('onetwo', concat) 269838bd8de5SBram Moolenaar 269938bd8de5SBram Moolenaar var total = 0 270038bd8de5SBram Moolenaar for nr in 270138bd8de5SBram Moolenaar [1, 2, 3] 270238bd8de5SBram Moolenaar total += nr 270338bd8de5SBram Moolenaar endfor 270438bd8de5SBram Moolenaar assert_equal(6, total) 270538bd8de5SBram Moolenaar 270638bd8de5SBram Moolenaar total = 0 270738bd8de5SBram Moolenaar for nr 270838bd8de5SBram Moolenaar in [1, 2, 3] 270938bd8de5SBram Moolenaar total += nr 271038bd8de5SBram Moolenaar endfor 271138bd8de5SBram Moolenaar assert_equal(6, total) 271238bd8de5SBram Moolenaar 271338bd8de5SBram Moolenaar total = 0 271438bd8de5SBram Moolenaar for nr 271538bd8de5SBram Moolenaar in 271638bd8de5SBram Moolenaar [1, 2, 3] 271738bd8de5SBram Moolenaar total += nr 271838bd8de5SBram Moolenaar endfor 271938bd8de5SBram Moolenaar assert_equal(6, total) 2720036d0714SBram Moolenaar 2721a3589a0dSBram Moolenaar # with type 2722a3589a0dSBram Moolenaar total = 0 2723a3589a0dSBram Moolenaar for n: number in [1, 2, 3] 2724a3589a0dSBram Moolenaar total += n 2725a3589a0dSBram Moolenaar endfor 2726a3589a0dSBram Moolenaar assert_equal(6, total) 2727a3589a0dSBram Moolenaar 2728fe090eb5SBram Moolenaar var chars = '' 2729fe090eb5SBram Moolenaar for s: string in 'foobar' 2730fe090eb5SBram Moolenaar chars ..= s 2731fe090eb5SBram Moolenaar endfor 2732fe090eb5SBram Moolenaar assert_equal('foobar', chars) 2733fe090eb5SBram Moolenaar 27345ede5b23SBram Moolenaar chars = '' 27355ede5b23SBram Moolenaar for x: string in {a: 'a', b: 'b'}->values() 27365ede5b23SBram Moolenaar chars ..= x 27375ede5b23SBram Moolenaar endfor 27385ede5b23SBram Moolenaar assert_equal('ab', chars) 27395ede5b23SBram Moolenaar 2740a3589a0dSBram Moolenaar # unpack with type 2741f2253963SBram Moolenaar var res = '' 2742a3589a0dSBram Moolenaar for [n: number, s: string] in [[1, 'a'], [2, 'b']] 2743a3589a0dSBram Moolenaar res ..= n .. s 2744a3589a0dSBram Moolenaar endfor 2745a3589a0dSBram Moolenaar assert_equal('1a2b', res) 2746a3589a0dSBram Moolenaar 2747444d8783SBram Moolenaar # unpack with one var 2748444d8783SBram Moolenaar var reslist = [] 2749444d8783SBram Moolenaar for [x] in [['aaa'], ['bbb']] 2750444d8783SBram Moolenaar reslist->add(x) 2751444d8783SBram Moolenaar endfor 2752444d8783SBram Moolenaar assert_equal(['aaa', 'bbb'], reslist) 2753444d8783SBram Moolenaar 2754a3589a0dSBram Moolenaar # loop over string 2755a3589a0dSBram Moolenaar res = '' 275674e54fcbSBram Moolenaar for c in 'aéc̀d' 275774e54fcbSBram Moolenaar res ..= c .. '-' 275874e54fcbSBram Moolenaar endfor 275974e54fcbSBram Moolenaar assert_equal('a-é-c̀-d-', res) 276074e54fcbSBram Moolenaar 276174e54fcbSBram Moolenaar res = '' 276274e54fcbSBram Moolenaar for c in '' 276374e54fcbSBram Moolenaar res ..= c .. '-' 276474e54fcbSBram Moolenaar endfor 276574e54fcbSBram Moolenaar assert_equal('', res) 276674e54fcbSBram Moolenaar 276774e54fcbSBram Moolenaar res = '' 276874e54fcbSBram Moolenaar for c in test_null_string() 276974e54fcbSBram Moolenaar res ..= c .. '-' 277074e54fcbSBram Moolenaar endfor 277174e54fcbSBram Moolenaar assert_equal('', res) 2772f2253963SBram Moolenaar 2773f2253963SBram Moolenaar var foo: list<dict<any>> = [ 2774f2253963SBram Moolenaar {a: 'Cat'} 2775f2253963SBram Moolenaar ] 2776f2253963SBram Moolenaar for dd in foo 2777f2253963SBram Moolenaar dd.counter = 12 2778f2253963SBram Moolenaar endfor 2779f2253963SBram Moolenaar assert_equal([{a: 'Cat', counter: 12}], foo) 2780ad2d4969SBram Moolenaar 2781ad2d4969SBram Moolenaar reslist = [] 2782ad2d4969SBram Moolenaar for _ in range(3) 2783ad2d4969SBram Moolenaar reslist->add('x') 2784ad2d4969SBram Moolenaar endfor 2785ad2d4969SBram Moolenaar assert_equal(['x', 'x', 'x'], reslist) 2786f2253963SBram Moolenaar END 2787f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2788e8c4abbbSBram Moolenaarenddef 2789e8c4abbbSBram Moolenaar 27902eb6fc3bSBram Moolenaardef Test_for_loop_with_closure() 27912eb6fc3bSBram Moolenaar var lines =<< trim END 27922eb6fc3bSBram Moolenaar var flist: list<func> 27932eb6fc3bSBram Moolenaar for i in range(5) 27942eb6fc3bSBram Moolenaar var inloop = i 27952eb6fc3bSBram Moolenaar flist[i] = () => inloop 27962eb6fc3bSBram Moolenaar endfor 27972eb6fc3bSBram Moolenaar for i in range(5) 27982eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 27992eb6fc3bSBram Moolenaar endfor 28002eb6fc3bSBram Moolenaar END 28012eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 28022eb6fc3bSBram Moolenaar 28032eb6fc3bSBram Moolenaar lines =<< trim END 28042eb6fc3bSBram Moolenaar var flist: list<func> 28052eb6fc3bSBram Moolenaar for i in range(5) 28062eb6fc3bSBram Moolenaar var inloop = i 28072eb6fc3bSBram Moolenaar flist[i] = () => { 28082eb6fc3bSBram Moolenaar return inloop 28092eb6fc3bSBram Moolenaar } 28102eb6fc3bSBram Moolenaar endfor 28112eb6fc3bSBram Moolenaar for i in range(5) 28122eb6fc3bSBram Moolenaar assert_equal(4, flist[i]()) 28132eb6fc3bSBram Moolenaar endfor 28142eb6fc3bSBram Moolenaar END 28152eb6fc3bSBram Moolenaar CheckDefAndScriptSuccess(lines) 28162eb6fc3bSBram Moolenaarenddef 28172eb6fc3bSBram Moolenaar 2818e8c4abbbSBram Moolenaardef Test_for_loop_fails() 2819442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for '], 'E1097:', 'E690:') 2820442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x'], 'E1097:', 'E690:') 2821442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['for x in'], 'E1097:', 'E15:') 2822442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for # in range(5)'], 'E690:') 2823442b29c9SBram Moolenaar CheckDefAndScriptFailure(['for i In range(5)'], 'E690:') 2824442b29c9SBram Moolenaar CheckDefAndScriptFailure2(['var x = 5', 'for x in range(5)', 'endfor'], 'E1017:', 'E1041:') 2825d4ab807dSBram Moolenaar CheckScriptFailure(['vim9script', 'var x = 5', 'for x in range(5)', '# comment', 'endfor'], 'E1041:', 3) 2826822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 28272d870f8dSBram Moolenaar delfunc! g:Func 2828675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 2829675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 2830675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 283174e54fcbSBram Moolenaar 283274e54fcbSBram Moolenaar # wrong type detected at compile time 283374e54fcbSBram Moolenaar CheckDefFailure(['for i in {a: 1}', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 283474e54fcbSBram Moolenaar 283574e54fcbSBram Moolenaar # wrong type detected at runtime 283674e54fcbSBram Moolenaar g:adict = {a: 1} 283774e54fcbSBram Moolenaar CheckDefExecFailure(['for i in g:adict', 'echo 3', 'endfor'], 'E1177: For loop on dict not supported') 283874e54fcbSBram Moolenaar unlet g:adict 2839f6a8d420SBram Moolenaar 2840f6a8d420SBram Moolenaar var lines =<< trim END 2841f6a8d420SBram Moolenaar var d: list<dict<any>> = [{a: 0}] 2842f6a8d420SBram Moolenaar for e in d 2843f6a8d420SBram Moolenaar e = {a: 0, b: ''} 2844f6a8d420SBram Moolenaar endfor 2845f6a8d420SBram Moolenaar END 2846f6a8d420SBram Moolenaar CheckDefAndScriptFailure2(lines, 'E1018:', 'E46:', 3) 2847fe090eb5SBram Moolenaar 2848fe090eb5SBram Moolenaar lines =<< trim END 2849fe090eb5SBram Moolenaar for nr: number in ['foo'] 2850fe090eb5SBram Moolenaar endfor 2851fe090eb5SBram Moolenaar END 2852fe090eb5SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1012: Type mismatch; expected number but got string', 1) 2853404557e6SBram Moolenaar 2854404557e6SBram Moolenaar lines =<< trim END 2855404557e6SBram Moolenaar for n : number in [1, 2] 2856404557e6SBram Moolenaar echo n 2857404557e6SBram Moolenaar endfor 2858404557e6SBram Moolenaar END 2859404557e6SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1059:', 1) 2860efc5db52SBram Moolenaar 2861efc5db52SBram Moolenaar lines =<< trim END 2862efc5db52SBram Moolenaar var d: dict<number> = {a: 1, b: 2} 2863efc5db52SBram Moolenaar for [k: job, v: job] in d->items() 2864efc5db52SBram Moolenaar echo k v 2865efc5db52SBram Moolenaar endfor 2866efc5db52SBram Moolenaar END 2867efc5db52SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1012: Type mismatch; expected job but got string', 2) 2868e8c4abbbSBram Moolenaarenddef 2869e8c4abbbSBram Moolenaar 2870ea87069dSBram Moolenaardef Test_for_loop_script_var() 2871ea87069dSBram Moolenaar # cannot use s:var in a :def function 2872ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 2873ea87069dSBram Moolenaar 2874ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 2875ea87069dSBram Moolenaar var lines =<< trim END 2876ea87069dSBram Moolenaar vim9script 2877ea87069dSBram Moolenaar var total = 0 2878ea87069dSBram Moolenaar for s:var in [1, 2, 3] 2879ea87069dSBram Moolenaar total += s:var 2880ea87069dSBram Moolenaar endfor 2881ea87069dSBram Moolenaar assert_equal(6, total) 2882ea87069dSBram Moolenaar 2883ea87069dSBram Moolenaar total = 0 2884ea87069dSBram Moolenaar for var in [1, 2, 3] 2885ea87069dSBram Moolenaar total += var 2886ea87069dSBram Moolenaar endfor 2887ea87069dSBram Moolenaar assert_equal(6, total) 2888ea87069dSBram Moolenaar END 2889ea87069dSBram Moolenaarenddef 2890ea87069dSBram Moolenaar 2891792f786aSBram Moolenaardef Test_for_loop_unpack() 28924b8a0651SBram Moolenaar var lines =<< trim END 2893792f786aSBram Moolenaar var result = [] 2894792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 2895792f786aSBram Moolenaar result->add(v1) 2896792f786aSBram Moolenaar result->add(v2) 2897792f786aSBram Moolenaar endfor 2898792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 2899792f786aSBram Moolenaar 2900792f786aSBram Moolenaar result = [] 2901792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 2902792f786aSBram Moolenaar result->add(v1) 2903792f786aSBram Moolenaar result->add(v2) 2904792f786aSBram Moolenaar result->add(v3) 2905792f786aSBram Moolenaar endfor 2906792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 2907792f786aSBram Moolenaar 29084b8a0651SBram Moolenaar result = [] 29094b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 29104b8a0651SBram Moolenaar result->add(&ts) 29114b8a0651SBram Moolenaar result->add(&sw) 29124b8a0651SBram Moolenaar endfor 29134b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 29144b8a0651SBram Moolenaar 29154b8a0651SBram Moolenaar var slist: list<string> 29164b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 29174b8a0651SBram Moolenaar slist->add($LOOPVAR) 29184b8a0651SBram Moolenaar slist->add(@r) 29194b8a0651SBram Moolenaar slist->add(v:errmsg) 29204b8a0651SBram Moolenaar endfor 29214b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 29224b8a0651SBram Moolenaar 29234b8a0651SBram Moolenaar slist = [] 29244b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 29254b8a0651SBram Moolenaar slist->add(g:globalvar) 29264b8a0651SBram Moolenaar slist->add(b:bufvar) 29274b8a0651SBram Moolenaar slist->add(w:winvar) 29284b8a0651SBram Moolenaar slist->add(t:tabvar) 29294b8a0651SBram Moolenaar endfor 29304b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 2931f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 2932b777da9bSBram Moolenaar 2933b777da9bSBram Moolenaar var res = [] 2934b777da9bSBram Moolenaar for [_, n, _] in [[1, 2, 3], [4, 5, 6]] 2935b777da9bSBram Moolenaar res->add(n) 2936b777da9bSBram Moolenaar endfor 2937b777da9bSBram Moolenaar assert_equal([2, 5], res) 29384b8a0651SBram Moolenaar END 29394b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 29404b8a0651SBram Moolenaar 29414b8a0651SBram Moolenaar lines =<< trim END 2942792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 2943792f786aSBram Moolenaar echo v1 v2 2944792f786aSBram Moolenaar endfor 2945792f786aSBram Moolenaar END 2946792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 2947792f786aSBram Moolenaar 2948792f786aSBram Moolenaar lines =<< trim END 2949792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 2950792f786aSBram Moolenaar echo v1 v2 2951792f786aSBram Moolenaar endfor 2952792f786aSBram Moolenaar END 2953792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 2954792f786aSBram Moolenaar 2955792f786aSBram Moolenaar lines =<< trim END 2956792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 2957792f786aSBram Moolenaar echo v1 2958792f786aSBram Moolenaar endfor 2959792f786aSBram Moolenaar END 2960792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 2961792f786aSBram Moolenaarenddef 2962792f786aSBram Moolenaar 2963c150c09eSBram Moolenaardef Test_for_loop_with_try_continue() 2964f2253963SBram Moolenaar var lines =<< trim END 2965c150c09eSBram Moolenaar var looped = 0 2966c150c09eSBram Moolenaar var cleanup = 0 2967c150c09eSBram Moolenaar for i in range(3) 2968c150c09eSBram Moolenaar looped += 1 2969c150c09eSBram Moolenaar try 2970c150c09eSBram Moolenaar eval [][0] 2971c150c09eSBram Moolenaar catch 2972c150c09eSBram Moolenaar continue 2973c150c09eSBram Moolenaar finally 2974c150c09eSBram Moolenaar cleanup += 1 2975c150c09eSBram Moolenaar endtry 2976c150c09eSBram Moolenaar endfor 2977c150c09eSBram Moolenaar assert_equal(3, looped) 2978c150c09eSBram Moolenaar assert_equal(3, cleanup) 2979f2253963SBram Moolenaar END 2980f2253963SBram Moolenaar CheckDefAndScriptSuccess(lines) 2981c150c09eSBram Moolenaarenddef 2982c150c09eSBram Moolenaar 2983d895b1d9Srbtnndef Test_while_skipped_block() 2984d895b1d9Srbtnn # test skipped blocks at outside of function 2985d895b1d9Srbtnn var lines =<< trim END 2986d895b1d9Srbtnn var result = [] 2987d895b1d9Srbtnn var n = 0 2988d895b1d9Srbtnn if true 2989d895b1d9Srbtnn n = 1 2990d895b1d9Srbtnn while n < 3 2991d895b1d9Srbtnn result += [n] 2992d895b1d9Srbtnn n += 1 2993d895b1d9Srbtnn endwhile 2994d895b1d9Srbtnn else 2995d895b1d9Srbtnn n = 3 2996d895b1d9Srbtnn while n < 5 2997d895b1d9Srbtnn result += [n] 2998d895b1d9Srbtnn n += 1 2999d895b1d9Srbtnn endwhile 3000d895b1d9Srbtnn endif 3001d895b1d9Srbtnn assert_equal([1, 2], result) 3002d895b1d9Srbtnn 3003d895b1d9Srbtnn result = [] 3004d895b1d9Srbtnn if false 3005d895b1d9Srbtnn n = 1 3006d895b1d9Srbtnn while n < 3 3007d895b1d9Srbtnn result += [n] 3008d895b1d9Srbtnn n += 1 3009d895b1d9Srbtnn endwhile 3010d895b1d9Srbtnn else 3011d895b1d9Srbtnn n = 3 3012d895b1d9Srbtnn while n < 5 3013d895b1d9Srbtnn result += [n] 3014d895b1d9Srbtnn n += 1 3015d895b1d9Srbtnn endwhile 3016d895b1d9Srbtnn endif 3017d895b1d9Srbtnn assert_equal([3, 4], result) 3018d895b1d9Srbtnn END 3019d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 3020d895b1d9Srbtnn 3021d895b1d9Srbtnn # test skipped blocks at inside of function 3022d895b1d9Srbtnn lines =<< trim END 3023d895b1d9Srbtnn def DefTrue() 3024d895b1d9Srbtnn var result = [] 3025d895b1d9Srbtnn var n = 0 3026d895b1d9Srbtnn if true 3027d895b1d9Srbtnn n = 1 3028d895b1d9Srbtnn while n < 3 3029d895b1d9Srbtnn result += [n] 3030d895b1d9Srbtnn n += 1 3031d895b1d9Srbtnn endwhile 3032d895b1d9Srbtnn else 3033d895b1d9Srbtnn n = 3 3034d895b1d9Srbtnn while n < 5 3035d895b1d9Srbtnn result += [n] 3036d895b1d9Srbtnn n += 1 3037d895b1d9Srbtnn endwhile 3038d895b1d9Srbtnn endif 3039d895b1d9Srbtnn assert_equal([1, 2], result) 3040d895b1d9Srbtnn enddef 3041d895b1d9Srbtnn DefTrue() 3042d895b1d9Srbtnn 3043d895b1d9Srbtnn def DefFalse() 3044d895b1d9Srbtnn var result = [] 3045d895b1d9Srbtnn var n = 0 3046d895b1d9Srbtnn if false 3047d895b1d9Srbtnn n = 1 3048d895b1d9Srbtnn while n < 3 3049d895b1d9Srbtnn result += [n] 3050d895b1d9Srbtnn n += 1 3051d895b1d9Srbtnn endwhile 3052d895b1d9Srbtnn else 3053d895b1d9Srbtnn n = 3 3054d895b1d9Srbtnn while n < 5 3055d895b1d9Srbtnn result += [n] 3056d895b1d9Srbtnn n += 1 3057d895b1d9Srbtnn endwhile 3058d895b1d9Srbtnn endif 3059d895b1d9Srbtnn assert_equal([3, 4], result) 3060d895b1d9Srbtnn enddef 3061d895b1d9Srbtnn DefFalse() 3062d895b1d9Srbtnn END 3063d895b1d9Srbtnn CheckDefAndScriptSuccess(lines) 3064d895b1d9Srbtnnenddef 3065d895b1d9Srbtnn 3066d0df1aacSBram Moolenaardef Test_while_loop() 3067cfcd011fSBram Moolenaar var result = '' 3068cfcd011fSBram Moolenaar var cnt = 0 3069d0df1aacSBram Moolenaar while cnt < 555 3070d0df1aacSBram Moolenaar if cnt == 3 3071d0df1aacSBram Moolenaar break 3072d0df1aacSBram Moolenaar endif 3073d0df1aacSBram Moolenaar cnt += 1 3074d0df1aacSBram Moolenaar if cnt == 2 3075d0df1aacSBram Moolenaar continue 3076d0df1aacSBram Moolenaar endif 3077d0df1aacSBram Moolenaar result ..= cnt .. '_' 3078d0df1aacSBram Moolenaar endwhile 3079d0df1aacSBram Moolenaar assert_equal('1_3_', result) 3080dee37dc7SBram Moolenaar 3081dee37dc7SBram Moolenaar var s = '' 30820123cc1eSBram Moolenaar while s == 'x' # {comment} 3083dee37dc7SBram Moolenaar endwhile 3084d0df1aacSBram Moolenaarenddef 3085d0df1aacSBram Moolenaar 3086e8c4abbbSBram Moolenaardef Test_while_loop_fails() 3087675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 3088675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 3089675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 3090675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 3091675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 3092675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 3093675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 30946628b7ebSBram Moolenaar 30956628b7ebSBram Moolenaar var lines =<< trim END 30966628b7ebSBram Moolenaar var s = '' 30976628b7ebSBram Moolenaar while s = '' 30986628b7ebSBram Moolenaar endwhile 30996628b7ebSBram Moolenaar END 31006628b7ebSBram Moolenaar CheckDefFailure(lines, 'E488:') 3101bd5da371SBram Moolenaarenddef 3102bd5da371SBram Moolenaar 31039645e2d9SBram Moolenaardef Test_interrupt_loop() 3104cfcd011fSBram Moolenaar var caught = false 3105cfcd011fSBram Moolenaar var x = 0 310697acfc78SBram Moolenaar try 31079645e2d9SBram Moolenaar while 1 31089645e2d9SBram Moolenaar x += 1 31099645e2d9SBram Moolenaar if x == 100 31109645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 31119645e2d9SBram Moolenaar endif 31129645e2d9SBram Moolenaar endwhile 311397acfc78SBram Moolenaar catch 311497acfc78SBram Moolenaar caught = true 311597acfc78SBram Moolenaar assert_equal(100, x) 311697acfc78SBram Moolenaar endtry 311797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 311825859dd7SBram Moolenaar # consume the CTRL-C 311925859dd7SBram Moolenaar getchar(0) 31209645e2d9SBram Moolenaarenddef 312120431c9dSBram Moolenaar 31224fdae999SBram Moolenaardef Test_automatic_line_continuation() 3123cfcd011fSBram Moolenaar var mylist = [ 31244fdae999SBram Moolenaar 'one', 31254fdae999SBram Moolenaar 'two', 31264fdae999SBram Moolenaar 'three', 3127f5be8cdbSBram Moolenaar ] # comment 31284fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 31294fdae999SBram Moolenaar 3130cfcd011fSBram Moolenaar var mydict = { 3131e0de171eSBram Moolenaar ['one']: 1, 3132e0de171eSBram Moolenaar ['two']: 2, 3133e0de171eSBram Moolenaar ['three']: 31344fdae999SBram Moolenaar 3, 3135f5be8cdbSBram Moolenaar } # comment 3136e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3137e0de171eSBram Moolenaar mydict = { 31382c330432SBram Moolenaar one: 1, # comment 31392c330432SBram Moolenaar two: # comment 31402c330432SBram Moolenaar 2, # comment 31412c330432SBram Moolenaar three: 3 # comment 31422c330432SBram Moolenaar } 3143e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3144e0de171eSBram Moolenaar mydict = { 31452c330432SBram Moolenaar one: 1, 31464fdae999SBram Moolenaar two: 31474fdae999SBram Moolenaar 2, 31482c330432SBram Moolenaar three: 3 31494fdae999SBram Moolenaar } 3150e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 3151e6085c53SBram Moolenaar 3152e6085c53SBram Moolenaar assert_equal( 3153e6085c53SBram Moolenaar ['one', 'two', 'three'], 3154e6085c53SBram Moolenaar split('one two three') 3155e6085c53SBram Moolenaar ) 31564fdae999SBram Moolenaarenddef 31574fdae999SBram Moolenaar 31587a092245SBram Moolenaardef Test_vim9_comment() 31597a092245SBram Moolenaar CheckScriptSuccess([ 31607a092245SBram Moolenaar 'vim9script', 31617a092245SBram Moolenaar '# something', 316293f82cbeSBram Moolenaar '#something', 316393f82cbeSBram Moolenaar '#{something', 31647a092245SBram Moolenaar ]) 316593f82cbeSBram Moolenaar 316693f82cbeSBram Moolenaar split Xfile 316793f82cbeSBram Moolenaar CheckScriptSuccess([ 316893f82cbeSBram Moolenaar 'vim9script', 316993f82cbeSBram Moolenaar 'edit #something', 317093f82cbeSBram Moolenaar ]) 317193f82cbeSBram Moolenaar CheckScriptSuccess([ 317293f82cbeSBram Moolenaar 'vim9script', 317393f82cbeSBram Moolenaar 'edit #{something', 317493f82cbeSBram Moolenaar ]) 317593f82cbeSBram Moolenaar close 317693f82cbeSBram Moolenaar 31777a092245SBram Moolenaar CheckScriptFailure([ 31787a092245SBram Moolenaar 'vim9script', 31797a092245SBram Moolenaar ':# something', 31807a092245SBram Moolenaar ], 'E488:') 31817a092245SBram Moolenaar CheckScriptFailure([ 31827a092245SBram Moolenaar '# something', 31837a092245SBram Moolenaar ], 'E488:') 31847a092245SBram Moolenaar CheckScriptFailure([ 31857a092245SBram Moolenaar ':# something', 31867a092245SBram Moolenaar ], 'E488:') 31877a092245SBram Moolenaar 31884a8d9f2eSBram Moolenaar { # block start 31894a8d9f2eSBram Moolenaar } # block end 31904a8d9f2eSBram Moolenaar CheckDefFailure([ 31914a8d9f2eSBram Moolenaar '{# comment', 31924a8d9f2eSBram Moolenaar ], 'E488:') 31934a8d9f2eSBram Moolenaar CheckDefFailure([ 31944a8d9f2eSBram Moolenaar '{', 31954a8d9f2eSBram Moolenaar '}# comment', 31964a8d9f2eSBram Moolenaar ], 'E488:') 31974a8d9f2eSBram Moolenaar 31984a8d9f2eSBram Moolenaar echo "yes" # comment 31994a8d9f2eSBram Moolenaar CheckDefFailure([ 32004a8d9f2eSBram Moolenaar 'echo "yes"# comment', 32014a8d9f2eSBram Moolenaar ], 'E488:') 32027a092245SBram Moolenaar CheckScriptSuccess([ 32037a092245SBram Moolenaar 'vim9script', 32047a092245SBram Moolenaar 'echo "yes" # something', 32057a092245SBram Moolenaar ]) 32067a092245SBram Moolenaar CheckScriptFailure([ 32077a092245SBram Moolenaar 'vim9script', 32087a092245SBram Moolenaar 'echo "yes"# something', 32097a092245SBram Moolenaar ], 'E121:') 32107a092245SBram Moolenaar CheckScriptFailure([ 32117a092245SBram Moolenaar 'vim9script', 32127a092245SBram Moolenaar 'echo# something', 3213f8103f27SBram Moolenaar ], 'E1144:') 32147a092245SBram Moolenaar CheckScriptFailure([ 32157a092245SBram Moolenaar 'echo "yes" # something', 32167a092245SBram Moolenaar ], 'E121:') 32177a092245SBram Moolenaar 32184a8d9f2eSBram Moolenaar exe "echo" # comment 32194a8d9f2eSBram Moolenaar CheckDefFailure([ 32204a8d9f2eSBram Moolenaar 'exe "echo"# comment', 32214a8d9f2eSBram Moolenaar ], 'E488:') 32224a8d9f2eSBram Moolenaar CheckScriptSuccess([ 32234a8d9f2eSBram Moolenaar 'vim9script', 32244a8d9f2eSBram Moolenaar 'exe "echo" # something', 32254a8d9f2eSBram Moolenaar ]) 32264a8d9f2eSBram Moolenaar CheckScriptFailure([ 32274a8d9f2eSBram Moolenaar 'vim9script', 32284a8d9f2eSBram Moolenaar 'exe "echo"# something', 32294a8d9f2eSBram Moolenaar ], 'E121:') 32304a8d9f2eSBram Moolenaar CheckScriptFailure([ 32314a8d9f2eSBram Moolenaar 'vim9script', 32324a8d9f2eSBram Moolenaar 'exe# something', 3233f8103f27SBram Moolenaar ], 'E1144:') 32344a8d9f2eSBram Moolenaar CheckScriptFailure([ 32354a8d9f2eSBram Moolenaar 'exe "echo" # something', 32364a8d9f2eSBram Moolenaar ], 'E121:') 32374a8d9f2eSBram Moolenaar 32387a092245SBram Moolenaar CheckDefFailure([ 32397a092245SBram Moolenaar 'try# comment', 32407a092245SBram Moolenaar ' echo "yes"', 32417a092245SBram Moolenaar 'catch', 32427a092245SBram Moolenaar 'endtry', 3243f8103f27SBram Moolenaar ], 'E1144:') 32442c5ed4e3SBram Moolenaar CheckScriptFailure([ 32452c5ed4e3SBram Moolenaar 'vim9script', 32462c5ed4e3SBram Moolenaar 'try# comment', 32472c5ed4e3SBram Moolenaar 'echo "yes"', 3248f8103f27SBram Moolenaar ], 'E1144:') 32497a092245SBram Moolenaar CheckDefFailure([ 32507a092245SBram Moolenaar 'try', 3251a72cfb80SBram Moolenaar ' throw#comment', 3252a72cfb80SBram Moolenaar 'catch', 3253a72cfb80SBram Moolenaar 'endtry', 3254f8103f27SBram Moolenaar ], 'E1144:') 3255a72cfb80SBram Moolenaar CheckDefFailure([ 3256a72cfb80SBram Moolenaar 'try', 3257a72cfb80SBram Moolenaar ' throw "yes"#comment', 3258a72cfb80SBram Moolenaar 'catch', 3259a72cfb80SBram Moolenaar 'endtry', 3260a72cfb80SBram Moolenaar ], 'E488:') 3261a72cfb80SBram Moolenaar CheckDefFailure([ 3262a72cfb80SBram Moolenaar 'try', 32637a092245SBram Moolenaar ' echo "yes"', 32647a092245SBram Moolenaar 'catch# comment', 32657a092245SBram Moolenaar 'endtry', 3266f8103f27SBram Moolenaar ], 'E1144:') 32672c5ed4e3SBram Moolenaar CheckScriptFailure([ 32682c5ed4e3SBram Moolenaar 'vim9script', 32692c5ed4e3SBram Moolenaar 'try', 32702c5ed4e3SBram Moolenaar ' echo "yes"', 32712c5ed4e3SBram Moolenaar 'catch# comment', 32722c5ed4e3SBram Moolenaar 'endtry', 3273f8103f27SBram Moolenaar ], 'E1144:') 32742c5ed4e3SBram Moolenaar CheckDefFailure([ 32752c5ed4e3SBram Moolenaar 'try', 32762c5ed4e3SBram Moolenaar ' echo "yes"', 32772c5ed4e3SBram Moolenaar 'catch /pat/# comment', 32782c5ed4e3SBram Moolenaar 'endtry', 32792c5ed4e3SBram Moolenaar ], 'E488:') 32807a092245SBram Moolenaar CheckDefFailure([ 32817a092245SBram Moolenaar 'try', 32827a092245SBram Moolenaar 'echo "yes"', 32837a092245SBram Moolenaar 'catch', 32847a092245SBram Moolenaar 'endtry# comment', 3285f8103f27SBram Moolenaar ], 'E1144:') 32862c5ed4e3SBram Moolenaar CheckScriptFailure([ 32872c5ed4e3SBram Moolenaar 'vim9script', 32882c5ed4e3SBram Moolenaar 'try', 32892c5ed4e3SBram Moolenaar ' echo "yes"', 32902c5ed4e3SBram Moolenaar 'catch', 32912c5ed4e3SBram Moolenaar 'endtry# comment', 3292f8103f27SBram Moolenaar ], 'E1144:') 32932c5ed4e3SBram Moolenaar 32942c5ed4e3SBram Moolenaar CheckScriptSuccess([ 32952c5ed4e3SBram Moolenaar 'vim9script', 32962c5ed4e3SBram Moolenaar 'hi # comment', 32972c5ed4e3SBram Moolenaar ]) 32982c5ed4e3SBram Moolenaar CheckScriptFailure([ 32992c5ed4e3SBram Moolenaar 'vim9script', 33002c5ed4e3SBram Moolenaar 'hi# comment', 3301f8103f27SBram Moolenaar ], 'E1144:') 33021966c248SBram Moolenaar CheckScriptSuccess([ 33031966c248SBram Moolenaar 'vim9script', 33041966c248SBram Moolenaar 'hi Search # comment', 33051966c248SBram Moolenaar ]) 33061966c248SBram Moolenaar CheckScriptFailure([ 33071966c248SBram Moolenaar 'vim9script', 33081966c248SBram Moolenaar 'hi Search# comment', 33091966c248SBram Moolenaar ], 'E416:') 33101966c248SBram Moolenaar CheckScriptSuccess([ 33111966c248SBram Moolenaar 'vim9script', 33121966c248SBram Moolenaar 'hi link This Search # comment', 33131966c248SBram Moolenaar ]) 33141966c248SBram Moolenaar CheckScriptFailure([ 33151966c248SBram Moolenaar 'vim9script', 33161966c248SBram Moolenaar 'hi link This That# comment', 33171966c248SBram Moolenaar ], 'E413:') 33181966c248SBram Moolenaar CheckScriptSuccess([ 33191966c248SBram Moolenaar 'vim9script', 33201966c248SBram Moolenaar 'hi clear This # comment', 33211966c248SBram Moolenaar 'hi clear # comment', 33221966c248SBram Moolenaar ]) 3323f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 3324f5be8cdbSBram Moolenaar # hi clear This# comment', 33251966c248SBram Moolenaar CheckScriptFailure([ 33261966c248SBram Moolenaar 'vim9script', 33271966c248SBram Moolenaar 'hi clear# comment', 33281966c248SBram Moolenaar ], 'E416:') 33291966c248SBram Moolenaar 33301966c248SBram Moolenaar CheckScriptSuccess([ 33311966c248SBram Moolenaar 'vim9script', 33321966c248SBram Moolenaar 'hi Group term=bold', 33331966c248SBram Moolenaar 'match Group /todo/ # comment', 33341966c248SBram Moolenaar ]) 33351966c248SBram Moolenaar CheckScriptFailure([ 33361966c248SBram Moolenaar 'vim9script', 33371966c248SBram Moolenaar 'hi Group term=bold', 33381966c248SBram Moolenaar 'match Group /todo/# comment', 33391966c248SBram Moolenaar ], 'E488:') 33401966c248SBram Moolenaar CheckScriptSuccess([ 33411966c248SBram Moolenaar 'vim9script', 33421966c248SBram Moolenaar 'match # comment', 33431966c248SBram Moolenaar ]) 33441966c248SBram Moolenaar CheckScriptFailure([ 33451966c248SBram Moolenaar 'vim9script', 33461966c248SBram Moolenaar 'match# comment', 3347f8103f27SBram Moolenaar ], 'E1144:') 33481966c248SBram Moolenaar CheckScriptSuccess([ 33491966c248SBram Moolenaar 'vim9script', 33501966c248SBram Moolenaar 'match none # comment', 33511966c248SBram Moolenaar ]) 33521966c248SBram Moolenaar CheckScriptFailure([ 33531966c248SBram Moolenaar 'vim9script', 33541966c248SBram Moolenaar 'match none# comment', 33551966c248SBram Moolenaar ], 'E475:') 33561966c248SBram Moolenaar 33571966c248SBram Moolenaar CheckScriptSuccess([ 33581966c248SBram Moolenaar 'vim9script', 33591966c248SBram Moolenaar 'menutrans clear # comment', 33601966c248SBram Moolenaar ]) 33611966c248SBram Moolenaar CheckScriptFailure([ 33621966c248SBram Moolenaar 'vim9script', 33631966c248SBram Moolenaar 'menutrans clear# comment text', 33641966c248SBram Moolenaar ], 'E474:') 33651966c248SBram Moolenaar 33661966c248SBram Moolenaar CheckScriptSuccess([ 33671966c248SBram Moolenaar 'vim9script', 33681966c248SBram Moolenaar 'syntax clear # comment', 33691966c248SBram Moolenaar ]) 33701966c248SBram Moolenaar CheckScriptFailure([ 33711966c248SBram Moolenaar 'vim9script', 33721966c248SBram Moolenaar 'syntax clear# comment text', 33731966c248SBram Moolenaar ], 'E28:') 33741966c248SBram Moolenaar CheckScriptSuccess([ 33751966c248SBram Moolenaar 'vim9script', 33761966c248SBram Moolenaar 'syntax keyword Word some', 33771966c248SBram Moolenaar 'syntax clear Word # comment', 33781966c248SBram Moolenaar ]) 33791966c248SBram Moolenaar CheckScriptFailure([ 33801966c248SBram Moolenaar 'vim9script', 33811966c248SBram Moolenaar 'syntax keyword Word some', 33821966c248SBram Moolenaar 'syntax clear Word# comment text', 33831966c248SBram Moolenaar ], 'E28:') 33841966c248SBram Moolenaar 33851966c248SBram Moolenaar CheckScriptSuccess([ 33861966c248SBram Moolenaar 'vim9script', 33871966c248SBram Moolenaar 'syntax list # comment', 33881966c248SBram Moolenaar ]) 33891966c248SBram Moolenaar CheckScriptFailure([ 33901966c248SBram Moolenaar 'vim9script', 33911966c248SBram Moolenaar 'syntax list# comment text', 33921966c248SBram Moolenaar ], 'E28:') 33931966c248SBram Moolenaar 33941966c248SBram Moolenaar CheckScriptSuccess([ 33951966c248SBram Moolenaar 'vim9script', 33961966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 33971966c248SBram Moolenaar ]) 33981966c248SBram Moolenaar CheckScriptFailure([ 33991966c248SBram Moolenaar 'vim9script', 34001966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 34011966c248SBram Moolenaar ], 'E475:') 34021966c248SBram Moolenaar 34031966c248SBram Moolenaar CheckScriptSuccess([ 34041966c248SBram Moolenaar 'vim9script', 34051966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 34061966c248SBram Moolenaar ]) 34071966c248SBram Moolenaar CheckScriptFailure([ 34081966c248SBram Moolenaar 'vim9script', 34091966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 34101966c248SBram Moolenaar ], 'E789:') 34111966c248SBram Moolenaar 34121966c248SBram Moolenaar CheckScriptSuccess([ 34131966c248SBram Moolenaar 'vim9script', 34141966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 34151966c248SBram Moolenaar ]) 34161966c248SBram Moolenaar CheckScriptFailure([ 34171966c248SBram Moolenaar 'vim9script', 34181966c248SBram Moolenaar 'syntax match Word /pat/# comment', 34191966c248SBram Moolenaar ], 'E402:') 34201966c248SBram Moolenaar 34211966c248SBram Moolenaar CheckScriptSuccess([ 34221966c248SBram Moolenaar 'vim9script', 34231966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 34241966c248SBram Moolenaar ]) 34251966c248SBram Moolenaar CheckScriptFailure([ 34261966c248SBram Moolenaar 'vim9script', 34271966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 34281966c248SBram Moolenaar ], 'E475:') 34291966c248SBram Moolenaar CheckScriptFailure([ 34301966c248SBram Moolenaar 'vim9script', 34311966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 34321966c248SBram Moolenaar ], 'E406:') 34331966c248SBram Moolenaar CheckScriptFailure([ 34341966c248SBram Moolenaar 'vim9script', 34351966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 34361966c248SBram Moolenaar ], 'E475:') 34371966c248SBram Moolenaar 34381966c248SBram Moolenaar CheckScriptSuccess([ 34391966c248SBram Moolenaar 'vim9script', 34401966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 34411966c248SBram Moolenaar ]) 34421966c248SBram Moolenaar CheckScriptFailure([ 34431966c248SBram Moolenaar 'vim9script', 34441966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 3445d032f34aSBram Moolenaar ], 'E402:') 34461966c248SBram Moolenaar 34471966c248SBram Moolenaar CheckScriptSuccess([ 34481966c248SBram Moolenaar 'vim9script', 34491966c248SBram Moolenaar 'syntax sync # comment', 34501966c248SBram Moolenaar ]) 34511966c248SBram Moolenaar CheckScriptFailure([ 34521966c248SBram Moolenaar 'vim9script', 34531966c248SBram Moolenaar 'syntax sync# comment', 34541966c248SBram Moolenaar ], 'E404:') 34551966c248SBram Moolenaar CheckScriptSuccess([ 34561966c248SBram Moolenaar 'vim9script', 34571966c248SBram Moolenaar 'syntax sync ccomment # comment', 34581966c248SBram Moolenaar ]) 34591966c248SBram Moolenaar CheckScriptFailure([ 34601966c248SBram Moolenaar 'vim9script', 34611966c248SBram Moolenaar 'syntax sync ccomment# comment', 34621966c248SBram Moolenaar ], 'E404:') 34631966c248SBram Moolenaar 34641966c248SBram Moolenaar CheckScriptSuccess([ 34651966c248SBram Moolenaar 'vim9script', 34661966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 34671966c248SBram Moolenaar ]) 34681966c248SBram Moolenaar CheckScriptFailure([ 34691966c248SBram Moolenaar 'vim9script', 34701966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 34711966c248SBram Moolenaar ], 'E475:') 3472a72cfb80SBram Moolenaar 3473a72cfb80SBram Moolenaar CheckScriptSuccess([ 3474a72cfb80SBram Moolenaar 'vim9script', 3475a72cfb80SBram Moolenaar 'command Echo echo # comment', 3476a72cfb80SBram Moolenaar 'command Echo # comment', 34772d870f8dSBram Moolenaar 'delcommand Echo', 3478a72cfb80SBram Moolenaar ]) 3479a72cfb80SBram Moolenaar CheckScriptFailure([ 3480a72cfb80SBram Moolenaar 'vim9script', 3481a72cfb80SBram Moolenaar 'command Echo echo# comment', 3482a72cfb80SBram Moolenaar 'Echo', 3483f8103f27SBram Moolenaar ], 'E1144:') 34842d870f8dSBram Moolenaar delcommand Echo 348570249ee8SBram Moolenaar 348670249ee8SBram Moolenaar var curdir = getcwd() 348770249ee8SBram Moolenaar CheckScriptSuccess([ 348870249ee8SBram Moolenaar 'command Echo cd " comment', 348970249ee8SBram Moolenaar 'Echo', 349070249ee8SBram Moolenaar 'delcommand Echo', 349170249ee8SBram Moolenaar ]) 349270249ee8SBram Moolenaar CheckScriptSuccess([ 3493090728adSBram Moolenaar 'vim9script', 349470249ee8SBram Moolenaar 'command Echo cd # comment', 349570249ee8SBram Moolenaar 'Echo', 349670249ee8SBram Moolenaar 'delcommand Echo', 349770249ee8SBram Moolenaar ]) 349870249ee8SBram Moolenaar CheckScriptFailure([ 349970249ee8SBram Moolenaar 'vim9script', 350070249ee8SBram Moolenaar 'command Echo cd " comment', 350170249ee8SBram Moolenaar 'Echo', 350270249ee8SBram Moolenaar ], 'E344:') 350370249ee8SBram Moolenaar delcommand Echo 350470249ee8SBram Moolenaar chdir(curdir) 350570249ee8SBram Moolenaar 3506a72cfb80SBram Moolenaar CheckScriptFailure([ 3507a72cfb80SBram Moolenaar 'vim9script', 3508a72cfb80SBram Moolenaar 'command Echo# comment', 3509a72cfb80SBram Moolenaar ], 'E182:') 3510a72cfb80SBram Moolenaar CheckScriptFailure([ 3511a72cfb80SBram Moolenaar 'vim9script', 3512a72cfb80SBram Moolenaar 'command Echo echo', 3513a72cfb80SBram Moolenaar 'command Echo# comment', 3514a72cfb80SBram Moolenaar ], 'E182:') 35152d870f8dSBram Moolenaar delcommand Echo 3516a72cfb80SBram Moolenaar 3517a72cfb80SBram Moolenaar CheckScriptSuccess([ 3518a72cfb80SBram Moolenaar 'vim9script', 3519a72cfb80SBram Moolenaar 'function # comment', 3520a72cfb80SBram Moolenaar ]) 3521a72cfb80SBram Moolenaar CheckScriptFailure([ 3522a72cfb80SBram Moolenaar 'vim9script', 35239898107fSBram Moolenaar 'function " comment', 35249898107fSBram Moolenaar ], 'E129:') 35259898107fSBram Moolenaar CheckScriptFailure([ 35269898107fSBram Moolenaar 'vim9script', 3527a72cfb80SBram Moolenaar 'function# comment', 3528f8103f27SBram Moolenaar ], 'E1144:') 3529a72cfb80SBram Moolenaar CheckScriptSuccess([ 3530a72cfb80SBram Moolenaar 'vim9script', 3531a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 3532a72cfb80SBram Moolenaar ]) 3533a72cfb80SBram Moolenaar CheckScriptFailure([ 3534a72cfb80SBram Moolenaar 'vim9script', 3535a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 3536a72cfb80SBram Moolenaar ], 'E488:') 3537a72cfb80SBram Moolenaar 3538a72cfb80SBram Moolenaar CheckScriptSuccess([ 3539a72cfb80SBram Moolenaar 'vim9script', 35404c17ad94SBram Moolenaar 'func g:DeleteMeA()', 3541a72cfb80SBram Moolenaar 'endfunc', 35424c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 3543a72cfb80SBram Moolenaar ]) 3544a72cfb80SBram Moolenaar CheckScriptFailure([ 3545a72cfb80SBram Moolenaar 'vim9script', 35464c17ad94SBram Moolenaar 'func g:DeleteMeB()', 3547a72cfb80SBram Moolenaar 'endfunc', 35484c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 3549a72cfb80SBram Moolenaar ], 'E488:') 3550a72cfb80SBram Moolenaar 3551a72cfb80SBram Moolenaar CheckScriptSuccess([ 3552a72cfb80SBram Moolenaar 'vim9script', 3553a72cfb80SBram Moolenaar 'call execute("ls") # comment', 3554a72cfb80SBram Moolenaar ]) 3555a72cfb80SBram Moolenaar CheckScriptFailure([ 3556a72cfb80SBram Moolenaar 'vim9script', 3557a72cfb80SBram Moolenaar 'call execute("ls")# comment', 3558a72cfb80SBram Moolenaar ], 'E488:') 3559e7e4838fSBram Moolenaar 3560e7e4838fSBram Moolenaar CheckScriptFailure([ 3561e7e4838fSBram Moolenaar 'def Test() " comment', 3562e7e4838fSBram Moolenaar 'enddef', 3563e7e4838fSBram Moolenaar ], 'E488:') 3564e7e4838fSBram Moolenaar CheckScriptFailure([ 3565e7e4838fSBram Moolenaar 'vim9script', 3566e7e4838fSBram Moolenaar 'def Test() " comment', 3567e7e4838fSBram Moolenaar 'enddef', 3568e7e4838fSBram Moolenaar ], 'E488:') 3569e7e4838fSBram Moolenaar 3570e7e4838fSBram Moolenaar CheckScriptSuccess([ 3571e7e4838fSBram Moolenaar 'func Test() " comment', 3572e7e4838fSBram Moolenaar 'endfunc', 35732d870f8dSBram Moolenaar 'delfunc Test', 3574e7e4838fSBram Moolenaar ]) 35759898107fSBram Moolenaar CheckScriptSuccess([ 3576e7e4838fSBram Moolenaar 'vim9script', 3577e7e4838fSBram Moolenaar 'func Test() " comment', 3578e7e4838fSBram Moolenaar 'endfunc', 35799898107fSBram Moolenaar ]) 3580e7e4838fSBram Moolenaar 3581e7e4838fSBram Moolenaar CheckScriptSuccess([ 3582e7e4838fSBram Moolenaar 'def Test() # comment', 3583e7e4838fSBram Moolenaar 'enddef', 3584e7e4838fSBram Moolenaar ]) 3585e7e4838fSBram Moolenaar CheckScriptFailure([ 3586e7e4838fSBram Moolenaar 'func Test() # comment', 3587e7e4838fSBram Moolenaar 'endfunc', 3588e7e4838fSBram Moolenaar ], 'E488:') 35890f37e356SBram Moolenaar 35900f37e356SBram Moolenaar var lines =<< trim END 35910f37e356SBram Moolenaar vim9script 35920f37e356SBram Moolenaar syn region Text 35930f37e356SBram Moolenaar \ start='foo' 35940f37e356SBram Moolenaar #\ comment 35950f37e356SBram Moolenaar \ end='bar' 35965072b47aSBram Moolenaar syn region Text start='foo' 35975072b47aSBram Moolenaar #\ comment 35985072b47aSBram Moolenaar \ end='bar' 35990f37e356SBram Moolenaar END 36000f37e356SBram Moolenaar CheckScriptSuccess(lines) 36010f37e356SBram Moolenaar 36020f37e356SBram Moolenaar lines =<< trim END 36030f37e356SBram Moolenaar vim9script 36040f37e356SBram Moolenaar syn region Text 36050f37e356SBram Moolenaar \ start='foo' 36060f37e356SBram Moolenaar "\ comment 36070f37e356SBram Moolenaar \ end='bar' 36080f37e356SBram Moolenaar END 36090f37e356SBram Moolenaar CheckScriptFailure(lines, 'E399:') 36102c5ed4e3SBram Moolenaarenddef 36112c5ed4e3SBram Moolenaar 36122c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 36132c5ed4e3SBram Moolenaar CheckCanRunGui 36142c5ed4e3SBram Moolenaar 36152c5ed4e3SBram Moolenaar CheckScriptFailure([ 36162c5ed4e3SBram Moolenaar 'vim9script', 36172c5ed4e3SBram Moolenaar 'gui#comment' 3618f8103f27SBram Moolenaar ], 'E1144:') 36192c5ed4e3SBram Moolenaar CheckScriptFailure([ 36202c5ed4e3SBram Moolenaar 'vim9script', 36212c5ed4e3SBram Moolenaar 'gui -f#comment' 3622b8bd2e6eSBram Moolenaar ], 'E194:') 36237a092245SBram Moolenaarenddef 36247a092245SBram Moolenaar 3625a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 36266797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 36276797966dSBram Moolenaar au TabEnter *.x g:entered = 2 3628a26b9700SBram Moolenaar 3629a26b9700SBram Moolenaar edit test.vim 3630a26b9700SBram Moolenaar doautocmd TabEnter #comment 3631a26b9700SBram Moolenaar assert_equal(1, g:entered) 3632a26b9700SBram Moolenaar 3633a26b9700SBram Moolenaar doautocmd TabEnter f.x 3634a26b9700SBram Moolenaar assert_equal(2, g:entered) 3635a26b9700SBram Moolenaar 3636a26b9700SBram Moolenaar g:entered = 0 3637a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 3638a26b9700SBram Moolenaar assert_equal(2, g:entered) 3639a26b9700SBram Moolenaar 3640a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 3641a26b9700SBram Moolenaar 3642a26b9700SBram Moolenaar au! TabEnter 3643a26b9700SBram Moolenaar unlet g:entered 3644d72c1bf0SBram Moolenaar 3645d72c1bf0SBram Moolenaar CheckScriptSuccess([ 3646d72c1bf0SBram Moolenaar 'vim9script', 36476797966dSBram Moolenaar 'g:var = 123', 3648e55b1c09SBram Moolenaar 'b:var = 456', 3649e55b1c09SBram Moolenaar 'w:var = 777', 3650e55b1c09SBram Moolenaar 't:var = 888', 3651d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 3652d72c1bf0SBram Moolenaar ]) 3653d72c1bf0SBram Moolenaar 3654d72c1bf0SBram Moolenaar CheckScriptFailure([ 3655d72c1bf0SBram Moolenaar 'vim9script', 3656cfcd011fSBram Moolenaar 'let var = 123', 3657cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 3658cfcd011fSBram Moolenaar 3659cfcd011fSBram Moolenaar CheckScriptFailure([ 3660cfcd011fSBram Moolenaar 'vim9script', 3661cfcd011fSBram Moolenaar 'var g:var = 123', 3662e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 3663e55b1c09SBram Moolenaar 3664e55b1c09SBram Moolenaar CheckScriptFailure([ 3665e55b1c09SBram Moolenaar 'vim9script', 3666cfcd011fSBram Moolenaar 'var b:var = 123', 3667e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 3668e55b1c09SBram Moolenaar 3669e55b1c09SBram Moolenaar CheckScriptFailure([ 3670e55b1c09SBram Moolenaar 'vim9script', 3671cfcd011fSBram Moolenaar 'var w:var = 123', 3672e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 3673e55b1c09SBram Moolenaar 3674e55b1c09SBram Moolenaar CheckScriptFailure([ 3675e55b1c09SBram Moolenaar 'vim9script', 3676cfcd011fSBram Moolenaar 'var t:var = 123', 3677e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 3678e55b1c09SBram Moolenaar 3679e55b1c09SBram Moolenaar CheckScriptFailure([ 3680e55b1c09SBram Moolenaar 'vim9script', 3681cfcd011fSBram Moolenaar 'var v:version = 123', 3682e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 3683e55b1c09SBram Moolenaar 3684e55b1c09SBram Moolenaar CheckScriptFailure([ 3685e55b1c09SBram Moolenaar 'vim9script', 3686cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 3687e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 36886797966dSBram Moolenaar 36896797966dSBram Moolenaar CheckScriptFailure([ 36906797966dSBram Moolenaar 'vim9script', 36916797966dSBram Moolenaar 'g:var = 123', 369232e35117SBram Moolenaar 'unlet g:var# comment1', 3693d72c1bf0SBram Moolenaar ], 'E108:') 3694d72c1bf0SBram Moolenaar 3695d72c1bf0SBram Moolenaar CheckScriptFailure([ 3696d72c1bf0SBram Moolenaar 'let g:var = 123', 3697d72c1bf0SBram Moolenaar 'unlet g:var # something', 3698d72c1bf0SBram Moolenaar ], 'E488:') 3699faac4104SBram Moolenaar 3700faac4104SBram Moolenaar CheckScriptSuccess([ 3701faac4104SBram Moolenaar 'vim9script', 370232e35117SBram Moolenaar 'if 1 # comment2', 3703faac4104SBram Moolenaar ' echo "yes"', 3704faac4104SBram Moolenaar 'elseif 2 #comment', 3705faac4104SBram Moolenaar ' echo "no"', 3706faac4104SBram Moolenaar 'endif', 3707faac4104SBram Moolenaar ]) 3708faac4104SBram Moolenaar 3709faac4104SBram Moolenaar CheckScriptFailure([ 3710faac4104SBram Moolenaar 'vim9script', 371132e35117SBram Moolenaar 'if 1# comment3', 3712faac4104SBram Moolenaar ' echo "yes"', 3713faac4104SBram Moolenaar 'endif', 3714fae55a9cSBram Moolenaar ], 'E488:') 3715faac4104SBram Moolenaar 3716faac4104SBram Moolenaar CheckScriptFailure([ 3717faac4104SBram Moolenaar 'vim9script', 371832e35117SBram Moolenaar 'if 0 # comment4', 3719faac4104SBram Moolenaar ' echo "yes"', 3720faac4104SBram Moolenaar 'elseif 2#comment', 3721faac4104SBram Moolenaar ' echo "no"', 3722faac4104SBram Moolenaar 'endif', 3723fae55a9cSBram Moolenaar ], 'E488:') 3724faac4104SBram Moolenaar 3725faac4104SBram Moolenaar CheckScriptSuccess([ 3726faac4104SBram Moolenaar 'vim9script', 3727cfcd011fSBram Moolenaar 'var v = 1 # comment5', 3728faac4104SBram Moolenaar ]) 3729faac4104SBram Moolenaar 3730faac4104SBram Moolenaar CheckScriptFailure([ 3731faac4104SBram Moolenaar 'vim9script', 3732cfcd011fSBram Moolenaar 'var v = 1# comment6', 3733fae55a9cSBram Moolenaar ], 'E488:') 3734faac4104SBram Moolenaar 3735faac4104SBram Moolenaar CheckScriptSuccess([ 3736faac4104SBram Moolenaar 'vim9script', 3737faac4104SBram Moolenaar 'new' 3738d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3739df069eecSBram Moolenaar ':$', 3740faac4104SBram Moolenaar 'dsearch /pat/ #comment', 3741faac4104SBram Moolenaar 'bwipe!', 3742faac4104SBram Moolenaar ]) 3743faac4104SBram Moolenaar 3744f5be8cdbSBram Moolenaar CheckScriptFailure([ 3745f5be8cdbSBram Moolenaar 'vim9script', 3746f5be8cdbSBram Moolenaar 'new' 3747d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 3748f5be8cdbSBram Moolenaar ':$', 3749f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 3750f5be8cdbSBram Moolenaar 'bwipe!', 3751f5be8cdbSBram Moolenaar ], 'E488:') 3752f5be8cdbSBram Moolenaar 3753f5be8cdbSBram Moolenaar CheckScriptFailure([ 3754f5be8cdbSBram Moolenaar 'vim9script', 3755f5be8cdbSBram Moolenaar 'func! SomeFunc()', 3756f5be8cdbSBram Moolenaar ], 'E477:') 3757a26b9700SBram Moolenaarenddef 3758a26b9700SBram Moolenaar 37597e5bd91dSBram Moolenaardef Test_finish() 3760cfcd011fSBram Moolenaar var lines =<< trim END 37617e5bd91dSBram Moolenaar vim9script 37626797966dSBram Moolenaar g:res = 'one' 37637e5bd91dSBram Moolenaar if v:false | finish | endif 37646797966dSBram Moolenaar g:res = 'two' 37657e5bd91dSBram Moolenaar finish 37666797966dSBram Moolenaar g:res = 'three' 37677e5bd91dSBram Moolenaar END 37687e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 37697e5bd91dSBram Moolenaar source Xfinished 37707e5bd91dSBram Moolenaar assert_equal('two', g:res) 37717e5bd91dSBram Moolenaar 37727e5bd91dSBram Moolenaar unlet g:res 37737e5bd91dSBram Moolenaar delete('Xfinished') 37747e5bd91dSBram Moolenaarenddef 37757e5bd91dSBram Moolenaar 3776a5d0077eSBram Moolenaardef Test_forward_declaration() 3777cfcd011fSBram Moolenaar var lines =<< trim END 3778a5d0077eSBram Moolenaar vim9script 3779a5d0077eSBram Moolenaar def GetValue(): string 3780a5d0077eSBram Moolenaar return theVal 3781a5d0077eSBram Moolenaar enddef 3782cfcd011fSBram Moolenaar var theVal = 'something' 3783822ba247SBram Moolenaar g:initVal = GetValue() 3784a5d0077eSBram Moolenaar theVal = 'else' 3785a5d0077eSBram Moolenaar g:laterVal = GetValue() 3786a5d0077eSBram Moolenaar END 3787a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 3788a5d0077eSBram Moolenaar source Xforward 3789a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 3790a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 3791a5d0077eSBram Moolenaar 3792a5d0077eSBram Moolenaar unlet g:initVal 3793a5d0077eSBram Moolenaar unlet g:laterVal 3794a5d0077eSBram Moolenaar delete('Xforward') 3795a5d0077eSBram Moolenaarenddef 3796a5d0077eSBram Moolenaar 37979721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 3798a6294955SBram Moolenaar var vim9_lines =<< trim END 3799a6294955SBram Moolenaar vim9script 3800a6294955SBram Moolenaar var local = 'local' 3801a6294955SBram Moolenaar g:global = 'global' 3802a6294955SBram Moolenaar export var exported = 'exported' 3803a6294955SBram Moolenaar export def GetText(): string 3804a6294955SBram Moolenaar return 'text' 3805a6294955SBram Moolenaar enddef 3806a6294955SBram Moolenaar END 3807a6294955SBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 3808a6294955SBram Moolenaar 3809cfcd011fSBram Moolenaar var legacy_lines =<< trim END 38109721fb4eSBram Moolenaar source Xvim9_script.vim 38119721fb4eSBram Moolenaar 38129721fb4eSBram Moolenaar call assert_false(exists('local')) 38139721fb4eSBram Moolenaar call assert_false(exists('exported')) 38149721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 38159721fb4eSBram Moolenaar call assert_equal('global', global) 38169721fb4eSBram Moolenaar call assert_equal('global', g:global) 38179721fb4eSBram Moolenaar 38189721fb4eSBram Moolenaar " imported variable becomes script-local 38199721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 38209721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 38219721fb4eSBram Moolenaar call assert_false(exists('exported')) 38229721fb4eSBram Moolenaar 38239721fb4eSBram Moolenaar " imported function becomes script-local 38249721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 38259721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 38269721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 38279721fb4eSBram Moolenaar END 38289721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 38299721fb4eSBram Moolenaar 38309721fb4eSBram Moolenaar source Xlegacy_script.vim 38319721fb4eSBram Moolenaar assert_equal('global', g:global) 3832f5be8cdbSBram Moolenaar unlet g:global 38339721fb4eSBram Moolenaar 38349721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 38359721fb4eSBram Moolenaar delete('Xvim9_script.vim') 38369721fb4eSBram Moolenaarenddef 3837a5d0077eSBram Moolenaar 3838e535db86SBram Moolenaardef Test_declare_script_in_func() 3839e535db86SBram Moolenaar var lines =<< trim END 3840e535db86SBram Moolenaar vim9script 3841e535db86SBram Moolenaar func Declare() 3842e535db86SBram Moolenaar let s:local = 123 3843e535db86SBram Moolenaar endfunc 3844e535db86SBram Moolenaar Declare() 3845e535db86SBram Moolenaar assert_equal(123, local) 3846e535db86SBram Moolenaar 3847e535db86SBram Moolenaar var error: string 3848e535db86SBram Moolenaar try 3849e535db86SBram Moolenaar local = 'asdf' 3850e535db86SBram Moolenaar catch 3851e535db86SBram Moolenaar error = v:exception 3852e535db86SBram Moolenaar endtry 3853e535db86SBram Moolenaar assert_match('E1012: Type mismatch; expected number but got string', error) 3854e535db86SBram Moolenaar 3855e535db86SBram Moolenaar lockvar local 3856e535db86SBram Moolenaar try 3857e535db86SBram Moolenaar local = 999 3858e535db86SBram Moolenaar catch 3859e535db86SBram Moolenaar error = v:exception 3860e535db86SBram Moolenaar endtry 3861e535db86SBram Moolenaar assert_match('E741: Value is locked: local', error) 3862e535db86SBram Moolenaar END 3863e535db86SBram Moolenaar CheckScriptSuccess(lines) 3864e535db86SBram Moolenaarenddef 3865e535db86SBram Moolenaar 3866e535db86SBram Moolenaar 38677d699701SBram Moolenaarfunc Test_vim9script_not_global() 38687d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 38697d699701SBram Moolenaar let vim9lines =<< trim END 38707d699701SBram Moolenaar vim9script 3871cfcd011fSBram Moolenaar var name = 'local' 38727d699701SBram Moolenaar func TheFunc() 38737d699701SBram Moolenaar echo 'local' 38747d699701SBram Moolenaar endfunc 38757d699701SBram Moolenaar def DefFunc() 38767d699701SBram Moolenaar echo 'local' 38777d699701SBram Moolenaar enddef 38787d699701SBram Moolenaar END 38797d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 38807d699701SBram Moolenaar source Xvim9script.vim 38817d699701SBram Moolenaar try 38827d699701SBram Moolenaar echo g:var 38837d699701SBram Moolenaar assert_report('did not fail') 38847d699701SBram Moolenaar catch /E121:/ 38857d699701SBram Moolenaar " caught 38867d699701SBram Moolenaar endtry 38877d699701SBram Moolenaar try 38887d699701SBram Moolenaar call TheFunc() 38897d699701SBram Moolenaar assert_report('did not fail') 38907d699701SBram Moolenaar catch /E117:/ 38917d699701SBram Moolenaar " caught 38927d699701SBram Moolenaar endtry 38937d699701SBram Moolenaar try 38947d699701SBram Moolenaar call DefFunc() 38957d699701SBram Moolenaar assert_report('did not fail') 38967d699701SBram Moolenaar catch /E117:/ 38977d699701SBram Moolenaar " caught 38987d699701SBram Moolenaar endtry 38997d699701SBram Moolenaar 390025859dd7SBram Moolenaar call delete('Xvim9script.vim') 39017d699701SBram Moolenaarendfunc 39027d699701SBram Moolenaar 3903eeb27bfeSBram Moolenaardef Test_vim9_copen() 3904eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 3905eeb27bfeSBram Moolenaar copen 3906eeb27bfeSBram Moolenaar quit 3907eeb27bfeSBram Moolenaarenddef 3908eeb27bfeSBram Moolenaar 390903290b84SBram Moolenaar" test using an auto-loaded function and variable 39102d6b20d6SBram Moolenaardef Test_vim9_autoload() 3911cfcd011fSBram Moolenaar var lines =<< trim END 39122d6b20d6SBram Moolenaar vim9script 391303290b84SBram Moolenaar def some#gettest(): string 391403290b84SBram Moolenaar return 'test' 391503290b84SBram Moolenaar enddef 391603290b84SBram Moolenaar g:some#name = 'name' 3917227c58a4SBram Moolenaar g:some#dict = {key: 'value'} 3918e3ffcd99SBram Moolenaar 3919e3ffcd99SBram Moolenaar def some#varargs(a1: string, ...l: list<string>): string 3920e3ffcd99SBram Moolenaar return a1 .. l[0] .. l[1] 3921e3ffcd99SBram Moolenaar enddef 392203290b84SBram Moolenaar END 392303290b84SBram Moolenaar 392403290b84SBram Moolenaar mkdir('Xdir/autoload', 'p') 392503290b84SBram Moolenaar writefile(lines, 'Xdir/autoload/some.vim') 392603290b84SBram Moolenaar var save_rtp = &rtp 392703290b84SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 392803290b84SBram Moolenaar 392903290b84SBram Moolenaar assert_equal('test', g:some#gettest()) 393003290b84SBram Moolenaar assert_equal('name', g:some#name) 3931227c58a4SBram Moolenaar assert_equal('value', g:some#dict.key) 393203290b84SBram Moolenaar g:some#other = 'other' 393303290b84SBram Moolenaar assert_equal('other', g:some#other) 393403290b84SBram Moolenaar 3935e3ffcd99SBram Moolenaar assert_equal('abc', some#varargs('a', 'b', 'c')) 3936e3ffcd99SBram Moolenaar 393717f700acSBram Moolenaar # upper case script name works 393817f700acSBram Moolenaar lines =<< trim END 393917f700acSBram Moolenaar vim9script 394017f700acSBram Moolenaar def Other#getOther(): string 394117f700acSBram Moolenaar return 'other' 394217f700acSBram Moolenaar enddef 394317f700acSBram Moolenaar END 394417f700acSBram Moolenaar writefile(lines, 'Xdir/autoload/Other.vim') 394517f700acSBram Moolenaar assert_equal('other', g:Other#getOther()) 394617f700acSBram Moolenaar 394703290b84SBram Moolenaar delete('Xdir', 'rf') 394803290b84SBram Moolenaar &rtp = save_rtp 394903290b84SBram Moolenaarenddef 395003290b84SBram Moolenaar 395103290b84SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 395203290b84SBram Moolenaardef Test_vim9_aucmd_autoload() 395303290b84SBram Moolenaar var lines =<< trim END 395403290b84SBram Moolenaar vim9script 39552d6b20d6SBram Moolenaar def foo#test() 39562d6b20d6SBram Moolenaar echomsg getreg('"') 39572d6b20d6SBram Moolenaar enddef 39582d6b20d6SBram Moolenaar END 39592d6b20d6SBram Moolenaar 39602d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 39612d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 3962cfcd011fSBram Moolenaar var save_rtp = &rtp 39632d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 39642d6b20d6SBram Moolenaar augroup test 39652d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 39662d6b20d6SBram Moolenaar augroup END 39672d6b20d6SBram Moolenaar 39682d6b20d6SBram Moolenaar normal Y 39692d6b20d6SBram Moolenaar 39702d6b20d6SBram Moolenaar augroup test 39712d6b20d6SBram Moolenaar autocmd! 39722d6b20d6SBram Moolenaar augroup END 39732d6b20d6SBram Moolenaar delete('Xdir', 'rf') 39742d6b20d6SBram Moolenaar &rtp = save_rtp 39752d6b20d6SBram Moolenaarenddef 39762d6b20d6SBram Moolenaar 397777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 397877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 3979cfcd011fSBram Moolenaar var lines =<< trim END 398077e5dcc3SBram Moolenaar vim9script 398177e5dcc3SBram Moolenaar def crash#func() 398277e5dcc3SBram Moolenaar try 398377e5dcc3SBram Moolenaar for x in List() 398477e5dcc3SBram Moolenaar endfor 398577e5dcc3SBram Moolenaar catch 398677e5dcc3SBram Moolenaar endtry 398777e5dcc3SBram Moolenaar g:ok = true 398877e5dcc3SBram Moolenaar enddef 398977e5dcc3SBram Moolenaar fu List() 399077e5dcc3SBram Moolenaar invalid 399177e5dcc3SBram Moolenaar endfu 399277e5dcc3SBram Moolenaar try 399348e11c10SBram Moolenaar alsoinvalid 399477e5dcc3SBram Moolenaar catch /wontmatch/ 399577e5dcc3SBram Moolenaar endtry 399677e5dcc3SBram Moolenaar END 399777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 399877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 399977e5dcc3SBram Moolenaar 400077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 400177e5dcc3SBram Moolenaar lines =<< trim END 400277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 400377e5dcc3SBram Moolenaar call crash#func() 400477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 40059c4f5520SBram Moolenaar qall! 400677e5dcc3SBram Moolenaar END 400777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 400877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 400977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 401077e5dcc3SBram Moolenaar 401177e5dcc3SBram Moolenaar delete('Xdidit') 401277e5dcc3SBram Moolenaar delete('Xscript') 401377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 401403290b84SBram Moolenaar 401503290b84SBram Moolenaar lines =<< trim END 401603290b84SBram Moolenaar vim9script 401703290b84SBram Moolenaar var foo#bar = 'asdf' 401803290b84SBram Moolenaar END 401903290b84SBram Moolenaar CheckScriptFailure(lines, 'E461: Illegal variable name: foo#bar', 2) 402077e5dcc3SBram Moolenaarenddef 402177e5dcc3SBram Moolenaar 402281e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 402381e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 402481e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 4025cfcd011fSBram Moolenaar var lines =<< trim END 402681e17fbeSBram Moolenaar let s:counter = 1 402781e17fbeSBram Moolenaar def s:Func() 402881e17fbeSBram Moolenaar au! CursorHold 402981e17fbeSBram Moolenaar au CursorHold * s:counter += 1 403081e17fbeSBram Moolenaar enddef 403181e17fbeSBram Moolenaar call s:Func() 403281e17fbeSBram Moolenaar doau CursorHold 403381e17fbeSBram Moolenaar call assert_equal(2, s:counter) 403481e17fbeSBram Moolenaar au! CursorHold 403581e17fbeSBram Moolenaar END 403681e17fbeSBram Moolenaar CheckScriptSuccess(lines) 403781e17fbeSBram Moolenaarenddef 403881e17fbeSBram Moolenaar 4039b5841b99SBram Moolenaardef Test_error_in_autoload_script() 4040b5841b99SBram Moolenaar var save_rtp = &rtp 4041b5841b99SBram Moolenaar var dir = getcwd() .. '/Xruntime' 4042b5841b99SBram Moolenaar &rtp = dir 4043b5841b99SBram Moolenaar mkdir(dir .. '/autoload', 'p') 4044b5841b99SBram Moolenaar 4045b5841b99SBram Moolenaar var lines =<< trim END 4046b5841b99SBram Moolenaar vim9script noclear 4047b5841b99SBram Moolenaar def script#autoloaded() 4048b5841b99SBram Moolenaar enddef 4049b5841b99SBram Moolenaar def Broken() 4050b5841b99SBram Moolenaar var x: any = '' 4051b5841b99SBram Moolenaar eval x != 0 4052b5841b99SBram Moolenaar enddef 4053b5841b99SBram Moolenaar Broken() 4054b5841b99SBram Moolenaar END 4055b5841b99SBram Moolenaar writefile(lines, dir .. '/autoload/script.vim') 4056b5841b99SBram Moolenaar 4057b5841b99SBram Moolenaar lines =<< trim END 4058b5841b99SBram Moolenaar vim9script 4059b5841b99SBram Moolenaar def CallAutoloaded() 4060b5841b99SBram Moolenaar script#autoloaded() 4061b5841b99SBram Moolenaar enddef 4062b5841b99SBram Moolenaar 4063b5841b99SBram Moolenaar function Legacy() 4064b5841b99SBram Moolenaar try 4065b5841b99SBram Moolenaar call s:CallAutoloaded() 4066b5841b99SBram Moolenaar catch 4067b5841b99SBram Moolenaar call assert_match('E1030: Using a String as a Number', v:exception) 4068b5841b99SBram Moolenaar endtry 4069b5841b99SBram Moolenaar endfunction 4070b5841b99SBram Moolenaar 4071b5841b99SBram Moolenaar Legacy() 4072b5841b99SBram Moolenaar END 4073b5841b99SBram Moolenaar CheckScriptSuccess(lines) 4074b5841b99SBram Moolenaar 4075b5841b99SBram Moolenaar &rtp = save_rtp 4076b5841b99SBram Moolenaar delete(dir, 'rf') 4077b5841b99SBram Moolenaarenddef 4078b5841b99SBram Moolenaar 40793896a105SBram Moolenaardef Test_cmdline_win() 40803896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 40813896a105SBram Moolenaar # the command line window. 40823896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 4083cfcd011fSBram Moolenaar var export_lines =<< trim END 40843896a105SBram Moolenaar vim9script 4085cfcd011fSBram Moolenaar export var That = 'yes' 40863896a105SBram Moolenaar END 40873896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 4088cfcd011fSBram Moolenaar var import_lines =<< trim END 40893896a105SBram Moolenaar vim9script 40903896a105SBram Moolenaar import That from './Xexport.vim' 40913896a105SBram Moolenaar END 40923896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 4093cfcd011fSBram Moolenaar var save_rtp = &rtp 40943896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 40953896a105SBram Moolenaar syntax on 40963896a105SBram Moolenaar augroup CmdWin 40973896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 40983896a105SBram Moolenaar augroup END 40993896a105SBram Moolenaar # this will open and also close the cmdline window 41003896a105SBram Moolenaar feedkeys('q:', 'xt') 41013896a105SBram Moolenaar assert_equal('yes', g:got_there) 41023896a105SBram Moolenaar 41033896a105SBram Moolenaar augroup CmdWin 41043896a105SBram Moolenaar au! 41053896a105SBram Moolenaar augroup END 41063896a105SBram Moolenaar &rtp = save_rtp 41073896a105SBram Moolenaar delete('rtp', 'rf') 41083896a105SBram Moolenaarenddef 41093896a105SBram Moolenaar 4110e3d4685fSBram Moolenaardef Test_invalid_sid() 4111e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 411225859dd7SBram Moolenaar 41139c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 4114d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 4115e3d4685fSBram Moolenaar endif 4116e3d4685fSBram Moolenaar delete('Xdidit') 4117e3d4685fSBram Moolenaarenddef 4118e3d4685fSBram Moolenaar 41199ec7026fSBram Moolenaardef Test_restoring_cpo() 41209ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 41219ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 41229ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 41239ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 41249ec7026fSBram Moolenaar endif 41259ec7026fSBram Moolenaar delete('Xsourced') 41269ec7026fSBram Moolenaar delete('Xclose') 4127090728adSBram Moolenaar delete('Xdone') 41280123cc1eSBram Moolenaar 41290123cc1eSBram Moolenaar writefile(['vim9script'], 'XanotherScript') 41300123cc1eSBram Moolenaar set cpo=aABceFsMny> 41310123cc1eSBram Moolenaar edit XanotherScript 41320123cc1eSBram Moolenaar so % 41330123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 41340123cc1eSBram Moolenaar :1del 41350123cc1eSBram Moolenaar w 41360123cc1eSBram Moolenaar so % 41370123cc1eSBram Moolenaar assert_equal('aABceFsMny>', &cpo) 41380123cc1eSBram Moolenaar 41390123cc1eSBram Moolenaar delete('XanotherScript') 41400123cc1eSBram Moolenaar set cpo&vim 41419ec7026fSBram Moolenaarenddef 41429ec7026fSBram Moolenaar 4143ffb7dcdbSBram Moolenaar" Use :function so we can use Check commands 4144ffb7dcdbSBram Moolenaarfunc Test_no_redraw_when_restoring_cpo() 414537294bd6SBram Moolenaar CheckScreendump 4146ffb7dcdbSBram Moolenaar CheckFeature timers 414737294bd6SBram Moolenaar 4148ffb7dcdbSBram Moolenaar let lines =<< trim END 414937294bd6SBram Moolenaar vim9script 415037294bd6SBram Moolenaar def script#func() 415137294bd6SBram Moolenaar enddef 415237294bd6SBram Moolenaar END 4153ffb7dcdbSBram Moolenaar call mkdir('Xdir/autoload', 'p') 4154ffb7dcdbSBram Moolenaar call writefile(lines, 'Xdir/autoload/script.vim') 415537294bd6SBram Moolenaar 4156ffb7dcdbSBram Moolenaar let lines =<< trim END 415737294bd6SBram Moolenaar vim9script 415837294bd6SBram Moolenaar set cpo+=M 415937294bd6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 4160767034c5SBram Moolenaar au CmdlineEnter : ++once timer_start(0, (_) => script#func()) 416137294bd6SBram Moolenaar setline(1, 'some text') 416237294bd6SBram Moolenaar END 4163ffb7dcdbSBram Moolenaar call writefile(lines, 'XTest_redraw_cpo') 4164ffb7dcdbSBram Moolenaar let buf = RunVimInTerminal('-S XTest_redraw_cpo', {'rows': 6}) 4165ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "V:") 4166ffb7dcdbSBram Moolenaar call VerifyScreenDump(buf, 'Test_vim9_no_redraw', {}) 416737294bd6SBram Moolenaar 4168ffb7dcdbSBram Moolenaar " clean up 4169ffb7dcdbSBram Moolenaar call term_sendkeys(buf, "\<Esc>u") 4170ffb7dcdbSBram Moolenaar call StopVimInTerminal(buf) 4171ffb7dcdbSBram Moolenaar call delete('XTest_redraw_cpo') 4172ffb7dcdbSBram Moolenaar call delete('Xdir', 'rf') 4173ffb7dcdbSBram Moolenaarendfunc 417437294bd6SBram Moolenaar 41759ec7026fSBram Moolenaar 4176f0afd9e1SBram Moolenaardef Test_unset_any_variable() 4177cfcd011fSBram Moolenaar var lines =<< trim END 4178cfcd011fSBram Moolenaar var name: any 4179cfcd011fSBram Moolenaar assert_equal(0, name) 4180f0afd9e1SBram Moolenaar END 4181f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 4182f0afd9e1SBram Moolenaarenddef 4183f0afd9e1SBram Moolenaar 41847e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 418558dbef33SBram Moolenaar CheckRunVimInTerminal 418658dbef33SBram Moolenaar 41877e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 41887e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 41897e9210eaSBram Moolenaarendfunc 41907e9210eaSBram Moolenaar 41917e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 41929c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 4193cfcd011fSBram Moolenaar var lines =<< trim END 41949c4f5520SBram Moolenaar func CheckAndQuit() 41959c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 41969c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 41979c4f5520SBram Moolenaar endfunc 41989c4f5520SBram Moolenaar END 41999c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 42009c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 4201e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 42029c4f5520SBram Moolenaar # define Afunc() on the command line 42039c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 42049c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 42052949cfdbSBram Moolenaar WaitForAssert(() => assert_equal(['errors: []'], readfile('Xdidcmd'))) 42069c4f5520SBram Moolenaar 42079c4f5520SBram Moolenaar call StopVimInTerminal(buf) 42089c4f5520SBram Moolenaar delete('XcallFunc') 42099c4f5520SBram Moolenaar delete('Xdidcmd') 42109c4f5520SBram Moolenaarenddef 42119c4f5520SBram Moolenaar 4212fcdc5d83SBram Moolenaardef Test_script_var_scope() 4213fcdc5d83SBram Moolenaar var lines =<< trim END 4214fcdc5d83SBram Moolenaar vim9script 4215fcdc5d83SBram Moolenaar if true 4216fcdc5d83SBram Moolenaar if true 4217fcdc5d83SBram Moolenaar var one = 'one' 4218fcdc5d83SBram Moolenaar echo one 4219fcdc5d83SBram Moolenaar endif 4220fcdc5d83SBram Moolenaar echo one 4221fcdc5d83SBram Moolenaar endif 4222fcdc5d83SBram Moolenaar END 4223fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4224fcdc5d83SBram Moolenaar 4225fcdc5d83SBram Moolenaar lines =<< trim END 4226fcdc5d83SBram Moolenaar vim9script 4227fcdc5d83SBram Moolenaar if true 4228fcdc5d83SBram Moolenaar if false 4229fcdc5d83SBram Moolenaar var one = 'one' 4230fcdc5d83SBram Moolenaar echo one 4231fcdc5d83SBram Moolenaar else 4232fcdc5d83SBram Moolenaar var one = 'one' 4233fcdc5d83SBram Moolenaar echo one 4234fcdc5d83SBram Moolenaar endif 4235fcdc5d83SBram Moolenaar echo one 4236fcdc5d83SBram Moolenaar endif 4237fcdc5d83SBram Moolenaar END 4238fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 4239fcdc5d83SBram Moolenaar 4240fcdc5d83SBram Moolenaar lines =<< trim END 4241fcdc5d83SBram Moolenaar vim9script 4242fcdc5d83SBram Moolenaar while true 4243fcdc5d83SBram Moolenaar var one = 'one' 4244fcdc5d83SBram Moolenaar echo one 4245fcdc5d83SBram Moolenaar break 4246fcdc5d83SBram Moolenaar endwhile 4247fcdc5d83SBram Moolenaar echo one 4248fcdc5d83SBram Moolenaar END 4249fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 4250fcdc5d83SBram Moolenaar 4251fcdc5d83SBram Moolenaar lines =<< trim END 4252fcdc5d83SBram Moolenaar vim9script 4253fcdc5d83SBram Moolenaar for i in range(1) 4254fcdc5d83SBram Moolenaar var one = 'one' 4255fcdc5d83SBram Moolenaar echo one 4256fcdc5d83SBram Moolenaar endfor 4257fcdc5d83SBram Moolenaar echo one 4258fcdc5d83SBram Moolenaar END 4259fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 42609becdf2bSBram Moolenaar 42619becdf2bSBram Moolenaar lines =<< trim END 42629becdf2bSBram Moolenaar vim9script 42639becdf2bSBram Moolenaar { 42649becdf2bSBram Moolenaar var one = 'one' 42659becdf2bSBram Moolenaar assert_equal('one', one) 42669becdf2bSBram Moolenaar } 42679becdf2bSBram Moolenaar assert_false(exists('one')) 42689becdf2bSBram Moolenaar assert_false(exists('s:one')) 42699becdf2bSBram Moolenaar END 42709becdf2bSBram Moolenaar CheckScriptSuccess(lines) 42719becdf2bSBram Moolenaar 42729becdf2bSBram Moolenaar lines =<< trim END 42739becdf2bSBram Moolenaar vim9script 42749becdf2bSBram Moolenaar { 42759becdf2bSBram Moolenaar var one = 'one' 42769becdf2bSBram Moolenaar echo one 42779becdf2bSBram Moolenaar } 42789becdf2bSBram Moolenaar echo one 42799becdf2bSBram Moolenaar END 42809becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 4281fcdc5d83SBram Moolenaarenddef 4282fcdc5d83SBram Moolenaar 4283352134bbSBram Moolenaardef Test_catch_exception_in_callback() 4284352134bbSBram Moolenaar var lines =<< trim END 4285352134bbSBram Moolenaar vim9script 42862a38908bSBram Moolenaar def Callback(...l: list<any>) 4287352134bbSBram Moolenaar try 4288352134bbSBram Moolenaar var x: string 4289352134bbSBram Moolenaar var y: string 4290352134bbSBram Moolenaar # this error should be caught with CHECKLEN 4291352134bbSBram Moolenaar [x, y] = [''] 4292352134bbSBram Moolenaar catch 4293352134bbSBram Moolenaar g:caught = 'yes' 4294352134bbSBram Moolenaar endtry 4295352134bbSBram Moolenaar enddef 4296e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 4297352134bbSBram Moolenaar feedkeys("\r", 'xt') 4298352134bbSBram Moolenaar END 4299352134bbSBram Moolenaar CheckScriptSuccess(lines) 4300352134bbSBram Moolenaar 4301352134bbSBram Moolenaar unlet g:caught 4302352134bbSBram Moolenaarenddef 4303352134bbSBram Moolenaar 4304631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 4305631e8f93SBram Moolenaar if !has('unix') || !has('job') 4306631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 4307631e8f93SBram Moolenaar endif 4308b16ff292SBram Moolenaar # FIXME: this check should not be needed 4309b16ff292SBram Moolenaar if has('win32') 4310b16ff292SBram Moolenaar throw 'Skipped: does not work on MS-Windows' 4311b16ff292SBram Moolenaar endif 4312631e8f93SBram Moolenaar var lines =<< trim END 4313631e8f93SBram Moolenaar vim9script 4314631e8f93SBram Moolenaar var source: list<number> 43152a38908bSBram Moolenaar def Out_cb(...l: list<any>) 4316631e8f93SBram Moolenaar eval [][0] 4317631e8f93SBram Moolenaar enddef 43182a38908bSBram Moolenaar def Exit_cb(...l: list<any>) 4319631e8f93SBram Moolenaar sleep 1m 4320631e8f93SBram Moolenaar source += l 4321631e8f93SBram Moolenaar enddef 4322e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 43236f17a3f0SBram Moolenaar while job_status(myjob) == 'run' 43246f17a3f0SBram Moolenaar sleep 10m 43256f17a3f0SBram Moolenaar endwhile 4326206c2a6eSBram Moolenaar # wait for Exit_cb() to be called 4327fe95b94fSBram Moolenaar sleep 200m 4328631e8f93SBram Moolenaar END 4329631e8f93SBram Moolenaar writefile(lines, 'Xdef') 4330631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 4331631e8f93SBram Moolenaar delete('Xdef') 4332631e8f93SBram Moolenaarenddef 4333631e8f93SBram Moolenaar 43344324d87aSBram Moolenaardef InvokeNormal() 43354324d87aSBram Moolenaar exe "norm! :m+1\r" 43364324d87aSBram Moolenaarenddef 43374324d87aSBram Moolenaar 43384324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 43394324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 43404324d87aSBram Moolenaar new 43414324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 43424324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 43434324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 43444324d87aSBram Moolenaar xunmap <F3> 4345b5b9480eSBram Moolenaarenddef 4346b5b9480eSBram Moolenaar 4347b5b9480eSBram Moolenaardef Test_white_space_after_command() 4348b5b9480eSBram Moolenaar var lines =<< trim END 4349b5b9480eSBram Moolenaar exit_cb: Func}) 4350b5b9480eSBram Moolenaar END 4351b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 4352f8103f27SBram Moolenaar 4353f8103f27SBram Moolenaar lines =<< trim END 4354f8103f27SBram Moolenaar e# 4355f8103f27SBram Moolenaar END 4356f8103f27SBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 43574324d87aSBram Moolenaarenddef 43584324d87aSBram Moolenaar 43594aab88d9SBram Moolenaardef Test_script_var_gone_when_sourced_twice() 43604aab88d9SBram Moolenaar var lines =<< trim END 43614aab88d9SBram Moolenaar vim9script 43624aab88d9SBram Moolenaar if exists('g:guard') 43634aab88d9SBram Moolenaar finish 43644aab88d9SBram Moolenaar endif 43654aab88d9SBram Moolenaar g:guard = 1 43664aab88d9SBram Moolenaar var name = 'thename' 43674aab88d9SBram Moolenaar def g:GetName(): string 43684aab88d9SBram Moolenaar return name 43694aab88d9SBram Moolenaar enddef 43704aab88d9SBram Moolenaar def g:SetName(arg: string) 43714aab88d9SBram Moolenaar name = arg 43724aab88d9SBram Moolenaar enddef 43734aab88d9SBram Moolenaar END 43744aab88d9SBram Moolenaar writefile(lines, 'XscriptTwice.vim') 43754aab88d9SBram Moolenaar so XscriptTwice.vim 43764aab88d9SBram Moolenaar assert_equal('thename', g:GetName()) 43774aab88d9SBram Moolenaar g:SetName('newname') 43784aab88d9SBram Moolenaar assert_equal('newname', g:GetName()) 43794aab88d9SBram Moolenaar so XscriptTwice.vim 43804aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 43814aab88d9SBram Moolenaar assert_fails('call g:SetName("x")', 'E1149:') 43824aab88d9SBram Moolenaar 43834aab88d9SBram Moolenaar delfunc g:GetName 43844aab88d9SBram Moolenaar delfunc g:SetName 43854aab88d9SBram Moolenaar delete('XscriptTwice.vim') 43864aab88d9SBram Moolenaar unlet g:guard 43874aab88d9SBram Moolenaarenddef 43884aab88d9SBram Moolenaar 43894aab88d9SBram Moolenaardef Test_import_gone_when_sourced_twice() 43904aab88d9SBram Moolenaar var exportlines =<< trim END 43914aab88d9SBram Moolenaar vim9script 43924aab88d9SBram Moolenaar if exists('g:guard') 43934aab88d9SBram Moolenaar finish 43944aab88d9SBram Moolenaar endif 43954aab88d9SBram Moolenaar g:guard = 1 43964aab88d9SBram Moolenaar export var name = 'someName' 43974aab88d9SBram Moolenaar END 43984aab88d9SBram Moolenaar writefile(exportlines, 'XexportScript.vim') 43994aab88d9SBram Moolenaar 44004aab88d9SBram Moolenaar var lines =<< trim END 44014aab88d9SBram Moolenaar vim9script 44024aab88d9SBram Moolenaar import name from './XexportScript.vim' 44034aab88d9SBram Moolenaar def g:GetName(): string 44044aab88d9SBram Moolenaar return name 44054aab88d9SBram Moolenaar enddef 44064aab88d9SBram Moolenaar END 44074aab88d9SBram Moolenaar writefile(lines, 'XscriptImport.vim') 44084aab88d9SBram Moolenaar so XscriptImport.vim 44094aab88d9SBram Moolenaar assert_equal('someName', g:GetName()) 44104aab88d9SBram Moolenaar 44114aab88d9SBram Moolenaar so XexportScript.vim 44124aab88d9SBram Moolenaar assert_fails('call g:GetName()', 'E1149:') 44134aab88d9SBram Moolenaar 44144aab88d9SBram Moolenaar delfunc g:GetName 44154aab88d9SBram Moolenaar delete('XexportScript.vim') 44164aab88d9SBram Moolenaar delete('XscriptImport.vim') 44174aab88d9SBram Moolenaar unlet g:guard 44184aab88d9SBram Moolenaarenddef 44194aab88d9SBram Moolenaar 442010b9421fSBram Moolenaardef Test_unsupported_commands() 442110b9421fSBram Moolenaar var lines =<< trim END 442210b9421fSBram Moolenaar ka 442310b9421fSBram Moolenaar END 44247d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 44257d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 442610b9421fSBram Moolenaar 442710b9421fSBram Moolenaar lines =<< trim END 4428ada1d870SBram Moolenaar :1ka 4429ada1d870SBram Moolenaar END 44307d840e9aSBram Moolenaar CheckDefFailure(lines, 'E476:') 44317d840e9aSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E492:') 4432ada1d870SBram Moolenaar 4433ada1d870SBram Moolenaar lines =<< trim END 443410b9421fSBram Moolenaar t 443510b9421fSBram Moolenaar END 443610b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 443710b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 443810b9421fSBram Moolenaar 443910b9421fSBram Moolenaar lines =<< trim END 444010b9421fSBram Moolenaar x 444110b9421fSBram Moolenaar END 444210b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 444310b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 444410b9421fSBram Moolenaar 444510b9421fSBram Moolenaar lines =<< trim END 444610b9421fSBram Moolenaar xit 444710b9421fSBram Moolenaar END 444810b9421fSBram Moolenaar CheckDefFailure(lines, 'E1100:') 444910b9421fSBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E1100:') 445010b9421fSBram Moolenaarenddef 445110b9421fSBram Moolenaar 4452c70fe460SBram Moolenaardef Test_mapping_line_number() 4453c70fe460SBram Moolenaar var lines =<< trim END 4454c70fe460SBram Moolenaar vim9script 4455c70fe460SBram Moolenaar def g:FuncA() 4456c70fe460SBram Moolenaar # Some comment 4457c70fe460SBram Moolenaar FuncB(0) 4458c70fe460SBram Moolenaar enddef 4459c70fe460SBram Moolenaar # Some comment 4460c70fe460SBram Moolenaar def FuncB( 4461c70fe460SBram Moolenaar # Some comment 4462c70fe460SBram Moolenaar n: number 4463c70fe460SBram Moolenaar ) 4464c70fe460SBram Moolenaar exe 'nno ' 4465c70fe460SBram Moolenaar # Some comment 4466c70fe460SBram Moolenaar .. '<F3> a' 4467c70fe460SBram Moolenaar .. 'b' 4468c70fe460SBram Moolenaar .. 'c' 4469c70fe460SBram Moolenaar enddef 4470c70fe460SBram Moolenaar END 4471c70fe460SBram Moolenaar CheckScriptSuccess(lines) 4472c70fe460SBram Moolenaar var res = execute('verbose nmap <F3>') 4473c70fe460SBram Moolenaar assert_match('No mapping found', res) 4474c70fe460SBram Moolenaar 4475c70fe460SBram Moolenaar g:FuncA() 4476c70fe460SBram Moolenaar res = execute('verbose nmap <F3>') 4477c70fe460SBram Moolenaar assert_match(' <F3> .* abc.*Last set from .*XScriptSuccess\d\+ line 11', res) 4478c70fe460SBram Moolenaar 4479c70fe460SBram Moolenaar nunmap <F3> 4480c70fe460SBram Moolenaar delfunc g:FuncA 4481c70fe460SBram Moolenaarenddef 4482c70fe460SBram Moolenaar 4483deb108baSBram Moolenaardef Test_option_set() 4484deb108baSBram Moolenaar # legacy script allows for white space 4485deb108baSBram Moolenaar var lines =<< trim END 4486deb108baSBram Moolenaar set foldlevel =11 4487deb108baSBram Moolenaar call assert_equal(11, &foldlevel) 4488deb108baSBram Moolenaar END 4489deb108baSBram Moolenaar CheckScriptSuccess(lines) 4490deb108baSBram Moolenaar 4491deb108baSBram Moolenaar set foldlevel 4492deb108baSBram Moolenaar set foldlevel=12 4493deb108baSBram Moolenaar assert_equal(12, &foldlevel) 4494deb108baSBram Moolenaar set foldlevel+=2 4495deb108baSBram Moolenaar assert_equal(14, &foldlevel) 4496deb108baSBram Moolenaar set foldlevel-=3 4497deb108baSBram Moolenaar assert_equal(11, &foldlevel) 4498deb108baSBram Moolenaar 4499deb108baSBram Moolenaar lines =<< trim END 4500deb108baSBram Moolenaar set foldlevel =1 4501deb108baSBram Moolenaar END 4502deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: =1') 4503deb108baSBram Moolenaar 4504deb108baSBram Moolenaar lines =<< trim END 4505deb108baSBram Moolenaar set foldlevel +=1 4506deb108baSBram Moolenaar END 4507deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: +=1') 4508deb108baSBram Moolenaar 4509deb108baSBram Moolenaar lines =<< trim END 4510deb108baSBram Moolenaar set foldlevel ^=1 4511deb108baSBram Moolenaar END 4512deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: ^=1') 4513deb108baSBram Moolenaar 4514deb108baSBram Moolenaar lines =<< trim END 4515deb108baSBram Moolenaar set foldlevel -=1 4516deb108baSBram Moolenaar END 4517deb108baSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: -=1') 4518deb108baSBram Moolenaar 4519deb108baSBram Moolenaar set foldlevel& 4520deb108baSBram Moolenaarenddef 4521deb108baSBram Moolenaar 4522208f0b48SBram Moolenaardef Test_option_modifier() 45231594f313SBram Moolenaar # legacy script allows for white space 4524208f0b48SBram Moolenaar var lines =<< trim END 4525208f0b48SBram Moolenaar set hlsearch & hlsearch ! 4526208f0b48SBram Moolenaar call assert_equal(1, &hlsearch) 4527208f0b48SBram Moolenaar END 4528208f0b48SBram Moolenaar CheckScriptSuccess(lines) 4529208f0b48SBram Moolenaar 45301594f313SBram Moolenaar set hlsearch 45311594f313SBram Moolenaar set hlsearch! 45321594f313SBram Moolenaar assert_equal(false, &hlsearch) 45331594f313SBram Moolenaar 45341594f313SBram Moolenaar set hlsearch 4535208f0b48SBram Moolenaar set hlsearch& 45361594f313SBram Moolenaar assert_equal(false, &hlsearch) 4537208f0b48SBram Moolenaar 4538208f0b48SBram Moolenaar lines =<< trim END 45391594f313SBram Moolenaar set hlsearch & 4540208f0b48SBram Moolenaar END 45411594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: &') 45421594f313SBram Moolenaar 45431594f313SBram Moolenaar lines =<< trim END 45441594f313SBram Moolenaar set hlsearch ! 45451594f313SBram Moolenaar END 45461594f313SBram Moolenaar CheckDefExecAndScriptFailure(lines, 'E1205: No white space allowed between option and: !') 45471594f313SBram Moolenaar 45481594f313SBram Moolenaar set hlsearch& 4549208f0b48SBram Moolenaarenddef 4550208f0b48SBram Moolenaar 4551c03fe66aSBram Moolenaar" This must be called last, it may cause following :def functions to fail 4552c03fe66aSBram Moolenaardef Test_xxx_echoerr_line_number() 4553c03fe66aSBram Moolenaar var lines =<< trim END 4554c03fe66aSBram Moolenaar echoerr 'some' 4555c03fe66aSBram Moolenaar .. ' error' 4556c03fe66aSBram Moolenaar .. ' continued' 4557c03fe66aSBram Moolenaar END 4558c03fe66aSBram Moolenaar CheckDefExecAndScriptFailure(lines, 'some error continued', 1) 4559c03fe66aSBram Moolenaarenddef 4560c03fe66aSBram Moolenaar 4561648594eaSBram Moolenaardef ProfiledWithLambda() 4562d9162550SBram Moolenaar var n = 3 4563d9162550SBram Moolenaar echo [[1, 2], [3, 4]]->filter((_, l) => l[0] == n) 4564d9162550SBram Moolenaarenddef 4565d9162550SBram Moolenaar 4566648594eaSBram Moolenaardef ProfiledNested() 4567648594eaSBram Moolenaar var x = 0 4568648594eaSBram Moolenaar def Nested(): any 4569648594eaSBram Moolenaar return x 4570648594eaSBram Moolenaar enddef 4571648594eaSBram Moolenaar Nested() 4572648594eaSBram Moolenaarenddef 4573648594eaSBram Moolenaar 4574ffcfddc7SBram Moolenaardef ProfiledNestedProfiled() 4575ffcfddc7SBram Moolenaar var x = 0 4576ffcfddc7SBram Moolenaar def Nested(): any 4577ffcfddc7SBram Moolenaar return x 4578ffcfddc7SBram Moolenaar enddef 4579ffcfddc7SBram Moolenaar Nested() 4580ffcfddc7SBram Moolenaarenddef 4581ffcfddc7SBram Moolenaar 4582d9162550SBram Moolenaar" Execute this near the end, profiling doesn't stop until Vim exists. 4583d9162550SBram Moolenaar" This only tests that it works, not the profiling output. 4584d9162550SBram Moolenaardef Test_xx_profile_with_lambda() 45854ece152aSBram Moolenaar CheckFeature profile 45864ece152aSBram Moolenaar 4587d9162550SBram Moolenaar profile start Xprofile.log 4588648594eaSBram Moolenaar profile func ProfiledWithLambda 4589648594eaSBram Moolenaar ProfiledWithLambda() 4590ffcfddc7SBram Moolenaar 4591648594eaSBram Moolenaar profile func ProfiledNested 4592648594eaSBram Moolenaar ProfiledNested() 4593ffcfddc7SBram Moolenaar 4594ffcfddc7SBram Moolenaar # Also profile the nested function. Use a different function, although the 4595ffcfddc7SBram Moolenaar # contents is the same, to make sure it was not already compiled. 4596ffcfddc7SBram Moolenaar profile func * 4597ffcfddc7SBram Moolenaar ProfiledNestedProfiled() 4598ffcfddc7SBram Moolenaar 4599ffcfddc7SBram Moolenaar profdel func * 4600ffcfddc7SBram Moolenaar profile pause 4601d9162550SBram Moolenaarenddef 4602d9162550SBram Moolenaar 4603585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 4604585fea7bSBram Moolenaardef Test_substitute_cmd() 4605585fea7bSBram Moolenaar new 4606585fea7bSBram Moolenaar setline(1, 'something') 4607585fea7bSBram Moolenaar :substitute(some(other( 4608585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4609585fea7bSBram Moolenaar bwipe! 4610585fea7bSBram Moolenaar 4611f5be8cdbSBram Moolenaar # also when the context is Vim9 script 4612cfcd011fSBram Moolenaar var lines =<< trim END 4613585fea7bSBram Moolenaar vim9script 4614585fea7bSBram Moolenaar new 4615585fea7bSBram Moolenaar setline(1, 'something') 4616585fea7bSBram Moolenaar :substitute(some(other( 4617585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 4618585fea7bSBram Moolenaar bwipe! 4619585fea7bSBram Moolenaar END 4620585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 4621585fea7bSBram Moolenaar source Xvim9lines 4622585fea7bSBram Moolenaar 4623585fea7bSBram Moolenaar delete('Xvim9lines') 4624585fea7bSBram Moolenaarenddef 4625585fea7bSBram Moolenaar 46268a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 4627