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 253fbbcd003SBram Moolenaardef Test_block_local_vars() 254fbbcd003SBram Moolenaar var lines =<< trim END 255fbbcd003SBram Moolenaar vim9script 256ed234f24SBram Moolenaar v:testing = 1 257fbbcd003SBram Moolenaar if true 258ed234f24SBram Moolenaar var text = ['hello'] 259ed234f24SBram Moolenaar def SayHello(): list<string> 260fbbcd003SBram Moolenaar return text 261fbbcd003SBram Moolenaar enddef 262fbbcd003SBram Moolenaar def SetText(v: string) 263ed234f24SBram Moolenaar text = [v] 264fbbcd003SBram Moolenaar enddef 265fbbcd003SBram Moolenaar endif 266fbbcd003SBram Moolenaar 267fbbcd003SBram Moolenaar if true 268ed234f24SBram Moolenaar var text = ['again'] 269ed234f24SBram Moolenaar def SayAgain(): list<string> 270fbbcd003SBram Moolenaar return text 271fbbcd003SBram Moolenaar enddef 272fbbcd003SBram Moolenaar endif 273ed234f24SBram Moolenaar 274ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 275ed234f24SBram Moolenaar test_garbagecollect_now() 276ed234f24SBram Moolenaar 277fbbcd003SBram Moolenaar defcompile 278fbbcd003SBram Moolenaar 279ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 280ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 281fbbcd003SBram Moolenaar 282fbbcd003SBram Moolenaar SetText('foobar') 283ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 284ed234f24SBram Moolenaar 285ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 286ed234f24SBram Moolenaar qall! 287fbbcd003SBram Moolenaar END 288ed234f24SBram Moolenaar 289ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 290ed234f24SBram Moolenaar # context gets garbage collected. 291ed234f24SBram Moolenaar writefile(lines, 'Xscript') 292ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 293ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 294ed234f24SBram Moolenaar 295ed234f24SBram Moolenaar delete('Xscript') 296ed234f24SBram Moolenaar delete('Xdidit') 297fbbcd003SBram Moolenaarenddef 298fbbcd003SBram Moolenaar 29939ca4127SBram Moolenaardef Test_block_local_vars_with_func() 30039ca4127SBram Moolenaar var lines =<< trim END 30139ca4127SBram Moolenaar vim9script 30239ca4127SBram Moolenaar if true 30339ca4127SBram Moolenaar var foo = 'foo' 30439ca4127SBram Moolenaar if true 30539ca4127SBram Moolenaar var bar = 'bar' 30639ca4127SBram Moolenaar def Func(): list<string> 30739ca4127SBram Moolenaar return [foo, bar] 30839ca4127SBram Moolenaar enddef 30939ca4127SBram Moolenaar endif 31039ca4127SBram Moolenaar endif 31139ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 31239ca4127SBram Moolenaar # "foo" and "bar" 31339ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 31439ca4127SBram Moolenaar END 31539ca4127SBram Moolenaar CheckScriptSuccess(lines) 31639ca4127SBram Moolenaarenddef 31739ca4127SBram Moolenaar 318d032f34aSBram Moolenaarfunc g:NoSuchFunc() 319d032f34aSBram Moolenaar echo 'none' 320d032f34aSBram Moolenaarendfunc 321d032f34aSBram Moolenaar 3228a7d6542SBram Moolenaardef Test_try_catch() 323cfcd011fSBram Moolenaar var l = [] 3247a092245SBram Moolenaar try # comment 3258a7d6542SBram Moolenaar add(l, '1') 3268a7d6542SBram Moolenaar throw 'wrong' 3278a7d6542SBram Moolenaar add(l, '2') 3287a092245SBram Moolenaar catch # comment 3298a7d6542SBram Moolenaar add(l, v:exception) 3307a092245SBram Moolenaar finally # comment 3318a7d6542SBram Moolenaar add(l, '3') 3327a092245SBram Moolenaar endtry # comment 3338a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 33468d130c6SBram Moolenaar 335e859312eSBram Moolenaar l = [] 336e859312eSBram Moolenaar try 337e859312eSBram Moolenaar try 338e859312eSBram Moolenaar add(l, '1') 339e859312eSBram Moolenaar throw 'wrong' 340e859312eSBram Moolenaar add(l, '2') 341e859312eSBram Moolenaar catch /right/ 342e859312eSBram Moolenaar add(l, v:exception) 343e859312eSBram Moolenaar endtry 344e859312eSBram Moolenaar catch /wrong/ 345e859312eSBram Moolenaar add(l, 'caught') 346373863edSBram Moolenaar fina 347e859312eSBram Moolenaar add(l, 'finally') 348e859312eSBram Moolenaar endtry 349e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 350e859312eSBram Moolenaar 351cfcd011fSBram Moolenaar var n: number 35268d130c6SBram Moolenaar try 35368d130c6SBram Moolenaar n = l[3] 35468d130c6SBram Moolenaar catch /E684:/ 35568d130c6SBram Moolenaar n = 99 35668d130c6SBram Moolenaar endtry 35768d130c6SBram Moolenaar assert_equal(99, n) 35868d130c6SBram Moolenaar 35968d130c6SBram Moolenaar try 360cc673e74SBram Moolenaar # string slice returns a string, not a number 36168d130c6SBram Moolenaar n = g:astring[3] 3625e654230SBram Moolenaar catch /E1012:/ 36368d130c6SBram Moolenaar n = 77 36468d130c6SBram Moolenaar endtry 36568d130c6SBram Moolenaar assert_equal(77, n) 36668d130c6SBram Moolenaar 36768d130c6SBram Moolenaar try 36868d130c6SBram Moolenaar n = l[g:astring] 3695e654230SBram Moolenaar catch /E1012:/ 37056acb094SBram Moolenaar n = 88 37168d130c6SBram Moolenaar endtry 37256acb094SBram Moolenaar assert_equal(88, n) 37368d130c6SBram Moolenaar 37468d130c6SBram Moolenaar try 37568d130c6SBram Moolenaar n = s:does_not_exist 37668d130c6SBram Moolenaar catch /E121:/ 377f0b9f43cSBram Moolenaar n = 111 378f0b9f43cSBram Moolenaar endtry 379f0b9f43cSBram Moolenaar assert_equal(111, n) 380f0b9f43cSBram Moolenaar 381f0b9f43cSBram Moolenaar try 382f0b9f43cSBram Moolenaar n = g:does_not_exist 383f0b9f43cSBram Moolenaar catch /E121:/ 38468d130c6SBram Moolenaar n = 121 38568d130c6SBram Moolenaar endtry 38668d130c6SBram Moolenaar assert_equal(121, n) 38768d130c6SBram Moolenaar 388cfcd011fSBram Moolenaar var d = #{one: 1} 38968d130c6SBram Moolenaar try 39068d130c6SBram Moolenaar n = d[g:astring] 39168d130c6SBram Moolenaar catch /E716:/ 39268d130c6SBram Moolenaar n = 222 39368d130c6SBram Moolenaar endtry 39468d130c6SBram Moolenaar assert_equal(222, n) 395f0b9f43cSBram Moolenaar 396f0b9f43cSBram Moolenaar try 397f0b9f43cSBram Moolenaar n = -g:astring 398f0b9f43cSBram Moolenaar catch /E39:/ 399f0b9f43cSBram Moolenaar n = 233 400f0b9f43cSBram Moolenaar endtry 401f0b9f43cSBram Moolenaar assert_equal(233, n) 402f0b9f43cSBram Moolenaar 403f0b9f43cSBram Moolenaar try 404f0b9f43cSBram Moolenaar n = +g:astring 405f0b9f43cSBram Moolenaar catch /E1030:/ 406f0b9f43cSBram Moolenaar n = 244 407f0b9f43cSBram Moolenaar endtry 408f0b9f43cSBram Moolenaar assert_equal(244, n) 409f0b9f43cSBram Moolenaar 410f0b9f43cSBram Moolenaar try 411f0b9f43cSBram Moolenaar n = +g:alist 412f0b9f43cSBram Moolenaar catch /E745:/ 413f0b9f43cSBram Moolenaar n = 255 414f0b9f43cSBram Moolenaar endtry 415f0b9f43cSBram Moolenaar assert_equal(255, n) 416f0b9f43cSBram Moolenaar 417cfcd011fSBram Moolenaar var nd: dict<any> 418f0b9f43cSBram Moolenaar try 4192bede173SBram Moolenaar nd = {[g:anumber]: 1} 4205e654230SBram Moolenaar catch /E1012:/ 421f0b9f43cSBram Moolenaar n = 266 422f0b9f43cSBram Moolenaar endtry 423f0b9f43cSBram Moolenaar assert_equal(266, n) 424f0b9f43cSBram Moolenaar 425f0b9f43cSBram Moolenaar try 426f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 427f0b9f43cSBram Moolenaar catch /E1093:/ 428f0b9f43cSBram Moolenaar n = 277 429f0b9f43cSBram Moolenaar endtry 430f0b9f43cSBram Moolenaar assert_equal(277, n) 431f0b9f43cSBram Moolenaar 432e859312eSBram Moolenaar try 433e859312eSBram Moolenaar &ts = g:astring 4345e654230SBram Moolenaar catch /E1012:/ 435e859312eSBram Moolenaar n = 288 436e859312eSBram Moolenaar endtry 437e859312eSBram Moolenaar assert_equal(288, n) 438e859312eSBram Moolenaar 439e859312eSBram Moolenaar try 440e859312eSBram Moolenaar &backspace = 'asdf' 441e859312eSBram Moolenaar catch /E474:/ 442e859312eSBram Moolenaar n = 299 443e859312eSBram Moolenaar endtry 444e859312eSBram Moolenaar assert_equal(299, n) 445e859312eSBram Moolenaar 446e859312eSBram Moolenaar l = [1] 447e859312eSBram Moolenaar try 448e859312eSBram Moolenaar l[3] = 3 449e859312eSBram Moolenaar catch /E684:/ 450e859312eSBram Moolenaar n = 300 451e859312eSBram Moolenaar endtry 452e859312eSBram Moolenaar assert_equal(300, n) 453e859312eSBram Moolenaar 454e859312eSBram Moolenaar try 455e859312eSBram Moolenaar unlet g:does_not_exist 456e859312eSBram Moolenaar catch /E108:/ 457e859312eSBram Moolenaar n = 322 458e859312eSBram Moolenaar endtry 459e859312eSBram Moolenaar assert_equal(322, n) 460e859312eSBram Moolenaar 461e859312eSBram Moolenaar try 4622bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 463e859312eSBram Moolenaar catch /E721:/ 464e859312eSBram Moolenaar n = 333 465e859312eSBram Moolenaar endtry 466e859312eSBram Moolenaar assert_equal(333, n) 467e859312eSBram Moolenaar 468e859312eSBram Moolenaar try 469e859312eSBram Moolenaar l = DeletedFunc() 470e859312eSBram Moolenaar catch /E933:/ 471e859312eSBram Moolenaar n = 344 472e859312eSBram Moolenaar endtry 473e859312eSBram Moolenaar assert_equal(344, n) 474d032f34aSBram Moolenaar 475d032f34aSBram Moolenaar try 476d032f34aSBram Moolenaar echo len(v:true) 477d032f34aSBram Moolenaar catch /E701:/ 478d032f34aSBram Moolenaar n = 355 479d032f34aSBram Moolenaar endtry 480d032f34aSBram Moolenaar assert_equal(355, n) 481d032f34aSBram Moolenaar 482cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 483d032f34aSBram Moolenaar delfunc g:NoSuchFunc 484d032f34aSBram Moolenaar try 485d032f34aSBram Moolenaar echo P() 486d032f34aSBram Moolenaar catch /E117:/ 487d032f34aSBram Moolenaar n = 366 488d032f34aSBram Moolenaar endtry 489d032f34aSBram Moolenaar assert_equal(366, n) 490d032f34aSBram Moolenaar 491d032f34aSBram Moolenaar try 492d032f34aSBram Moolenaar echo g:NoSuchFunc() 493d032f34aSBram Moolenaar catch /E117:/ 494d032f34aSBram Moolenaar n = 377 495d032f34aSBram Moolenaar endtry 496d032f34aSBram Moolenaar assert_equal(377, n) 497d032f34aSBram Moolenaar 498d032f34aSBram Moolenaar try 499d032f34aSBram Moolenaar echo g:alist + 4 500d032f34aSBram Moolenaar catch /E745:/ 501d032f34aSBram Moolenaar n = 388 502d032f34aSBram Moolenaar endtry 503d032f34aSBram Moolenaar assert_equal(388, n) 504d032f34aSBram Moolenaar 505d032f34aSBram Moolenaar try 506d032f34aSBram Moolenaar echo 4 + g:alist 507d032f34aSBram Moolenaar catch /E745:/ 508d032f34aSBram Moolenaar n = 399 509d032f34aSBram Moolenaar endtry 510d032f34aSBram Moolenaar assert_equal(399, n) 511d032f34aSBram Moolenaar 512d032f34aSBram Moolenaar try 513d032f34aSBram Moolenaar echo g:alist.member 514d032f34aSBram Moolenaar catch /E715:/ 515d032f34aSBram Moolenaar n = 400 516d032f34aSBram Moolenaar endtry 517d032f34aSBram Moolenaar assert_equal(400, n) 518d032f34aSBram Moolenaar 519d032f34aSBram Moolenaar try 520d032f34aSBram Moolenaar echo d.member 521d032f34aSBram Moolenaar catch /E716:/ 522d032f34aSBram Moolenaar n = 411 523d032f34aSBram Moolenaar endtry 524d032f34aSBram Moolenaar assert_equal(411, n) 5258a7d6542SBram Moolenaarenddef 5268a7d6542SBram Moolenaar 527e859312eSBram Moolenaardef DeletedFunc(): list<any> 528e859312eSBram Moolenaar return ['delete me'] 529e859312eSBram Moolenaarenddef 530e859312eSBram Moolenaardefcompile 531e859312eSBram Moolenaardelfunc DeletedFunc 532e859312eSBram Moolenaar 533257cc5eeSBram Moolenaardef ThrowFromDef() 534a72cfb80SBram Moolenaar throw "getout" # comment 535257cc5eeSBram Moolenaarenddef 536257cc5eeSBram Moolenaar 537257cc5eeSBram Moolenaarfunc CatchInFunc() 538257cc5eeSBram Moolenaar try 539257cc5eeSBram Moolenaar call ThrowFromDef() 540257cc5eeSBram Moolenaar catch 541257cc5eeSBram Moolenaar let g:thrown_func = v:exception 542257cc5eeSBram Moolenaar endtry 543257cc5eeSBram Moolenaarendfunc 544257cc5eeSBram Moolenaar 545257cc5eeSBram Moolenaardef CatchInDef() 546257cc5eeSBram Moolenaar try 547257cc5eeSBram Moolenaar ThrowFromDef() 548257cc5eeSBram Moolenaar catch 549257cc5eeSBram Moolenaar g:thrown_def = v:exception 550257cc5eeSBram Moolenaar endtry 551257cc5eeSBram Moolenaarenddef 552257cc5eeSBram Moolenaar 553f575adffSBram Moolenaardef ReturnFinally(): string 554f575adffSBram Moolenaar try 555f575adffSBram Moolenaar return 'intry' 556373863edSBram Moolenaar finall 557f575adffSBram Moolenaar g:in_finally = 'finally' 558f575adffSBram Moolenaar endtry 559f575adffSBram Moolenaar return 'end' 560f575adffSBram Moolenaarenddef 561f575adffSBram Moolenaar 562257cc5eeSBram Moolenaardef Test_try_catch_nested() 563257cc5eeSBram Moolenaar CatchInFunc() 564257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 565257cc5eeSBram Moolenaar 566257cc5eeSBram Moolenaar CatchInDef() 567257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 568f575adffSBram Moolenaar 569f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 570f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 571f575adffSBram Moolenaarenddef 572f575adffSBram Moolenaar 5739939f57bSBram Moolenaardef TryOne(): number 5749939f57bSBram Moolenaar try 5759939f57bSBram Moolenaar return 0 5769939f57bSBram Moolenaar catch 5779939f57bSBram Moolenaar endtry 5789939f57bSBram Moolenaar return 0 5799939f57bSBram Moolenaarenddef 5809939f57bSBram Moolenaar 5819939f57bSBram Moolenaardef TryTwo(n: number): string 5829939f57bSBram Moolenaar try 583cfcd011fSBram Moolenaar var x = {} 5849939f57bSBram Moolenaar catch 5859939f57bSBram Moolenaar endtry 5869939f57bSBram Moolenaar return 'text' 5879939f57bSBram Moolenaarenddef 5889939f57bSBram Moolenaar 5899939f57bSBram Moolenaardef Test_try_catch_twice() 5909939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5919939f57bSBram Moolenaarenddef 5929939f57bSBram Moolenaar 593f575adffSBram Moolenaardef Test_try_catch_match() 594cfcd011fSBram Moolenaar var seq = 'a' 595f575adffSBram Moolenaar try 596f575adffSBram Moolenaar throw 'something' 597f575adffSBram Moolenaar catch /nothing/ 598f575adffSBram Moolenaar seq ..= 'x' 599f575adffSBram Moolenaar catch /some/ 600f575adffSBram Moolenaar seq ..= 'b' 601f575adffSBram Moolenaar catch /asdf/ 602f575adffSBram Moolenaar seq ..= 'x' 603e8c4abbbSBram Moolenaar catch ?a\?sdf? 604e8c4abbbSBram Moolenaar seq ..= 'y' 605f575adffSBram Moolenaar finally 606f575adffSBram Moolenaar seq ..= 'c' 607f575adffSBram Moolenaar endtry 608f575adffSBram Moolenaar assert_equal('abc', seq) 609257cc5eeSBram Moolenaarenddef 610257cc5eeSBram Moolenaar 611e8c4abbbSBram Moolenaardef Test_try_catch_fails() 612d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 613d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 614d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 615d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 616d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 617d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 618d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 619d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 62013106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 621d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 622585fea7bSBram Moolenaar 623d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 624d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 625e8c4abbbSBram Moolenaarenddef 626e8c4abbbSBram Moolenaar 627006ad48bSBram Moolenaardef Test_throw_vimscript() 628f5be8cdbSBram Moolenaar # only checks line continuation 629cfcd011fSBram Moolenaar var lines =<< trim END 630006ad48bSBram Moolenaar vim9script 631006ad48bSBram Moolenaar try 632006ad48bSBram Moolenaar throw 'one' 633006ad48bSBram Moolenaar .. 'two' 634006ad48bSBram Moolenaar catch 635006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 636006ad48bSBram Moolenaar endtry 637006ad48bSBram Moolenaar END 638006ad48bSBram Moolenaar CheckScriptSuccess(lines) 6391e021e63SBram Moolenaar 6401e021e63SBram Moolenaar lines =<< trim END 6411e021e63SBram Moolenaar vim9script 642352134bbSBram Moolenaar @r = '' 6431e021e63SBram Moolenaar def Func() 6441e021e63SBram Moolenaar throw @r 6451e021e63SBram Moolenaar enddef 6461e021e63SBram Moolenaar var result = '' 6471e021e63SBram Moolenaar try 6481e021e63SBram Moolenaar Func() 6491e021e63SBram Moolenaar catch /E1129:/ 6501e021e63SBram Moolenaar result = 'caught' 6511e021e63SBram Moolenaar endtry 6521e021e63SBram Moolenaar assert_equal('caught', result) 6531e021e63SBram Moolenaar END 6541e021e63SBram Moolenaar CheckScriptSuccess(lines) 655006ad48bSBram Moolenaarenddef 656006ad48bSBram Moolenaar 657ed677f55SBram Moolenaardef Test_error_in_nested_function() 658ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 659cfcd011fSBram Moolenaar var lines =<< trim END 660ed677f55SBram Moolenaar vim9script 661ed677f55SBram Moolenaar def Func() 662ed677f55SBram Moolenaar Error() 663ed677f55SBram Moolenaar g:test_var = 1 664ed677f55SBram Moolenaar enddef 665ed677f55SBram Moolenaar func Error() abort 666ed677f55SBram Moolenaar eval [][0] 667ed677f55SBram Moolenaar endfunc 668ed677f55SBram Moolenaar Func() 669ed677f55SBram Moolenaar END 670ed677f55SBram Moolenaar g:test_var = 0 671ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 672ed677f55SBram Moolenaar assert_equal(0, g:test_var) 673ed677f55SBram Moolenaarenddef 674ed677f55SBram Moolenaar 67537c83711SBram Moolenaardef Test_cexpr_vimscript() 676f5be8cdbSBram Moolenaar # only checks line continuation 67737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 678cfcd011fSBram Moolenaar var lines =<< trim END 67937c83711SBram Moolenaar vim9script 68037c83711SBram Moolenaar cexpr 'File' 68137c83711SBram Moolenaar .. ' someFile' .. 68237c83711SBram Moolenaar ' line 19' 68337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 68437c83711SBram Moolenaar END 68537c83711SBram Moolenaar CheckScriptSuccess(lines) 68637c83711SBram Moolenaar set errorformat& 68737c83711SBram Moolenaarenddef 68837c83711SBram Moolenaar 689c9edd6b5SBram Moolenaardef Test_statusline_syntax() 690c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 691cfcd011fSBram Moolenaar var lines =<< trim END 692c9edd6b5SBram Moolenaar vim9script 693c9edd6b5SBram Moolenaar func g:Status() 694c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 695c9edd6b5SBram Moolenaar endfunc 696c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 697c9edd6b5SBram Moolenaar redrawstatus 698c9edd6b5SBram Moolenaar set laststatus statusline= 699c9edd6b5SBram Moolenaar END 700c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 701c9edd6b5SBram Moolenaarenddef 702c9edd6b5SBram Moolenaar 703b209750bSBram Moolenaardef Test_list_vimscript() 704b209750bSBram Moolenaar # checks line continuation and comments 705cfcd011fSBram Moolenaar var lines =<< trim END 706b209750bSBram Moolenaar vim9script 707cfcd011fSBram Moolenaar var mylist = [ 708b209750bSBram Moolenaar 'one', 709b209750bSBram Moolenaar # comment 710b209750bSBram Moolenaar 'two', # empty line follows 711b209750bSBram Moolenaar 712b209750bSBram Moolenaar 'three', 713b209750bSBram Moolenaar ] 714b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 715b209750bSBram Moolenaar END 716b209750bSBram Moolenaar CheckScriptSuccess(lines) 71766250c93SBram Moolenaar 71866250c93SBram Moolenaar # check all lines from heredoc are kept 71966250c93SBram Moolenaar lines =<< trim END 72066250c93SBram Moolenaar # comment 1 72166250c93SBram Moolenaar two 72266250c93SBram Moolenaar # comment 3 72366250c93SBram Moolenaar 72466250c93SBram Moolenaar five 72566250c93SBram Moolenaar # comment 6 72666250c93SBram Moolenaar END 72766250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 728b209750bSBram Moolenaarenddef 729b209750bSBram Moolenaar 7302a1381c3SBram Moolenaarif has('channel') 73140ee466cSBram Moolenaar let someJob = test_null_job() 73240ee466cSBram Moolenaar 73340ee466cSBram Moolenaar def FuncWithError() 73440ee466cSBram Moolenaar echomsg g:someJob 73540ee466cSBram Moolenaar enddef 73640ee466cSBram Moolenaar 73740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 73840ee466cSBram Moolenaar try 73940ee466cSBram Moolenaar call FuncWithError() 74040ee466cSBram Moolenaar catch 74140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 74240ee466cSBram Moolenaar endtry 74340ee466cSBram Moolenaar endfunc 7442a1381c3SBram Moolenaarendif 74540ee466cSBram Moolenaar 7468a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 7478a7d6542SBram Moolenaar vim9script 748cfcd011fSBram Moolenaar var name: string = 'bob' 7498a7d6542SBram Moolenaar def Concat(arg: string): string 7508a7d6542SBram Moolenaar return name .. arg 7518a7d6542SBram Moolenaar enddef 752227a69deSBram Moolenaar g:result = Concat('bie') 753227a69deSBram Moolenaar g:localname = name 7548a7d6542SBram Moolenaar 7558a7d6542SBram Moolenaar export const CONST = 1234 756cfcd011fSBram Moolenaar export var exported = 9876 757cfcd011fSBram Moolenaar export var exp_name = 'John' 7588a7d6542SBram Moolenaar export def Exported(): string 7598a7d6542SBram Moolenaar return 'Exported' 7608a7d6542SBram Moolenaar enddef 7618a7d6542SBram MoolenaarEND 7628a7d6542SBram Moolenaar 763b3ca9824SBram Moolenaardef Undo_export_script_lines() 764b3ca9824SBram Moolenaar unlet g:result 765b3ca9824SBram Moolenaar unlet g:localname 766b3ca9824SBram Moolenaarenddef 767b3ca9824SBram Moolenaar 7685269bd2aSBram Moolenaardef Test_vim9_import_export() 769cfcd011fSBram Moolenaar var import_script_lines =<< trim END 7708a7d6542SBram Moolenaar vim9script 7718a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 7728a7d6542SBram Moolenaar g:imported = exported 7736e587dcbSBram Moolenaar exported += 3 7746e587dcbSBram Moolenaar g:imported_added = exported 7758a7d6542SBram Moolenaar g:imported_func = Exported() 7766e587dcbSBram Moolenaar 77740f4f7a4SBram Moolenaar def GetExported(): string 778cfcd011fSBram Moolenaar var local_dict = #{ref: Exported} 77940f4f7a4SBram Moolenaar return local_dict.ref() 78040f4f7a4SBram Moolenaar enddef 78140f4f7a4SBram Moolenaar g:funcref_result = GetExported() 78240f4f7a4SBram Moolenaar 7836e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7846e587dcbSBram Moolenaar g:imported_name = exp_name 7856e587dcbSBram Moolenaar exp_name ..= ' Doe' 7866e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7875381c7a1SBram Moolenaar g:imported_later = exported 7888a7d6542SBram Moolenaar END 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7918a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7928a7d6542SBram Moolenaar 7938a7d6542SBram Moolenaar source Ximport.vim 7948a7d6542SBram Moolenaar 7958a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7968a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7978a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7986e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7995381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8008a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 80140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 8026e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8036e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8048a7d6542SBram Moolenaar assert_false(exists('g:name')) 8058a7d6542SBram Moolenaar 806b3ca9824SBram Moolenaar Undo_export_script_lines() 8078a7d6542SBram Moolenaar unlet g:imported 8086e587dcbSBram Moolenaar unlet g:imported_added 8095381c7a1SBram Moolenaar unlet g:imported_later 8108a7d6542SBram Moolenaar unlet g:imported_func 8116e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 8128a7d6542SBram Moolenaar delete('Ximport.vim') 813f2d5c240SBram Moolenaar 8141c991144SBram Moolenaar # similar, with line breaks 815cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 8161c991144SBram Moolenaar vim9script 8171c991144SBram Moolenaar import { 8181c991144SBram Moolenaar exported, 8191c991144SBram Moolenaar Exported, 8201c991144SBram Moolenaar } 8211c991144SBram Moolenaar from 8221c991144SBram Moolenaar './Xexport.vim' 8231c991144SBram Moolenaar g:imported = exported 8241c991144SBram Moolenaar exported += 5 8251c991144SBram Moolenaar g:imported_added = exported 8261c991144SBram Moolenaar g:imported_func = Exported() 8271c991144SBram Moolenaar END 8281c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 8291c991144SBram Moolenaar source Ximport_lbr.vim 8301c991144SBram Moolenaar 8311c991144SBram Moolenaar assert_equal(9876, g:imported) 8321c991144SBram Moolenaar assert_equal(9881, g:imported_added) 8331c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 8341c991144SBram Moolenaar 8351c991144SBram Moolenaar # exported script not sourced again 8361c991144SBram Moolenaar assert_false(exists('g:result')) 8371c991144SBram Moolenaar unlet g:imported 8381c991144SBram Moolenaar unlet g:imported_added 8391c991144SBram Moolenaar unlet g:imported_func 8401c991144SBram Moolenaar delete('Ximport_lbr.vim') 8411c991144SBram Moolenaar 8421c991144SBram Moolenaar # import inside :def function 843cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 8445381c7a1SBram Moolenaar vim9script 8455381c7a1SBram Moolenaar def ImportInDef() 8465381c7a1SBram Moolenaar import exported from './Xexport.vim' 8475381c7a1SBram Moolenaar g:imported = exported 8485381c7a1SBram Moolenaar exported += 7 8495381c7a1SBram Moolenaar g:imported_added = exported 8505381c7a1SBram Moolenaar enddef 8515381c7a1SBram Moolenaar ImportInDef() 8525381c7a1SBram Moolenaar END 8535381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8545381c7a1SBram Moolenaar source Ximport2.vim 855f5be8cdbSBram Moolenaar # TODO: this should be 9879 8565381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8575381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8585381c7a1SBram Moolenaar unlet g:imported 8595381c7a1SBram Moolenaar unlet g:imported_added 8605381c7a1SBram Moolenaar delete('Ximport2.vim') 8615381c7a1SBram Moolenaar 862cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 863f2d5c240SBram Moolenaar vim9script 864f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 865f2d5c240SBram Moolenaar def UseExport() 866f2d5c240SBram Moolenaar g:imported = Export.exported 867f2d5c240SBram Moolenaar enddef 868f2d5c240SBram Moolenaar UseExport() 869f2d5c240SBram Moolenaar END 870f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 871f2d5c240SBram Moolenaar source Ximport.vim 8725381c7a1SBram Moolenaar assert_equal(9883, g:imported) 873f2d5c240SBram Moolenaar 874cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 875599c89c8SBram Moolenaar vim9script 876599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 877599c89c8SBram Moolenaar def Func() 878cfcd011fSBram Moolenaar var dummy = 1 879cfcd011fSBram Moolenaar var imported = Export + dummy 880599c89c8SBram Moolenaar enddef 881822ba247SBram Moolenaar defcompile 882599c89c8SBram Moolenaar END 883599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 88444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 885599c89c8SBram Moolenaar 886cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 887599c89c8SBram Moolenaar vim9script 888599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 889599c89c8SBram Moolenaar def Func() 890cfcd011fSBram Moolenaar var imported = Export . exported 891599c89c8SBram Moolenaar enddef 892822ba247SBram Moolenaar defcompile 893599c89c8SBram Moolenaar END 894599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 89544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 896599c89c8SBram Moolenaar 897cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 898599c89c8SBram Moolenaar vim9script 899599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 900599c89c8SBram Moolenaar def Func() 901cfcd011fSBram Moolenaar var imported = Export. 902599c89c8SBram Moolenaar enddef 903822ba247SBram Moolenaar defcompile 904599c89c8SBram Moolenaar END 905599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 90644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 907599c89c8SBram Moolenaar 908cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 9091c991144SBram Moolenaar vim9script 9101c991144SBram Moolenaar import * 9111c991144SBram Moolenaar as Export 9121c991144SBram Moolenaar from 9131c991144SBram Moolenaar './Xexport.vim' 9141c991144SBram Moolenaar def UseExport() 9151c991144SBram Moolenaar g:imported = Export.exported 9161c991144SBram Moolenaar enddef 9171c991144SBram Moolenaar UseExport() 9181c991144SBram Moolenaar END 9191c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 9201c991144SBram Moolenaar source Ximport.vim 9211c991144SBram Moolenaar assert_equal(9883, g:imported) 9221c991144SBram Moolenaar 923cfcd011fSBram Moolenaar var import_star_lines =<< trim END 924f2d5c240SBram Moolenaar vim9script 925f2d5c240SBram Moolenaar import * from './Xexport.vim' 926f2d5c240SBram Moolenaar END 927f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 92844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 929f2d5c240SBram Moolenaar 930f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 931cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 932fa29c8abSBram Moolenaar vim9script 933fa29c8abSBram Moolenaar import name from './Xexport.vim' 934fa29c8abSBram Moolenaar END 935fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 93644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 937fa29c8abSBram Moolenaar 938f5be8cdbSBram Moolenaar # try to import something that is already defined 939cfcd011fSBram Moolenaar var import_already_defined =<< trim END 9405269bd2aSBram Moolenaar vim9script 941cfcd011fSBram Moolenaar var exported = 'something' 9425269bd2aSBram Moolenaar import exported from './Xexport.vim' 9435269bd2aSBram Moolenaar END 9445269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 94544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9465269bd2aSBram Moolenaar 947f5be8cdbSBram Moolenaar # try to import something that is already defined 9485269bd2aSBram Moolenaar import_already_defined =<< trim END 9495269bd2aSBram Moolenaar vim9script 950cfcd011fSBram Moolenaar var exported = 'something' 9515269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9525269bd2aSBram Moolenaar END 9535269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 95444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9555269bd2aSBram Moolenaar 956f5be8cdbSBram Moolenaar # try to import something that is already defined 9575269bd2aSBram Moolenaar import_already_defined =<< trim END 9585269bd2aSBram Moolenaar vim9script 959cfcd011fSBram Moolenaar var exported = 'something' 9605269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9615269bd2aSBram Moolenaar END 9625269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 96344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9645269bd2aSBram Moolenaar 965f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 966cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 967fa29c8abSBram Moolenaar vim9script 968fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 969fa29c8abSBram Moolenaar END 970fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 97144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 972fa29c8abSBram Moolenaar 973cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 974fa29c8abSBram Moolenaar vim9script 975fa29c8abSBram Moolenaar import name './Xexport.vim' 976fa29c8abSBram Moolenaar END 977fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 97844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 979fa29c8abSBram Moolenaar 980cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 981fa29c8abSBram Moolenaar vim9script 982fa29c8abSBram Moolenaar import name from Xexport.vim 983fa29c8abSBram Moolenaar END 984fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 98544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 986fa29c8abSBram Moolenaar 987cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 988fa29c8abSBram Moolenaar vim9script 989fa29c8abSBram Moolenaar import name from './XnoExport.vim' 990fa29c8abSBram Moolenaar END 991fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 99244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 993fa29c8abSBram Moolenaar 994cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 995fa29c8abSBram Moolenaar vim9script 996fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 997fa29c8abSBram Moolenaar END 9985269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 99944d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1000fa29c8abSBram Moolenaar 1001f2d5c240SBram Moolenaar delete('Ximport.vim') 10025269bd2aSBram Moolenaar delete('Ximport3.vim') 10038a7d6542SBram Moolenaar delete('Xexport.vim') 10048a7d6542SBram Moolenaar 1005f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1006750802b5SBram Moolenaar set cpo&vi 1007cfcd011fSBram Moolenaar var cpo_before = &cpo 1008cfcd011fSBram Moolenaar var lines =<< trim END 1009750802b5SBram Moolenaar vim9script 1010750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1011750802b5SBram Moolenaar END 1012750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1013750802b5SBram Moolenaar source Xvim9_script 1014750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1015750802b5SBram Moolenaar set cpo&vim 1016750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1017750802b5SBram Moolenaar delete('Xvim9_script') 1018750802b5SBram Moolenaarenddef 1019750802b5SBram Moolenaar 1020803af686SBram Moolenaarfunc g:Trigger() 1021803af686SBram Moolenaar source Ximport.vim 1022803af686SBram Moolenaar return "echo 'yes'\<CR>" 1023803af686SBram Moolenaarendfunc 1024803af686SBram Moolenaar 1025803af686SBram Moolenaardef Test_import_export_expr_map() 1026803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1027cfcd011fSBram Moolenaar var export_lines =<< trim END 1028803af686SBram Moolenaar vim9script 1029803af686SBram Moolenaar export def That(): string 1030803af686SBram Moolenaar return 'yes' 1031803af686SBram Moolenaar enddef 1032803af686SBram Moolenaar END 1033803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1034803af686SBram Moolenaar 1035cfcd011fSBram Moolenaar var import_lines =<< trim END 1036803af686SBram Moolenaar vim9script 1037803af686SBram Moolenaar import That from './Xexport_that.vim' 1038803af686SBram Moolenaar assert_equal('yes', That()) 1039803af686SBram Moolenaar END 1040803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1041803af686SBram Moolenaar 1042803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1043803af686SBram Moolenaar feedkeys('trigger', "xt") 1044803af686SBram Moolenaar 1045730b2483SBram Moolenaar delete('Xexport_that.vim') 1046803af686SBram Moolenaar delete('Ximport.vim') 1047803af686SBram Moolenaar nunmap trigger 1048803af686SBram Moolenaarenddef 1049803af686SBram Moolenaar 10508e1986e3SBram Moolenaardef Test_import_in_filetype() 10518e1986e3SBram Moolenaar # check that :import works when the buffer is locked 10528e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1053cfcd011fSBram Moolenaar var export_lines =<< trim END 10548e1986e3SBram Moolenaar vim9script 1055cfcd011fSBram Moolenaar export var That = 'yes' 10568e1986e3SBram Moolenaar END 1057730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 10588e1986e3SBram Moolenaar 1059cfcd011fSBram Moolenaar var import_lines =<< trim END 10608e1986e3SBram Moolenaar vim9script 1061730b2483SBram Moolenaar import That from './Xexport_ft.vim' 10628e1986e3SBram Moolenaar assert_equal('yes', That) 10638e1986e3SBram Moolenaar g:did_load_mytpe = 1 10648e1986e3SBram Moolenaar END 10658e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 10668e1986e3SBram Moolenaar 1067cfcd011fSBram Moolenaar var save_rtp = &rtp 10688e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 10698e1986e3SBram Moolenaar 10708e1986e3SBram Moolenaar filetype plugin on 10718e1986e3SBram Moolenaar copen 10728e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 10738e1986e3SBram Moolenaar 10748e1986e3SBram Moolenaar quit! 1075730b2483SBram Moolenaar delete('Xexport_ft.vim') 10768e1986e3SBram Moolenaar delete('ftplugin', 'rf') 10778e1986e3SBram Moolenaar &rtp = save_rtp 10788e1986e3SBram Moolenaarenddef 10798e1986e3SBram Moolenaar 1080efa94447SBram Moolenaardef Test_use_import_in_mapping() 1081cfcd011fSBram Moolenaar var lines =<< trim END 1082efa94447SBram Moolenaar vim9script 1083efa94447SBram Moolenaar export def Funcx() 1084efa94447SBram Moolenaar g:result = 42 1085efa94447SBram Moolenaar enddef 1086efa94447SBram Moolenaar END 1087efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1088efa94447SBram Moolenaar lines =<< trim END 1089efa94447SBram Moolenaar vim9script 1090efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1091b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1092efa94447SBram Moolenaar END 1093efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1094efa94447SBram Moolenaar 1095efa94447SBram Moolenaar source Xmapscript.vim 1096b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1097efa94447SBram Moolenaar assert_equal(42, g:result) 1098efa94447SBram Moolenaar 1099efa94447SBram Moolenaar unlet g:result 1100efa94447SBram Moolenaar delete('XsomeExport.vim') 1101efa94447SBram Moolenaar delete('Xmapscript.vim') 1102b3ca9824SBram Moolenaar nunmap <F3> 1103efa94447SBram Moolenaarenddef 1104efa94447SBram Moolenaar 1105750802b5SBram Moolenaardef Test_vim9script_fails() 11068a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11078a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1108cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 11099721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1110cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1111750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1112750802b5SBram Moolenaar 1113cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1114c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1115c785b9a7SBram Moolenaar 1116e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1117e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 11188a7d6542SBram Moolenaarenddef 11198a7d6542SBram Moolenaar 1120f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1121101f4810SBram Moolenaar CheckRunVimInTerminal 1122101f4810SBram Moolenaar 11239bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1124c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11259bb3eb3eSBram Moolenaarendfunc 11269bb3eb3eSBram Moolenaar 1127c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1128cfcd011fSBram Moolenaar var export =<< trim END 1129101f4810SBram Moolenaar vim9script 1130101f4810SBram Moolenaar export def Foo(): number 1131101f4810SBram Moolenaar return 0 1132101f4810SBram Moolenaar enddef 1133101f4810SBram Moolenaar END 1134730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1135101f4810SBram Moolenaar 1136cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 11379bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11389bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1139101f4810SBram Moolenaar 1140730b2483SBram Moolenaar delete('XexportCmd.vim') 11419bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11429bb3eb3eSBram Moolenaarenddef 1143101f4810SBram Moolenaar 11444c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1145cfcd011fSBram Moolenaar var lines =<< trim END 11468a7d6542SBram Moolenaar vim9script 11478a7d6542SBram Moolenaar const var = '' 1148cfcd011fSBram Moolenaar var valone = 1234 11498a7d6542SBram Moolenaar def MyFunc(arg: string) 11508a7d6542SBram Moolenaar valone = 5678 11518a7d6542SBram Moolenaar enddef 11528a7d6542SBram Moolenaar END 1153cfcd011fSBram Moolenaar var morelines =<< trim END 1154cfcd011fSBram Moolenaar var valtwo = 222 11558a7d6542SBram Moolenaar export def GetValtwo(): number 11568a7d6542SBram Moolenaar return valtwo 11578a7d6542SBram Moolenaar enddef 11588a7d6542SBram Moolenaar END 115903afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11608a7d6542SBram Moolenaar source Xreload.vim 11618a7d6542SBram Moolenaar source Xreload.vim 11628a7d6542SBram Moolenaar source Xreload.vim 11638a7d6542SBram Moolenaar 1164cfcd011fSBram Moolenaar var testlines =<< trim END 11658a7d6542SBram Moolenaar vim9script 11668a7d6542SBram Moolenaar def TheFunc() 11678a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11688a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11698a7d6542SBram Moolenaar enddef 11708a7d6542SBram Moolenaar TheFunc() 11718a7d6542SBram Moolenaar END 11728a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11738a7d6542SBram Moolenaar source Ximport.vim 11748a7d6542SBram Moolenaar 1175f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1176f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11778a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11788a7d6542SBram Moolenaar source Ximport.vim 11798a7d6542SBram Moolenaar 1180f5be8cdbSBram Moolenaar # cannot declare a var twice 11818a7d6542SBram Moolenaar lines =<< trim END 11828a7d6542SBram Moolenaar vim9script 1183cfcd011fSBram Moolenaar var valone = 1234 1184cfcd011fSBram Moolenaar var valone = 5678 11858a7d6542SBram Moolenaar END 11868a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 118744d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 11888a7d6542SBram Moolenaar 11898a7d6542SBram Moolenaar delete('Xreload.vim') 11908a7d6542SBram Moolenaar delete('Ximport.vim') 11918a7d6542SBram Moolenaarenddef 11928a7d6542SBram Moolenaar 119395006e3dSBram Moolenaardef s:RetSome(): string 119495006e3dSBram Moolenaar return 'some' 119595006e3dSBram Moolenaarenddef 119695006e3dSBram Moolenaar 1197fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1198fe465a01SBram Moolenaar" script-local name. 1199fe465a01SBram Moolenaardef Test_vim9script_funcref() 1200cfcd011fSBram Moolenaar var sortlines =<< trim END 1201fe465a01SBram Moolenaar vim9script 1202fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1203bed36b93SBram Moolenaar return i2 - i1 1204fe465a01SBram Moolenaar enddef 1205fe465a01SBram Moolenaar 1206fe465a01SBram Moolenaar export def FastSort(): list<number> 1207fe465a01SBram Moolenaar return range(5)->sort(Compare) 1208fe465a01SBram Moolenaar enddef 1209fe465a01SBram Moolenaar END 1210fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1211fe465a01SBram Moolenaar 1212cfcd011fSBram Moolenaar var lines =<< trim END 1213fe465a01SBram Moolenaar vim9script 1214fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1215fe465a01SBram Moolenaar def Test() 1216fe465a01SBram Moolenaar g:result = FastSort() 1217fe465a01SBram Moolenaar enddef 1218fe465a01SBram Moolenaar Test() 1219fe465a01SBram Moolenaar END 1220fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1221fe465a01SBram Moolenaar 1222fe465a01SBram Moolenaar source Xscript.vim 1223fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1224fe465a01SBram Moolenaar 1225fe465a01SBram Moolenaar unlet g:result 1226fe465a01SBram Moolenaar delete('Xsort.vim') 1227fe465a01SBram Moolenaar delete('Xscript.vim') 122895006e3dSBram Moolenaar 1229cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 123095006e3dSBram Moolenaar assert_equal('some', Funcref()) 1231fe465a01SBram Moolenaarenddef 1232fe465a01SBram Moolenaar 1233601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1234601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1235601e76acSBram Moolenaar" function reference. 1236c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1237cfcd011fSBram Moolenaar var filterLines =<< trim END 1238c620c055SBram Moolenaar vim9script 1239c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1240c620c055SBram Moolenaar return idx % 2 == 1 1241c620c055SBram Moolenaar enddef 1242c620c055SBram Moolenaar export def FastFilter(): list<number> 1243c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1244c620c055SBram Moolenaar enddef 1245601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1246601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1247601e76acSBram Moolenaar enddef 1248c620c055SBram Moolenaar END 1249c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1250c620c055SBram Moolenaar 1251cfcd011fSBram Moolenaar var lines =<< trim END 1252c620c055SBram Moolenaar vim9script 1253601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1254c620c055SBram Moolenaar def Test() 1255cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1256c620c055SBram Moolenaar enddef 1257c620c055SBram Moolenaar Test() 1258601e76acSBram Moolenaar def TestDirect() 1259cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1260601e76acSBram Moolenaar enddef 1261601e76acSBram Moolenaar TestDirect() 1262c620c055SBram Moolenaar END 1263601e76acSBram Moolenaar CheckScriptSuccess(lines) 1264c620c055SBram Moolenaar delete('Xfilter.vim') 1265c620c055SBram Moolenaarenddef 1266c620c055SBram Moolenaar 12674c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1268cfcd011fSBram Moolenaar var first_lines =<< trim END 12694c17ad94SBram Moolenaar vim9script 12704c17ad94SBram Moolenaar def FuncYes(): string 12714c17ad94SBram Moolenaar return 'yes' 12724c17ad94SBram Moolenaar enddef 12734c17ad94SBram Moolenaar END 1274cfcd011fSBram Moolenaar var withno_lines =<< trim END 12754c17ad94SBram Moolenaar def FuncNo(): string 12764c17ad94SBram Moolenaar return 'no' 12774c17ad94SBram Moolenaar enddef 12784c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12794c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12804c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 128103afdcf1SBram Moolenaar enddef 128203afdcf1SBram Moolenaar END 1283cfcd011fSBram Moolenaar var nono_lines =<< trim END 128403afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 128503afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 128644d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 12874c17ad94SBram Moolenaar enddef 12884c17ad94SBram Moolenaar END 12894c17ad94SBram Moolenaar 12904c17ad94SBram Moolenaar # FuncNo() is defined 129103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12924c17ad94SBram Moolenaar source Xreloaded.vim 12934c17ad94SBram Moolenaar g:DoCheck(true) 12944c17ad94SBram Moolenaar 12954c17ad94SBram Moolenaar # FuncNo() is not redefined 129603afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12974c17ad94SBram Moolenaar source Xreloaded.vim 129803afdcf1SBram Moolenaar g:DoCheck() 12994c17ad94SBram Moolenaar 13004c17ad94SBram Moolenaar # FuncNo() is back 130103afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13024c17ad94SBram Moolenaar source Xreloaded.vim 130303afdcf1SBram Moolenaar g:DoCheck() 13044c17ad94SBram Moolenaar 13054c17ad94SBram Moolenaar delete('Xreloaded.vim') 13064c17ad94SBram Moolenaarenddef 13074c17ad94SBram Moolenaar 130889483d40SBram Moolenaardef Test_vim9script_reload_delvar() 130989483d40SBram Moolenaar # write the script with a script-local variable 1310cfcd011fSBram Moolenaar var lines =<< trim END 131189483d40SBram Moolenaar vim9script 1312cfcd011fSBram Moolenaar var name = 'string' 131389483d40SBram Moolenaar END 131489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 131589483d40SBram Moolenaar source XreloadVar.vim 131689483d40SBram Moolenaar 131789483d40SBram Moolenaar # now write the script using the same variable locally - works 131889483d40SBram Moolenaar lines =<< trim END 131989483d40SBram Moolenaar vim9script 132089483d40SBram Moolenaar def Func() 1321cfcd011fSBram Moolenaar var name = 'string' 132289483d40SBram Moolenaar enddef 132389483d40SBram Moolenaar END 132489483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 132589483d40SBram Moolenaar source XreloadVar.vim 132689483d40SBram Moolenaar 132789483d40SBram Moolenaar delete('XreloadVar.vim') 132889483d40SBram Moolenaarenddef 132989483d40SBram Moolenaar 13308a7d6542SBram Moolenaardef Test_import_absolute() 1331cfcd011fSBram Moolenaar var import_lines = [ 1332e6085c53SBram Moolenaar 'vim9script', 1333e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1334e6085c53SBram Moolenaar 'def UseExported()', 1335e6085c53SBram Moolenaar ' g:imported_abs = exported', 1336e6085c53SBram Moolenaar ' exported = 8888', 1337e6085c53SBram Moolenaar ' g:imported_after = exported', 1338e6085c53SBram Moolenaar 'enddef', 1339e6085c53SBram Moolenaar 'UseExported()', 1340e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1341e6085c53SBram Moolenaar ] 13428a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13438a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13448a7d6542SBram Moolenaar 13458a7d6542SBram Moolenaar source Ximport_abs.vim 13468a7d6542SBram Moolenaar 13478a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13484e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1349fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1350fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1351fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1352fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1353fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1354fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1355fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1356fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1357fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1358fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1359e6085c53SBram Moolenaar g:import_disassembled) 1360b3ca9824SBram Moolenaar 1361b3ca9824SBram Moolenaar Undo_export_script_lines() 13628a7d6542SBram Moolenaar unlet g:imported_abs 13634e12a5dfSBram Moolenaar unlet g:import_disassembled 13648a7d6542SBram Moolenaar 13658a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13668a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13678a7d6542SBram Moolenaarenddef 13688a7d6542SBram Moolenaar 13698a7d6542SBram Moolenaardef Test_import_rtp() 1370cfcd011fSBram Moolenaar var import_lines = [ 1371e6085c53SBram Moolenaar 'vim9script', 1372e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1373e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1374e6085c53SBram Moolenaar ] 13758a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13768a7d6542SBram Moolenaar mkdir('import') 13778a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13788a7d6542SBram Moolenaar 1379cfcd011fSBram Moolenaar var save_rtp = &rtp 13808a7d6542SBram Moolenaar &rtp = getcwd() 13818a7d6542SBram Moolenaar source Ximport_rtp.vim 13828a7d6542SBram Moolenaar &rtp = save_rtp 13838a7d6542SBram Moolenaar 13848a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13858a7d6542SBram Moolenaar 1386b3ca9824SBram Moolenaar Undo_export_script_lines() 1387b3ca9824SBram Moolenaar unlet g:imported_rtp 13888a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 138989483d40SBram Moolenaar delete('import', 'rf') 13908a7d6542SBram Moolenaarenddef 13918a7d6542SBram Moolenaar 139225e0f586SBram Moolenaardef Test_import_compile_error() 1393cfcd011fSBram Moolenaar var export_lines = [ 139425e0f586SBram Moolenaar 'vim9script', 139525e0f586SBram Moolenaar 'export def ExpFunc(): string', 139625e0f586SBram Moolenaar ' return notDefined', 139725e0f586SBram Moolenaar 'enddef', 139825e0f586SBram Moolenaar ] 139925e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 140025e0f586SBram Moolenaar 1401cfcd011fSBram Moolenaar var import_lines = [ 140225e0f586SBram Moolenaar 'vim9script', 140325e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 140425e0f586SBram Moolenaar 'def ImpFunc()', 140525e0f586SBram Moolenaar ' echo ExpFunc()', 140625e0f586SBram Moolenaar 'enddef', 140725e0f586SBram Moolenaar 'defcompile', 140825e0f586SBram Moolenaar ] 140925e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 141025e0f586SBram Moolenaar 141125e0f586SBram Moolenaar try 141225e0f586SBram Moolenaar source Ximport.vim 141325e0f586SBram Moolenaar catch /E1001/ 1414f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 14157707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 141625e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 141725e0f586SBram Moolenaar endtry 141825e0f586SBram Moolenaar 141925e0f586SBram Moolenaar delete('Xexported.vim') 142025e0f586SBram Moolenaar delete('Ximport.vim') 142125e0f586SBram Moolenaarenddef 142225e0f586SBram Moolenaar 1423c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1424cfcd011fSBram Moolenaar var lines = [ 1425c4ce36d4SBram Moolenaar 'vim9script', 1426c4ce36d4SBram Moolenaar 'def Func()', 1427c4ce36d4SBram Moolenaar ' eval [][0]', 1428c4ce36d4SBram Moolenaar 'enddef', 1429c4ce36d4SBram Moolenaar 'Func()', 1430c4ce36d4SBram Moolenaar ] 1431c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1432c4ce36d4SBram Moolenaar 1433c4ce36d4SBram Moolenaar for count in range(3) 1434c4ce36d4SBram Moolenaar try 1435c4ce36d4SBram Moolenaar source Xtestscript.vim 1436c4ce36d4SBram Moolenaar catch /E684/ 1437c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1438c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1439c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1440c4ce36d4SBram Moolenaar endtry 1441c4ce36d4SBram Moolenaar endfor 1442c4ce36d4SBram Moolenaar 1443c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1444c4ce36d4SBram Moolenaarenddef 1445c4ce36d4SBram Moolenaar 1446eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1447cfcd011fSBram Moolenaar var export_lines =<< trim END 1448eef2102eSBram Moolenaar vim9script 1449eef2102eSBram Moolenaar export def Func() 1450eef2102eSBram Moolenaar echo 'imported' 1451eef2102eSBram Moolenaar enddef 1452eef2102eSBram Moolenaar END 1453eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1454eef2102eSBram Moolenaar 1455cfcd011fSBram Moolenaar var lines =<< trim END 1456eef2102eSBram Moolenaar vim9script 1457eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1458eef2102eSBram Moolenaar def Func() 1459eef2102eSBram Moolenaar echo 'local to function' 1460eef2102eSBram Moolenaar enddef 1461eef2102eSBram Moolenaar END 1462eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1463eef2102eSBram Moolenaar 1464eef2102eSBram Moolenaar lines =<< trim END 1465eef2102eSBram Moolenaar vim9script 1466eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1467eef2102eSBram Moolenaar def Outer() 1468eef2102eSBram Moolenaar def Func() 1469eef2102eSBram Moolenaar echo 'local to function' 1470eef2102eSBram Moolenaar enddef 1471eef2102eSBram Moolenaar enddef 1472eef2102eSBram Moolenaar defcompile 1473eef2102eSBram Moolenaar END 1474eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1475eef2102eSBram Moolenaar 1476eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1477eef2102eSBram Moolenaarenddef 1478eef2102eSBram Moolenaar 1479b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1480cfcd011fSBram Moolenaar var lines =<< trim END 1481b9a2cac3SBram Moolenaar vim9script 1482b9a2cac3SBram Moolenaar def Func() 1483b9a2cac3SBram Moolenaar echo 'one' 1484b9a2cac3SBram Moolenaar enddef 1485b9a2cac3SBram Moolenaar def Func() 1486b9a2cac3SBram Moolenaar echo 'two' 1487b9a2cac3SBram Moolenaar enddef 1488b9a2cac3SBram Moolenaar END 1489b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1490fa211f3cSBram Moolenaar 1491fa211f3cSBram Moolenaar lines =<< trim END 1492fa211f3cSBram Moolenaar vim9script 1493fa211f3cSBram Moolenaar def Foo(): string 1494fa211f3cSBram Moolenaar return 'foo' 1495fa211f3cSBram Moolenaar enddef 1496fa211f3cSBram Moolenaar def Func() 1497cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1498fa211f3cSBram Moolenaar enddef 1499fa211f3cSBram Moolenaar defcompile 1500fa211f3cSBram Moolenaar END 1501fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1502b9a2cac3SBram Moolenaarenddef 1503b9a2cac3SBram Moolenaar 15048a7d6542SBram Moolenaardef Test_fixed_size_list() 1505f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1506cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 15078a7d6542SBram Moolenaar l->remove(0) 15088a7d6542SBram Moolenaar l->add(5) 15098a7d6542SBram Moolenaar l->insert(99, 1) 15100f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 15118a7d6542SBram Moolenaarenddef 15128a7d6542SBram Moolenaar 1513ae616494SBram Moolenaardef Test_no_insert_xit() 1514d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1515d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1516d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1517d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1518d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1519ae616494SBram Moolenaar 1520ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1521ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1522ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1523ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1524f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1525f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1526f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1527f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1528f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1529ae616494SBram Moolenaarenddef 1530ae616494SBram Moolenaar 1531158906cfSBram Moolenaardef IfElse(what: number): string 1532cfcd011fSBram Moolenaar var res = '' 1533158906cfSBram Moolenaar if what == 1 1534158906cfSBram Moolenaar res = "one" 1535158906cfSBram Moolenaar elseif what == 2 1536158906cfSBram Moolenaar res = "two" 1537a259d8d3SBram Moolenaar else 1538158906cfSBram Moolenaar res = "three" 1539a259d8d3SBram Moolenaar endif 1540158906cfSBram Moolenaar return res 1541a259d8d3SBram Moolenaarenddef 1542a259d8d3SBram Moolenaar 1543158906cfSBram Moolenaardef Test_if_elseif_else() 1544158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1545158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1546158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 15470f18b6d1SBram Moolenaarenddef 15480f18b6d1SBram Moolenaar 1549e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1550d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1551d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1552d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1553d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1554d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1555e8c4abbbSBram Moolenaarenddef 1556e8c4abbbSBram Moolenaar 15576d69bf60SBram Moolenaarlet g:bool_true = v:true 15586d69bf60SBram Moolenaarlet g:bool_false = v:false 15596d69bf60SBram Moolenaar 15606d69bf60SBram Moolenaardef Test_if_const_expr() 1561cfcd011fSBram Moolenaar var res = false 15626d69bf60SBram Moolenaar if true ? true : false 15636d69bf60SBram Moolenaar res = true 15646d69bf60SBram Moolenaar endif 15656d69bf60SBram Moolenaar assert_equal(true, res) 15666d69bf60SBram Moolenaar 1567585fea7bSBram Moolenaar g:glob = 2 1568585fea7bSBram Moolenaar if false 15696797966dSBram Moolenaar execute('g:glob = 3') 1570585fea7bSBram Moolenaar endif 1571585fea7bSBram Moolenaar assert_equal(2, g:glob) 1572585fea7bSBram Moolenaar if true 15736797966dSBram Moolenaar execute('g:glob = 3') 1574585fea7bSBram Moolenaar endif 1575585fea7bSBram Moolenaar assert_equal(3, g:glob) 1576585fea7bSBram Moolenaar 15776d69bf60SBram Moolenaar res = false 15786d69bf60SBram Moolenaar if g:bool_true ? true : false 15796d69bf60SBram Moolenaar res = true 15806d69bf60SBram Moolenaar endif 15816d69bf60SBram Moolenaar assert_equal(true, res) 15826d69bf60SBram Moolenaar 15836d69bf60SBram Moolenaar res = false 15846d69bf60SBram Moolenaar if true ? g:bool_true : false 15856d69bf60SBram Moolenaar res = true 15866d69bf60SBram Moolenaar endif 15876d69bf60SBram Moolenaar assert_equal(true, res) 15886d69bf60SBram Moolenaar 15896d69bf60SBram Moolenaar res = false 15906d69bf60SBram Moolenaar if true ? true : g:bool_false 15916d69bf60SBram Moolenaar res = true 15926d69bf60SBram Moolenaar endif 15936d69bf60SBram Moolenaar assert_equal(true, res) 15946d69bf60SBram Moolenaar 15956d69bf60SBram Moolenaar res = false 15966d69bf60SBram Moolenaar if true ? false : true 15976d69bf60SBram Moolenaar res = true 15986d69bf60SBram Moolenaar endif 15996d69bf60SBram Moolenaar assert_equal(false, res) 16006d69bf60SBram Moolenaar 16016d69bf60SBram Moolenaar res = false 16026d69bf60SBram Moolenaar if false ? false : true 16036d69bf60SBram Moolenaar res = true 16046d69bf60SBram Moolenaar endif 16056d69bf60SBram Moolenaar assert_equal(true, res) 16066d69bf60SBram Moolenaar 16076d69bf60SBram Moolenaar res = false 16086d69bf60SBram Moolenaar if false ? true : false 16096d69bf60SBram Moolenaar res = true 16106d69bf60SBram Moolenaar endif 16116d69bf60SBram Moolenaar assert_equal(false, res) 16126d69bf60SBram Moolenaar 16136d69bf60SBram Moolenaar res = false 1614e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1615e8c4abbbSBram Moolenaar res = true 1616e8c4abbbSBram Moolenaar endif 1617e8c4abbbSBram Moolenaar assert_equal(false, res) 1618e8c4abbbSBram Moolenaar 1619e8c4abbbSBram Moolenaar res = false 16206d69bf60SBram Moolenaar if true && true 16216d69bf60SBram Moolenaar res = true 16226d69bf60SBram Moolenaar endif 16236d69bf60SBram Moolenaar assert_equal(true, res) 16246d69bf60SBram Moolenaar 16256d69bf60SBram Moolenaar res = false 16266d69bf60SBram Moolenaar if true && false 16276d69bf60SBram Moolenaar res = true 16286d69bf60SBram Moolenaar endif 16296d69bf60SBram Moolenaar assert_equal(false, res) 16306d69bf60SBram Moolenaar 16316d69bf60SBram Moolenaar res = false 16326d69bf60SBram Moolenaar if g:bool_true && false 16336d69bf60SBram Moolenaar res = true 16346d69bf60SBram Moolenaar endif 16356d69bf60SBram Moolenaar assert_equal(false, res) 16366d69bf60SBram Moolenaar 16376d69bf60SBram Moolenaar res = false 16386d69bf60SBram Moolenaar if true && g:bool_false 16396d69bf60SBram Moolenaar res = true 16406d69bf60SBram Moolenaar endif 16416d69bf60SBram Moolenaar assert_equal(false, res) 16426d69bf60SBram Moolenaar 16436d69bf60SBram Moolenaar res = false 16446d69bf60SBram Moolenaar if false && false 16456d69bf60SBram Moolenaar res = true 16466d69bf60SBram Moolenaar endif 16476d69bf60SBram Moolenaar assert_equal(false, res) 16486d69bf60SBram Moolenaar 16496d69bf60SBram Moolenaar res = false 16506d69bf60SBram Moolenaar if true || false 16516d69bf60SBram Moolenaar res = true 16526d69bf60SBram Moolenaar endif 16536d69bf60SBram Moolenaar assert_equal(true, res) 16546d69bf60SBram Moolenaar 16556d69bf60SBram Moolenaar res = false 16566d69bf60SBram Moolenaar if g:bool_true || false 16576d69bf60SBram Moolenaar res = true 16586d69bf60SBram Moolenaar endif 16596d69bf60SBram Moolenaar assert_equal(true, res) 16606d69bf60SBram Moolenaar 16616d69bf60SBram Moolenaar res = false 16626d69bf60SBram Moolenaar if true || g:bool_false 16636d69bf60SBram Moolenaar res = true 16646d69bf60SBram Moolenaar endif 16656d69bf60SBram Moolenaar assert_equal(true, res) 16666d69bf60SBram Moolenaar 16676d69bf60SBram Moolenaar res = false 16686d69bf60SBram Moolenaar if false || false 16696d69bf60SBram Moolenaar res = true 16706d69bf60SBram Moolenaar endif 16716d69bf60SBram Moolenaar assert_equal(false, res) 16723988f64fSBram Moolenaar 16733988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 16743988f64fSBram Moolenaar if false | eval 0 | endif 16753988f64fSBram Moolenaar if false | eval burp + 234 | endif 16763988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 16773988f64fSBram Moolenaar if false 16783988f64fSBram Moolenaar burp 16793988f64fSBram Moolenaar endif 168080c34ca3SBram Moolenaarenddef 16816d69bf60SBram Moolenaar 168280c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1683d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1684d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1685d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1686d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16876d69bf60SBram Moolenaarenddef 16886d69bf60SBram Moolenaar 168972abcf42SBram Moolenaardef RunNested(i: number): number 1690cfcd011fSBram Moolenaar var x: number = 0 169172abcf42SBram Moolenaar if i % 2 169272abcf42SBram Moolenaar if 1 1693f5be8cdbSBram Moolenaar # comment 169472abcf42SBram Moolenaar else 1695f5be8cdbSBram Moolenaar # comment 169672abcf42SBram Moolenaar endif 169772abcf42SBram Moolenaar x += 1 169872abcf42SBram Moolenaar else 169972abcf42SBram Moolenaar x += 1000 170072abcf42SBram Moolenaar endif 170172abcf42SBram Moolenaar return x 170272abcf42SBram Moolenaarenddef 170372abcf42SBram Moolenaar 170472abcf42SBram Moolenaardef Test_nested_if() 170572abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 170672abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 170772abcf42SBram Moolenaarenddef 170872abcf42SBram Moolenaar 1709ad39c094SBram Moolenaardef Test_execute_cmd() 1710ad39c094SBram Moolenaar new 1711ad39c094SBram Moolenaar setline(1, 'default') 1712d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1713ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1714a72cfb80SBram Moolenaar 1715d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1716a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1717a72cfb80SBram Moolenaar 1718cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1719cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1720a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1721ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1722a72cfb80SBram Moolenaar 1723d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1724ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1725a72cfb80SBram Moolenaar 1726cfcd011fSBram Moolenaar var cmd_first = 'call ' 1727cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1728ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1729ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1730ad39c094SBram Moolenaar bwipe! 1731585fea7bSBram Moolenaar 1732cfcd011fSBram Moolenaar var n = true 17332d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 17342d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 17352d6b20d6SBram Moolenaar 1736e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 1737e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1738e5abf7afSBram Moolenaar 1739d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1740d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1741d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1742ad39c094SBram Moolenaarenddef 1743ad39c094SBram Moolenaar 174447e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1745f5be8cdbSBram Moolenaar # only checks line continuation 1746cfcd011fSBram Moolenaar var lines =<< trim END 174747e880d6SBram Moolenaar vim9script 174847e880d6SBram Moolenaar execute 'g:someVar' 174947e880d6SBram Moolenaar .. ' = ' .. 175047e880d6SBram Moolenaar '28' 175147e880d6SBram Moolenaar assert_equal(28, g:someVar) 175247e880d6SBram Moolenaar unlet g:someVar 175347e880d6SBram Moolenaar END 175447e880d6SBram Moolenaar CheckScriptSuccess(lines) 175547e880d6SBram Moolenaarenddef 175647e880d6SBram Moolenaar 1757ad39c094SBram Moolenaardef Test_echo_cmd() 1758a72cfb80SBram Moolenaar echo 'some' # comment 1759585fea7bSBram Moolenaar echon 'thing' 1760ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1761ad39c094SBram Moolenaar 1762a72cfb80SBram Moolenaar echo "some" # comment 1763a72cfb80SBram Moolenaar echon "thing" 1764a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1765a72cfb80SBram Moolenaar 1766cfcd011fSBram Moolenaar var str1 = 'some' 1767cfcd011fSBram Moolenaar var str2 = 'more' 1768ad39c094SBram Moolenaar echo str1 str2 1769ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1770a72cfb80SBram Moolenaar 1771d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1772ad39c094SBram Moolenaarenddef 1773ad39c094SBram Moolenaar 1774f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1775f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1776f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1777f93c7feaSBram Moolenaar echo 'clear' 1778df069eecSBram Moolenaar :1messages 1779f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1780f93c7feaSBram Moolenaar 1781d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1782f93c7feaSBram Moolenaarenddef 1783f93c7feaSBram Moolenaar 178447e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1785f5be8cdbSBram Moolenaar # only checks line continuation 1786cfcd011fSBram Moolenaar var lines =<< trim END 178747e880d6SBram Moolenaar vim9script 178847e880d6SBram Moolenaar echomsg 'here' 178947e880d6SBram Moolenaar .. ' is ' .. 179047e880d6SBram Moolenaar 'a message' 179147e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 179247e880d6SBram Moolenaar END 179347e880d6SBram Moolenaar CheckScriptSuccess(lines) 179447e880d6SBram Moolenaarenddef 179547e880d6SBram Moolenaar 1796f93c7feaSBram Moolenaardef Test_echoerr_cmd() 179740ee466cSBram Moolenaar try 179840ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 179940ee466cSBram Moolenaar catch 180040ee466cSBram Moolenaar assert_match('something wrong', v:exception) 180140ee466cSBram Moolenaar endtry 1802f93c7feaSBram Moolenaarenddef 1803f93c7feaSBram Moolenaar 180447e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1805f5be8cdbSBram Moolenaar # only checks line continuation 1806cfcd011fSBram Moolenaar var lines =<< trim END 180747e880d6SBram Moolenaar vim9script 180847e880d6SBram Moolenaar try 180947e880d6SBram Moolenaar echoerr 'this' 181047e880d6SBram Moolenaar .. ' is ' .. 181147e880d6SBram Moolenaar 'wrong' 181247e880d6SBram Moolenaar catch 181347e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 181447e880d6SBram Moolenaar endtry 181547e880d6SBram Moolenaar END 181647e880d6SBram Moolenaar CheckScriptSuccess(lines) 181747e880d6SBram Moolenaarenddef 181847e880d6SBram Moolenaar 181941fe0617SBram Moolenaardef Test_for_outside_of_function() 1820cfcd011fSBram Moolenaar var lines =<< trim END 182141fe0617SBram Moolenaar vim9script 182241fe0617SBram Moolenaar new 182341fe0617SBram Moolenaar for var in range(0, 3) 182441fe0617SBram Moolenaar append(line('$'), var) 182541fe0617SBram Moolenaar endfor 182641fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 182741fe0617SBram Moolenaar bwipe! 182841fe0617SBram Moolenaar END 182941fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 183041fe0617SBram Moolenaar source Xvim9for.vim 183141fe0617SBram Moolenaar delete('Xvim9for.vim') 183241fe0617SBram Moolenaarenddef 18338a7d6542SBram Moolenaar 1834e8c4abbbSBram Moolenaardef Test_for_loop() 1835cfcd011fSBram Moolenaar var result = '' 1836e8c4abbbSBram Moolenaar for cnt in range(7) 1837e8c4abbbSBram Moolenaar if cnt == 4 1838e8c4abbbSBram Moolenaar break 1839e8c4abbbSBram Moolenaar endif 1840e8c4abbbSBram Moolenaar if cnt == 2 1841e8c4abbbSBram Moolenaar continue 1842e8c4abbbSBram Moolenaar endif 1843e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1844e8c4abbbSBram Moolenaar endfor 1845e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 18460ad3e894SBram Moolenaar 1847cfcd011fSBram Moolenaar var concat = '' 18480ad3e894SBram Moolenaar for str in eval('["one", "two"]') 18490ad3e894SBram Moolenaar concat ..= str 18500ad3e894SBram Moolenaar endfor 18510ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1852e8c4abbbSBram Moolenaarenddef 1853e8c4abbbSBram Moolenaar 1854e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1855675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1856675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1857cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1858822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 1859451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1860675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1861675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1862675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1863e8c4abbbSBram Moolenaarenddef 1864e8c4abbbSBram Moolenaar 1865*792f786aSBram Moolenaardef Test_for_loop_unpack() 1866*792f786aSBram Moolenaar var result = [] 1867*792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 1868*792f786aSBram Moolenaar result->add(v1) 1869*792f786aSBram Moolenaar result->add(v2) 1870*792f786aSBram Moolenaar endfor 1871*792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 1872*792f786aSBram Moolenaar 1873*792f786aSBram Moolenaar result = [] 1874*792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 1875*792f786aSBram Moolenaar result->add(v1) 1876*792f786aSBram Moolenaar result->add(v2) 1877*792f786aSBram Moolenaar result->add(v3) 1878*792f786aSBram Moolenaar endfor 1879*792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 1880*792f786aSBram Moolenaar 1881*792f786aSBram Moolenaar var lines =<< trim END 1882*792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 1883*792f786aSBram Moolenaar echo v1 v2 1884*792f786aSBram Moolenaar endfor 1885*792f786aSBram Moolenaar END 1886*792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 1887*792f786aSBram Moolenaar 1888*792f786aSBram Moolenaar lines =<< trim END 1889*792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 1890*792f786aSBram Moolenaar echo v1 v2 1891*792f786aSBram Moolenaar endfor 1892*792f786aSBram Moolenaar END 1893*792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 1894*792f786aSBram Moolenaar 1895*792f786aSBram Moolenaar lines =<< trim END 1896*792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 1897*792f786aSBram Moolenaar echo v1 1898*792f786aSBram Moolenaar endfor 1899*792f786aSBram Moolenaar END 1900*792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 1901*792f786aSBram Moolenaarenddef 1902*792f786aSBram Moolenaar 1903d0df1aacSBram Moolenaardef Test_while_loop() 1904cfcd011fSBram Moolenaar var result = '' 1905cfcd011fSBram Moolenaar var cnt = 0 1906d0df1aacSBram Moolenaar while cnt < 555 1907d0df1aacSBram Moolenaar if cnt == 3 1908d0df1aacSBram Moolenaar break 1909d0df1aacSBram Moolenaar endif 1910d0df1aacSBram Moolenaar cnt += 1 1911d0df1aacSBram Moolenaar if cnt == 2 1912d0df1aacSBram Moolenaar continue 1913d0df1aacSBram Moolenaar endif 1914d0df1aacSBram Moolenaar result ..= cnt .. '_' 1915d0df1aacSBram Moolenaar endwhile 1916d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1917d0df1aacSBram Moolenaarenddef 1918d0df1aacSBram Moolenaar 1919e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1920675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1921675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1922675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1923675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1924675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1925675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1926675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1927bd5da371SBram Moolenaarenddef 1928bd5da371SBram Moolenaar 19299645e2d9SBram Moolenaardef Test_interrupt_loop() 1930cfcd011fSBram Moolenaar var caught = false 1931cfcd011fSBram Moolenaar var x = 0 193297acfc78SBram Moolenaar try 19339645e2d9SBram Moolenaar while 1 19349645e2d9SBram Moolenaar x += 1 19359645e2d9SBram Moolenaar if x == 100 19369645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 19379645e2d9SBram Moolenaar endif 19389645e2d9SBram Moolenaar endwhile 193997acfc78SBram Moolenaar catch 194097acfc78SBram Moolenaar caught = true 194197acfc78SBram Moolenaar assert_equal(100, x) 194297acfc78SBram Moolenaar endtry 194397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 194425859dd7SBram Moolenaar # consume the CTRL-C 194525859dd7SBram Moolenaar getchar(0) 19469645e2d9SBram Moolenaarenddef 194720431c9dSBram Moolenaar 19484fdae999SBram Moolenaardef Test_automatic_line_continuation() 1949cfcd011fSBram Moolenaar var mylist = [ 19504fdae999SBram Moolenaar 'one', 19514fdae999SBram Moolenaar 'two', 19524fdae999SBram Moolenaar 'three', 1953f5be8cdbSBram Moolenaar ] # comment 19544fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 19554fdae999SBram Moolenaar 1956cfcd011fSBram Moolenaar var mydict = { 19574fdae999SBram Moolenaar 'one': 1, 19584fdae999SBram Moolenaar 'two': 2, 19594fdae999SBram Moolenaar 'three': 19604fdae999SBram Moolenaar 3, 1961f5be8cdbSBram Moolenaar } # comment 19624fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 19634fdae999SBram Moolenaar mydict = #{ 19642c330432SBram Moolenaar one: 1, # comment 19652c330432SBram Moolenaar two: # comment 19662c330432SBram Moolenaar 2, # comment 19672c330432SBram Moolenaar three: 3 # comment 19682c330432SBram Moolenaar } 19692c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 19702c330432SBram Moolenaar mydict = #{ 19712c330432SBram Moolenaar one: 1, 19724fdae999SBram Moolenaar two: 19734fdae999SBram Moolenaar 2, 19742c330432SBram Moolenaar three: 3 19754fdae999SBram Moolenaar } 19764fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1977e6085c53SBram Moolenaar 1978e6085c53SBram Moolenaar assert_equal( 1979e6085c53SBram Moolenaar ['one', 'two', 'three'], 1980e6085c53SBram Moolenaar split('one two three') 1981e6085c53SBram Moolenaar ) 19824fdae999SBram Moolenaarenddef 19834fdae999SBram Moolenaar 19847a092245SBram Moolenaardef Test_vim9_comment() 19857a092245SBram Moolenaar CheckScriptSuccess([ 19867a092245SBram Moolenaar 'vim9script', 19877a092245SBram Moolenaar '# something', 19887a092245SBram Moolenaar ]) 19897a092245SBram Moolenaar CheckScriptFailure([ 19907a092245SBram Moolenaar 'vim9script', 19917a092245SBram Moolenaar ':# something', 19927a092245SBram Moolenaar ], 'E488:') 19937a092245SBram Moolenaar CheckScriptFailure([ 19947a092245SBram Moolenaar '# something', 19957a092245SBram Moolenaar ], 'E488:') 19967a092245SBram Moolenaar CheckScriptFailure([ 19977a092245SBram Moolenaar ':# something', 19987a092245SBram Moolenaar ], 'E488:') 19997a092245SBram Moolenaar 20004a8d9f2eSBram Moolenaar { # block start 20014a8d9f2eSBram Moolenaar } # block end 20024a8d9f2eSBram Moolenaar CheckDefFailure([ 20034a8d9f2eSBram Moolenaar '{# comment', 20044a8d9f2eSBram Moolenaar ], 'E488:') 20054a8d9f2eSBram Moolenaar CheckDefFailure([ 20064a8d9f2eSBram Moolenaar '{', 20074a8d9f2eSBram Moolenaar '}# comment', 20084a8d9f2eSBram Moolenaar ], 'E488:') 20094a8d9f2eSBram Moolenaar 20104a8d9f2eSBram Moolenaar echo "yes" # comment 20114a8d9f2eSBram Moolenaar CheckDefFailure([ 20124a8d9f2eSBram Moolenaar 'echo "yes"# comment', 20134a8d9f2eSBram Moolenaar ], 'E488:') 20147a092245SBram Moolenaar CheckScriptSuccess([ 20157a092245SBram Moolenaar 'vim9script', 20167a092245SBram Moolenaar 'echo "yes" # something', 20177a092245SBram Moolenaar ]) 20187a092245SBram Moolenaar CheckScriptFailure([ 20197a092245SBram Moolenaar 'vim9script', 20207a092245SBram Moolenaar 'echo "yes"# something', 20217a092245SBram Moolenaar ], 'E121:') 20227a092245SBram Moolenaar CheckScriptFailure([ 20237a092245SBram Moolenaar 'vim9script', 20247a092245SBram Moolenaar 'echo# something', 20257a092245SBram Moolenaar ], 'E121:') 20267a092245SBram Moolenaar CheckScriptFailure([ 20277a092245SBram Moolenaar 'echo "yes" # something', 20287a092245SBram Moolenaar ], 'E121:') 20297a092245SBram Moolenaar 20304a8d9f2eSBram Moolenaar exe "echo" # comment 20314a8d9f2eSBram Moolenaar CheckDefFailure([ 20324a8d9f2eSBram Moolenaar 'exe "echo"# comment', 20334a8d9f2eSBram Moolenaar ], 'E488:') 20344a8d9f2eSBram Moolenaar CheckScriptSuccess([ 20354a8d9f2eSBram Moolenaar 'vim9script', 20364a8d9f2eSBram Moolenaar 'exe "echo" # something', 20374a8d9f2eSBram Moolenaar ]) 20384a8d9f2eSBram Moolenaar CheckScriptFailure([ 20394a8d9f2eSBram Moolenaar 'vim9script', 20404a8d9f2eSBram Moolenaar 'exe "echo"# something', 20414a8d9f2eSBram Moolenaar ], 'E121:') 20424a8d9f2eSBram Moolenaar CheckDefFailure([ 20434a8d9f2eSBram Moolenaar 'exe # comment', 20444a8d9f2eSBram Moolenaar ], 'E1015:') 20454a8d9f2eSBram Moolenaar CheckScriptFailure([ 20464a8d9f2eSBram Moolenaar 'vim9script', 20474a8d9f2eSBram Moolenaar 'exe# something', 20484a8d9f2eSBram Moolenaar ], 'E121:') 20494a8d9f2eSBram Moolenaar CheckScriptFailure([ 20504a8d9f2eSBram Moolenaar 'exe "echo" # something', 20514a8d9f2eSBram Moolenaar ], 'E121:') 20524a8d9f2eSBram Moolenaar 20537a092245SBram Moolenaar CheckDefFailure([ 20547a092245SBram Moolenaar 'try# comment', 20557a092245SBram Moolenaar ' echo "yes"', 20567a092245SBram Moolenaar 'catch', 20577a092245SBram Moolenaar 'endtry', 20587a092245SBram Moolenaar ], 'E488:') 20592c5ed4e3SBram Moolenaar CheckScriptFailure([ 20602c5ed4e3SBram Moolenaar 'vim9script', 20612c5ed4e3SBram Moolenaar 'try# comment', 20622c5ed4e3SBram Moolenaar 'echo "yes"', 20632c5ed4e3SBram Moolenaar ], 'E488:') 20647a092245SBram Moolenaar CheckDefFailure([ 20657a092245SBram Moolenaar 'try', 2066a72cfb80SBram Moolenaar ' throw#comment', 2067a72cfb80SBram Moolenaar 'catch', 2068a72cfb80SBram Moolenaar 'endtry', 2069a72cfb80SBram Moolenaar ], 'E1015:') 2070a72cfb80SBram Moolenaar CheckDefFailure([ 2071a72cfb80SBram Moolenaar 'try', 2072a72cfb80SBram Moolenaar ' throw "yes"#comment', 2073a72cfb80SBram Moolenaar 'catch', 2074a72cfb80SBram Moolenaar 'endtry', 2075a72cfb80SBram Moolenaar ], 'E488:') 2076a72cfb80SBram Moolenaar CheckDefFailure([ 2077a72cfb80SBram Moolenaar 'try', 20787a092245SBram Moolenaar ' echo "yes"', 20797a092245SBram Moolenaar 'catch# comment', 20807a092245SBram Moolenaar 'endtry', 20817a092245SBram Moolenaar ], 'E488:') 20822c5ed4e3SBram Moolenaar CheckScriptFailure([ 20832c5ed4e3SBram Moolenaar 'vim9script', 20842c5ed4e3SBram Moolenaar 'try', 20852c5ed4e3SBram Moolenaar ' echo "yes"', 20862c5ed4e3SBram Moolenaar 'catch# comment', 20872c5ed4e3SBram Moolenaar 'endtry', 20882c5ed4e3SBram Moolenaar ], 'E654:') 20892c5ed4e3SBram Moolenaar CheckDefFailure([ 20902c5ed4e3SBram Moolenaar 'try', 20912c5ed4e3SBram Moolenaar ' echo "yes"', 20922c5ed4e3SBram Moolenaar 'catch /pat/# comment', 20932c5ed4e3SBram Moolenaar 'endtry', 20942c5ed4e3SBram Moolenaar ], 'E488:') 20957a092245SBram Moolenaar CheckDefFailure([ 20967a092245SBram Moolenaar 'try', 20977a092245SBram Moolenaar 'echo "yes"', 20987a092245SBram Moolenaar 'catch', 20997a092245SBram Moolenaar 'endtry# comment', 21007a092245SBram Moolenaar ], 'E488:') 21012c5ed4e3SBram Moolenaar CheckScriptFailure([ 21022c5ed4e3SBram Moolenaar 'vim9script', 21032c5ed4e3SBram Moolenaar 'try', 21042c5ed4e3SBram Moolenaar ' echo "yes"', 21052c5ed4e3SBram Moolenaar 'catch', 21062c5ed4e3SBram Moolenaar 'endtry# comment', 21079b7bf9e9SBram Moolenaar ], 'E488:') 21082c5ed4e3SBram Moolenaar 21092c5ed4e3SBram Moolenaar CheckScriptSuccess([ 21102c5ed4e3SBram Moolenaar 'vim9script', 21112c5ed4e3SBram Moolenaar 'hi # comment', 21122c5ed4e3SBram Moolenaar ]) 21132c5ed4e3SBram Moolenaar CheckScriptFailure([ 21142c5ed4e3SBram Moolenaar 'vim9script', 21152c5ed4e3SBram Moolenaar 'hi# comment', 21162c5ed4e3SBram Moolenaar ], 'E416:') 21171966c248SBram Moolenaar CheckScriptSuccess([ 21181966c248SBram Moolenaar 'vim9script', 21191966c248SBram Moolenaar 'hi Search # comment', 21201966c248SBram Moolenaar ]) 21211966c248SBram Moolenaar CheckScriptFailure([ 21221966c248SBram Moolenaar 'vim9script', 21231966c248SBram Moolenaar 'hi Search# comment', 21241966c248SBram Moolenaar ], 'E416:') 21251966c248SBram Moolenaar CheckScriptSuccess([ 21261966c248SBram Moolenaar 'vim9script', 21271966c248SBram Moolenaar 'hi link This Search # comment', 21281966c248SBram Moolenaar ]) 21291966c248SBram Moolenaar CheckScriptFailure([ 21301966c248SBram Moolenaar 'vim9script', 21311966c248SBram Moolenaar 'hi link This That# comment', 21321966c248SBram Moolenaar ], 'E413:') 21331966c248SBram Moolenaar CheckScriptSuccess([ 21341966c248SBram Moolenaar 'vim9script', 21351966c248SBram Moolenaar 'hi clear This # comment', 21361966c248SBram Moolenaar 'hi clear # comment', 21371966c248SBram Moolenaar ]) 2138f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2139f5be8cdbSBram Moolenaar # hi clear This# comment', 21401966c248SBram Moolenaar CheckScriptFailure([ 21411966c248SBram Moolenaar 'vim9script', 21421966c248SBram Moolenaar 'hi clear# comment', 21431966c248SBram Moolenaar ], 'E416:') 21441966c248SBram Moolenaar 21451966c248SBram Moolenaar CheckScriptSuccess([ 21461966c248SBram Moolenaar 'vim9script', 21471966c248SBram Moolenaar 'hi Group term=bold', 21481966c248SBram Moolenaar 'match Group /todo/ # comment', 21491966c248SBram Moolenaar ]) 21501966c248SBram Moolenaar CheckScriptFailure([ 21511966c248SBram Moolenaar 'vim9script', 21521966c248SBram Moolenaar 'hi Group term=bold', 21531966c248SBram Moolenaar 'match Group /todo/# comment', 21541966c248SBram Moolenaar ], 'E488:') 21551966c248SBram Moolenaar CheckScriptSuccess([ 21561966c248SBram Moolenaar 'vim9script', 21571966c248SBram Moolenaar 'match # comment', 21581966c248SBram Moolenaar ]) 21591966c248SBram Moolenaar CheckScriptFailure([ 21601966c248SBram Moolenaar 'vim9script', 21611966c248SBram Moolenaar 'match# comment', 21621966c248SBram Moolenaar ], 'E475:') 21631966c248SBram Moolenaar CheckScriptSuccess([ 21641966c248SBram Moolenaar 'vim9script', 21651966c248SBram Moolenaar 'match none # comment', 21661966c248SBram Moolenaar ]) 21671966c248SBram Moolenaar CheckScriptFailure([ 21681966c248SBram Moolenaar 'vim9script', 21691966c248SBram Moolenaar 'match none# comment', 21701966c248SBram Moolenaar ], 'E475:') 21711966c248SBram Moolenaar 21721966c248SBram Moolenaar CheckScriptSuccess([ 21731966c248SBram Moolenaar 'vim9script', 21741966c248SBram Moolenaar 'menutrans clear # comment', 21751966c248SBram Moolenaar ]) 21761966c248SBram Moolenaar CheckScriptFailure([ 21771966c248SBram Moolenaar 'vim9script', 21781966c248SBram Moolenaar 'menutrans clear# comment text', 21791966c248SBram Moolenaar ], 'E474:') 21801966c248SBram Moolenaar 21811966c248SBram Moolenaar CheckScriptSuccess([ 21821966c248SBram Moolenaar 'vim9script', 21831966c248SBram Moolenaar 'syntax clear # comment', 21841966c248SBram Moolenaar ]) 21851966c248SBram Moolenaar CheckScriptFailure([ 21861966c248SBram Moolenaar 'vim9script', 21871966c248SBram Moolenaar 'syntax clear# comment text', 21881966c248SBram Moolenaar ], 'E28:') 21891966c248SBram Moolenaar CheckScriptSuccess([ 21901966c248SBram Moolenaar 'vim9script', 21911966c248SBram Moolenaar 'syntax keyword Word some', 21921966c248SBram Moolenaar 'syntax clear Word # comment', 21931966c248SBram Moolenaar ]) 21941966c248SBram Moolenaar CheckScriptFailure([ 21951966c248SBram Moolenaar 'vim9script', 21961966c248SBram Moolenaar 'syntax keyword Word some', 21971966c248SBram Moolenaar 'syntax clear Word# comment text', 21981966c248SBram Moolenaar ], 'E28:') 21991966c248SBram Moolenaar 22001966c248SBram Moolenaar CheckScriptSuccess([ 22011966c248SBram Moolenaar 'vim9script', 22021966c248SBram Moolenaar 'syntax list # comment', 22031966c248SBram Moolenaar ]) 22041966c248SBram Moolenaar CheckScriptFailure([ 22051966c248SBram Moolenaar 'vim9script', 22061966c248SBram Moolenaar 'syntax list# comment text', 22071966c248SBram Moolenaar ], 'E28:') 22081966c248SBram Moolenaar 22091966c248SBram Moolenaar CheckScriptSuccess([ 22101966c248SBram Moolenaar 'vim9script', 22111966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 22121966c248SBram Moolenaar ]) 22131966c248SBram Moolenaar CheckScriptFailure([ 22141966c248SBram Moolenaar 'vim9script', 22151966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 22161966c248SBram Moolenaar ], 'E475:') 22171966c248SBram Moolenaar 22181966c248SBram Moolenaar CheckScriptSuccess([ 22191966c248SBram Moolenaar 'vim9script', 22201966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 22211966c248SBram Moolenaar ]) 22221966c248SBram Moolenaar CheckScriptFailure([ 22231966c248SBram Moolenaar 'vim9script', 22241966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 22251966c248SBram Moolenaar ], 'E789:') 22261966c248SBram Moolenaar 22271966c248SBram Moolenaar CheckScriptSuccess([ 22281966c248SBram Moolenaar 'vim9script', 22291966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 22301966c248SBram Moolenaar ]) 22311966c248SBram Moolenaar CheckScriptFailure([ 22321966c248SBram Moolenaar 'vim9script', 22331966c248SBram Moolenaar 'syntax match Word /pat/# comment', 22341966c248SBram Moolenaar ], 'E402:') 22351966c248SBram Moolenaar 22361966c248SBram Moolenaar CheckScriptSuccess([ 22371966c248SBram Moolenaar 'vim9script', 22381966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 22391966c248SBram Moolenaar ]) 22401966c248SBram Moolenaar CheckScriptFailure([ 22411966c248SBram Moolenaar 'vim9script', 22421966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 22431966c248SBram Moolenaar ], 'E475:') 22441966c248SBram Moolenaar CheckScriptFailure([ 22451966c248SBram Moolenaar 'vim9script', 22461966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 22471966c248SBram Moolenaar ], 'E406:') 22481966c248SBram Moolenaar CheckScriptFailure([ 22491966c248SBram Moolenaar 'vim9script', 22501966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 22511966c248SBram Moolenaar ], 'E475:') 22521966c248SBram Moolenaar 22531966c248SBram Moolenaar CheckScriptSuccess([ 22541966c248SBram Moolenaar 'vim9script', 22551966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 22561966c248SBram Moolenaar ]) 22571966c248SBram Moolenaar CheckScriptFailure([ 22581966c248SBram Moolenaar 'vim9script', 22591966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2260d032f34aSBram Moolenaar ], 'E402:') 22611966c248SBram Moolenaar 22621966c248SBram Moolenaar CheckScriptSuccess([ 22631966c248SBram Moolenaar 'vim9script', 22641966c248SBram Moolenaar 'syntax sync # comment', 22651966c248SBram Moolenaar ]) 22661966c248SBram Moolenaar CheckScriptFailure([ 22671966c248SBram Moolenaar 'vim9script', 22681966c248SBram Moolenaar 'syntax sync# comment', 22691966c248SBram Moolenaar ], 'E404:') 22701966c248SBram Moolenaar CheckScriptSuccess([ 22711966c248SBram Moolenaar 'vim9script', 22721966c248SBram Moolenaar 'syntax sync ccomment # comment', 22731966c248SBram Moolenaar ]) 22741966c248SBram Moolenaar CheckScriptFailure([ 22751966c248SBram Moolenaar 'vim9script', 22761966c248SBram Moolenaar 'syntax sync ccomment# comment', 22771966c248SBram Moolenaar ], 'E404:') 22781966c248SBram Moolenaar 22791966c248SBram Moolenaar CheckScriptSuccess([ 22801966c248SBram Moolenaar 'vim9script', 22811966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 22821966c248SBram Moolenaar ]) 22831966c248SBram Moolenaar CheckScriptFailure([ 22841966c248SBram Moolenaar 'vim9script', 22851966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 22861966c248SBram Moolenaar ], 'E475:') 2287a72cfb80SBram Moolenaar 2288a72cfb80SBram Moolenaar CheckScriptSuccess([ 2289a72cfb80SBram Moolenaar 'vim9script', 2290a72cfb80SBram Moolenaar 'command Echo echo # comment', 2291a72cfb80SBram Moolenaar 'command Echo # comment', 2292a72cfb80SBram Moolenaar ]) 2293a72cfb80SBram Moolenaar CheckScriptFailure([ 2294a72cfb80SBram Moolenaar 'vim9script', 2295a72cfb80SBram Moolenaar 'command Echo echo# comment', 2296a72cfb80SBram Moolenaar 'Echo', 2297a72cfb80SBram Moolenaar ], 'E121:') 2298a72cfb80SBram Moolenaar CheckScriptFailure([ 2299a72cfb80SBram Moolenaar 'vim9script', 2300a72cfb80SBram Moolenaar 'command Echo# comment', 2301a72cfb80SBram Moolenaar ], 'E182:') 2302a72cfb80SBram Moolenaar CheckScriptFailure([ 2303a72cfb80SBram Moolenaar 'vim9script', 2304a72cfb80SBram Moolenaar 'command Echo echo', 2305a72cfb80SBram Moolenaar 'command Echo# comment', 2306a72cfb80SBram Moolenaar ], 'E182:') 2307a72cfb80SBram Moolenaar 2308a72cfb80SBram Moolenaar CheckScriptSuccess([ 2309a72cfb80SBram Moolenaar 'vim9script', 2310a72cfb80SBram Moolenaar 'function # comment', 2311a72cfb80SBram Moolenaar ]) 2312a72cfb80SBram Moolenaar CheckScriptFailure([ 2313a72cfb80SBram Moolenaar 'vim9script', 23149898107fSBram Moolenaar 'function " comment', 23159898107fSBram Moolenaar ], 'E129:') 23169898107fSBram Moolenaar CheckScriptFailure([ 23179898107fSBram Moolenaar 'vim9script', 2318a72cfb80SBram Moolenaar 'function# comment', 2319a72cfb80SBram Moolenaar ], 'E129:') 2320a72cfb80SBram Moolenaar CheckScriptSuccess([ 2321a72cfb80SBram Moolenaar 'vim9script', 2322a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2323a72cfb80SBram Moolenaar ]) 2324a72cfb80SBram Moolenaar CheckScriptFailure([ 2325a72cfb80SBram Moolenaar 'vim9script', 2326a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2327a72cfb80SBram Moolenaar ], 'E488:') 2328a72cfb80SBram Moolenaar 2329a72cfb80SBram Moolenaar CheckScriptSuccess([ 2330a72cfb80SBram Moolenaar 'vim9script', 23314c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2332a72cfb80SBram Moolenaar 'endfunc', 23334c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2334a72cfb80SBram Moolenaar ]) 2335a72cfb80SBram Moolenaar CheckScriptFailure([ 2336a72cfb80SBram Moolenaar 'vim9script', 23374c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2338a72cfb80SBram Moolenaar 'endfunc', 23394c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2340a72cfb80SBram Moolenaar ], 'E488:') 2341a72cfb80SBram Moolenaar 2342a72cfb80SBram Moolenaar CheckScriptSuccess([ 2343a72cfb80SBram Moolenaar 'vim9script', 2344a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2345a72cfb80SBram Moolenaar ]) 2346a72cfb80SBram Moolenaar CheckScriptFailure([ 2347a72cfb80SBram Moolenaar 'vim9script', 2348a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2349a72cfb80SBram Moolenaar ], 'E488:') 2350e7e4838fSBram Moolenaar 2351e7e4838fSBram Moolenaar CheckScriptFailure([ 2352e7e4838fSBram Moolenaar 'def Test() " comment', 2353e7e4838fSBram Moolenaar 'enddef', 2354e7e4838fSBram Moolenaar ], 'E488:') 2355e7e4838fSBram Moolenaar CheckScriptFailure([ 2356e7e4838fSBram Moolenaar 'vim9script', 2357e7e4838fSBram Moolenaar 'def Test() " comment', 2358e7e4838fSBram Moolenaar 'enddef', 2359e7e4838fSBram Moolenaar ], 'E488:') 2360e7e4838fSBram Moolenaar 2361e7e4838fSBram Moolenaar CheckScriptSuccess([ 2362e7e4838fSBram Moolenaar 'func Test() " comment', 2363e7e4838fSBram Moolenaar 'endfunc', 2364e7e4838fSBram Moolenaar ]) 23659898107fSBram Moolenaar CheckScriptSuccess([ 2366e7e4838fSBram Moolenaar 'vim9script', 2367e7e4838fSBram Moolenaar 'func Test() " comment', 2368e7e4838fSBram Moolenaar 'endfunc', 23699898107fSBram Moolenaar ]) 2370e7e4838fSBram Moolenaar 2371e7e4838fSBram Moolenaar CheckScriptSuccess([ 2372e7e4838fSBram Moolenaar 'def Test() # comment', 2373e7e4838fSBram Moolenaar 'enddef', 2374e7e4838fSBram Moolenaar ]) 2375e7e4838fSBram Moolenaar CheckScriptFailure([ 2376e7e4838fSBram Moolenaar 'func Test() # comment', 2377e7e4838fSBram Moolenaar 'endfunc', 2378e7e4838fSBram Moolenaar ], 'E488:') 23792c5ed4e3SBram Moolenaarenddef 23802c5ed4e3SBram Moolenaar 23812c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 23822c5ed4e3SBram Moolenaar CheckCanRunGui 23832c5ed4e3SBram Moolenaar 23842c5ed4e3SBram Moolenaar CheckScriptFailure([ 23852c5ed4e3SBram Moolenaar 'vim9script', 23862c5ed4e3SBram Moolenaar 'gui#comment' 23872c5ed4e3SBram Moolenaar ], 'E499:') 23882c5ed4e3SBram Moolenaar CheckScriptFailure([ 23892c5ed4e3SBram Moolenaar 'vim9script', 23902c5ed4e3SBram Moolenaar 'gui -f#comment' 23912c5ed4e3SBram Moolenaar ], 'E499:') 23927a092245SBram Moolenaarenddef 23937a092245SBram Moolenaar 2394a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 23956797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 23966797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2397a26b9700SBram Moolenaar 2398a26b9700SBram Moolenaar edit test.vim 2399a26b9700SBram Moolenaar doautocmd TabEnter #comment 2400a26b9700SBram Moolenaar assert_equal(1, g:entered) 2401a26b9700SBram Moolenaar 2402a26b9700SBram Moolenaar doautocmd TabEnter f.x 2403a26b9700SBram Moolenaar assert_equal(2, g:entered) 2404a26b9700SBram Moolenaar 2405a26b9700SBram Moolenaar g:entered = 0 2406a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2407a26b9700SBram Moolenaar assert_equal(2, g:entered) 2408a26b9700SBram Moolenaar 2409a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2410a26b9700SBram Moolenaar 2411a26b9700SBram Moolenaar au! TabEnter 2412a26b9700SBram Moolenaar unlet g:entered 2413d72c1bf0SBram Moolenaar 2414d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2415d72c1bf0SBram Moolenaar 'vim9script', 24166797966dSBram Moolenaar 'g:var = 123', 2417e55b1c09SBram Moolenaar 'b:var = 456', 2418e55b1c09SBram Moolenaar 'w:var = 777', 2419e55b1c09SBram Moolenaar 't:var = 888', 2420d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2421d72c1bf0SBram Moolenaar ]) 2422d72c1bf0SBram Moolenaar 2423d72c1bf0SBram Moolenaar CheckScriptFailure([ 2424d72c1bf0SBram Moolenaar 'vim9script', 2425cfcd011fSBram Moolenaar 'let var = 123', 2426cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2427cfcd011fSBram Moolenaar 2428cfcd011fSBram Moolenaar CheckScriptFailure([ 2429cfcd011fSBram Moolenaar 'vim9script', 2430cfcd011fSBram Moolenaar 'var g:var = 123', 2431e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2432e55b1c09SBram Moolenaar 2433e55b1c09SBram Moolenaar CheckScriptFailure([ 2434e55b1c09SBram Moolenaar 'vim9script', 2435cfcd011fSBram Moolenaar 'var b:var = 123', 2436e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2437e55b1c09SBram Moolenaar 2438e55b1c09SBram Moolenaar CheckScriptFailure([ 2439e55b1c09SBram Moolenaar 'vim9script', 2440cfcd011fSBram Moolenaar 'var w:var = 123', 2441e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2442e55b1c09SBram Moolenaar 2443e55b1c09SBram Moolenaar CheckScriptFailure([ 2444e55b1c09SBram Moolenaar 'vim9script', 2445cfcd011fSBram Moolenaar 'var t:var = 123', 2446e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2447e55b1c09SBram Moolenaar 2448e55b1c09SBram Moolenaar CheckScriptFailure([ 2449e55b1c09SBram Moolenaar 'vim9script', 2450cfcd011fSBram Moolenaar 'var v:version = 123', 2451e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2452e55b1c09SBram Moolenaar 2453e55b1c09SBram Moolenaar CheckScriptFailure([ 2454e55b1c09SBram Moolenaar 'vim9script', 2455cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2456e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 24576797966dSBram Moolenaar 24586797966dSBram Moolenaar CheckScriptFailure([ 24596797966dSBram Moolenaar 'vim9script', 24606797966dSBram Moolenaar 'g:var = 123', 246132e35117SBram Moolenaar 'unlet g:var# comment1', 2462d72c1bf0SBram Moolenaar ], 'E108:') 2463d72c1bf0SBram Moolenaar 2464d72c1bf0SBram Moolenaar CheckScriptFailure([ 2465d72c1bf0SBram Moolenaar 'let g:var = 123', 2466d72c1bf0SBram Moolenaar 'unlet g:var # something', 2467d72c1bf0SBram Moolenaar ], 'E488:') 2468faac4104SBram Moolenaar 2469faac4104SBram Moolenaar CheckScriptSuccess([ 2470faac4104SBram Moolenaar 'vim9script', 247132e35117SBram Moolenaar 'if 1 # comment2', 2472faac4104SBram Moolenaar ' echo "yes"', 2473faac4104SBram Moolenaar 'elseif 2 #comment', 2474faac4104SBram Moolenaar ' echo "no"', 2475faac4104SBram Moolenaar 'endif', 2476faac4104SBram Moolenaar ]) 2477faac4104SBram Moolenaar 2478faac4104SBram Moolenaar CheckScriptFailure([ 2479faac4104SBram Moolenaar 'vim9script', 248032e35117SBram Moolenaar 'if 1# comment3', 2481faac4104SBram Moolenaar ' echo "yes"', 2482faac4104SBram Moolenaar 'endif', 2483faac4104SBram Moolenaar ], 'E15:') 2484faac4104SBram Moolenaar 2485faac4104SBram Moolenaar CheckScriptFailure([ 2486faac4104SBram Moolenaar 'vim9script', 248732e35117SBram Moolenaar 'if 0 # comment4', 2488faac4104SBram Moolenaar ' echo "yes"', 2489faac4104SBram Moolenaar 'elseif 2#comment', 2490faac4104SBram Moolenaar ' echo "no"', 2491faac4104SBram Moolenaar 'endif', 2492faac4104SBram Moolenaar ], 'E15:') 2493faac4104SBram Moolenaar 2494faac4104SBram Moolenaar CheckScriptSuccess([ 2495faac4104SBram Moolenaar 'vim9script', 2496cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2497faac4104SBram Moolenaar ]) 2498faac4104SBram Moolenaar 2499faac4104SBram Moolenaar CheckScriptFailure([ 2500faac4104SBram Moolenaar 'vim9script', 2501cfcd011fSBram Moolenaar 'var v = 1# comment6', 250232e35117SBram Moolenaar ], 'E15:') 2503faac4104SBram Moolenaar 2504faac4104SBram Moolenaar CheckScriptSuccess([ 2505faac4104SBram Moolenaar 'vim9script', 2506faac4104SBram Moolenaar 'new' 2507d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2508df069eecSBram Moolenaar ':$', 2509faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2510faac4104SBram Moolenaar 'bwipe!', 2511faac4104SBram Moolenaar ]) 2512faac4104SBram Moolenaar 2513f5be8cdbSBram Moolenaar CheckScriptFailure([ 2514f5be8cdbSBram Moolenaar 'vim9script', 2515f5be8cdbSBram Moolenaar 'new' 2516d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2517f5be8cdbSBram Moolenaar ':$', 2518f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2519f5be8cdbSBram Moolenaar 'bwipe!', 2520f5be8cdbSBram Moolenaar ], 'E488:') 2521f5be8cdbSBram Moolenaar 2522f5be8cdbSBram Moolenaar CheckScriptFailure([ 2523f5be8cdbSBram Moolenaar 'vim9script', 2524f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2525f5be8cdbSBram Moolenaar ], 'E477:') 2526a26b9700SBram Moolenaarenddef 2527a26b9700SBram Moolenaar 25287e5bd91dSBram Moolenaardef Test_finish() 2529cfcd011fSBram Moolenaar var lines =<< trim END 25307e5bd91dSBram Moolenaar vim9script 25316797966dSBram Moolenaar g:res = 'one' 25327e5bd91dSBram Moolenaar if v:false | finish | endif 25336797966dSBram Moolenaar g:res = 'two' 25347e5bd91dSBram Moolenaar finish 25356797966dSBram Moolenaar g:res = 'three' 25367e5bd91dSBram Moolenaar END 25377e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 25387e5bd91dSBram Moolenaar source Xfinished 25397e5bd91dSBram Moolenaar assert_equal('two', g:res) 25407e5bd91dSBram Moolenaar 25417e5bd91dSBram Moolenaar unlet g:res 25427e5bd91dSBram Moolenaar delete('Xfinished') 25437e5bd91dSBram Moolenaarenddef 25447e5bd91dSBram Moolenaar 2545a5d0077eSBram Moolenaardef Test_forward_declaration() 2546cfcd011fSBram Moolenaar var lines =<< trim END 2547a5d0077eSBram Moolenaar vim9script 2548a5d0077eSBram Moolenaar def GetValue(): string 2549a5d0077eSBram Moolenaar return theVal 2550a5d0077eSBram Moolenaar enddef 2551cfcd011fSBram Moolenaar var theVal = 'something' 2552822ba247SBram Moolenaar g:initVal = GetValue() 2553a5d0077eSBram Moolenaar theVal = 'else' 2554a5d0077eSBram Moolenaar g:laterVal = GetValue() 2555a5d0077eSBram Moolenaar END 2556a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2557a5d0077eSBram Moolenaar source Xforward 2558a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2559a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2560a5d0077eSBram Moolenaar 2561a5d0077eSBram Moolenaar unlet g:initVal 2562a5d0077eSBram Moolenaar unlet g:laterVal 2563a5d0077eSBram Moolenaar delete('Xforward') 2564a5d0077eSBram Moolenaarenddef 2565a5d0077eSBram Moolenaar 25669721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2567cfcd011fSBram Moolenaar var legacy_lines =<< trim END 25689721fb4eSBram Moolenaar source Xvim9_script.vim 25699721fb4eSBram Moolenaar 25709721fb4eSBram Moolenaar call assert_false(exists('local')) 25719721fb4eSBram Moolenaar call assert_false(exists('exported')) 25729721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 25739721fb4eSBram Moolenaar call assert_equal('global', global) 25749721fb4eSBram Moolenaar call assert_equal('global', g:global) 25759721fb4eSBram Moolenaar 25769721fb4eSBram Moolenaar " imported variable becomes script-local 25779721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 25789721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 25799721fb4eSBram Moolenaar call assert_false(exists('exported')) 25809721fb4eSBram Moolenaar 25819721fb4eSBram Moolenaar " imported function becomes script-local 25829721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 25839721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 25849721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 25859721fb4eSBram Moolenaar END 25869721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 25879721fb4eSBram Moolenaar 2588cfcd011fSBram Moolenaar var vim9_lines =<< trim END 25899721fb4eSBram Moolenaar vim9script 2590cfcd011fSBram Moolenaar var local = 'local' 25919721fb4eSBram Moolenaar g:global = 'global' 2592cfcd011fSBram Moolenaar export var exported = 'exported' 25939721fb4eSBram Moolenaar export def GetText(): string 25949721fb4eSBram Moolenaar return 'text' 25959721fb4eSBram Moolenaar enddef 25969721fb4eSBram Moolenaar END 25979721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 25989721fb4eSBram Moolenaar 25999721fb4eSBram Moolenaar source Xlegacy_script.vim 26009721fb4eSBram Moolenaar 26019721fb4eSBram Moolenaar assert_equal('global', g:global) 2602f5be8cdbSBram Moolenaar unlet g:global 26039721fb4eSBram Moolenaar 26049721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 26059721fb4eSBram Moolenaar delete('Xvim9_script.vim') 26069721fb4eSBram Moolenaarenddef 2607a5d0077eSBram Moolenaar 26087d699701SBram Moolenaarfunc Test_vim9script_not_global() 26097d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 26107d699701SBram Moolenaar let vim9lines =<< trim END 26117d699701SBram Moolenaar vim9script 2612cfcd011fSBram Moolenaar var name = 'local' 26137d699701SBram Moolenaar func TheFunc() 26147d699701SBram Moolenaar echo 'local' 26157d699701SBram Moolenaar endfunc 26167d699701SBram Moolenaar def DefFunc() 26177d699701SBram Moolenaar echo 'local' 26187d699701SBram Moolenaar enddef 26197d699701SBram Moolenaar END 26207d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 26217d699701SBram Moolenaar source Xvim9script.vim 26227d699701SBram Moolenaar try 26237d699701SBram Moolenaar echo g:var 26247d699701SBram Moolenaar assert_report('did not fail') 26257d699701SBram Moolenaar catch /E121:/ 26267d699701SBram Moolenaar " caught 26277d699701SBram Moolenaar endtry 26287d699701SBram Moolenaar try 26297d699701SBram Moolenaar call TheFunc() 26307d699701SBram Moolenaar assert_report('did not fail') 26317d699701SBram Moolenaar catch /E117:/ 26327d699701SBram Moolenaar " caught 26337d699701SBram Moolenaar endtry 26347d699701SBram Moolenaar try 26357d699701SBram Moolenaar call DefFunc() 26367d699701SBram Moolenaar assert_report('did not fail') 26377d699701SBram Moolenaar catch /E117:/ 26387d699701SBram Moolenaar " caught 26397d699701SBram Moolenaar endtry 26407d699701SBram Moolenaar 264125859dd7SBram Moolenaar call delete('Xvim9script.vim') 26427d699701SBram Moolenaarendfunc 26437d699701SBram Moolenaar 2644eeb27bfeSBram Moolenaardef Test_vim9_copen() 2645eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2646eeb27bfeSBram Moolenaar copen 2647eeb27bfeSBram Moolenaar quit 2648eeb27bfeSBram Moolenaarenddef 2649eeb27bfeSBram Moolenaar 26502d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 26512d6b20d6SBram Moolenaardef Test_vim9_autoload() 2652cfcd011fSBram Moolenaar var lines =<< trim END 26532d6b20d6SBram Moolenaar vim9script 26542d6b20d6SBram Moolenaar def foo#test() 26552d6b20d6SBram Moolenaar echomsg getreg('"') 26562d6b20d6SBram Moolenaar enddef 26572d6b20d6SBram Moolenaar END 26582d6b20d6SBram Moolenaar 26592d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 26602d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2661cfcd011fSBram Moolenaar var save_rtp = &rtp 26622d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 26632d6b20d6SBram Moolenaar augroup test 26642d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 26652d6b20d6SBram Moolenaar augroup END 26662d6b20d6SBram Moolenaar 26672d6b20d6SBram Moolenaar normal Y 26682d6b20d6SBram Moolenaar 26692d6b20d6SBram Moolenaar augroup test 26702d6b20d6SBram Moolenaar autocmd! 26712d6b20d6SBram Moolenaar augroup END 26722d6b20d6SBram Moolenaar delete('Xdir', 'rf') 26732d6b20d6SBram Moolenaar &rtp = save_rtp 26742d6b20d6SBram Moolenaarenddef 26752d6b20d6SBram Moolenaar 267677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 267777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2678cfcd011fSBram Moolenaar var lines =<< trim END 267977e5dcc3SBram Moolenaar vim9script 268077e5dcc3SBram Moolenaar def crash#func() 268177e5dcc3SBram Moolenaar try 268277e5dcc3SBram Moolenaar for x in List() 268377e5dcc3SBram Moolenaar endfor 268477e5dcc3SBram Moolenaar catch 268577e5dcc3SBram Moolenaar endtry 268677e5dcc3SBram Moolenaar g:ok = true 268777e5dcc3SBram Moolenaar enddef 268877e5dcc3SBram Moolenaar fu List() 268977e5dcc3SBram Moolenaar invalid 269077e5dcc3SBram Moolenaar endfu 269177e5dcc3SBram Moolenaar try 269277e5dcc3SBram Moolenaar invalid 269377e5dcc3SBram Moolenaar catch /wontmatch/ 269477e5dcc3SBram Moolenaar endtry 269577e5dcc3SBram Moolenaar END 269677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 269777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 269877e5dcc3SBram Moolenaar 269977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 270077e5dcc3SBram Moolenaar lines =<< trim END 270177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 270277e5dcc3SBram Moolenaar call crash#func() 270377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 27049c4f5520SBram Moolenaar qall! 270577e5dcc3SBram Moolenaar END 270677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 270777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 270877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 270977e5dcc3SBram Moolenaar 271077e5dcc3SBram Moolenaar delete('Xdidit') 271177e5dcc3SBram Moolenaar delete('Xscript') 271277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 271377e5dcc3SBram Moolenaarenddef 271477e5dcc3SBram Moolenaar 271581e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 271681e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 271781e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2718cfcd011fSBram Moolenaar var lines =<< trim END 271981e17fbeSBram Moolenaar let s:counter = 1 272081e17fbeSBram Moolenaar def s:Func() 272181e17fbeSBram Moolenaar au! CursorHold 272281e17fbeSBram Moolenaar au CursorHold * s:counter += 1 272381e17fbeSBram Moolenaar enddef 272481e17fbeSBram Moolenaar call s:Func() 272581e17fbeSBram Moolenaar doau CursorHold 272681e17fbeSBram Moolenaar call assert_equal(2, s:counter) 272781e17fbeSBram Moolenaar au! CursorHold 272881e17fbeSBram Moolenaar END 272981e17fbeSBram Moolenaar CheckScriptSuccess(lines) 273081e17fbeSBram Moolenaarenddef 273181e17fbeSBram Moolenaar 27323896a105SBram Moolenaardef Test_cmdline_win() 27333896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 27343896a105SBram Moolenaar # the command line window. 27353896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2736cfcd011fSBram Moolenaar var export_lines =<< trim END 27373896a105SBram Moolenaar vim9script 2738cfcd011fSBram Moolenaar export var That = 'yes' 27393896a105SBram Moolenaar END 27403896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2741cfcd011fSBram Moolenaar var import_lines =<< trim END 27423896a105SBram Moolenaar vim9script 27433896a105SBram Moolenaar import That from './Xexport.vim' 27443896a105SBram Moolenaar END 27453896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2746cfcd011fSBram Moolenaar var save_rtp = &rtp 27473896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 27483896a105SBram Moolenaar syntax on 27493896a105SBram Moolenaar augroup CmdWin 27503896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 27513896a105SBram Moolenaar augroup END 27523896a105SBram Moolenaar # this will open and also close the cmdline window 27533896a105SBram Moolenaar feedkeys('q:', 'xt') 27543896a105SBram Moolenaar assert_equal('yes', g:got_there) 27553896a105SBram Moolenaar 27563896a105SBram Moolenaar augroup CmdWin 27573896a105SBram Moolenaar au! 27583896a105SBram Moolenaar augroup END 27593896a105SBram Moolenaar &rtp = save_rtp 27603896a105SBram Moolenaar delete('rtp', 'rf') 27613896a105SBram Moolenaarenddef 27623896a105SBram Moolenaar 2763e3d4685fSBram Moolenaardef Test_invalid_sid() 2764e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 276525859dd7SBram Moolenaar 27669c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2767d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2768e3d4685fSBram Moolenaar endif 2769e3d4685fSBram Moolenaar delete('Xdidit') 2770e3d4685fSBram Moolenaarenddef 2771e3d4685fSBram Moolenaar 2772f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2773cfcd011fSBram Moolenaar var lines =<< trim END 2774cfcd011fSBram Moolenaar var name: any 2775cfcd011fSBram Moolenaar assert_equal(0, name) 2776f0afd9e1SBram Moolenaar END 2777f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2778f0afd9e1SBram Moolenaarenddef 2779f0afd9e1SBram Moolenaar 27807e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 278158dbef33SBram Moolenaar CheckRunVimInTerminal 278258dbef33SBram Moolenaar 27837e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 27847e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 27857e9210eaSBram Moolenaarendfunc 27867e9210eaSBram Moolenaar 27877e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 27889c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 2789cfcd011fSBram Moolenaar var lines =<< trim END 27909c4f5520SBram Moolenaar func CheckAndQuit() 27919c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 27929c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 27939c4f5520SBram Moolenaar endfunc 27949c4f5520SBram Moolenaar END 27959c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 27969c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 2797cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) 27989c4f5520SBram Moolenaar # define Afunc() on the command line 27999c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 28009c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 28019c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 28029c4f5520SBram Moolenaar 28039c4f5520SBram Moolenaar call StopVimInTerminal(buf) 28049c4f5520SBram Moolenaar delete('XcallFunc') 28059c4f5520SBram Moolenaar delete('Xdidcmd') 28069c4f5520SBram Moolenaarenddef 28079c4f5520SBram Moolenaar 2808fcdc5d83SBram Moolenaardef Test_script_var_scope() 2809fcdc5d83SBram Moolenaar var lines =<< trim END 2810fcdc5d83SBram Moolenaar vim9script 2811fcdc5d83SBram Moolenaar if true 2812fcdc5d83SBram Moolenaar if true 2813fcdc5d83SBram Moolenaar var one = 'one' 2814fcdc5d83SBram Moolenaar echo one 2815fcdc5d83SBram Moolenaar endif 2816fcdc5d83SBram Moolenaar echo one 2817fcdc5d83SBram Moolenaar endif 2818fcdc5d83SBram Moolenaar END 2819fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2820fcdc5d83SBram Moolenaar 2821fcdc5d83SBram Moolenaar lines =<< trim END 2822fcdc5d83SBram Moolenaar vim9script 2823fcdc5d83SBram Moolenaar if true 2824fcdc5d83SBram Moolenaar if false 2825fcdc5d83SBram Moolenaar var one = 'one' 2826fcdc5d83SBram Moolenaar echo one 2827fcdc5d83SBram Moolenaar else 2828fcdc5d83SBram Moolenaar var one = 'one' 2829fcdc5d83SBram Moolenaar echo one 2830fcdc5d83SBram Moolenaar endif 2831fcdc5d83SBram Moolenaar echo one 2832fcdc5d83SBram Moolenaar endif 2833fcdc5d83SBram Moolenaar END 2834fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 2835fcdc5d83SBram Moolenaar 2836fcdc5d83SBram Moolenaar lines =<< trim END 2837fcdc5d83SBram Moolenaar vim9script 2838fcdc5d83SBram Moolenaar while true 2839fcdc5d83SBram Moolenaar var one = 'one' 2840fcdc5d83SBram Moolenaar echo one 2841fcdc5d83SBram Moolenaar break 2842fcdc5d83SBram Moolenaar endwhile 2843fcdc5d83SBram Moolenaar echo one 2844fcdc5d83SBram Moolenaar END 2845fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2846fcdc5d83SBram Moolenaar 2847fcdc5d83SBram Moolenaar lines =<< trim END 2848fcdc5d83SBram Moolenaar vim9script 2849fcdc5d83SBram Moolenaar for i in range(1) 2850fcdc5d83SBram Moolenaar var one = 'one' 2851fcdc5d83SBram Moolenaar echo one 2852fcdc5d83SBram Moolenaar endfor 2853fcdc5d83SBram Moolenaar echo one 2854fcdc5d83SBram Moolenaar END 2855fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 28569becdf2bSBram Moolenaar 28579becdf2bSBram Moolenaar lines =<< trim END 28589becdf2bSBram Moolenaar vim9script 28599becdf2bSBram Moolenaar { 28609becdf2bSBram Moolenaar var one = 'one' 28619becdf2bSBram Moolenaar assert_equal('one', one) 28629becdf2bSBram Moolenaar } 28639becdf2bSBram Moolenaar assert_false(exists('one')) 28649becdf2bSBram Moolenaar assert_false(exists('s:one')) 28659becdf2bSBram Moolenaar END 28669becdf2bSBram Moolenaar CheckScriptSuccess(lines) 28679becdf2bSBram Moolenaar 28689becdf2bSBram Moolenaar lines =<< trim END 28699becdf2bSBram Moolenaar vim9script 28709becdf2bSBram Moolenaar { 28719becdf2bSBram Moolenaar var one = 'one' 28729becdf2bSBram Moolenaar echo one 28739becdf2bSBram Moolenaar } 28749becdf2bSBram Moolenaar echo one 28759becdf2bSBram Moolenaar END 28769becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 2877fcdc5d83SBram Moolenaarenddef 2878fcdc5d83SBram Moolenaar 2879352134bbSBram Moolenaardef Test_catch_exception_in_callback() 2880352134bbSBram Moolenaar var lines =<< trim END 2881352134bbSBram Moolenaar vim9script 2882352134bbSBram Moolenaar def Callback(...l: any) 2883352134bbSBram Moolenaar try 2884352134bbSBram Moolenaar var x: string 2885352134bbSBram Moolenaar var y: string 2886352134bbSBram Moolenaar # this error should be caught with CHECKLEN 2887352134bbSBram Moolenaar [x, y] = [''] 2888352134bbSBram Moolenaar catch 2889352134bbSBram Moolenaar g:caught = 'yes' 2890352134bbSBram Moolenaar endtry 2891352134bbSBram Moolenaar enddef 2892352134bbSBram Moolenaar popup_menu('popup', #{callback: Callback}) 2893352134bbSBram Moolenaar feedkeys("\r", 'xt') 2894352134bbSBram Moolenaar END 2895352134bbSBram Moolenaar CheckScriptSuccess(lines) 2896352134bbSBram Moolenaar 2897352134bbSBram Moolenaar unlet g:caught 2898352134bbSBram Moolenaarenddef 2899352134bbSBram Moolenaar 2900631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 2901631e8f93SBram Moolenaar if !has('unix') || !has('job') 2902631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 2903631e8f93SBram Moolenaar endif 2904631e8f93SBram Moolenaar var lines =<< trim END 2905631e8f93SBram Moolenaar vim9script 2906631e8f93SBram Moolenaar var source: list<number> 2907631e8f93SBram Moolenaar def Out_cb(...l: any) 2908631e8f93SBram Moolenaar eval [][0] 2909631e8f93SBram Moolenaar enddef 2910631e8f93SBram Moolenaar def Exit_cb(...l: any) 2911631e8f93SBram Moolenaar sleep 1m 2912631e8f93SBram Moolenaar source += l 2913631e8f93SBram Moolenaar enddef 2914631e8f93SBram Moolenaar var myjob = job_start('echo burp', #{out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 2915631e8f93SBram Moolenaar sleep 100m 2916631e8f93SBram Moolenaar END 2917631e8f93SBram Moolenaar writefile(lines, 'Xdef') 2918631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 2919631e8f93SBram Moolenaar delete('Xdef') 2920631e8f93SBram Moolenaarenddef 2921631e8f93SBram Moolenaar 2922b4bcea47SBram Moolenaardef Test_put_with_linebreak() 2923b4bcea47SBram Moolenaar new 2924b4bcea47SBram Moolenaar var lines =<< trim END 2925b4bcea47SBram Moolenaar vim9script 2926b4bcea47SBram Moolenaar pu=split('abc', '\zs') 2927b4bcea47SBram Moolenaar ->join() 2928b4bcea47SBram Moolenaar END 2929b4bcea47SBram Moolenaar CheckScriptSuccess(lines) 2930b4bcea47SBram Moolenaar getline(2)->assert_equal('a b c') 2931b4bcea47SBram Moolenaar bwipe! 2932b4bcea47SBram Moolenaarenddef 2933b4bcea47SBram Moolenaar 2934585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2935585fea7bSBram Moolenaardef Test_substitute_cmd() 2936585fea7bSBram Moolenaar new 2937585fea7bSBram Moolenaar setline(1, 'something') 2938585fea7bSBram Moolenaar :substitute(some(other( 2939585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2940585fea7bSBram Moolenaar bwipe! 2941585fea7bSBram Moolenaar 2942f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2943cfcd011fSBram Moolenaar var lines =<< trim END 2944585fea7bSBram Moolenaar vim9script 2945585fea7bSBram Moolenaar new 2946585fea7bSBram Moolenaar setline(1, 'something') 2947585fea7bSBram Moolenaar :substitute(some(other( 2948585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2949585fea7bSBram Moolenaar bwipe! 2950585fea7bSBram Moolenaar END 2951585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2952585fea7bSBram Moolenaar source Xvim9lines 2953585fea7bSBram Moolenaar 2954585fea7bSBram Moolenaar delete('Xvim9lines') 2955585fea7bSBram Moolenaarenddef 2956585fea7bSBram Moolenaar 29578a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2958