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 88a7d6542SBram Moolenaar 95d72ce69SBram Moolenaardef Test_range_only() 105d72ce69SBram Moolenaar new 115d72ce69SBram Moolenaar setline(1, ['blah', 'Blah']) 125d72ce69SBram Moolenaar :/Blah/ 135d72ce69SBram Moolenaar assert_equal(2, getcurpos()[1]) 14c2af0affSBram Moolenaar bwipe! 15c2af0affSBram Moolenaar 16c2af0affSBram Moolenaar # without range commands use current line 17c2af0affSBram Moolenaar new 18c2af0affSBram Moolenaar setline(1, ['one', 'two', 'three']) 19c2af0affSBram Moolenaar :2 20c2af0affSBram Moolenaar print 21c2af0affSBram Moolenaar assert_equal('two', Screenline(&lines)) 22c2af0affSBram Moolenaar :3 23c2af0affSBram Moolenaar list 24c2af0affSBram Moolenaar assert_equal('three$', Screenline(&lines)) 25c2af0affSBram Moolenaar bwipe! 265d72ce69SBram Moolenaarenddef 275d72ce69SBram Moolenaar 28a6e67e4fSBram Moolenaarlet g:alist = [7] 29a6e67e4fSBram Moolenaarlet g:astring = 'text' 30f0b9f43cSBram Moolenaarlet g:anumber = 123 316e587dcbSBram Moolenaar 324c17ad94SBram Moolenaardef Test_delfunction() 33f5be8cdbSBram Moolenaar # Check function is defined in script namespace 344c17ad94SBram Moolenaar CheckScriptSuccess([ 354c17ad94SBram Moolenaar 'vim9script', 364c17ad94SBram Moolenaar 'func CheckMe()', 374c17ad94SBram Moolenaar ' return 123', 384c17ad94SBram Moolenaar 'endfunc', 394c17ad94SBram Moolenaar 'assert_equal(123, s:CheckMe())', 404c17ad94SBram Moolenaar ]) 414c17ad94SBram Moolenaar 42f5be8cdbSBram Moolenaar # Check function in script namespace cannot be deleted 434c17ad94SBram Moolenaar CheckScriptFailure([ 444c17ad94SBram Moolenaar 'vim9script', 454c17ad94SBram Moolenaar 'func DeleteMe1()', 464c17ad94SBram Moolenaar 'endfunc', 474c17ad94SBram Moolenaar 'delfunction DeleteMe1', 484c17ad94SBram Moolenaar ], 'E1084:') 494c17ad94SBram Moolenaar CheckScriptFailure([ 504c17ad94SBram Moolenaar 'vim9script', 514c17ad94SBram Moolenaar 'func DeleteMe2()', 524c17ad94SBram Moolenaar 'endfunc', 534c17ad94SBram Moolenaar 'def DoThat()', 544c17ad94SBram Moolenaar ' delfunction DeleteMe2', 554c17ad94SBram Moolenaar 'enddef', 564c17ad94SBram Moolenaar 'DoThat()', 574c17ad94SBram Moolenaar ], 'E1084:') 584c17ad94SBram Moolenaar CheckScriptFailure([ 594c17ad94SBram Moolenaar 'vim9script', 604c17ad94SBram Moolenaar 'def DeleteMe3()', 614c17ad94SBram Moolenaar 'enddef', 624c17ad94SBram Moolenaar 'delfunction DeleteMe3', 634c17ad94SBram Moolenaar ], 'E1084:') 644c17ad94SBram Moolenaar CheckScriptFailure([ 654c17ad94SBram Moolenaar 'vim9script', 664c17ad94SBram Moolenaar 'def DeleteMe4()', 674c17ad94SBram Moolenaar 'enddef', 684c17ad94SBram Moolenaar 'def DoThat()', 694c17ad94SBram Moolenaar ' delfunction DeleteMe4', 704c17ad94SBram Moolenaar 'enddef', 714c17ad94SBram Moolenaar 'DoThat()', 724c17ad94SBram Moolenaar ], 'E1084:') 73925e9fd6SBram Moolenaar 74925e9fd6SBram Moolenaar # Check that global :def function can be replaced and deleted 75cfcd011fSBram Moolenaar var lines =<< trim END 76925e9fd6SBram Moolenaar vim9script 77925e9fd6SBram Moolenaar def g:Global(): string 78925e9fd6SBram Moolenaar return "yes" 79925e9fd6SBram Moolenaar enddef 80925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 81925e9fd6SBram Moolenaar def! g:Global(): string 82925e9fd6SBram Moolenaar return "no" 83925e9fd6SBram Moolenaar enddef 84925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 85925e9fd6SBram Moolenaar delfunc g:Global 86925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 87925e9fd6SBram Moolenaar END 88925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 89925e9fd6SBram Moolenaar 90925e9fd6SBram Moolenaar # Check that global function can be replaced by a :def function and deleted 91925e9fd6SBram Moolenaar lines =<< trim END 92925e9fd6SBram Moolenaar vim9script 93925e9fd6SBram Moolenaar func g:Global() 94925e9fd6SBram Moolenaar return "yes" 95925e9fd6SBram Moolenaar endfunc 96925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 97925e9fd6SBram Moolenaar def! g:Global(): string 98925e9fd6SBram Moolenaar return "no" 99925e9fd6SBram Moolenaar enddef 100925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 101925e9fd6SBram Moolenaar delfunc g:Global 102925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 103925e9fd6SBram Moolenaar END 104925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 105925e9fd6SBram Moolenaar 106925e9fd6SBram Moolenaar # Check that global :def function can be replaced by a function and deleted 107925e9fd6SBram Moolenaar lines =<< trim END 108925e9fd6SBram Moolenaar vim9script 109925e9fd6SBram Moolenaar def g:Global(): string 110925e9fd6SBram Moolenaar return "yes" 111925e9fd6SBram Moolenaar enddef 112925e9fd6SBram Moolenaar assert_equal("yes", g:Global()) 113925e9fd6SBram Moolenaar func! g:Global() 114925e9fd6SBram Moolenaar return "no" 115925e9fd6SBram Moolenaar endfunc 116925e9fd6SBram Moolenaar assert_equal("no", g:Global()) 117925e9fd6SBram Moolenaar delfunc g:Global 118925e9fd6SBram Moolenaar assert_false(exists('*g:Global')) 119925e9fd6SBram Moolenaar END 120925e9fd6SBram Moolenaar CheckScriptSuccess(lines) 1214c17ad94SBram Moolenaarenddef 1224c17ad94SBram Moolenaar 12308052228SBram Moolenaardef Test_wrong_type() 124cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<nothing>'], 'E1010:') 125cfcd011fSBram Moolenaar CheckDefFailure(['var name: list<list<nothing>>'], 'E1010:') 126cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<nothing>'], 'E1010:') 127cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<dict<nothing>>'], 'E1010:') 128599c89c8SBram Moolenaar 129cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<number'], 'E1009:') 130cfcd011fSBram Moolenaar CheckDefFailure(['var name: dict<list<number>'], 'E1009:') 13142a480bfSBram Moolenaar 132cfcd011fSBram Moolenaar CheckDefFailure(['var name: ally'], 'E1010:') 133cfcd011fSBram Moolenaar CheckDefFailure(['var name: bram'], 'E1010:') 134cfcd011fSBram Moolenaar CheckDefFailure(['var name: cathy'], 'E1010:') 135cfcd011fSBram Moolenaar CheckDefFailure(['var name: dom'], 'E1010:') 136cfcd011fSBram Moolenaar CheckDefFailure(['var name: freddy'], 'E1010:') 137cfcd011fSBram Moolenaar CheckDefFailure(['var name: john'], 'E1010:') 138cfcd011fSBram Moolenaar CheckDefFailure(['var name: larry'], 'E1010:') 139cfcd011fSBram Moolenaar CheckDefFailure(['var name: ned'], 'E1010:') 140cfcd011fSBram Moolenaar CheckDefFailure(['var name: pam'], 'E1010:') 141cfcd011fSBram Moolenaar CheckDefFailure(['var name: sam'], 'E1010:') 142cfcd011fSBram Moolenaar CheckDefFailure(['var name: vim'], 'E1010:') 143a0a9f43aSBram Moolenaar 144cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: number', 'Ref()'], 'E1085:') 145cfcd011fSBram Moolenaar CheckDefFailure(['var Ref: string', 'var res = Ref()'], 'E1085:') 14608052228SBram Moolenaarenddef 1478a7d6542SBram Moolenaar 14810c65860SBram Moolenaardef Test_script_wrong_type() 14910c65860SBram Moolenaar var lines =<< trim END 15010c65860SBram Moolenaar vim9script 15110c65860SBram Moolenaar var s:dict: dict<string> 15210c65860SBram Moolenaar s:dict['a'] = ['x'] 15310c65860SBram Moolenaar END 15410c65860SBram Moolenaar CheckScriptFailure(lines, 'E1012: Type mismatch; expected string but got list<string>', 3) 15510c65860SBram Moolenaarenddef 15610c65860SBram Moolenaar 15708052228SBram Moolenaardef Test_const() 158cfcd011fSBram Moolenaar CheckDefFailure(['final name = 234', 'name = 99'], 'E1018:') 159cfcd011fSBram Moolenaar CheckDefFailure(['final one = 234', 'var one = 99'], 'E1017:') 160cfcd011fSBram Moolenaar CheckDefFailure(['final list = [1, 2]', 'var list = [3, 4]'], 'E1017:') 16130fd8204SBram Moolenaar CheckDefFailure(['final two'], 'E1125:') 16230fd8204SBram Moolenaar CheckDefFailure(['final &option'], 'E996:') 163dbeecb2bSBram Moolenaar 164cfcd011fSBram Moolenaar var lines =<< trim END 16530fd8204SBram Moolenaar final list = [1, 2, 3] 166dbeecb2bSBram Moolenaar list[0] = 4 1670b4c66c6SBram Moolenaar list->assert_equal([4, 2, 3]) 16830fd8204SBram Moolenaar const other = [5, 6, 7] 1690b4c66c6SBram Moolenaar other->assert_equal([5, 6, 7]) 17071abe482SBram Moolenaar 171cfcd011fSBram Moolenaar var varlist = [7, 8] 17230fd8204SBram Moolenaar const constlist = [1, varlist, 3] 17371abe482SBram Moolenaar varlist[0] = 77 17471abe482SBram Moolenaar # TODO: does not work yet 17571abe482SBram Moolenaar # constlist[1][1] = 88 176cfcd011fSBram Moolenaar var cl = constlist[1] 17771abe482SBram Moolenaar cl[1] = 88 17871abe482SBram Moolenaar constlist->assert_equal([1, [77, 88], 3]) 17971abe482SBram Moolenaar 180cfcd011fSBram Moolenaar var vardict = #{five: 5, six: 6} 18130fd8204SBram Moolenaar const constdict = #{one: 1, two: vardict, three: 3} 18271abe482SBram Moolenaar vardict['five'] = 55 18371abe482SBram Moolenaar # TODO: does not work yet 18471abe482SBram Moolenaar # constdict['two']['six'] = 66 185cfcd011fSBram Moolenaar var cd = constdict['two'] 18671abe482SBram Moolenaar cd['six'] = 66 18771abe482SBram Moolenaar constdict->assert_equal(#{one: 1, two: #{five: 55, six: 66}, three: 3}) 188dbeecb2bSBram Moolenaar END 189dbeecb2bSBram Moolenaar CheckDefAndScriptSuccess(lines) 19008052228SBram Moolenaarenddef 1918a7d6542SBram Moolenaar 1920b4c66c6SBram Moolenaardef Test_const_bang() 193cfcd011fSBram Moolenaar var lines =<< trim END 19430fd8204SBram Moolenaar const var = 234 1950b4c66c6SBram Moolenaar var = 99 1960b4c66c6SBram Moolenaar END 1970b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1018:', 2) 1980b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E46:', 3) 1990b4c66c6SBram Moolenaar 2000b4c66c6SBram Moolenaar lines =<< trim END 20130fd8204SBram Moolenaar const ll = [2, 3, 4] 2020b4c66c6SBram Moolenaar ll[0] = 99 2030b4c66c6SBram Moolenaar END 2040b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1119:', 2) 2050b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2060b4c66c6SBram Moolenaar 2070b4c66c6SBram Moolenaar lines =<< trim END 20830fd8204SBram Moolenaar const ll = [2, 3, 4] 2090b4c66c6SBram Moolenaar ll[3] = 99 2100b4c66c6SBram Moolenaar END 2110b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1118:', 2) 2120b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E684:', 3) 2130b4c66c6SBram Moolenaar 2140b4c66c6SBram Moolenaar lines =<< trim END 21530fd8204SBram Moolenaar const dd = #{one: 1, two: 2} 2160b4c66c6SBram Moolenaar dd["one"] = 99 2170b4c66c6SBram Moolenaar END 2180b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1121:', 2) 2190b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2200b4c66c6SBram Moolenaar 2210b4c66c6SBram Moolenaar lines =<< trim END 22230fd8204SBram Moolenaar const dd = #{one: 1, two: 2} 2230b4c66c6SBram Moolenaar dd["three"] = 99 2240b4c66c6SBram Moolenaar END 2250b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2260b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2270b4c66c6SBram Moolenaarenddef 2280b4c66c6SBram Moolenaar 229df069eecSBram Moolenaardef Test_range_no_colon() 230d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 231d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 232d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 233d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 234df069eecSBram Moolenaarenddef 235df069eecSBram Moolenaar 236df069eecSBram Moolenaar 2378a7d6542SBram Moolenaardef Test_block() 238cfcd011fSBram Moolenaar var outer = 1 2398a7d6542SBram Moolenaar { 240cfcd011fSBram Moolenaar var inner = 2 2418a7d6542SBram Moolenaar assert_equal(1, outer) 2428a7d6542SBram Moolenaar assert_equal(2, inner) 2438a7d6542SBram Moolenaar } 2448a7d6542SBram Moolenaar assert_equal(1, outer) 2458a7d6542SBram Moolenaarenddef 2468a7d6542SBram Moolenaar 24708052228SBram Moolenaardef Test_block_failure() 248cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 24908052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 25008052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 25108052228SBram Moolenaarenddef 2528a7d6542SBram Moolenaar 253*fbbcd003SBram Moolenaardef Test_block_local_vars() 254*fbbcd003SBram Moolenaar var lines =<< trim END 255*fbbcd003SBram Moolenaar vim9script 256*fbbcd003SBram Moolenaar if true 257*fbbcd003SBram Moolenaar var text = 'hello' 258*fbbcd003SBram Moolenaar def SayHello(): string 259*fbbcd003SBram Moolenaar return text 260*fbbcd003SBram Moolenaar enddef 261*fbbcd003SBram Moolenaar def SetText(v: string) 262*fbbcd003SBram Moolenaar text = v 263*fbbcd003SBram Moolenaar enddef 264*fbbcd003SBram Moolenaar endif 265*fbbcd003SBram Moolenaar 266*fbbcd003SBram Moolenaar if true 267*fbbcd003SBram Moolenaar var text = 'again' 268*fbbcd003SBram Moolenaar def SayAgain(): string 269*fbbcd003SBram Moolenaar return text 270*fbbcd003SBram Moolenaar enddef 271*fbbcd003SBram Moolenaar endif 272*fbbcd003SBram Moolenaar defcompile 273*fbbcd003SBram Moolenaar 274*fbbcd003SBram Moolenaar assert_equal('hello', SayHello()) 275*fbbcd003SBram Moolenaar assert_equal('again', SayAgain()) 276*fbbcd003SBram Moolenaar 277*fbbcd003SBram Moolenaar SetText('foobar') 278*fbbcd003SBram Moolenaar assert_equal('foobar', SayHello()) 279*fbbcd003SBram Moolenaar END 280*fbbcd003SBram Moolenaar CheckScriptSuccess(lines) 281*fbbcd003SBram Moolenaarenddef 282*fbbcd003SBram Moolenaar 283d032f34aSBram Moolenaarfunc g:NoSuchFunc() 284d032f34aSBram Moolenaar echo 'none' 285d032f34aSBram Moolenaarendfunc 286d032f34aSBram Moolenaar 2878a7d6542SBram Moolenaardef Test_try_catch() 288cfcd011fSBram Moolenaar var l = [] 2897a092245SBram Moolenaar try # comment 2908a7d6542SBram Moolenaar add(l, '1') 2918a7d6542SBram Moolenaar throw 'wrong' 2928a7d6542SBram Moolenaar add(l, '2') 2937a092245SBram Moolenaar catch # comment 2948a7d6542SBram Moolenaar add(l, v:exception) 2957a092245SBram Moolenaar finally # comment 2968a7d6542SBram Moolenaar add(l, '3') 2977a092245SBram Moolenaar endtry # comment 2988a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 29968d130c6SBram Moolenaar 300e859312eSBram Moolenaar l = [] 301e859312eSBram Moolenaar try 302e859312eSBram Moolenaar try 303e859312eSBram Moolenaar add(l, '1') 304e859312eSBram Moolenaar throw 'wrong' 305e859312eSBram Moolenaar add(l, '2') 306e859312eSBram Moolenaar catch /right/ 307e859312eSBram Moolenaar add(l, v:exception) 308e859312eSBram Moolenaar endtry 309e859312eSBram Moolenaar catch /wrong/ 310e859312eSBram Moolenaar add(l, 'caught') 311373863edSBram Moolenaar fina 312e859312eSBram Moolenaar add(l, 'finally') 313e859312eSBram Moolenaar endtry 314e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 315e859312eSBram Moolenaar 316cfcd011fSBram Moolenaar var n: number 31768d130c6SBram Moolenaar try 31868d130c6SBram Moolenaar n = l[3] 31968d130c6SBram Moolenaar catch /E684:/ 32068d130c6SBram Moolenaar n = 99 32168d130c6SBram Moolenaar endtry 32268d130c6SBram Moolenaar assert_equal(99, n) 32368d130c6SBram Moolenaar 32468d130c6SBram Moolenaar try 325cc673e74SBram Moolenaar # string slice returns a string, not a number 32668d130c6SBram Moolenaar n = g:astring[3] 3275e654230SBram Moolenaar catch /E1012:/ 32868d130c6SBram Moolenaar n = 77 32968d130c6SBram Moolenaar endtry 33068d130c6SBram Moolenaar assert_equal(77, n) 33168d130c6SBram Moolenaar 33268d130c6SBram Moolenaar try 33368d130c6SBram Moolenaar n = l[g:astring] 3345e654230SBram Moolenaar catch /E1012:/ 33556acb094SBram Moolenaar n = 88 33668d130c6SBram Moolenaar endtry 33756acb094SBram Moolenaar assert_equal(88, n) 33868d130c6SBram Moolenaar 33968d130c6SBram Moolenaar try 34068d130c6SBram Moolenaar n = s:does_not_exist 34168d130c6SBram Moolenaar catch /E121:/ 342f0b9f43cSBram Moolenaar n = 111 343f0b9f43cSBram Moolenaar endtry 344f0b9f43cSBram Moolenaar assert_equal(111, n) 345f0b9f43cSBram Moolenaar 346f0b9f43cSBram Moolenaar try 347f0b9f43cSBram Moolenaar n = g:does_not_exist 348f0b9f43cSBram Moolenaar catch /E121:/ 34968d130c6SBram Moolenaar n = 121 35068d130c6SBram Moolenaar endtry 35168d130c6SBram Moolenaar assert_equal(121, n) 35268d130c6SBram Moolenaar 353cfcd011fSBram Moolenaar var d = #{one: 1} 35468d130c6SBram Moolenaar try 35568d130c6SBram Moolenaar n = d[g:astring] 35668d130c6SBram Moolenaar catch /E716:/ 35768d130c6SBram Moolenaar n = 222 35868d130c6SBram Moolenaar endtry 35968d130c6SBram Moolenaar assert_equal(222, n) 360f0b9f43cSBram Moolenaar 361f0b9f43cSBram Moolenaar try 362f0b9f43cSBram Moolenaar n = -g:astring 363f0b9f43cSBram Moolenaar catch /E39:/ 364f0b9f43cSBram Moolenaar n = 233 365f0b9f43cSBram Moolenaar endtry 366f0b9f43cSBram Moolenaar assert_equal(233, n) 367f0b9f43cSBram Moolenaar 368f0b9f43cSBram Moolenaar try 369f0b9f43cSBram Moolenaar n = +g:astring 370f0b9f43cSBram Moolenaar catch /E1030:/ 371f0b9f43cSBram Moolenaar n = 244 372f0b9f43cSBram Moolenaar endtry 373f0b9f43cSBram Moolenaar assert_equal(244, n) 374f0b9f43cSBram Moolenaar 375f0b9f43cSBram Moolenaar try 376f0b9f43cSBram Moolenaar n = +g:alist 377f0b9f43cSBram Moolenaar catch /E745:/ 378f0b9f43cSBram Moolenaar n = 255 379f0b9f43cSBram Moolenaar endtry 380f0b9f43cSBram Moolenaar assert_equal(255, n) 381f0b9f43cSBram Moolenaar 382cfcd011fSBram Moolenaar var nd: dict<any> 383f0b9f43cSBram Moolenaar try 384f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 3855e654230SBram Moolenaar catch /E1012:/ 386f0b9f43cSBram Moolenaar n = 266 387f0b9f43cSBram Moolenaar endtry 388f0b9f43cSBram Moolenaar assert_equal(266, n) 389f0b9f43cSBram Moolenaar 390f0b9f43cSBram Moolenaar try 391f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 392f0b9f43cSBram Moolenaar catch /E1093:/ 393f0b9f43cSBram Moolenaar n = 277 394f0b9f43cSBram Moolenaar endtry 395f0b9f43cSBram Moolenaar assert_equal(277, n) 396f0b9f43cSBram Moolenaar 397e859312eSBram Moolenaar try 398e859312eSBram Moolenaar &ts = g:astring 3995e654230SBram Moolenaar catch /E1012:/ 400e859312eSBram Moolenaar n = 288 401e859312eSBram Moolenaar endtry 402e859312eSBram Moolenaar assert_equal(288, n) 403e859312eSBram Moolenaar 404e859312eSBram Moolenaar try 405e859312eSBram Moolenaar &backspace = 'asdf' 406e859312eSBram Moolenaar catch /E474:/ 407e859312eSBram Moolenaar n = 299 408e859312eSBram Moolenaar endtry 409e859312eSBram Moolenaar assert_equal(299, n) 410e859312eSBram Moolenaar 411e859312eSBram Moolenaar l = [1] 412e859312eSBram Moolenaar try 413e859312eSBram Moolenaar l[3] = 3 414e859312eSBram Moolenaar catch /E684:/ 415e859312eSBram Moolenaar n = 300 416e859312eSBram Moolenaar endtry 417e859312eSBram Moolenaar assert_equal(300, n) 418e859312eSBram Moolenaar 419e859312eSBram Moolenaar try 420e859312eSBram Moolenaar unlet g:does_not_exist 421e859312eSBram Moolenaar catch /E108:/ 422e859312eSBram Moolenaar n = 322 423e859312eSBram Moolenaar endtry 424e859312eSBram Moolenaar assert_equal(322, n) 425e859312eSBram Moolenaar 426e859312eSBram Moolenaar try 427e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 428e859312eSBram Moolenaar catch /E721:/ 429e859312eSBram Moolenaar n = 333 430e859312eSBram Moolenaar endtry 431e859312eSBram Moolenaar assert_equal(333, n) 432e859312eSBram Moolenaar 433e859312eSBram Moolenaar try 434e859312eSBram Moolenaar l = DeletedFunc() 435e859312eSBram Moolenaar catch /E933:/ 436e859312eSBram Moolenaar n = 344 437e859312eSBram Moolenaar endtry 438e859312eSBram Moolenaar assert_equal(344, n) 439d032f34aSBram Moolenaar 440d032f34aSBram Moolenaar try 441d032f34aSBram Moolenaar echo len(v:true) 442d032f34aSBram Moolenaar catch /E701:/ 443d032f34aSBram Moolenaar n = 355 444d032f34aSBram Moolenaar endtry 445d032f34aSBram Moolenaar assert_equal(355, n) 446d032f34aSBram Moolenaar 447cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 448d032f34aSBram Moolenaar delfunc g:NoSuchFunc 449d032f34aSBram Moolenaar try 450d032f34aSBram Moolenaar echo P() 451d032f34aSBram Moolenaar catch /E117:/ 452d032f34aSBram Moolenaar n = 366 453d032f34aSBram Moolenaar endtry 454d032f34aSBram Moolenaar assert_equal(366, n) 455d032f34aSBram Moolenaar 456d032f34aSBram Moolenaar try 457d032f34aSBram Moolenaar echo g:NoSuchFunc() 458d032f34aSBram Moolenaar catch /E117:/ 459d032f34aSBram Moolenaar n = 377 460d032f34aSBram Moolenaar endtry 461d032f34aSBram Moolenaar assert_equal(377, n) 462d032f34aSBram Moolenaar 463d032f34aSBram Moolenaar try 464d032f34aSBram Moolenaar echo g:alist + 4 465d032f34aSBram Moolenaar catch /E745:/ 466d032f34aSBram Moolenaar n = 388 467d032f34aSBram Moolenaar endtry 468d032f34aSBram Moolenaar assert_equal(388, n) 469d032f34aSBram Moolenaar 470d032f34aSBram Moolenaar try 471d032f34aSBram Moolenaar echo 4 + g:alist 472d032f34aSBram Moolenaar catch /E745:/ 473d032f34aSBram Moolenaar n = 399 474d032f34aSBram Moolenaar endtry 475d032f34aSBram Moolenaar assert_equal(399, n) 476d032f34aSBram Moolenaar 477d032f34aSBram Moolenaar try 478d032f34aSBram Moolenaar echo g:alist.member 479d032f34aSBram Moolenaar catch /E715:/ 480d032f34aSBram Moolenaar n = 400 481d032f34aSBram Moolenaar endtry 482d032f34aSBram Moolenaar assert_equal(400, n) 483d032f34aSBram Moolenaar 484d032f34aSBram Moolenaar try 485d032f34aSBram Moolenaar echo d.member 486d032f34aSBram Moolenaar catch /E716:/ 487d032f34aSBram Moolenaar n = 411 488d032f34aSBram Moolenaar endtry 489d032f34aSBram Moolenaar assert_equal(411, n) 4908a7d6542SBram Moolenaarenddef 4918a7d6542SBram Moolenaar 492e859312eSBram Moolenaardef DeletedFunc(): list<any> 493e859312eSBram Moolenaar return ['delete me'] 494e859312eSBram Moolenaarenddef 495e859312eSBram Moolenaardefcompile 496e859312eSBram Moolenaardelfunc DeletedFunc 497e859312eSBram Moolenaar 498257cc5eeSBram Moolenaardef ThrowFromDef() 499a72cfb80SBram Moolenaar throw "getout" # comment 500257cc5eeSBram Moolenaarenddef 501257cc5eeSBram Moolenaar 502257cc5eeSBram Moolenaarfunc CatchInFunc() 503257cc5eeSBram Moolenaar try 504257cc5eeSBram Moolenaar call ThrowFromDef() 505257cc5eeSBram Moolenaar catch 506257cc5eeSBram Moolenaar let g:thrown_func = v:exception 507257cc5eeSBram Moolenaar endtry 508257cc5eeSBram Moolenaarendfunc 509257cc5eeSBram Moolenaar 510257cc5eeSBram Moolenaardef CatchInDef() 511257cc5eeSBram Moolenaar try 512257cc5eeSBram Moolenaar ThrowFromDef() 513257cc5eeSBram Moolenaar catch 514257cc5eeSBram Moolenaar g:thrown_def = v:exception 515257cc5eeSBram Moolenaar endtry 516257cc5eeSBram Moolenaarenddef 517257cc5eeSBram Moolenaar 518f575adffSBram Moolenaardef ReturnFinally(): string 519f575adffSBram Moolenaar try 520f575adffSBram Moolenaar return 'intry' 521373863edSBram Moolenaar finall 522f575adffSBram Moolenaar g:in_finally = 'finally' 523f575adffSBram Moolenaar endtry 524f575adffSBram Moolenaar return 'end' 525f575adffSBram Moolenaarenddef 526f575adffSBram Moolenaar 527257cc5eeSBram Moolenaardef Test_try_catch_nested() 528257cc5eeSBram Moolenaar CatchInFunc() 529257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 530257cc5eeSBram Moolenaar 531257cc5eeSBram Moolenaar CatchInDef() 532257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 533f575adffSBram Moolenaar 534f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 535f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 536f575adffSBram Moolenaarenddef 537f575adffSBram Moolenaar 5389939f57bSBram Moolenaardef TryOne(): number 5399939f57bSBram Moolenaar try 5409939f57bSBram Moolenaar return 0 5419939f57bSBram Moolenaar catch 5429939f57bSBram Moolenaar endtry 5439939f57bSBram Moolenaar return 0 5449939f57bSBram Moolenaarenddef 5459939f57bSBram Moolenaar 5469939f57bSBram Moolenaardef TryTwo(n: number): string 5479939f57bSBram Moolenaar try 548cfcd011fSBram Moolenaar var x = {} 5499939f57bSBram Moolenaar catch 5509939f57bSBram Moolenaar endtry 5519939f57bSBram Moolenaar return 'text' 5529939f57bSBram Moolenaarenddef 5539939f57bSBram Moolenaar 5549939f57bSBram Moolenaardef Test_try_catch_twice() 5559939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5569939f57bSBram Moolenaarenddef 5579939f57bSBram Moolenaar 558f575adffSBram Moolenaardef Test_try_catch_match() 559cfcd011fSBram Moolenaar var seq = 'a' 560f575adffSBram Moolenaar try 561f575adffSBram Moolenaar throw 'something' 562f575adffSBram Moolenaar catch /nothing/ 563f575adffSBram Moolenaar seq ..= 'x' 564f575adffSBram Moolenaar catch /some/ 565f575adffSBram Moolenaar seq ..= 'b' 566f575adffSBram Moolenaar catch /asdf/ 567f575adffSBram Moolenaar seq ..= 'x' 568e8c4abbbSBram Moolenaar catch ?a\?sdf? 569e8c4abbbSBram Moolenaar seq ..= 'y' 570f575adffSBram Moolenaar finally 571f575adffSBram Moolenaar seq ..= 'c' 572f575adffSBram Moolenaar endtry 573f575adffSBram Moolenaar assert_equal('abc', seq) 574257cc5eeSBram Moolenaarenddef 575257cc5eeSBram Moolenaar 576e8c4abbbSBram Moolenaardef Test_try_catch_fails() 577d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 578d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 579d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 580d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 581d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 582d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 583d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 584d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 58513106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 586d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 587585fea7bSBram Moolenaar 588d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 589d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 590e8c4abbbSBram Moolenaarenddef 591e8c4abbbSBram Moolenaar 592006ad48bSBram Moolenaardef Test_throw_vimscript() 593f5be8cdbSBram Moolenaar # only checks line continuation 594cfcd011fSBram Moolenaar var lines =<< trim END 595006ad48bSBram Moolenaar vim9script 596006ad48bSBram Moolenaar try 597006ad48bSBram Moolenaar throw 'one' 598006ad48bSBram Moolenaar .. 'two' 599006ad48bSBram Moolenaar catch 600006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 601006ad48bSBram Moolenaar endtry 602006ad48bSBram Moolenaar END 603006ad48bSBram Moolenaar CheckScriptSuccess(lines) 604006ad48bSBram Moolenaarenddef 605006ad48bSBram Moolenaar 606ed677f55SBram Moolenaardef Test_error_in_nested_function() 607ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 608cfcd011fSBram Moolenaar var lines =<< trim END 609ed677f55SBram Moolenaar vim9script 610ed677f55SBram Moolenaar def Func() 611ed677f55SBram Moolenaar Error() 612ed677f55SBram Moolenaar g:test_var = 1 613ed677f55SBram Moolenaar enddef 614ed677f55SBram Moolenaar func Error() abort 615ed677f55SBram Moolenaar eval [][0] 616ed677f55SBram Moolenaar endfunc 617ed677f55SBram Moolenaar Func() 618ed677f55SBram Moolenaar END 619ed677f55SBram Moolenaar g:test_var = 0 620ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 621ed677f55SBram Moolenaar assert_equal(0, g:test_var) 622ed677f55SBram Moolenaarenddef 623ed677f55SBram Moolenaar 62437c83711SBram Moolenaardef Test_cexpr_vimscript() 625f5be8cdbSBram Moolenaar # only checks line continuation 62637c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 627cfcd011fSBram Moolenaar var lines =<< trim END 62837c83711SBram Moolenaar vim9script 62937c83711SBram Moolenaar cexpr 'File' 63037c83711SBram Moolenaar .. ' someFile' .. 63137c83711SBram Moolenaar ' line 19' 63237c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 63337c83711SBram Moolenaar END 63437c83711SBram Moolenaar CheckScriptSuccess(lines) 63537c83711SBram Moolenaar set errorformat& 63637c83711SBram Moolenaarenddef 63737c83711SBram Moolenaar 638c9edd6b5SBram Moolenaardef Test_statusline_syntax() 639c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 640cfcd011fSBram Moolenaar var lines =<< trim END 641c9edd6b5SBram Moolenaar vim9script 642c9edd6b5SBram Moolenaar func g:Status() 643c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 644c9edd6b5SBram Moolenaar endfunc 645c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 646c9edd6b5SBram Moolenaar redrawstatus 647c9edd6b5SBram Moolenaar set laststatus statusline= 648c9edd6b5SBram Moolenaar END 649c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 650c9edd6b5SBram Moolenaarenddef 651c9edd6b5SBram Moolenaar 652b209750bSBram Moolenaardef Test_list_vimscript() 653b209750bSBram Moolenaar # checks line continuation and comments 654cfcd011fSBram Moolenaar var lines =<< trim END 655b209750bSBram Moolenaar vim9script 656cfcd011fSBram Moolenaar var mylist = [ 657b209750bSBram Moolenaar 'one', 658b209750bSBram Moolenaar # comment 659b209750bSBram Moolenaar 'two', # empty line follows 660b209750bSBram Moolenaar 661b209750bSBram Moolenaar 'three', 662b209750bSBram Moolenaar ] 663b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 664b209750bSBram Moolenaar END 665b209750bSBram Moolenaar CheckScriptSuccess(lines) 66666250c93SBram Moolenaar 66766250c93SBram Moolenaar # check all lines from heredoc are kept 66866250c93SBram Moolenaar lines =<< trim END 66966250c93SBram Moolenaar # comment 1 67066250c93SBram Moolenaar two 67166250c93SBram Moolenaar # comment 3 67266250c93SBram Moolenaar 67366250c93SBram Moolenaar five 67466250c93SBram Moolenaar # comment 6 67566250c93SBram Moolenaar END 67666250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 677b209750bSBram Moolenaarenddef 678b209750bSBram Moolenaar 6792a1381c3SBram Moolenaarif has('channel') 68040ee466cSBram Moolenaar let someJob = test_null_job() 68140ee466cSBram Moolenaar 68240ee466cSBram Moolenaar def FuncWithError() 68340ee466cSBram Moolenaar echomsg g:someJob 68440ee466cSBram Moolenaar enddef 68540ee466cSBram Moolenaar 68640ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 68740ee466cSBram Moolenaar try 68840ee466cSBram Moolenaar call FuncWithError() 68940ee466cSBram Moolenaar catch 69040ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 69140ee466cSBram Moolenaar endtry 69240ee466cSBram Moolenaar endfunc 6932a1381c3SBram Moolenaarendif 69440ee466cSBram Moolenaar 6958a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 6968a7d6542SBram Moolenaar vim9script 697cfcd011fSBram Moolenaar var name: string = 'bob' 6988a7d6542SBram Moolenaar def Concat(arg: string): string 6998a7d6542SBram Moolenaar return name .. arg 7008a7d6542SBram Moolenaar enddef 701227a69deSBram Moolenaar g:result = Concat('bie') 702227a69deSBram Moolenaar g:localname = name 7038a7d6542SBram Moolenaar 7048a7d6542SBram Moolenaar export const CONST = 1234 705cfcd011fSBram Moolenaar export var exported = 9876 706cfcd011fSBram Moolenaar export var exp_name = 'John' 7078a7d6542SBram Moolenaar export def Exported(): string 7088a7d6542SBram Moolenaar return 'Exported' 7098a7d6542SBram Moolenaar enddef 7108a7d6542SBram MoolenaarEND 7118a7d6542SBram Moolenaar 712b3ca9824SBram Moolenaardef Undo_export_script_lines() 713b3ca9824SBram Moolenaar unlet g:result 714b3ca9824SBram Moolenaar unlet g:localname 715b3ca9824SBram Moolenaarenddef 716b3ca9824SBram Moolenaar 7175269bd2aSBram Moolenaardef Test_vim9_import_export() 718cfcd011fSBram Moolenaar var import_script_lines =<< trim END 7198a7d6542SBram Moolenaar vim9script 7208a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 7218a7d6542SBram Moolenaar g:imported = exported 7226e587dcbSBram Moolenaar exported += 3 7236e587dcbSBram Moolenaar g:imported_added = exported 7248a7d6542SBram Moolenaar g:imported_func = Exported() 7256e587dcbSBram Moolenaar 72640f4f7a4SBram Moolenaar def GetExported(): string 727cfcd011fSBram Moolenaar var local_dict = #{ref: Exported} 72840f4f7a4SBram Moolenaar return local_dict.ref() 72940f4f7a4SBram Moolenaar enddef 73040f4f7a4SBram Moolenaar g:funcref_result = GetExported() 73140f4f7a4SBram Moolenaar 7326e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7336e587dcbSBram Moolenaar g:imported_name = exp_name 7346e587dcbSBram Moolenaar exp_name ..= ' Doe' 7356e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7365381c7a1SBram Moolenaar g:imported_later = exported 7378a7d6542SBram Moolenaar END 7388a7d6542SBram Moolenaar 7398a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7408a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7418a7d6542SBram Moolenaar 7428a7d6542SBram Moolenaar source Ximport.vim 7438a7d6542SBram Moolenaar 7448a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7458a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7468a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7476e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7485381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 7498a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 75040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 7516e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 7526e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 7538a7d6542SBram Moolenaar assert_false(exists('g:name')) 7548a7d6542SBram Moolenaar 755b3ca9824SBram Moolenaar Undo_export_script_lines() 7568a7d6542SBram Moolenaar unlet g:imported 7576e587dcbSBram Moolenaar unlet g:imported_added 7585381c7a1SBram Moolenaar unlet g:imported_later 7598a7d6542SBram Moolenaar unlet g:imported_func 7606e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 7618a7d6542SBram Moolenaar delete('Ximport.vim') 762f2d5c240SBram Moolenaar 7631c991144SBram Moolenaar # similar, with line breaks 764cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 7651c991144SBram Moolenaar vim9script 7661c991144SBram Moolenaar import { 7671c991144SBram Moolenaar exported, 7681c991144SBram Moolenaar Exported, 7691c991144SBram Moolenaar } 7701c991144SBram Moolenaar from 7711c991144SBram Moolenaar './Xexport.vim' 7721c991144SBram Moolenaar g:imported = exported 7731c991144SBram Moolenaar exported += 5 7741c991144SBram Moolenaar g:imported_added = exported 7751c991144SBram Moolenaar g:imported_func = Exported() 7761c991144SBram Moolenaar END 7771c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 7781c991144SBram Moolenaar source Ximport_lbr.vim 7791c991144SBram Moolenaar 7801c991144SBram Moolenaar assert_equal(9876, g:imported) 7811c991144SBram Moolenaar assert_equal(9881, g:imported_added) 7821c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 7831c991144SBram Moolenaar 7841c991144SBram Moolenaar # exported script not sourced again 7851c991144SBram Moolenaar assert_false(exists('g:result')) 7861c991144SBram Moolenaar unlet g:imported 7871c991144SBram Moolenaar unlet g:imported_added 7881c991144SBram Moolenaar unlet g:imported_func 7891c991144SBram Moolenaar delete('Ximport_lbr.vim') 7901c991144SBram Moolenaar 7911c991144SBram Moolenaar # import inside :def function 792cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 7935381c7a1SBram Moolenaar vim9script 7945381c7a1SBram Moolenaar def ImportInDef() 7955381c7a1SBram Moolenaar import exported from './Xexport.vim' 7965381c7a1SBram Moolenaar g:imported = exported 7975381c7a1SBram Moolenaar exported += 7 7985381c7a1SBram Moolenaar g:imported_added = exported 7995381c7a1SBram Moolenaar enddef 8005381c7a1SBram Moolenaar ImportInDef() 8015381c7a1SBram Moolenaar END 8025381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8035381c7a1SBram Moolenaar source Ximport2.vim 804f5be8cdbSBram Moolenaar # TODO: this should be 9879 8055381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8065381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8075381c7a1SBram Moolenaar unlet g:imported 8085381c7a1SBram Moolenaar unlet g:imported_added 8095381c7a1SBram Moolenaar delete('Ximport2.vim') 8105381c7a1SBram Moolenaar 811cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 812f2d5c240SBram Moolenaar vim9script 813f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 814f2d5c240SBram Moolenaar def UseExport() 815f2d5c240SBram Moolenaar g:imported = Export.exported 816f2d5c240SBram Moolenaar enddef 817f2d5c240SBram Moolenaar UseExport() 818f2d5c240SBram Moolenaar END 819f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 820f2d5c240SBram Moolenaar source Ximport.vim 8215381c7a1SBram Moolenaar assert_equal(9883, g:imported) 822f2d5c240SBram Moolenaar 823cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 824599c89c8SBram Moolenaar vim9script 825599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 826599c89c8SBram Moolenaar def Func() 827cfcd011fSBram Moolenaar var dummy = 1 828cfcd011fSBram Moolenaar var imported = Export + dummy 829599c89c8SBram Moolenaar enddef 830822ba247SBram Moolenaar defcompile 831599c89c8SBram Moolenaar END 832599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 83344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 834599c89c8SBram Moolenaar 835cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 836599c89c8SBram Moolenaar vim9script 837599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 838599c89c8SBram Moolenaar def Func() 839cfcd011fSBram Moolenaar var imported = Export . exported 840599c89c8SBram Moolenaar enddef 841822ba247SBram Moolenaar defcompile 842599c89c8SBram Moolenaar END 843599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 84444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 845599c89c8SBram Moolenaar 846cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 847599c89c8SBram Moolenaar vim9script 848599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 849599c89c8SBram Moolenaar def Func() 850cfcd011fSBram Moolenaar var imported = Export. 851599c89c8SBram Moolenaar enddef 852822ba247SBram Moolenaar defcompile 853599c89c8SBram Moolenaar END 854599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 85544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 856599c89c8SBram Moolenaar 857cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 8581c991144SBram Moolenaar vim9script 8591c991144SBram Moolenaar import * 8601c991144SBram Moolenaar as Export 8611c991144SBram Moolenaar from 8621c991144SBram Moolenaar './Xexport.vim' 8631c991144SBram Moolenaar def UseExport() 8641c991144SBram Moolenaar g:imported = Export.exported 8651c991144SBram Moolenaar enddef 8661c991144SBram Moolenaar UseExport() 8671c991144SBram Moolenaar END 8681c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 8691c991144SBram Moolenaar source Ximport.vim 8701c991144SBram Moolenaar assert_equal(9883, g:imported) 8711c991144SBram Moolenaar 872cfcd011fSBram Moolenaar var import_star_lines =<< trim END 873f2d5c240SBram Moolenaar vim9script 874f2d5c240SBram Moolenaar import * from './Xexport.vim' 875f2d5c240SBram Moolenaar END 876f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 87744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 878f2d5c240SBram Moolenaar 879f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 880cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 881fa29c8abSBram Moolenaar vim9script 882fa29c8abSBram Moolenaar import name from './Xexport.vim' 883fa29c8abSBram Moolenaar END 884fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 88544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 886fa29c8abSBram Moolenaar 887f5be8cdbSBram Moolenaar # try to import something that is already defined 888cfcd011fSBram Moolenaar var import_already_defined =<< trim END 8895269bd2aSBram Moolenaar vim9script 890cfcd011fSBram Moolenaar var exported = 'something' 8915269bd2aSBram Moolenaar import exported from './Xexport.vim' 8925269bd2aSBram Moolenaar END 8935269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 89444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 8955269bd2aSBram Moolenaar 896f5be8cdbSBram Moolenaar # try to import something that is already defined 8975269bd2aSBram Moolenaar import_already_defined =<< trim END 8985269bd2aSBram Moolenaar vim9script 899cfcd011fSBram Moolenaar var exported = 'something' 9005269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9015269bd2aSBram Moolenaar END 9025269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 90344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9045269bd2aSBram Moolenaar 905f5be8cdbSBram Moolenaar # try to import something that is already defined 9065269bd2aSBram Moolenaar import_already_defined =<< trim END 9075269bd2aSBram Moolenaar vim9script 908cfcd011fSBram Moolenaar var exported = 'something' 9095269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9105269bd2aSBram Moolenaar END 9115269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 91244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9135269bd2aSBram Moolenaar 914f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 915cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 916fa29c8abSBram Moolenaar vim9script 917fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 918fa29c8abSBram Moolenaar END 919fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 92044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 921fa29c8abSBram Moolenaar 922cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 923fa29c8abSBram Moolenaar vim9script 924fa29c8abSBram Moolenaar import name './Xexport.vim' 925fa29c8abSBram Moolenaar END 926fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 92744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 928fa29c8abSBram Moolenaar 929cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 930fa29c8abSBram Moolenaar vim9script 931fa29c8abSBram Moolenaar import name from Xexport.vim 932fa29c8abSBram Moolenaar END 933fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 93444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 935fa29c8abSBram Moolenaar 936cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 937fa29c8abSBram Moolenaar vim9script 938fa29c8abSBram Moolenaar import name from './XnoExport.vim' 939fa29c8abSBram Moolenaar END 940fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 94144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 942fa29c8abSBram Moolenaar 943cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 944fa29c8abSBram Moolenaar vim9script 945fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 946fa29c8abSBram Moolenaar END 9475269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 94844d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 949fa29c8abSBram Moolenaar 950f2d5c240SBram Moolenaar delete('Ximport.vim') 9515269bd2aSBram Moolenaar delete('Ximport3.vim') 9528a7d6542SBram Moolenaar delete('Xexport.vim') 9538a7d6542SBram Moolenaar 954f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 955750802b5SBram Moolenaar set cpo&vi 956cfcd011fSBram Moolenaar var cpo_before = &cpo 957cfcd011fSBram Moolenaar var lines =<< trim END 958750802b5SBram Moolenaar vim9script 959750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 960750802b5SBram Moolenaar END 961750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 962750802b5SBram Moolenaar source Xvim9_script 963750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 964750802b5SBram Moolenaar set cpo&vim 965750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 966750802b5SBram Moolenaar delete('Xvim9_script') 967750802b5SBram Moolenaarenddef 968750802b5SBram Moolenaar 969803af686SBram Moolenaarfunc g:Trigger() 970803af686SBram Moolenaar source Ximport.vim 971803af686SBram Moolenaar return "echo 'yes'\<CR>" 972803af686SBram Moolenaarendfunc 973803af686SBram Moolenaar 974803af686SBram Moolenaardef Test_import_export_expr_map() 975803af686SBram Moolenaar # check that :import and :export work when buffer is locked 976cfcd011fSBram Moolenaar var export_lines =<< trim END 977803af686SBram Moolenaar vim9script 978803af686SBram Moolenaar export def That(): string 979803af686SBram Moolenaar return 'yes' 980803af686SBram Moolenaar enddef 981803af686SBram Moolenaar END 982803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 983803af686SBram Moolenaar 984cfcd011fSBram Moolenaar var import_lines =<< trim END 985803af686SBram Moolenaar vim9script 986803af686SBram Moolenaar import That from './Xexport_that.vim' 987803af686SBram Moolenaar assert_equal('yes', That()) 988803af686SBram Moolenaar END 989803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 990803af686SBram Moolenaar 991803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 992803af686SBram Moolenaar feedkeys('trigger', "xt") 993803af686SBram Moolenaar 994730b2483SBram Moolenaar delete('Xexport_that.vim') 995803af686SBram Moolenaar delete('Ximport.vim') 996803af686SBram Moolenaar nunmap trigger 997803af686SBram Moolenaarenddef 998803af686SBram Moolenaar 9998e1986e3SBram Moolenaardef Test_import_in_filetype() 10008e1986e3SBram Moolenaar # check that :import works when the buffer is locked 10018e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1002cfcd011fSBram Moolenaar var export_lines =<< trim END 10038e1986e3SBram Moolenaar vim9script 1004cfcd011fSBram Moolenaar export var That = 'yes' 10058e1986e3SBram Moolenaar END 1006730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 10078e1986e3SBram Moolenaar 1008cfcd011fSBram Moolenaar var import_lines =<< trim END 10098e1986e3SBram Moolenaar vim9script 1010730b2483SBram Moolenaar import That from './Xexport_ft.vim' 10118e1986e3SBram Moolenaar assert_equal('yes', That) 10128e1986e3SBram Moolenaar g:did_load_mytpe = 1 10138e1986e3SBram Moolenaar END 10148e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 10158e1986e3SBram Moolenaar 1016cfcd011fSBram Moolenaar var save_rtp = &rtp 10178e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 10188e1986e3SBram Moolenaar 10198e1986e3SBram Moolenaar filetype plugin on 10208e1986e3SBram Moolenaar copen 10218e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 10228e1986e3SBram Moolenaar 10238e1986e3SBram Moolenaar quit! 1024730b2483SBram Moolenaar delete('Xexport_ft.vim') 10258e1986e3SBram Moolenaar delete('ftplugin', 'rf') 10268e1986e3SBram Moolenaar &rtp = save_rtp 10278e1986e3SBram Moolenaarenddef 10288e1986e3SBram Moolenaar 1029efa94447SBram Moolenaardef Test_use_import_in_mapping() 1030cfcd011fSBram Moolenaar var lines =<< trim END 1031efa94447SBram Moolenaar vim9script 1032efa94447SBram Moolenaar export def Funcx() 1033efa94447SBram Moolenaar g:result = 42 1034efa94447SBram Moolenaar enddef 1035efa94447SBram Moolenaar END 1036efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1037efa94447SBram Moolenaar lines =<< trim END 1038efa94447SBram Moolenaar vim9script 1039efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1040b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1041efa94447SBram Moolenaar END 1042efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1043efa94447SBram Moolenaar 1044efa94447SBram Moolenaar source Xmapscript.vim 1045b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1046efa94447SBram Moolenaar assert_equal(42, g:result) 1047efa94447SBram Moolenaar 1048efa94447SBram Moolenaar unlet g:result 1049efa94447SBram Moolenaar delete('XsomeExport.vim') 1050efa94447SBram Moolenaar delete('Xmapscript.vim') 1051b3ca9824SBram Moolenaar nunmap <F3> 1052efa94447SBram Moolenaarenddef 1053efa94447SBram Moolenaar 1054750802b5SBram Moolenaardef Test_vim9script_fails() 10558a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 10568a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1057cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 10589721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1059cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1060750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1061750802b5SBram Moolenaar 1062cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1063c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1064c785b9a7SBram Moolenaar 1065e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1066e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 10678a7d6542SBram Moolenaarenddef 10688a7d6542SBram Moolenaar 1069f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1070101f4810SBram Moolenaar CheckRunVimInTerminal 1071101f4810SBram Moolenaar 10729bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1073c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 10749bb3eb3eSBram Moolenaarendfunc 10759bb3eb3eSBram Moolenaar 1076c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1077cfcd011fSBram Moolenaar var export =<< trim END 1078101f4810SBram Moolenaar vim9script 1079101f4810SBram Moolenaar export def Foo(): number 1080101f4810SBram Moolenaar return 0 1081101f4810SBram Moolenaar enddef 1082101f4810SBram Moolenaar END 1083730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1084101f4810SBram Moolenaar 1085cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 10869bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 10879bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1088101f4810SBram Moolenaar 1089730b2483SBram Moolenaar delete('XexportCmd.vim') 10909bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 10919bb3eb3eSBram Moolenaarenddef 1092101f4810SBram Moolenaar 10934c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1094cfcd011fSBram Moolenaar var lines =<< trim END 10958a7d6542SBram Moolenaar vim9script 10968a7d6542SBram Moolenaar const var = '' 1097cfcd011fSBram Moolenaar var valone = 1234 10988a7d6542SBram Moolenaar def MyFunc(arg: string) 10998a7d6542SBram Moolenaar valone = 5678 11008a7d6542SBram Moolenaar enddef 11018a7d6542SBram Moolenaar END 1102cfcd011fSBram Moolenaar var morelines =<< trim END 1103cfcd011fSBram Moolenaar var valtwo = 222 11048a7d6542SBram Moolenaar export def GetValtwo(): number 11058a7d6542SBram Moolenaar return valtwo 11068a7d6542SBram Moolenaar enddef 11078a7d6542SBram Moolenaar END 110803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11098a7d6542SBram Moolenaar source Xreload.vim 11108a7d6542SBram Moolenaar source Xreload.vim 11118a7d6542SBram Moolenaar source Xreload.vim 11128a7d6542SBram Moolenaar 1113cfcd011fSBram Moolenaar var testlines =<< trim END 11148a7d6542SBram Moolenaar vim9script 11158a7d6542SBram Moolenaar def TheFunc() 11168a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11178a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11188a7d6542SBram Moolenaar enddef 11198a7d6542SBram Moolenaar TheFunc() 11208a7d6542SBram Moolenaar END 11218a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11228a7d6542SBram Moolenaar source Ximport.vim 11238a7d6542SBram Moolenaar 1124f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1125f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11268a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11278a7d6542SBram Moolenaar source Ximport.vim 11288a7d6542SBram Moolenaar 1129f5be8cdbSBram Moolenaar # cannot declare a var twice 11308a7d6542SBram Moolenaar lines =<< trim END 11318a7d6542SBram Moolenaar vim9script 1132cfcd011fSBram Moolenaar var valone = 1234 1133cfcd011fSBram Moolenaar var valone = 5678 11348a7d6542SBram Moolenaar END 11358a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 113644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 11378a7d6542SBram Moolenaar 11388a7d6542SBram Moolenaar delete('Xreload.vim') 11398a7d6542SBram Moolenaar delete('Ximport.vim') 11408a7d6542SBram Moolenaarenddef 11418a7d6542SBram Moolenaar 114295006e3dSBram Moolenaardef s:RetSome(): string 114395006e3dSBram Moolenaar return 'some' 114495006e3dSBram Moolenaarenddef 114595006e3dSBram Moolenaar 1146fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1147fe465a01SBram Moolenaar" script-local name. 1148fe465a01SBram Moolenaardef Test_vim9script_funcref() 1149cfcd011fSBram Moolenaar var sortlines =<< trim END 1150fe465a01SBram Moolenaar vim9script 1151fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1152bed36b93SBram Moolenaar return i2 - i1 1153fe465a01SBram Moolenaar enddef 1154fe465a01SBram Moolenaar 1155fe465a01SBram Moolenaar export def FastSort(): list<number> 1156fe465a01SBram Moolenaar return range(5)->sort(Compare) 1157fe465a01SBram Moolenaar enddef 1158fe465a01SBram Moolenaar END 1159fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1160fe465a01SBram Moolenaar 1161cfcd011fSBram Moolenaar var lines =<< trim END 1162fe465a01SBram Moolenaar vim9script 1163fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1164fe465a01SBram Moolenaar def Test() 1165fe465a01SBram Moolenaar g:result = FastSort() 1166fe465a01SBram Moolenaar enddef 1167fe465a01SBram Moolenaar Test() 1168fe465a01SBram Moolenaar END 1169fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1170fe465a01SBram Moolenaar 1171fe465a01SBram Moolenaar source Xscript.vim 1172fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1173fe465a01SBram Moolenaar 1174fe465a01SBram Moolenaar unlet g:result 1175fe465a01SBram Moolenaar delete('Xsort.vim') 1176fe465a01SBram Moolenaar delete('Xscript.vim') 117795006e3dSBram Moolenaar 1178cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 117995006e3dSBram Moolenaar assert_equal('some', Funcref()) 1180fe465a01SBram Moolenaarenddef 1181fe465a01SBram Moolenaar 1182601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1183601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1184601e76acSBram Moolenaar" function reference. 1185c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1186cfcd011fSBram Moolenaar var filterLines =<< trim END 1187c620c055SBram Moolenaar vim9script 1188c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1189c620c055SBram Moolenaar return idx % 2 == 1 1190c620c055SBram Moolenaar enddef 1191c620c055SBram Moolenaar export def FastFilter(): list<number> 1192c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1193c620c055SBram Moolenaar enddef 1194601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1195601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1196601e76acSBram Moolenaar enddef 1197c620c055SBram Moolenaar END 1198c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1199c620c055SBram Moolenaar 1200cfcd011fSBram Moolenaar var lines =<< trim END 1201c620c055SBram Moolenaar vim9script 1202601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1203c620c055SBram Moolenaar def Test() 1204cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1205c620c055SBram Moolenaar enddef 1206c620c055SBram Moolenaar Test() 1207601e76acSBram Moolenaar def TestDirect() 1208cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1209601e76acSBram Moolenaar enddef 1210601e76acSBram Moolenaar TestDirect() 1211c620c055SBram Moolenaar END 1212601e76acSBram Moolenaar CheckScriptSuccess(lines) 1213c620c055SBram Moolenaar delete('Xfilter.vim') 1214c620c055SBram Moolenaarenddef 1215c620c055SBram Moolenaar 12164c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1217cfcd011fSBram Moolenaar var first_lines =<< trim END 12184c17ad94SBram Moolenaar vim9script 12194c17ad94SBram Moolenaar def FuncYes(): string 12204c17ad94SBram Moolenaar return 'yes' 12214c17ad94SBram Moolenaar enddef 12224c17ad94SBram Moolenaar END 1223cfcd011fSBram Moolenaar var withno_lines =<< trim END 12244c17ad94SBram Moolenaar def FuncNo(): string 12254c17ad94SBram Moolenaar return 'no' 12264c17ad94SBram Moolenaar enddef 12274c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12284c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12294c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 123003afdcf1SBram Moolenaar enddef 123103afdcf1SBram Moolenaar END 1232cfcd011fSBram Moolenaar var nono_lines =<< trim END 123303afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 123403afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 123544d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 12364c17ad94SBram Moolenaar enddef 12374c17ad94SBram Moolenaar END 12384c17ad94SBram Moolenaar 12394c17ad94SBram Moolenaar # FuncNo() is defined 124003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12414c17ad94SBram Moolenaar source Xreloaded.vim 12424c17ad94SBram Moolenaar g:DoCheck(true) 12434c17ad94SBram Moolenaar 12444c17ad94SBram Moolenaar # FuncNo() is not redefined 124503afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12464c17ad94SBram Moolenaar source Xreloaded.vim 124703afdcf1SBram Moolenaar g:DoCheck() 12484c17ad94SBram Moolenaar 12494c17ad94SBram Moolenaar # FuncNo() is back 125003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12514c17ad94SBram Moolenaar source Xreloaded.vim 125203afdcf1SBram Moolenaar g:DoCheck() 12534c17ad94SBram Moolenaar 12544c17ad94SBram Moolenaar delete('Xreloaded.vim') 12554c17ad94SBram Moolenaarenddef 12564c17ad94SBram Moolenaar 125789483d40SBram Moolenaardef Test_vim9script_reload_delvar() 125889483d40SBram Moolenaar # write the script with a script-local variable 1259cfcd011fSBram Moolenaar var lines =<< trim END 126089483d40SBram Moolenaar vim9script 1261cfcd011fSBram Moolenaar var name = 'string' 126289483d40SBram Moolenaar END 126389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 126489483d40SBram Moolenaar source XreloadVar.vim 126589483d40SBram Moolenaar 126689483d40SBram Moolenaar # now write the script using the same variable locally - works 126789483d40SBram Moolenaar lines =<< trim END 126889483d40SBram Moolenaar vim9script 126989483d40SBram Moolenaar def Func() 1270cfcd011fSBram Moolenaar var name = 'string' 127189483d40SBram Moolenaar enddef 127289483d40SBram Moolenaar END 127389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 127489483d40SBram Moolenaar source XreloadVar.vim 127589483d40SBram Moolenaar 127689483d40SBram Moolenaar delete('XreloadVar.vim') 127789483d40SBram Moolenaarenddef 127889483d40SBram Moolenaar 12798a7d6542SBram Moolenaardef Test_import_absolute() 1280cfcd011fSBram Moolenaar var import_lines = [ 1281e6085c53SBram Moolenaar 'vim9script', 1282e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1283e6085c53SBram Moolenaar 'def UseExported()', 1284e6085c53SBram Moolenaar ' g:imported_abs = exported', 1285e6085c53SBram Moolenaar ' exported = 8888', 1286e6085c53SBram Moolenaar ' g:imported_after = exported', 1287e6085c53SBram Moolenaar 'enddef', 1288e6085c53SBram Moolenaar 'UseExported()', 1289e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1290e6085c53SBram Moolenaar ] 12918a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 12928a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 12938a7d6542SBram Moolenaar 12948a7d6542SBram Moolenaar source Ximport_abs.vim 12958a7d6542SBram Moolenaar 12968a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 12974e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1298*fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1299*fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1300*fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1301*fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1302*fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1303*fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1304*fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1305*fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1306*fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1307*fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1308e6085c53SBram Moolenaar g:import_disassembled) 1309b3ca9824SBram Moolenaar 1310b3ca9824SBram Moolenaar Undo_export_script_lines() 13118a7d6542SBram Moolenaar unlet g:imported_abs 13124e12a5dfSBram Moolenaar unlet g:import_disassembled 13138a7d6542SBram Moolenaar 13148a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13158a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13168a7d6542SBram Moolenaarenddef 13178a7d6542SBram Moolenaar 13188a7d6542SBram Moolenaardef Test_import_rtp() 1319cfcd011fSBram Moolenaar var import_lines = [ 1320e6085c53SBram Moolenaar 'vim9script', 1321e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1322e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1323e6085c53SBram Moolenaar ] 13248a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13258a7d6542SBram Moolenaar mkdir('import') 13268a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13278a7d6542SBram Moolenaar 1328cfcd011fSBram Moolenaar var save_rtp = &rtp 13298a7d6542SBram Moolenaar &rtp = getcwd() 13308a7d6542SBram Moolenaar source Ximport_rtp.vim 13318a7d6542SBram Moolenaar &rtp = save_rtp 13328a7d6542SBram Moolenaar 13338a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13348a7d6542SBram Moolenaar 1335b3ca9824SBram Moolenaar Undo_export_script_lines() 1336b3ca9824SBram Moolenaar unlet g:imported_rtp 13378a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 133889483d40SBram Moolenaar delete('import', 'rf') 13398a7d6542SBram Moolenaarenddef 13408a7d6542SBram Moolenaar 134125e0f586SBram Moolenaardef Test_import_compile_error() 1342cfcd011fSBram Moolenaar var export_lines = [ 134325e0f586SBram Moolenaar 'vim9script', 134425e0f586SBram Moolenaar 'export def ExpFunc(): string', 134525e0f586SBram Moolenaar ' return notDefined', 134625e0f586SBram Moolenaar 'enddef', 134725e0f586SBram Moolenaar ] 134825e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 134925e0f586SBram Moolenaar 1350cfcd011fSBram Moolenaar var import_lines = [ 135125e0f586SBram Moolenaar 'vim9script', 135225e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 135325e0f586SBram Moolenaar 'def ImpFunc()', 135425e0f586SBram Moolenaar ' echo ExpFunc()', 135525e0f586SBram Moolenaar 'enddef', 135625e0f586SBram Moolenaar 'defcompile', 135725e0f586SBram Moolenaar ] 135825e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 135925e0f586SBram Moolenaar 136025e0f586SBram Moolenaar try 136125e0f586SBram Moolenaar source Ximport.vim 136225e0f586SBram Moolenaar catch /E1001/ 1363f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 13647707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 136525e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 136625e0f586SBram Moolenaar endtry 136725e0f586SBram Moolenaar 136825e0f586SBram Moolenaar delete('Xexported.vim') 136925e0f586SBram Moolenaar delete('Ximport.vim') 137025e0f586SBram Moolenaarenddef 137125e0f586SBram Moolenaar 1372c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1373cfcd011fSBram Moolenaar var lines = [ 1374c4ce36d4SBram Moolenaar 'vim9script', 1375c4ce36d4SBram Moolenaar 'def Func()', 1376c4ce36d4SBram Moolenaar ' eval [][0]', 1377c4ce36d4SBram Moolenaar 'enddef', 1378c4ce36d4SBram Moolenaar 'Func()', 1379c4ce36d4SBram Moolenaar ] 1380c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1381c4ce36d4SBram Moolenaar 1382c4ce36d4SBram Moolenaar for count in range(3) 1383c4ce36d4SBram Moolenaar try 1384c4ce36d4SBram Moolenaar source Xtestscript.vim 1385c4ce36d4SBram Moolenaar catch /E684/ 1386c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1387c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1388c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1389c4ce36d4SBram Moolenaar endtry 1390c4ce36d4SBram Moolenaar endfor 1391c4ce36d4SBram Moolenaar 1392c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1393c4ce36d4SBram Moolenaarenddef 1394c4ce36d4SBram Moolenaar 1395eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1396cfcd011fSBram Moolenaar var export_lines =<< trim END 1397eef2102eSBram Moolenaar vim9script 1398eef2102eSBram Moolenaar export def Func() 1399eef2102eSBram Moolenaar echo 'imported' 1400eef2102eSBram Moolenaar enddef 1401eef2102eSBram Moolenaar END 1402eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1403eef2102eSBram Moolenaar 1404cfcd011fSBram Moolenaar var lines =<< trim END 1405eef2102eSBram Moolenaar vim9script 1406eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1407eef2102eSBram Moolenaar def Func() 1408eef2102eSBram Moolenaar echo 'local to function' 1409eef2102eSBram Moolenaar enddef 1410eef2102eSBram Moolenaar END 1411eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1412eef2102eSBram Moolenaar 1413eef2102eSBram Moolenaar lines =<< trim END 1414eef2102eSBram Moolenaar vim9script 1415eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1416eef2102eSBram Moolenaar def Outer() 1417eef2102eSBram Moolenaar def Func() 1418eef2102eSBram Moolenaar echo 'local to function' 1419eef2102eSBram Moolenaar enddef 1420eef2102eSBram Moolenaar enddef 1421eef2102eSBram Moolenaar defcompile 1422eef2102eSBram Moolenaar END 1423eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1424eef2102eSBram Moolenaar 1425eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1426eef2102eSBram Moolenaarenddef 1427eef2102eSBram Moolenaar 1428b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1429cfcd011fSBram Moolenaar var lines =<< trim END 1430b9a2cac3SBram Moolenaar vim9script 1431b9a2cac3SBram Moolenaar def Func() 1432b9a2cac3SBram Moolenaar echo 'one' 1433b9a2cac3SBram Moolenaar enddef 1434b9a2cac3SBram Moolenaar def Func() 1435b9a2cac3SBram Moolenaar echo 'two' 1436b9a2cac3SBram Moolenaar enddef 1437b9a2cac3SBram Moolenaar END 1438b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1439fa211f3cSBram Moolenaar 1440fa211f3cSBram Moolenaar lines =<< trim END 1441fa211f3cSBram Moolenaar vim9script 1442fa211f3cSBram Moolenaar def Foo(): string 1443fa211f3cSBram Moolenaar return 'foo' 1444fa211f3cSBram Moolenaar enddef 1445fa211f3cSBram Moolenaar def Func() 1446cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1447fa211f3cSBram Moolenaar enddef 1448fa211f3cSBram Moolenaar defcompile 1449fa211f3cSBram Moolenaar END 1450fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1451b9a2cac3SBram Moolenaarenddef 1452b9a2cac3SBram Moolenaar 14538a7d6542SBram Moolenaardef Test_fixed_size_list() 1454f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1455cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 14568a7d6542SBram Moolenaar l->remove(0) 14578a7d6542SBram Moolenaar l->add(5) 14588a7d6542SBram Moolenaar l->insert(99, 1) 14590f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14608a7d6542SBram Moolenaarenddef 14618a7d6542SBram Moolenaar 1462ae616494SBram Moolenaardef Test_no_insert_xit() 1463d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1464d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1465d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1466d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1467d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1468ae616494SBram Moolenaar 1469ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1470ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1471ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1472ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1473f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1474f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1475f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1476f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1477f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1478ae616494SBram Moolenaarenddef 1479ae616494SBram Moolenaar 1480158906cfSBram Moolenaardef IfElse(what: number): string 1481cfcd011fSBram Moolenaar var res = '' 1482158906cfSBram Moolenaar if what == 1 1483158906cfSBram Moolenaar res = "one" 1484158906cfSBram Moolenaar elseif what == 2 1485158906cfSBram Moolenaar res = "two" 1486a259d8d3SBram Moolenaar else 1487158906cfSBram Moolenaar res = "three" 1488a259d8d3SBram Moolenaar endif 1489158906cfSBram Moolenaar return res 1490a259d8d3SBram Moolenaarenddef 1491a259d8d3SBram Moolenaar 1492158906cfSBram Moolenaardef Test_if_elseif_else() 1493158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1494158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1495158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 14960f18b6d1SBram Moolenaarenddef 14970f18b6d1SBram Moolenaar 1498e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1499d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1500d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1501d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1502d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1503d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1504e8c4abbbSBram Moolenaarenddef 1505e8c4abbbSBram Moolenaar 15066d69bf60SBram Moolenaarlet g:bool_true = v:true 15076d69bf60SBram Moolenaarlet g:bool_false = v:false 15086d69bf60SBram Moolenaar 15096d69bf60SBram Moolenaardef Test_if_const_expr() 1510cfcd011fSBram Moolenaar var res = false 15116d69bf60SBram Moolenaar if true ? true : false 15126d69bf60SBram Moolenaar res = true 15136d69bf60SBram Moolenaar endif 15146d69bf60SBram Moolenaar assert_equal(true, res) 15156d69bf60SBram Moolenaar 1516585fea7bSBram Moolenaar g:glob = 2 1517585fea7bSBram Moolenaar if false 15186797966dSBram Moolenaar execute('g:glob = 3') 1519585fea7bSBram Moolenaar endif 1520585fea7bSBram Moolenaar assert_equal(2, g:glob) 1521585fea7bSBram Moolenaar if true 15226797966dSBram Moolenaar execute('g:glob = 3') 1523585fea7bSBram Moolenaar endif 1524585fea7bSBram Moolenaar assert_equal(3, g:glob) 1525585fea7bSBram Moolenaar 15266d69bf60SBram Moolenaar res = false 15276d69bf60SBram Moolenaar if g:bool_true ? true : false 15286d69bf60SBram Moolenaar res = true 15296d69bf60SBram Moolenaar endif 15306d69bf60SBram Moolenaar assert_equal(true, res) 15316d69bf60SBram Moolenaar 15326d69bf60SBram Moolenaar res = false 15336d69bf60SBram Moolenaar if true ? g:bool_true : false 15346d69bf60SBram Moolenaar res = true 15356d69bf60SBram Moolenaar endif 15366d69bf60SBram Moolenaar assert_equal(true, res) 15376d69bf60SBram Moolenaar 15386d69bf60SBram Moolenaar res = false 15396d69bf60SBram Moolenaar if true ? true : g:bool_false 15406d69bf60SBram Moolenaar res = true 15416d69bf60SBram Moolenaar endif 15426d69bf60SBram Moolenaar assert_equal(true, res) 15436d69bf60SBram Moolenaar 15446d69bf60SBram Moolenaar res = false 15456d69bf60SBram Moolenaar if true ? false : true 15466d69bf60SBram Moolenaar res = true 15476d69bf60SBram Moolenaar endif 15486d69bf60SBram Moolenaar assert_equal(false, res) 15496d69bf60SBram Moolenaar 15506d69bf60SBram Moolenaar res = false 15516d69bf60SBram Moolenaar if false ? false : true 15526d69bf60SBram Moolenaar res = true 15536d69bf60SBram Moolenaar endif 15546d69bf60SBram Moolenaar assert_equal(true, res) 15556d69bf60SBram Moolenaar 15566d69bf60SBram Moolenaar res = false 15576d69bf60SBram Moolenaar if false ? true : false 15586d69bf60SBram Moolenaar res = true 15596d69bf60SBram Moolenaar endif 15606d69bf60SBram Moolenaar assert_equal(false, res) 15616d69bf60SBram Moolenaar 15626d69bf60SBram Moolenaar res = false 1563e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1564e8c4abbbSBram Moolenaar res = true 1565e8c4abbbSBram Moolenaar endif 1566e8c4abbbSBram Moolenaar assert_equal(false, res) 1567e8c4abbbSBram Moolenaar 1568e8c4abbbSBram Moolenaar res = false 15696d69bf60SBram Moolenaar if true && true 15706d69bf60SBram Moolenaar res = true 15716d69bf60SBram Moolenaar endif 15726d69bf60SBram Moolenaar assert_equal(true, res) 15736d69bf60SBram Moolenaar 15746d69bf60SBram Moolenaar res = false 15756d69bf60SBram Moolenaar if true && false 15766d69bf60SBram Moolenaar res = true 15776d69bf60SBram Moolenaar endif 15786d69bf60SBram Moolenaar assert_equal(false, res) 15796d69bf60SBram Moolenaar 15806d69bf60SBram Moolenaar res = false 15816d69bf60SBram Moolenaar if g:bool_true && false 15826d69bf60SBram Moolenaar res = true 15836d69bf60SBram Moolenaar endif 15846d69bf60SBram Moolenaar assert_equal(false, res) 15856d69bf60SBram Moolenaar 15866d69bf60SBram Moolenaar res = false 15876d69bf60SBram Moolenaar if true && g:bool_false 15886d69bf60SBram Moolenaar res = true 15896d69bf60SBram Moolenaar endif 15906d69bf60SBram Moolenaar assert_equal(false, res) 15916d69bf60SBram Moolenaar 15926d69bf60SBram Moolenaar res = false 15936d69bf60SBram Moolenaar if false && false 15946d69bf60SBram Moolenaar res = true 15956d69bf60SBram Moolenaar endif 15966d69bf60SBram Moolenaar assert_equal(false, res) 15976d69bf60SBram Moolenaar 15986d69bf60SBram Moolenaar res = false 15996d69bf60SBram Moolenaar if true || false 16006d69bf60SBram Moolenaar res = true 16016d69bf60SBram Moolenaar endif 16026d69bf60SBram Moolenaar assert_equal(true, res) 16036d69bf60SBram Moolenaar 16046d69bf60SBram Moolenaar res = false 16056d69bf60SBram Moolenaar if g:bool_true || false 16066d69bf60SBram Moolenaar res = true 16076d69bf60SBram Moolenaar endif 16086d69bf60SBram Moolenaar assert_equal(true, res) 16096d69bf60SBram Moolenaar 16106d69bf60SBram Moolenaar res = false 16116d69bf60SBram Moolenaar if true || g:bool_false 16126d69bf60SBram Moolenaar res = true 16136d69bf60SBram Moolenaar endif 16146d69bf60SBram Moolenaar assert_equal(true, res) 16156d69bf60SBram Moolenaar 16166d69bf60SBram Moolenaar res = false 16176d69bf60SBram Moolenaar if false || false 16186d69bf60SBram Moolenaar res = true 16196d69bf60SBram Moolenaar endif 16206d69bf60SBram Moolenaar assert_equal(false, res) 16213988f64fSBram Moolenaar 16223988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 16233988f64fSBram Moolenaar if false | eval 0 | endif 16243988f64fSBram Moolenaar if false | eval burp + 234 | endif 16253988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 16263988f64fSBram Moolenaar if false 16273988f64fSBram Moolenaar burp 16283988f64fSBram Moolenaar endif 162980c34ca3SBram Moolenaarenddef 16306d69bf60SBram Moolenaar 163180c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1632d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1633d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1634d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1635d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16366d69bf60SBram Moolenaarenddef 16376d69bf60SBram Moolenaar 163872abcf42SBram Moolenaardef RunNested(i: number): number 1639cfcd011fSBram Moolenaar var x: number = 0 164072abcf42SBram Moolenaar if i % 2 164172abcf42SBram Moolenaar if 1 1642f5be8cdbSBram Moolenaar # comment 164372abcf42SBram Moolenaar else 1644f5be8cdbSBram Moolenaar # comment 164572abcf42SBram Moolenaar endif 164672abcf42SBram Moolenaar x += 1 164772abcf42SBram Moolenaar else 164872abcf42SBram Moolenaar x += 1000 164972abcf42SBram Moolenaar endif 165072abcf42SBram Moolenaar return x 165172abcf42SBram Moolenaarenddef 165272abcf42SBram Moolenaar 165372abcf42SBram Moolenaardef Test_nested_if() 165472abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 165572abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 165672abcf42SBram Moolenaarenddef 165772abcf42SBram Moolenaar 1658ad39c094SBram Moolenaardef Test_execute_cmd() 1659ad39c094SBram Moolenaar new 1660ad39c094SBram Moolenaar setline(1, 'default') 1661d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1662ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1663a72cfb80SBram Moolenaar 1664d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1665a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1666a72cfb80SBram Moolenaar 1667cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1668cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1669a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1670ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1671a72cfb80SBram Moolenaar 1672d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1673ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1674a72cfb80SBram Moolenaar 1675cfcd011fSBram Moolenaar var cmd_first = 'call ' 1676cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1677ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1678ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1679ad39c094SBram Moolenaar bwipe! 1680585fea7bSBram Moolenaar 1681cfcd011fSBram Moolenaar var n = true 16822d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 16832d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 16842d6b20d6SBram Moolenaar 1685e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 1686e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1687e5abf7afSBram Moolenaar 1688d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1689d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1690d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1691ad39c094SBram Moolenaarenddef 1692ad39c094SBram Moolenaar 169347e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1694f5be8cdbSBram Moolenaar # only checks line continuation 1695cfcd011fSBram Moolenaar var lines =<< trim END 169647e880d6SBram Moolenaar vim9script 169747e880d6SBram Moolenaar execute 'g:someVar' 169847e880d6SBram Moolenaar .. ' = ' .. 169947e880d6SBram Moolenaar '28' 170047e880d6SBram Moolenaar assert_equal(28, g:someVar) 170147e880d6SBram Moolenaar unlet g:someVar 170247e880d6SBram Moolenaar END 170347e880d6SBram Moolenaar CheckScriptSuccess(lines) 170447e880d6SBram Moolenaarenddef 170547e880d6SBram Moolenaar 1706ad39c094SBram Moolenaardef Test_echo_cmd() 1707a72cfb80SBram Moolenaar echo 'some' # comment 1708585fea7bSBram Moolenaar echon 'thing' 1709ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1710ad39c094SBram Moolenaar 1711a72cfb80SBram Moolenaar echo "some" # comment 1712a72cfb80SBram Moolenaar echon "thing" 1713a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1714a72cfb80SBram Moolenaar 1715cfcd011fSBram Moolenaar var str1 = 'some' 1716cfcd011fSBram Moolenaar var str2 = 'more' 1717ad39c094SBram Moolenaar echo str1 str2 1718ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1719a72cfb80SBram Moolenaar 1720d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1721ad39c094SBram Moolenaarenddef 1722ad39c094SBram Moolenaar 1723f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1724f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1725f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1726f93c7feaSBram Moolenaar echo 'clear' 1727df069eecSBram Moolenaar :1messages 1728f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1729f93c7feaSBram Moolenaar 1730d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1731f93c7feaSBram Moolenaarenddef 1732f93c7feaSBram Moolenaar 173347e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1734f5be8cdbSBram Moolenaar # only checks line continuation 1735cfcd011fSBram Moolenaar var lines =<< trim END 173647e880d6SBram Moolenaar vim9script 173747e880d6SBram Moolenaar echomsg 'here' 173847e880d6SBram Moolenaar .. ' is ' .. 173947e880d6SBram Moolenaar 'a message' 174047e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 174147e880d6SBram Moolenaar END 174247e880d6SBram Moolenaar CheckScriptSuccess(lines) 174347e880d6SBram Moolenaarenddef 174447e880d6SBram Moolenaar 1745f93c7feaSBram Moolenaardef Test_echoerr_cmd() 174640ee466cSBram Moolenaar try 174740ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 174840ee466cSBram Moolenaar catch 174940ee466cSBram Moolenaar assert_match('something wrong', v:exception) 175040ee466cSBram Moolenaar endtry 1751f93c7feaSBram Moolenaarenddef 1752f93c7feaSBram Moolenaar 175347e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1754f5be8cdbSBram Moolenaar # only checks line continuation 1755cfcd011fSBram Moolenaar var lines =<< trim END 175647e880d6SBram Moolenaar vim9script 175747e880d6SBram Moolenaar try 175847e880d6SBram Moolenaar echoerr 'this' 175947e880d6SBram Moolenaar .. ' is ' .. 176047e880d6SBram Moolenaar 'wrong' 176147e880d6SBram Moolenaar catch 176247e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 176347e880d6SBram Moolenaar endtry 176447e880d6SBram Moolenaar END 176547e880d6SBram Moolenaar CheckScriptSuccess(lines) 176647e880d6SBram Moolenaarenddef 176747e880d6SBram Moolenaar 176841fe0617SBram Moolenaardef Test_for_outside_of_function() 1769cfcd011fSBram Moolenaar var lines =<< trim END 177041fe0617SBram Moolenaar vim9script 177141fe0617SBram Moolenaar new 177241fe0617SBram Moolenaar for var in range(0, 3) 177341fe0617SBram Moolenaar append(line('$'), var) 177441fe0617SBram Moolenaar endfor 177541fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 177641fe0617SBram Moolenaar bwipe! 177741fe0617SBram Moolenaar END 177841fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 177941fe0617SBram Moolenaar source Xvim9for.vim 178041fe0617SBram Moolenaar delete('Xvim9for.vim') 178141fe0617SBram Moolenaarenddef 17828a7d6542SBram Moolenaar 1783e8c4abbbSBram Moolenaardef Test_for_loop() 1784cfcd011fSBram Moolenaar var result = '' 1785e8c4abbbSBram Moolenaar for cnt in range(7) 1786e8c4abbbSBram Moolenaar if cnt == 4 1787e8c4abbbSBram Moolenaar break 1788e8c4abbbSBram Moolenaar endif 1789e8c4abbbSBram Moolenaar if cnt == 2 1790e8c4abbbSBram Moolenaar continue 1791e8c4abbbSBram Moolenaar endif 1792e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1793e8c4abbbSBram Moolenaar endfor 1794e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 17950ad3e894SBram Moolenaar 1796cfcd011fSBram Moolenaar var concat = '' 17970ad3e894SBram Moolenaar for str in eval('["one", "two"]') 17980ad3e894SBram Moolenaar concat ..= str 17990ad3e894SBram Moolenaar endfor 18000ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1801e8c4abbbSBram Moolenaarenddef 1802e8c4abbbSBram Moolenaar 1803e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1804675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1805675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1806cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1807822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 1808451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1809675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1810675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1811675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1812e8c4abbbSBram Moolenaarenddef 1813e8c4abbbSBram Moolenaar 1814d0df1aacSBram Moolenaardef Test_while_loop() 1815cfcd011fSBram Moolenaar var result = '' 1816cfcd011fSBram Moolenaar var cnt = 0 1817d0df1aacSBram Moolenaar while cnt < 555 1818d0df1aacSBram Moolenaar if cnt == 3 1819d0df1aacSBram Moolenaar break 1820d0df1aacSBram Moolenaar endif 1821d0df1aacSBram Moolenaar cnt += 1 1822d0df1aacSBram Moolenaar if cnt == 2 1823d0df1aacSBram Moolenaar continue 1824d0df1aacSBram Moolenaar endif 1825d0df1aacSBram Moolenaar result ..= cnt .. '_' 1826d0df1aacSBram Moolenaar endwhile 1827d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1828d0df1aacSBram Moolenaarenddef 1829d0df1aacSBram Moolenaar 1830e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1831675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1832675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1833675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1834675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1835675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1836675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1837675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1838bd5da371SBram Moolenaarenddef 1839bd5da371SBram Moolenaar 18409645e2d9SBram Moolenaardef Test_interrupt_loop() 1841cfcd011fSBram Moolenaar var caught = false 1842cfcd011fSBram Moolenaar var x = 0 184397acfc78SBram Moolenaar try 18449645e2d9SBram Moolenaar while 1 18459645e2d9SBram Moolenaar x += 1 18469645e2d9SBram Moolenaar if x == 100 18479645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 18489645e2d9SBram Moolenaar endif 18499645e2d9SBram Moolenaar endwhile 185097acfc78SBram Moolenaar catch 185197acfc78SBram Moolenaar caught = true 185297acfc78SBram Moolenaar assert_equal(100, x) 185397acfc78SBram Moolenaar endtry 185497acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 185525859dd7SBram Moolenaar # consume the CTRL-C 185625859dd7SBram Moolenaar getchar(0) 18579645e2d9SBram Moolenaarenddef 185820431c9dSBram Moolenaar 18594fdae999SBram Moolenaardef Test_automatic_line_continuation() 1860cfcd011fSBram Moolenaar var mylist = [ 18614fdae999SBram Moolenaar 'one', 18624fdae999SBram Moolenaar 'two', 18634fdae999SBram Moolenaar 'three', 1864f5be8cdbSBram Moolenaar ] # comment 18654fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 18664fdae999SBram Moolenaar 1867cfcd011fSBram Moolenaar var mydict = { 18684fdae999SBram Moolenaar 'one': 1, 18694fdae999SBram Moolenaar 'two': 2, 18704fdae999SBram Moolenaar 'three': 18714fdae999SBram Moolenaar 3, 1872f5be8cdbSBram Moolenaar } # comment 18734fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 18744fdae999SBram Moolenaar mydict = #{ 18752c330432SBram Moolenaar one: 1, # comment 18762c330432SBram Moolenaar two: # comment 18772c330432SBram Moolenaar 2, # comment 18782c330432SBram Moolenaar three: 3 # comment 18792c330432SBram Moolenaar } 18802c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 18812c330432SBram Moolenaar mydict = #{ 18822c330432SBram Moolenaar one: 1, 18834fdae999SBram Moolenaar two: 18844fdae999SBram Moolenaar 2, 18852c330432SBram Moolenaar three: 3 18864fdae999SBram Moolenaar } 18874fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1888e6085c53SBram Moolenaar 1889e6085c53SBram Moolenaar assert_equal( 1890e6085c53SBram Moolenaar ['one', 'two', 'three'], 1891e6085c53SBram Moolenaar split('one two three') 1892e6085c53SBram Moolenaar ) 18934fdae999SBram Moolenaarenddef 18944fdae999SBram Moolenaar 18957a092245SBram Moolenaardef Test_vim9_comment() 18967a092245SBram Moolenaar CheckScriptSuccess([ 18977a092245SBram Moolenaar 'vim9script', 18987a092245SBram Moolenaar '# something', 18997a092245SBram Moolenaar ]) 19007a092245SBram Moolenaar CheckScriptFailure([ 19017a092245SBram Moolenaar 'vim9script', 19027a092245SBram Moolenaar ':# something', 19037a092245SBram Moolenaar ], 'E488:') 19047a092245SBram Moolenaar CheckScriptFailure([ 19057a092245SBram Moolenaar '# something', 19067a092245SBram Moolenaar ], 'E488:') 19077a092245SBram Moolenaar CheckScriptFailure([ 19087a092245SBram Moolenaar ':# something', 19097a092245SBram Moolenaar ], 'E488:') 19107a092245SBram Moolenaar 19114a8d9f2eSBram Moolenaar { # block start 19124a8d9f2eSBram Moolenaar } # block end 19134a8d9f2eSBram Moolenaar CheckDefFailure([ 19144a8d9f2eSBram Moolenaar '{# comment', 19154a8d9f2eSBram Moolenaar ], 'E488:') 19164a8d9f2eSBram Moolenaar CheckDefFailure([ 19174a8d9f2eSBram Moolenaar '{', 19184a8d9f2eSBram Moolenaar '}# comment', 19194a8d9f2eSBram Moolenaar ], 'E488:') 19204a8d9f2eSBram Moolenaar 19214a8d9f2eSBram Moolenaar echo "yes" # comment 19224a8d9f2eSBram Moolenaar CheckDefFailure([ 19234a8d9f2eSBram Moolenaar 'echo "yes"# comment', 19244a8d9f2eSBram Moolenaar ], 'E488:') 19257a092245SBram Moolenaar CheckScriptSuccess([ 19267a092245SBram Moolenaar 'vim9script', 19277a092245SBram Moolenaar 'echo "yes" # something', 19287a092245SBram Moolenaar ]) 19297a092245SBram Moolenaar CheckScriptFailure([ 19307a092245SBram Moolenaar 'vim9script', 19317a092245SBram Moolenaar 'echo "yes"# something', 19327a092245SBram Moolenaar ], 'E121:') 19337a092245SBram Moolenaar CheckScriptFailure([ 19347a092245SBram Moolenaar 'vim9script', 19357a092245SBram Moolenaar 'echo# something', 19367a092245SBram Moolenaar ], 'E121:') 19377a092245SBram Moolenaar CheckScriptFailure([ 19387a092245SBram Moolenaar 'echo "yes" # something', 19397a092245SBram Moolenaar ], 'E121:') 19407a092245SBram Moolenaar 19414a8d9f2eSBram Moolenaar exe "echo" # comment 19424a8d9f2eSBram Moolenaar CheckDefFailure([ 19434a8d9f2eSBram Moolenaar 'exe "echo"# comment', 19444a8d9f2eSBram Moolenaar ], 'E488:') 19454a8d9f2eSBram Moolenaar CheckScriptSuccess([ 19464a8d9f2eSBram Moolenaar 'vim9script', 19474a8d9f2eSBram Moolenaar 'exe "echo" # something', 19484a8d9f2eSBram Moolenaar ]) 19494a8d9f2eSBram Moolenaar CheckScriptFailure([ 19504a8d9f2eSBram Moolenaar 'vim9script', 19514a8d9f2eSBram Moolenaar 'exe "echo"# something', 19524a8d9f2eSBram Moolenaar ], 'E121:') 19534a8d9f2eSBram Moolenaar CheckDefFailure([ 19544a8d9f2eSBram Moolenaar 'exe # comment', 19554a8d9f2eSBram Moolenaar ], 'E1015:') 19564a8d9f2eSBram Moolenaar CheckScriptFailure([ 19574a8d9f2eSBram Moolenaar 'vim9script', 19584a8d9f2eSBram Moolenaar 'exe# something', 19594a8d9f2eSBram Moolenaar ], 'E121:') 19604a8d9f2eSBram Moolenaar CheckScriptFailure([ 19614a8d9f2eSBram Moolenaar 'exe "echo" # something', 19624a8d9f2eSBram Moolenaar ], 'E121:') 19634a8d9f2eSBram Moolenaar 19647a092245SBram Moolenaar CheckDefFailure([ 19657a092245SBram Moolenaar 'try# comment', 19667a092245SBram Moolenaar ' echo "yes"', 19677a092245SBram Moolenaar 'catch', 19687a092245SBram Moolenaar 'endtry', 19697a092245SBram Moolenaar ], 'E488:') 19702c5ed4e3SBram Moolenaar CheckScriptFailure([ 19712c5ed4e3SBram Moolenaar 'vim9script', 19722c5ed4e3SBram Moolenaar 'try# comment', 19732c5ed4e3SBram Moolenaar 'echo "yes"', 19742c5ed4e3SBram Moolenaar ], 'E488:') 19757a092245SBram Moolenaar CheckDefFailure([ 19767a092245SBram Moolenaar 'try', 1977a72cfb80SBram Moolenaar ' throw#comment', 1978a72cfb80SBram Moolenaar 'catch', 1979a72cfb80SBram Moolenaar 'endtry', 1980a72cfb80SBram Moolenaar ], 'E1015:') 1981a72cfb80SBram Moolenaar CheckDefFailure([ 1982a72cfb80SBram Moolenaar 'try', 1983a72cfb80SBram Moolenaar ' throw "yes"#comment', 1984a72cfb80SBram Moolenaar 'catch', 1985a72cfb80SBram Moolenaar 'endtry', 1986a72cfb80SBram Moolenaar ], 'E488:') 1987a72cfb80SBram Moolenaar CheckDefFailure([ 1988a72cfb80SBram Moolenaar 'try', 19897a092245SBram Moolenaar ' echo "yes"', 19907a092245SBram Moolenaar 'catch# comment', 19917a092245SBram Moolenaar 'endtry', 19927a092245SBram Moolenaar ], 'E488:') 19932c5ed4e3SBram Moolenaar CheckScriptFailure([ 19942c5ed4e3SBram Moolenaar 'vim9script', 19952c5ed4e3SBram Moolenaar 'try', 19962c5ed4e3SBram Moolenaar ' echo "yes"', 19972c5ed4e3SBram Moolenaar 'catch# comment', 19982c5ed4e3SBram Moolenaar 'endtry', 19992c5ed4e3SBram Moolenaar ], 'E654:') 20002c5ed4e3SBram Moolenaar CheckDefFailure([ 20012c5ed4e3SBram Moolenaar 'try', 20022c5ed4e3SBram Moolenaar ' echo "yes"', 20032c5ed4e3SBram Moolenaar 'catch /pat/# comment', 20042c5ed4e3SBram Moolenaar 'endtry', 20052c5ed4e3SBram Moolenaar ], 'E488:') 20067a092245SBram Moolenaar CheckDefFailure([ 20077a092245SBram Moolenaar 'try', 20087a092245SBram Moolenaar 'echo "yes"', 20097a092245SBram Moolenaar 'catch', 20107a092245SBram Moolenaar 'endtry# comment', 20117a092245SBram Moolenaar ], 'E488:') 20122c5ed4e3SBram Moolenaar CheckScriptFailure([ 20132c5ed4e3SBram Moolenaar 'vim9script', 20142c5ed4e3SBram Moolenaar 'try', 20152c5ed4e3SBram Moolenaar ' echo "yes"', 20162c5ed4e3SBram Moolenaar 'catch', 20172c5ed4e3SBram Moolenaar 'endtry# comment', 20189b7bf9e9SBram Moolenaar ], 'E488:') 20192c5ed4e3SBram Moolenaar 20202c5ed4e3SBram Moolenaar CheckScriptSuccess([ 20212c5ed4e3SBram Moolenaar 'vim9script', 20222c5ed4e3SBram Moolenaar 'hi # comment', 20232c5ed4e3SBram Moolenaar ]) 20242c5ed4e3SBram Moolenaar CheckScriptFailure([ 20252c5ed4e3SBram Moolenaar 'vim9script', 20262c5ed4e3SBram Moolenaar 'hi# comment', 20272c5ed4e3SBram Moolenaar ], 'E416:') 20281966c248SBram Moolenaar CheckScriptSuccess([ 20291966c248SBram Moolenaar 'vim9script', 20301966c248SBram Moolenaar 'hi Search # comment', 20311966c248SBram Moolenaar ]) 20321966c248SBram Moolenaar CheckScriptFailure([ 20331966c248SBram Moolenaar 'vim9script', 20341966c248SBram Moolenaar 'hi Search# comment', 20351966c248SBram Moolenaar ], 'E416:') 20361966c248SBram Moolenaar CheckScriptSuccess([ 20371966c248SBram Moolenaar 'vim9script', 20381966c248SBram Moolenaar 'hi link This Search # comment', 20391966c248SBram Moolenaar ]) 20401966c248SBram Moolenaar CheckScriptFailure([ 20411966c248SBram Moolenaar 'vim9script', 20421966c248SBram Moolenaar 'hi link This That# comment', 20431966c248SBram Moolenaar ], 'E413:') 20441966c248SBram Moolenaar CheckScriptSuccess([ 20451966c248SBram Moolenaar 'vim9script', 20461966c248SBram Moolenaar 'hi clear This # comment', 20471966c248SBram Moolenaar 'hi clear # comment', 20481966c248SBram Moolenaar ]) 2049f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2050f5be8cdbSBram Moolenaar # hi clear This# comment', 20511966c248SBram Moolenaar CheckScriptFailure([ 20521966c248SBram Moolenaar 'vim9script', 20531966c248SBram Moolenaar 'hi clear# comment', 20541966c248SBram Moolenaar ], 'E416:') 20551966c248SBram Moolenaar 20561966c248SBram Moolenaar CheckScriptSuccess([ 20571966c248SBram Moolenaar 'vim9script', 20581966c248SBram Moolenaar 'hi Group term=bold', 20591966c248SBram Moolenaar 'match Group /todo/ # comment', 20601966c248SBram Moolenaar ]) 20611966c248SBram Moolenaar CheckScriptFailure([ 20621966c248SBram Moolenaar 'vim9script', 20631966c248SBram Moolenaar 'hi Group term=bold', 20641966c248SBram Moolenaar 'match Group /todo/# comment', 20651966c248SBram Moolenaar ], 'E488:') 20661966c248SBram Moolenaar CheckScriptSuccess([ 20671966c248SBram Moolenaar 'vim9script', 20681966c248SBram Moolenaar 'match # comment', 20691966c248SBram Moolenaar ]) 20701966c248SBram Moolenaar CheckScriptFailure([ 20711966c248SBram Moolenaar 'vim9script', 20721966c248SBram Moolenaar 'match# comment', 20731966c248SBram Moolenaar ], 'E475:') 20741966c248SBram Moolenaar CheckScriptSuccess([ 20751966c248SBram Moolenaar 'vim9script', 20761966c248SBram Moolenaar 'match none # comment', 20771966c248SBram Moolenaar ]) 20781966c248SBram Moolenaar CheckScriptFailure([ 20791966c248SBram Moolenaar 'vim9script', 20801966c248SBram Moolenaar 'match none# comment', 20811966c248SBram Moolenaar ], 'E475:') 20821966c248SBram Moolenaar 20831966c248SBram Moolenaar CheckScriptSuccess([ 20841966c248SBram Moolenaar 'vim9script', 20851966c248SBram Moolenaar 'menutrans clear # comment', 20861966c248SBram Moolenaar ]) 20871966c248SBram Moolenaar CheckScriptFailure([ 20881966c248SBram Moolenaar 'vim9script', 20891966c248SBram Moolenaar 'menutrans clear# comment text', 20901966c248SBram Moolenaar ], 'E474:') 20911966c248SBram Moolenaar 20921966c248SBram Moolenaar CheckScriptSuccess([ 20931966c248SBram Moolenaar 'vim9script', 20941966c248SBram Moolenaar 'syntax clear # comment', 20951966c248SBram Moolenaar ]) 20961966c248SBram Moolenaar CheckScriptFailure([ 20971966c248SBram Moolenaar 'vim9script', 20981966c248SBram Moolenaar 'syntax clear# comment text', 20991966c248SBram Moolenaar ], 'E28:') 21001966c248SBram Moolenaar CheckScriptSuccess([ 21011966c248SBram Moolenaar 'vim9script', 21021966c248SBram Moolenaar 'syntax keyword Word some', 21031966c248SBram Moolenaar 'syntax clear Word # comment', 21041966c248SBram Moolenaar ]) 21051966c248SBram Moolenaar CheckScriptFailure([ 21061966c248SBram Moolenaar 'vim9script', 21071966c248SBram Moolenaar 'syntax keyword Word some', 21081966c248SBram Moolenaar 'syntax clear Word# comment text', 21091966c248SBram Moolenaar ], 'E28:') 21101966c248SBram Moolenaar 21111966c248SBram Moolenaar CheckScriptSuccess([ 21121966c248SBram Moolenaar 'vim9script', 21131966c248SBram Moolenaar 'syntax list # comment', 21141966c248SBram Moolenaar ]) 21151966c248SBram Moolenaar CheckScriptFailure([ 21161966c248SBram Moolenaar 'vim9script', 21171966c248SBram Moolenaar 'syntax list# comment text', 21181966c248SBram Moolenaar ], 'E28:') 21191966c248SBram Moolenaar 21201966c248SBram Moolenaar CheckScriptSuccess([ 21211966c248SBram Moolenaar 'vim9script', 21221966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 21231966c248SBram Moolenaar ]) 21241966c248SBram Moolenaar CheckScriptFailure([ 21251966c248SBram Moolenaar 'vim9script', 21261966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 21271966c248SBram Moolenaar ], 'E475:') 21281966c248SBram Moolenaar 21291966c248SBram Moolenaar CheckScriptSuccess([ 21301966c248SBram Moolenaar 'vim9script', 21311966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 21321966c248SBram Moolenaar ]) 21331966c248SBram Moolenaar CheckScriptFailure([ 21341966c248SBram Moolenaar 'vim9script', 21351966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 21361966c248SBram Moolenaar ], 'E789:') 21371966c248SBram Moolenaar 21381966c248SBram Moolenaar CheckScriptSuccess([ 21391966c248SBram Moolenaar 'vim9script', 21401966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 21411966c248SBram Moolenaar ]) 21421966c248SBram Moolenaar CheckScriptFailure([ 21431966c248SBram Moolenaar 'vim9script', 21441966c248SBram Moolenaar 'syntax match Word /pat/# comment', 21451966c248SBram Moolenaar ], 'E402:') 21461966c248SBram Moolenaar 21471966c248SBram Moolenaar CheckScriptSuccess([ 21481966c248SBram Moolenaar 'vim9script', 21491966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 21501966c248SBram Moolenaar ]) 21511966c248SBram Moolenaar CheckScriptFailure([ 21521966c248SBram Moolenaar 'vim9script', 21531966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 21541966c248SBram Moolenaar ], 'E475:') 21551966c248SBram Moolenaar CheckScriptFailure([ 21561966c248SBram Moolenaar 'vim9script', 21571966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 21581966c248SBram Moolenaar ], 'E406:') 21591966c248SBram Moolenaar CheckScriptFailure([ 21601966c248SBram Moolenaar 'vim9script', 21611966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 21621966c248SBram Moolenaar ], 'E475:') 21631966c248SBram Moolenaar 21641966c248SBram Moolenaar CheckScriptSuccess([ 21651966c248SBram Moolenaar 'vim9script', 21661966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 21671966c248SBram Moolenaar ]) 21681966c248SBram Moolenaar CheckScriptFailure([ 21691966c248SBram Moolenaar 'vim9script', 21701966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2171d032f34aSBram Moolenaar ], 'E402:') 21721966c248SBram Moolenaar 21731966c248SBram Moolenaar CheckScriptSuccess([ 21741966c248SBram Moolenaar 'vim9script', 21751966c248SBram Moolenaar 'syntax sync # comment', 21761966c248SBram Moolenaar ]) 21771966c248SBram Moolenaar CheckScriptFailure([ 21781966c248SBram Moolenaar 'vim9script', 21791966c248SBram Moolenaar 'syntax sync# comment', 21801966c248SBram Moolenaar ], 'E404:') 21811966c248SBram Moolenaar CheckScriptSuccess([ 21821966c248SBram Moolenaar 'vim9script', 21831966c248SBram Moolenaar 'syntax sync ccomment # comment', 21841966c248SBram Moolenaar ]) 21851966c248SBram Moolenaar CheckScriptFailure([ 21861966c248SBram Moolenaar 'vim9script', 21871966c248SBram Moolenaar 'syntax sync ccomment# comment', 21881966c248SBram Moolenaar ], 'E404:') 21891966c248SBram Moolenaar 21901966c248SBram Moolenaar CheckScriptSuccess([ 21911966c248SBram Moolenaar 'vim9script', 21921966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 21931966c248SBram Moolenaar ]) 21941966c248SBram Moolenaar CheckScriptFailure([ 21951966c248SBram Moolenaar 'vim9script', 21961966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 21971966c248SBram Moolenaar ], 'E475:') 2198a72cfb80SBram Moolenaar 2199a72cfb80SBram Moolenaar CheckScriptSuccess([ 2200a72cfb80SBram Moolenaar 'vim9script', 2201a72cfb80SBram Moolenaar 'command Echo echo # comment', 2202a72cfb80SBram Moolenaar 'command Echo # comment', 2203a72cfb80SBram Moolenaar ]) 2204a72cfb80SBram Moolenaar CheckScriptFailure([ 2205a72cfb80SBram Moolenaar 'vim9script', 2206a72cfb80SBram Moolenaar 'command Echo echo# comment', 2207a72cfb80SBram Moolenaar 'Echo', 2208a72cfb80SBram Moolenaar ], 'E121:') 2209a72cfb80SBram Moolenaar CheckScriptFailure([ 2210a72cfb80SBram Moolenaar 'vim9script', 2211a72cfb80SBram Moolenaar 'command Echo# comment', 2212a72cfb80SBram Moolenaar ], 'E182:') 2213a72cfb80SBram Moolenaar CheckScriptFailure([ 2214a72cfb80SBram Moolenaar 'vim9script', 2215a72cfb80SBram Moolenaar 'command Echo echo', 2216a72cfb80SBram Moolenaar 'command Echo# comment', 2217a72cfb80SBram Moolenaar ], 'E182:') 2218a72cfb80SBram Moolenaar 2219a72cfb80SBram Moolenaar CheckScriptSuccess([ 2220a72cfb80SBram Moolenaar 'vim9script', 2221a72cfb80SBram Moolenaar 'function # comment', 2222a72cfb80SBram Moolenaar ]) 2223a72cfb80SBram Moolenaar CheckScriptFailure([ 2224a72cfb80SBram Moolenaar 'vim9script', 22259898107fSBram Moolenaar 'function " comment', 22269898107fSBram Moolenaar ], 'E129:') 22279898107fSBram Moolenaar CheckScriptFailure([ 22289898107fSBram Moolenaar 'vim9script', 2229a72cfb80SBram Moolenaar 'function# comment', 2230a72cfb80SBram Moolenaar ], 'E129:') 2231a72cfb80SBram Moolenaar CheckScriptSuccess([ 2232a72cfb80SBram Moolenaar 'vim9script', 2233a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2234a72cfb80SBram Moolenaar ]) 2235a72cfb80SBram Moolenaar CheckScriptFailure([ 2236a72cfb80SBram Moolenaar 'vim9script', 2237a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2238a72cfb80SBram Moolenaar ], 'E488:') 2239a72cfb80SBram Moolenaar 2240a72cfb80SBram Moolenaar CheckScriptSuccess([ 2241a72cfb80SBram Moolenaar 'vim9script', 22424c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2243a72cfb80SBram Moolenaar 'endfunc', 22444c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2245a72cfb80SBram Moolenaar ]) 2246a72cfb80SBram Moolenaar CheckScriptFailure([ 2247a72cfb80SBram Moolenaar 'vim9script', 22484c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2249a72cfb80SBram Moolenaar 'endfunc', 22504c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2251a72cfb80SBram Moolenaar ], 'E488:') 2252a72cfb80SBram Moolenaar 2253a72cfb80SBram Moolenaar CheckScriptSuccess([ 2254a72cfb80SBram Moolenaar 'vim9script', 2255a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2256a72cfb80SBram Moolenaar ]) 2257a72cfb80SBram Moolenaar CheckScriptFailure([ 2258a72cfb80SBram Moolenaar 'vim9script', 2259a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2260a72cfb80SBram Moolenaar ], 'E488:') 2261e7e4838fSBram Moolenaar 2262e7e4838fSBram Moolenaar CheckScriptFailure([ 2263e7e4838fSBram Moolenaar 'def Test() " comment', 2264e7e4838fSBram Moolenaar 'enddef', 2265e7e4838fSBram Moolenaar ], 'E488:') 2266e7e4838fSBram Moolenaar CheckScriptFailure([ 2267e7e4838fSBram Moolenaar 'vim9script', 2268e7e4838fSBram Moolenaar 'def Test() " comment', 2269e7e4838fSBram Moolenaar 'enddef', 2270e7e4838fSBram Moolenaar ], 'E488:') 2271e7e4838fSBram Moolenaar 2272e7e4838fSBram Moolenaar CheckScriptSuccess([ 2273e7e4838fSBram Moolenaar 'func Test() " comment', 2274e7e4838fSBram Moolenaar 'endfunc', 2275e7e4838fSBram Moolenaar ]) 22769898107fSBram Moolenaar CheckScriptSuccess([ 2277e7e4838fSBram Moolenaar 'vim9script', 2278e7e4838fSBram Moolenaar 'func Test() " comment', 2279e7e4838fSBram Moolenaar 'endfunc', 22809898107fSBram Moolenaar ]) 2281e7e4838fSBram Moolenaar 2282e7e4838fSBram Moolenaar CheckScriptSuccess([ 2283e7e4838fSBram Moolenaar 'def Test() # comment', 2284e7e4838fSBram Moolenaar 'enddef', 2285e7e4838fSBram Moolenaar ]) 2286e7e4838fSBram Moolenaar CheckScriptFailure([ 2287e7e4838fSBram Moolenaar 'func Test() # comment', 2288e7e4838fSBram Moolenaar 'endfunc', 2289e7e4838fSBram Moolenaar ], 'E488:') 22902c5ed4e3SBram Moolenaarenddef 22912c5ed4e3SBram Moolenaar 22922c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 22932c5ed4e3SBram Moolenaar CheckCanRunGui 22942c5ed4e3SBram Moolenaar 22952c5ed4e3SBram Moolenaar CheckScriptFailure([ 22962c5ed4e3SBram Moolenaar 'vim9script', 22972c5ed4e3SBram Moolenaar 'gui#comment' 22982c5ed4e3SBram Moolenaar ], 'E499:') 22992c5ed4e3SBram Moolenaar CheckScriptFailure([ 23002c5ed4e3SBram Moolenaar 'vim9script', 23012c5ed4e3SBram Moolenaar 'gui -f#comment' 23022c5ed4e3SBram Moolenaar ], 'E499:') 23037a092245SBram Moolenaarenddef 23047a092245SBram Moolenaar 2305a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 23066797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 23076797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2308a26b9700SBram Moolenaar 2309a26b9700SBram Moolenaar edit test.vim 2310a26b9700SBram Moolenaar doautocmd TabEnter #comment 2311a26b9700SBram Moolenaar assert_equal(1, g:entered) 2312a26b9700SBram Moolenaar 2313a26b9700SBram Moolenaar doautocmd TabEnter f.x 2314a26b9700SBram Moolenaar assert_equal(2, g:entered) 2315a26b9700SBram Moolenaar 2316a26b9700SBram Moolenaar g:entered = 0 2317a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2318a26b9700SBram Moolenaar assert_equal(2, g:entered) 2319a26b9700SBram Moolenaar 2320a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2321a26b9700SBram Moolenaar 2322a26b9700SBram Moolenaar au! TabEnter 2323a26b9700SBram Moolenaar unlet g:entered 2324d72c1bf0SBram Moolenaar 2325d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2326d72c1bf0SBram Moolenaar 'vim9script', 23276797966dSBram Moolenaar 'g:var = 123', 2328e55b1c09SBram Moolenaar 'b:var = 456', 2329e55b1c09SBram Moolenaar 'w:var = 777', 2330e55b1c09SBram Moolenaar 't:var = 888', 2331d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2332d72c1bf0SBram Moolenaar ]) 2333d72c1bf0SBram Moolenaar 2334d72c1bf0SBram Moolenaar CheckScriptFailure([ 2335d72c1bf0SBram Moolenaar 'vim9script', 2336cfcd011fSBram Moolenaar 'let var = 123', 2337cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2338cfcd011fSBram Moolenaar 2339cfcd011fSBram Moolenaar CheckScriptFailure([ 2340cfcd011fSBram Moolenaar 'vim9script', 2341cfcd011fSBram Moolenaar 'var g:var = 123', 2342e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2343e55b1c09SBram Moolenaar 2344e55b1c09SBram Moolenaar CheckScriptFailure([ 2345e55b1c09SBram Moolenaar 'vim9script', 2346cfcd011fSBram Moolenaar 'var b:var = 123', 2347e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2348e55b1c09SBram Moolenaar 2349e55b1c09SBram Moolenaar CheckScriptFailure([ 2350e55b1c09SBram Moolenaar 'vim9script', 2351cfcd011fSBram Moolenaar 'var w:var = 123', 2352e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2353e55b1c09SBram Moolenaar 2354e55b1c09SBram Moolenaar CheckScriptFailure([ 2355e55b1c09SBram Moolenaar 'vim9script', 2356cfcd011fSBram Moolenaar 'var t:var = 123', 2357e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2358e55b1c09SBram Moolenaar 2359e55b1c09SBram Moolenaar CheckScriptFailure([ 2360e55b1c09SBram Moolenaar 'vim9script', 2361cfcd011fSBram Moolenaar 'var v:version = 123', 2362e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2363e55b1c09SBram Moolenaar 2364e55b1c09SBram Moolenaar CheckScriptFailure([ 2365e55b1c09SBram Moolenaar 'vim9script', 2366cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2367e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 23686797966dSBram Moolenaar 23696797966dSBram Moolenaar CheckScriptFailure([ 23706797966dSBram Moolenaar 'vim9script', 23716797966dSBram Moolenaar 'g:var = 123', 237232e35117SBram Moolenaar 'unlet g:var# comment1', 2373d72c1bf0SBram Moolenaar ], 'E108:') 2374d72c1bf0SBram Moolenaar 2375d72c1bf0SBram Moolenaar CheckScriptFailure([ 2376d72c1bf0SBram Moolenaar 'let g:var = 123', 2377d72c1bf0SBram Moolenaar 'unlet g:var # something', 2378d72c1bf0SBram Moolenaar ], 'E488:') 2379faac4104SBram Moolenaar 2380faac4104SBram Moolenaar CheckScriptSuccess([ 2381faac4104SBram Moolenaar 'vim9script', 238232e35117SBram Moolenaar 'if 1 # comment2', 2383faac4104SBram Moolenaar ' echo "yes"', 2384faac4104SBram Moolenaar 'elseif 2 #comment', 2385faac4104SBram Moolenaar ' echo "no"', 2386faac4104SBram Moolenaar 'endif', 2387faac4104SBram Moolenaar ]) 2388faac4104SBram Moolenaar 2389faac4104SBram Moolenaar CheckScriptFailure([ 2390faac4104SBram Moolenaar 'vim9script', 239132e35117SBram Moolenaar 'if 1# comment3', 2392faac4104SBram Moolenaar ' echo "yes"', 2393faac4104SBram Moolenaar 'endif', 2394faac4104SBram Moolenaar ], 'E15:') 2395faac4104SBram Moolenaar 2396faac4104SBram Moolenaar CheckScriptFailure([ 2397faac4104SBram Moolenaar 'vim9script', 239832e35117SBram Moolenaar 'if 0 # comment4', 2399faac4104SBram Moolenaar ' echo "yes"', 2400faac4104SBram Moolenaar 'elseif 2#comment', 2401faac4104SBram Moolenaar ' echo "no"', 2402faac4104SBram Moolenaar 'endif', 2403faac4104SBram Moolenaar ], 'E15:') 2404faac4104SBram Moolenaar 2405faac4104SBram Moolenaar CheckScriptSuccess([ 2406faac4104SBram Moolenaar 'vim9script', 2407cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2408faac4104SBram Moolenaar ]) 2409faac4104SBram Moolenaar 2410faac4104SBram Moolenaar CheckScriptFailure([ 2411faac4104SBram Moolenaar 'vim9script', 2412cfcd011fSBram Moolenaar 'var v = 1# comment6', 241332e35117SBram Moolenaar ], 'E15:') 2414faac4104SBram Moolenaar 2415faac4104SBram Moolenaar CheckScriptSuccess([ 2416faac4104SBram Moolenaar 'vim9script', 2417faac4104SBram Moolenaar 'new' 2418d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2419df069eecSBram Moolenaar ':$', 2420faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2421faac4104SBram Moolenaar 'bwipe!', 2422faac4104SBram Moolenaar ]) 2423faac4104SBram Moolenaar 2424f5be8cdbSBram Moolenaar CheckScriptFailure([ 2425f5be8cdbSBram Moolenaar 'vim9script', 2426f5be8cdbSBram Moolenaar 'new' 2427d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2428f5be8cdbSBram Moolenaar ':$', 2429f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2430f5be8cdbSBram Moolenaar 'bwipe!', 2431f5be8cdbSBram Moolenaar ], 'E488:') 2432f5be8cdbSBram Moolenaar 2433f5be8cdbSBram Moolenaar CheckScriptFailure([ 2434f5be8cdbSBram Moolenaar 'vim9script', 2435f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2436f5be8cdbSBram Moolenaar ], 'E477:') 2437a26b9700SBram Moolenaarenddef 2438a26b9700SBram Moolenaar 24397e5bd91dSBram Moolenaardef Test_finish() 2440cfcd011fSBram Moolenaar var lines =<< trim END 24417e5bd91dSBram Moolenaar vim9script 24426797966dSBram Moolenaar g:res = 'one' 24437e5bd91dSBram Moolenaar if v:false | finish | endif 24446797966dSBram Moolenaar g:res = 'two' 24457e5bd91dSBram Moolenaar finish 24466797966dSBram Moolenaar g:res = 'three' 24477e5bd91dSBram Moolenaar END 24487e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 24497e5bd91dSBram Moolenaar source Xfinished 24507e5bd91dSBram Moolenaar assert_equal('two', g:res) 24517e5bd91dSBram Moolenaar 24527e5bd91dSBram Moolenaar unlet g:res 24537e5bd91dSBram Moolenaar delete('Xfinished') 24547e5bd91dSBram Moolenaarenddef 24557e5bd91dSBram Moolenaar 2456a5d0077eSBram Moolenaardef Test_forward_declaration() 2457cfcd011fSBram Moolenaar var lines =<< trim END 2458a5d0077eSBram Moolenaar vim9script 2459a5d0077eSBram Moolenaar def GetValue(): string 2460a5d0077eSBram Moolenaar return theVal 2461a5d0077eSBram Moolenaar enddef 2462cfcd011fSBram Moolenaar var theVal = 'something' 2463822ba247SBram Moolenaar g:initVal = GetValue() 2464a5d0077eSBram Moolenaar theVal = 'else' 2465a5d0077eSBram Moolenaar g:laterVal = GetValue() 2466a5d0077eSBram Moolenaar END 2467a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2468a5d0077eSBram Moolenaar source Xforward 2469a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2470a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2471a5d0077eSBram Moolenaar 2472a5d0077eSBram Moolenaar unlet g:initVal 2473a5d0077eSBram Moolenaar unlet g:laterVal 2474a5d0077eSBram Moolenaar delete('Xforward') 2475a5d0077eSBram Moolenaarenddef 2476a5d0077eSBram Moolenaar 24779721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2478cfcd011fSBram Moolenaar var legacy_lines =<< trim END 24799721fb4eSBram Moolenaar source Xvim9_script.vim 24809721fb4eSBram Moolenaar 24819721fb4eSBram Moolenaar call assert_false(exists('local')) 24829721fb4eSBram Moolenaar call assert_false(exists('exported')) 24839721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 24849721fb4eSBram Moolenaar call assert_equal('global', global) 24859721fb4eSBram Moolenaar call assert_equal('global', g:global) 24869721fb4eSBram Moolenaar 24879721fb4eSBram Moolenaar " imported variable becomes script-local 24889721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 24899721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 24909721fb4eSBram Moolenaar call assert_false(exists('exported')) 24919721fb4eSBram Moolenaar 24929721fb4eSBram Moolenaar " imported function becomes script-local 24939721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 24949721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 24959721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 24969721fb4eSBram Moolenaar END 24979721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 24989721fb4eSBram Moolenaar 2499cfcd011fSBram Moolenaar var vim9_lines =<< trim END 25009721fb4eSBram Moolenaar vim9script 2501cfcd011fSBram Moolenaar var local = 'local' 25029721fb4eSBram Moolenaar g:global = 'global' 2503cfcd011fSBram Moolenaar export var exported = 'exported' 25049721fb4eSBram Moolenaar export def GetText(): string 25059721fb4eSBram Moolenaar return 'text' 25069721fb4eSBram Moolenaar enddef 25079721fb4eSBram Moolenaar END 25089721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 25099721fb4eSBram Moolenaar 25109721fb4eSBram Moolenaar source Xlegacy_script.vim 25119721fb4eSBram Moolenaar 25129721fb4eSBram Moolenaar assert_equal('global', g:global) 2513f5be8cdbSBram Moolenaar unlet g:global 25149721fb4eSBram Moolenaar 25159721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 25169721fb4eSBram Moolenaar delete('Xvim9_script.vim') 25179721fb4eSBram Moolenaarenddef 2518a5d0077eSBram Moolenaar 25197d699701SBram Moolenaarfunc Test_vim9script_not_global() 25207d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 25217d699701SBram Moolenaar let vim9lines =<< trim END 25227d699701SBram Moolenaar vim9script 2523cfcd011fSBram Moolenaar var name = 'local' 25247d699701SBram Moolenaar func TheFunc() 25257d699701SBram Moolenaar echo 'local' 25267d699701SBram Moolenaar endfunc 25277d699701SBram Moolenaar def DefFunc() 25287d699701SBram Moolenaar echo 'local' 25297d699701SBram Moolenaar enddef 25307d699701SBram Moolenaar END 25317d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 25327d699701SBram Moolenaar source Xvim9script.vim 25337d699701SBram Moolenaar try 25347d699701SBram Moolenaar echo g:var 25357d699701SBram Moolenaar assert_report('did not fail') 25367d699701SBram Moolenaar catch /E121:/ 25377d699701SBram Moolenaar " caught 25387d699701SBram Moolenaar endtry 25397d699701SBram Moolenaar try 25407d699701SBram Moolenaar call TheFunc() 25417d699701SBram Moolenaar assert_report('did not fail') 25427d699701SBram Moolenaar catch /E117:/ 25437d699701SBram Moolenaar " caught 25447d699701SBram Moolenaar endtry 25457d699701SBram Moolenaar try 25467d699701SBram Moolenaar call DefFunc() 25477d699701SBram Moolenaar assert_report('did not fail') 25487d699701SBram Moolenaar catch /E117:/ 25497d699701SBram Moolenaar " caught 25507d699701SBram Moolenaar endtry 25517d699701SBram Moolenaar 255225859dd7SBram Moolenaar call delete('Xvim9script.vim') 25537d699701SBram Moolenaarendfunc 25547d699701SBram Moolenaar 2555eeb27bfeSBram Moolenaardef Test_vim9_copen() 2556eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2557eeb27bfeSBram Moolenaar copen 2558eeb27bfeSBram Moolenaar quit 2559eeb27bfeSBram Moolenaarenddef 2560eeb27bfeSBram Moolenaar 25612d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 25622d6b20d6SBram Moolenaardef Test_vim9_autoload() 2563cfcd011fSBram Moolenaar var lines =<< trim END 25642d6b20d6SBram Moolenaar vim9script 25652d6b20d6SBram Moolenaar def foo#test() 25662d6b20d6SBram Moolenaar echomsg getreg('"') 25672d6b20d6SBram Moolenaar enddef 25682d6b20d6SBram Moolenaar END 25692d6b20d6SBram Moolenaar 25702d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 25712d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2572cfcd011fSBram Moolenaar var save_rtp = &rtp 25732d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 25742d6b20d6SBram Moolenaar augroup test 25752d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 25762d6b20d6SBram Moolenaar augroup END 25772d6b20d6SBram Moolenaar 25782d6b20d6SBram Moolenaar normal Y 25792d6b20d6SBram Moolenaar 25802d6b20d6SBram Moolenaar augroup test 25812d6b20d6SBram Moolenaar autocmd! 25822d6b20d6SBram Moolenaar augroup END 25832d6b20d6SBram Moolenaar delete('Xdir', 'rf') 25842d6b20d6SBram Moolenaar &rtp = save_rtp 25852d6b20d6SBram Moolenaarenddef 25862d6b20d6SBram Moolenaar 258777e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 258877e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2589cfcd011fSBram Moolenaar var lines =<< trim END 259077e5dcc3SBram Moolenaar vim9script 259177e5dcc3SBram Moolenaar def crash#func() 259277e5dcc3SBram Moolenaar try 259377e5dcc3SBram Moolenaar for x in List() 259477e5dcc3SBram Moolenaar endfor 259577e5dcc3SBram Moolenaar catch 259677e5dcc3SBram Moolenaar endtry 259777e5dcc3SBram Moolenaar g:ok = true 259877e5dcc3SBram Moolenaar enddef 259977e5dcc3SBram Moolenaar fu List() 260077e5dcc3SBram Moolenaar invalid 260177e5dcc3SBram Moolenaar endfu 260277e5dcc3SBram Moolenaar try 260377e5dcc3SBram Moolenaar invalid 260477e5dcc3SBram Moolenaar catch /wontmatch/ 260577e5dcc3SBram Moolenaar endtry 260677e5dcc3SBram Moolenaar END 260777e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 260877e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 260977e5dcc3SBram Moolenaar 261077e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 261177e5dcc3SBram Moolenaar lines =<< trim END 261277e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 261377e5dcc3SBram Moolenaar call crash#func() 261477e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 26159c4f5520SBram Moolenaar qall! 261677e5dcc3SBram Moolenaar END 261777e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 261877e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 261977e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 262077e5dcc3SBram Moolenaar 262177e5dcc3SBram Moolenaar delete('Xdidit') 262277e5dcc3SBram Moolenaar delete('Xscript') 262377e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 262477e5dcc3SBram Moolenaarenddef 262577e5dcc3SBram Moolenaar 262681e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 262781e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 262881e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2629cfcd011fSBram Moolenaar var lines =<< trim END 263081e17fbeSBram Moolenaar let s:counter = 1 263181e17fbeSBram Moolenaar def s:Func() 263281e17fbeSBram Moolenaar au! CursorHold 263381e17fbeSBram Moolenaar au CursorHold * s:counter += 1 263481e17fbeSBram Moolenaar enddef 263581e17fbeSBram Moolenaar call s:Func() 263681e17fbeSBram Moolenaar doau CursorHold 263781e17fbeSBram Moolenaar call assert_equal(2, s:counter) 263881e17fbeSBram Moolenaar au! CursorHold 263981e17fbeSBram Moolenaar END 264081e17fbeSBram Moolenaar CheckScriptSuccess(lines) 264181e17fbeSBram Moolenaarenddef 264281e17fbeSBram Moolenaar 26433896a105SBram Moolenaardef Test_cmdline_win() 26443896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 26453896a105SBram Moolenaar # the command line window. 26463896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2647cfcd011fSBram Moolenaar var export_lines =<< trim END 26483896a105SBram Moolenaar vim9script 2649cfcd011fSBram Moolenaar export var That = 'yes' 26503896a105SBram Moolenaar END 26513896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2652cfcd011fSBram Moolenaar var import_lines =<< trim END 26533896a105SBram Moolenaar vim9script 26543896a105SBram Moolenaar import That from './Xexport.vim' 26553896a105SBram Moolenaar END 26563896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2657cfcd011fSBram Moolenaar var save_rtp = &rtp 26583896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 26593896a105SBram Moolenaar syntax on 26603896a105SBram Moolenaar augroup CmdWin 26613896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 26623896a105SBram Moolenaar augroup END 26633896a105SBram Moolenaar # this will open and also close the cmdline window 26643896a105SBram Moolenaar feedkeys('q:', 'xt') 26653896a105SBram Moolenaar assert_equal('yes', g:got_there) 26663896a105SBram Moolenaar 26673896a105SBram Moolenaar augroup CmdWin 26683896a105SBram Moolenaar au! 26693896a105SBram Moolenaar augroup END 26703896a105SBram Moolenaar &rtp = save_rtp 26713896a105SBram Moolenaar delete('rtp', 'rf') 26723896a105SBram Moolenaarenddef 26733896a105SBram Moolenaar 2674e3d4685fSBram Moolenaardef Test_invalid_sid() 2675e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 267625859dd7SBram Moolenaar 26779c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2678d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2679e3d4685fSBram Moolenaar endif 2680e3d4685fSBram Moolenaar delete('Xdidit') 2681e3d4685fSBram Moolenaarenddef 2682e3d4685fSBram Moolenaar 2683f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2684cfcd011fSBram Moolenaar var lines =<< trim END 2685cfcd011fSBram Moolenaar var name: any 2686cfcd011fSBram Moolenaar assert_equal(0, name) 2687f0afd9e1SBram Moolenaar END 2688f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2689f0afd9e1SBram Moolenaarenddef 2690f0afd9e1SBram Moolenaar 26917e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 269258dbef33SBram Moolenaar CheckRunVimInTerminal 269358dbef33SBram Moolenaar 26947e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 26957e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 26967e9210eaSBram Moolenaarendfunc 26977e9210eaSBram Moolenaar 26987e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 26999c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 2700cfcd011fSBram Moolenaar var lines =<< trim END 27019c4f5520SBram Moolenaar func CheckAndQuit() 27029c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 27039c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 27049c4f5520SBram Moolenaar endfunc 27059c4f5520SBram Moolenaar END 27069c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 27079c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 2708cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) 27099c4f5520SBram Moolenaar # define Afunc() on the command line 27109c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 27119c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 27129c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 27139c4f5520SBram Moolenaar 27149c4f5520SBram Moolenaar call StopVimInTerminal(buf) 27159c4f5520SBram Moolenaar delete('XcallFunc') 27169c4f5520SBram Moolenaar delete('Xdidcmd') 27179c4f5520SBram Moolenaarenddef 27189c4f5520SBram Moolenaar 2719fcdc5d83SBram Moolenaardef Test_script_var_scope() 2720fcdc5d83SBram Moolenaar var lines =<< trim END 2721fcdc5d83SBram Moolenaar vim9script 2722fcdc5d83SBram Moolenaar if true 2723fcdc5d83SBram Moolenaar if true 2724fcdc5d83SBram Moolenaar var one = 'one' 2725fcdc5d83SBram Moolenaar echo one 2726fcdc5d83SBram Moolenaar endif 2727fcdc5d83SBram Moolenaar echo one 2728fcdc5d83SBram Moolenaar endif 2729fcdc5d83SBram Moolenaar END 2730fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2731fcdc5d83SBram Moolenaar 2732fcdc5d83SBram Moolenaar lines =<< trim END 2733fcdc5d83SBram Moolenaar vim9script 2734fcdc5d83SBram Moolenaar if true 2735fcdc5d83SBram Moolenaar if false 2736fcdc5d83SBram Moolenaar var one = 'one' 2737fcdc5d83SBram Moolenaar echo one 2738fcdc5d83SBram Moolenaar else 2739fcdc5d83SBram Moolenaar var one = 'one' 2740fcdc5d83SBram Moolenaar echo one 2741fcdc5d83SBram Moolenaar endif 2742fcdc5d83SBram Moolenaar echo one 2743fcdc5d83SBram Moolenaar endif 2744fcdc5d83SBram Moolenaar END 2745fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 2746fcdc5d83SBram Moolenaar 2747fcdc5d83SBram Moolenaar lines =<< trim END 2748fcdc5d83SBram Moolenaar vim9script 2749fcdc5d83SBram Moolenaar while true 2750fcdc5d83SBram Moolenaar var one = 'one' 2751fcdc5d83SBram Moolenaar echo one 2752fcdc5d83SBram Moolenaar break 2753fcdc5d83SBram Moolenaar endwhile 2754fcdc5d83SBram Moolenaar echo one 2755fcdc5d83SBram Moolenaar END 2756fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2757fcdc5d83SBram Moolenaar 2758fcdc5d83SBram Moolenaar lines =<< trim END 2759fcdc5d83SBram Moolenaar vim9script 2760fcdc5d83SBram Moolenaar for i in range(1) 2761fcdc5d83SBram Moolenaar var one = 'one' 2762fcdc5d83SBram Moolenaar echo one 2763fcdc5d83SBram Moolenaar endfor 2764fcdc5d83SBram Moolenaar echo one 2765fcdc5d83SBram Moolenaar END 2766fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 27679becdf2bSBram Moolenaar 27689becdf2bSBram Moolenaar lines =<< trim END 27699becdf2bSBram Moolenaar vim9script 27709becdf2bSBram Moolenaar { 27719becdf2bSBram Moolenaar var one = 'one' 27729becdf2bSBram Moolenaar assert_equal('one', one) 27739becdf2bSBram Moolenaar } 27749becdf2bSBram Moolenaar assert_false(exists('one')) 27759becdf2bSBram Moolenaar assert_false(exists('s:one')) 27769becdf2bSBram Moolenaar END 27779becdf2bSBram Moolenaar CheckScriptSuccess(lines) 27789becdf2bSBram Moolenaar 27799becdf2bSBram Moolenaar lines =<< trim END 27809becdf2bSBram Moolenaar vim9script 27819becdf2bSBram Moolenaar { 27829becdf2bSBram Moolenaar var one = 'one' 27839becdf2bSBram Moolenaar echo one 27849becdf2bSBram Moolenaar } 27859becdf2bSBram Moolenaar echo one 27869becdf2bSBram Moolenaar END 27879becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 2788fcdc5d83SBram Moolenaarenddef 2789fcdc5d83SBram Moolenaar 2790585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2791585fea7bSBram Moolenaardef Test_substitute_cmd() 2792585fea7bSBram Moolenaar new 2793585fea7bSBram Moolenaar setline(1, 'something') 2794585fea7bSBram Moolenaar :substitute(some(other( 2795585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2796585fea7bSBram Moolenaar bwipe! 2797585fea7bSBram Moolenaar 2798f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2799cfcd011fSBram Moolenaar var lines =<< trim END 2800585fea7bSBram Moolenaar vim9script 2801585fea7bSBram Moolenaar new 2802585fea7bSBram Moolenaar setline(1, 'something') 2803585fea7bSBram Moolenaar :substitute(some(other( 2804585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2805585fea7bSBram Moolenaar bwipe! 2806585fea7bSBram Moolenaar END 2807585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2808585fea7bSBram Moolenaar source Xvim9lines 2809585fea7bSBram Moolenaar 2810585fea7bSBram Moolenaar delete('Xvim9lines') 2811585fea7bSBram Moolenaarenddef 2812585fea7bSBram Moolenaar 28138a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2814