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 253d032f34aSBram Moolenaarfunc g:NoSuchFunc() 254d032f34aSBram Moolenaar echo 'none' 255d032f34aSBram Moolenaarendfunc 256d032f34aSBram Moolenaar 2578a7d6542SBram Moolenaardef Test_try_catch() 258cfcd011fSBram Moolenaar var l = [] 2597a092245SBram Moolenaar try # comment 2608a7d6542SBram Moolenaar add(l, '1') 2618a7d6542SBram Moolenaar throw 'wrong' 2628a7d6542SBram Moolenaar add(l, '2') 2637a092245SBram Moolenaar catch # comment 2648a7d6542SBram Moolenaar add(l, v:exception) 2657a092245SBram Moolenaar finally # comment 2668a7d6542SBram Moolenaar add(l, '3') 2677a092245SBram Moolenaar endtry # comment 2688a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 26968d130c6SBram Moolenaar 270e859312eSBram Moolenaar l = [] 271e859312eSBram Moolenaar try 272e859312eSBram Moolenaar try 273e859312eSBram Moolenaar add(l, '1') 274e859312eSBram Moolenaar throw 'wrong' 275e859312eSBram Moolenaar add(l, '2') 276e859312eSBram Moolenaar catch /right/ 277e859312eSBram Moolenaar add(l, v:exception) 278e859312eSBram Moolenaar endtry 279e859312eSBram Moolenaar catch /wrong/ 280e859312eSBram Moolenaar add(l, 'caught') 281373863edSBram Moolenaar fina 282e859312eSBram Moolenaar add(l, 'finally') 283e859312eSBram Moolenaar endtry 284e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 285e859312eSBram Moolenaar 286cfcd011fSBram Moolenaar var n: number 28768d130c6SBram Moolenaar try 28868d130c6SBram Moolenaar n = l[3] 28968d130c6SBram Moolenaar catch /E684:/ 29068d130c6SBram Moolenaar n = 99 29168d130c6SBram Moolenaar endtry 29268d130c6SBram Moolenaar assert_equal(99, n) 29368d130c6SBram Moolenaar 29468d130c6SBram Moolenaar try 295cc673e74SBram Moolenaar # string slice returns a string, not a number 29668d130c6SBram Moolenaar n = g:astring[3] 2975e654230SBram Moolenaar catch /E1012:/ 29868d130c6SBram Moolenaar n = 77 29968d130c6SBram Moolenaar endtry 30068d130c6SBram Moolenaar assert_equal(77, n) 30168d130c6SBram Moolenaar 30268d130c6SBram Moolenaar try 30368d130c6SBram Moolenaar n = l[g:astring] 3045e654230SBram Moolenaar catch /E1012:/ 30556acb094SBram Moolenaar n = 88 30668d130c6SBram Moolenaar endtry 30756acb094SBram Moolenaar assert_equal(88, n) 30868d130c6SBram Moolenaar 30968d130c6SBram Moolenaar try 31068d130c6SBram Moolenaar n = s:does_not_exist 31168d130c6SBram Moolenaar catch /E121:/ 312f0b9f43cSBram Moolenaar n = 111 313f0b9f43cSBram Moolenaar endtry 314f0b9f43cSBram Moolenaar assert_equal(111, n) 315f0b9f43cSBram Moolenaar 316f0b9f43cSBram Moolenaar try 317f0b9f43cSBram Moolenaar n = g:does_not_exist 318f0b9f43cSBram Moolenaar catch /E121:/ 31968d130c6SBram Moolenaar n = 121 32068d130c6SBram Moolenaar endtry 32168d130c6SBram Moolenaar assert_equal(121, n) 32268d130c6SBram Moolenaar 323cfcd011fSBram Moolenaar var d = #{one: 1} 32468d130c6SBram Moolenaar try 32568d130c6SBram Moolenaar n = d[g:astring] 32668d130c6SBram Moolenaar catch /E716:/ 32768d130c6SBram Moolenaar n = 222 32868d130c6SBram Moolenaar endtry 32968d130c6SBram Moolenaar assert_equal(222, n) 330f0b9f43cSBram Moolenaar 331f0b9f43cSBram Moolenaar try 332f0b9f43cSBram Moolenaar n = -g:astring 333f0b9f43cSBram Moolenaar catch /E39:/ 334f0b9f43cSBram Moolenaar n = 233 335f0b9f43cSBram Moolenaar endtry 336f0b9f43cSBram Moolenaar assert_equal(233, n) 337f0b9f43cSBram Moolenaar 338f0b9f43cSBram Moolenaar try 339f0b9f43cSBram Moolenaar n = +g:astring 340f0b9f43cSBram Moolenaar catch /E1030:/ 341f0b9f43cSBram Moolenaar n = 244 342f0b9f43cSBram Moolenaar endtry 343f0b9f43cSBram Moolenaar assert_equal(244, n) 344f0b9f43cSBram Moolenaar 345f0b9f43cSBram Moolenaar try 346f0b9f43cSBram Moolenaar n = +g:alist 347f0b9f43cSBram Moolenaar catch /E745:/ 348f0b9f43cSBram Moolenaar n = 255 349f0b9f43cSBram Moolenaar endtry 350f0b9f43cSBram Moolenaar assert_equal(255, n) 351f0b9f43cSBram Moolenaar 352cfcd011fSBram Moolenaar var nd: dict<any> 353f0b9f43cSBram Moolenaar try 354f0b9f43cSBram Moolenaar nd = {g:anumber: 1} 3555e654230SBram Moolenaar catch /E1012:/ 356f0b9f43cSBram Moolenaar n = 266 357f0b9f43cSBram Moolenaar endtry 358f0b9f43cSBram Moolenaar assert_equal(266, n) 359f0b9f43cSBram Moolenaar 360f0b9f43cSBram Moolenaar try 361f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 362f0b9f43cSBram Moolenaar catch /E1093:/ 363f0b9f43cSBram Moolenaar n = 277 364f0b9f43cSBram Moolenaar endtry 365f0b9f43cSBram Moolenaar assert_equal(277, n) 366f0b9f43cSBram Moolenaar 367e859312eSBram Moolenaar try 368e859312eSBram Moolenaar &ts = g:astring 3695e654230SBram Moolenaar catch /E1012:/ 370e859312eSBram Moolenaar n = 288 371e859312eSBram Moolenaar endtry 372e859312eSBram Moolenaar assert_equal(288, n) 373e859312eSBram Moolenaar 374e859312eSBram Moolenaar try 375e859312eSBram Moolenaar &backspace = 'asdf' 376e859312eSBram Moolenaar catch /E474:/ 377e859312eSBram Moolenaar n = 299 378e859312eSBram Moolenaar endtry 379e859312eSBram Moolenaar assert_equal(299, n) 380e859312eSBram Moolenaar 381e859312eSBram Moolenaar l = [1] 382e859312eSBram Moolenaar try 383e859312eSBram Moolenaar l[3] = 3 384e859312eSBram Moolenaar catch /E684:/ 385e859312eSBram Moolenaar n = 300 386e859312eSBram Moolenaar endtry 387e859312eSBram Moolenaar assert_equal(300, n) 388e859312eSBram Moolenaar 389e859312eSBram Moolenaar try 390e859312eSBram Moolenaar unlet g:does_not_exist 391e859312eSBram Moolenaar catch /E108:/ 392e859312eSBram Moolenaar n = 322 393e859312eSBram Moolenaar endtry 394e859312eSBram Moolenaar assert_equal(322, n) 395e859312eSBram Moolenaar 396e859312eSBram Moolenaar try 397e859312eSBram Moolenaar d = {'text': 1, g:astring: 2} 398e859312eSBram Moolenaar catch /E721:/ 399e859312eSBram Moolenaar n = 333 400e859312eSBram Moolenaar endtry 401e859312eSBram Moolenaar assert_equal(333, n) 402e859312eSBram Moolenaar 403e859312eSBram Moolenaar try 404e859312eSBram Moolenaar l = DeletedFunc() 405e859312eSBram Moolenaar catch /E933:/ 406e859312eSBram Moolenaar n = 344 407e859312eSBram Moolenaar endtry 408e859312eSBram Moolenaar assert_equal(344, n) 409d032f34aSBram Moolenaar 410d032f34aSBram Moolenaar try 411d032f34aSBram Moolenaar echo len(v:true) 412d032f34aSBram Moolenaar catch /E701:/ 413d032f34aSBram Moolenaar n = 355 414d032f34aSBram Moolenaar endtry 415d032f34aSBram Moolenaar assert_equal(355, n) 416d032f34aSBram Moolenaar 417cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 418d032f34aSBram Moolenaar delfunc g:NoSuchFunc 419d032f34aSBram Moolenaar try 420d032f34aSBram Moolenaar echo P() 421d032f34aSBram Moolenaar catch /E117:/ 422d032f34aSBram Moolenaar n = 366 423d032f34aSBram Moolenaar endtry 424d032f34aSBram Moolenaar assert_equal(366, n) 425d032f34aSBram Moolenaar 426d032f34aSBram Moolenaar try 427d032f34aSBram Moolenaar echo g:NoSuchFunc() 428d032f34aSBram Moolenaar catch /E117:/ 429d032f34aSBram Moolenaar n = 377 430d032f34aSBram Moolenaar endtry 431d032f34aSBram Moolenaar assert_equal(377, n) 432d032f34aSBram Moolenaar 433d032f34aSBram Moolenaar try 434d032f34aSBram Moolenaar echo g:alist + 4 435d032f34aSBram Moolenaar catch /E745:/ 436d032f34aSBram Moolenaar n = 388 437d032f34aSBram Moolenaar endtry 438d032f34aSBram Moolenaar assert_equal(388, n) 439d032f34aSBram Moolenaar 440d032f34aSBram Moolenaar try 441d032f34aSBram Moolenaar echo 4 + g:alist 442d032f34aSBram Moolenaar catch /E745:/ 443d032f34aSBram Moolenaar n = 399 444d032f34aSBram Moolenaar endtry 445d032f34aSBram Moolenaar assert_equal(399, n) 446d032f34aSBram Moolenaar 447d032f34aSBram Moolenaar try 448d032f34aSBram Moolenaar echo g:alist.member 449d032f34aSBram Moolenaar catch /E715:/ 450d032f34aSBram Moolenaar n = 400 451d032f34aSBram Moolenaar endtry 452d032f34aSBram Moolenaar assert_equal(400, n) 453d032f34aSBram Moolenaar 454d032f34aSBram Moolenaar try 455d032f34aSBram Moolenaar echo d.member 456d032f34aSBram Moolenaar catch /E716:/ 457d032f34aSBram Moolenaar n = 411 458d032f34aSBram Moolenaar endtry 459d032f34aSBram Moolenaar assert_equal(411, n) 4608a7d6542SBram Moolenaarenddef 4618a7d6542SBram Moolenaar 462e859312eSBram Moolenaardef DeletedFunc(): list<any> 463e859312eSBram Moolenaar return ['delete me'] 464e859312eSBram Moolenaarenddef 465e859312eSBram Moolenaardefcompile 466e859312eSBram Moolenaardelfunc DeletedFunc 467e859312eSBram Moolenaar 468257cc5eeSBram Moolenaardef ThrowFromDef() 469a72cfb80SBram Moolenaar throw "getout" # comment 470257cc5eeSBram Moolenaarenddef 471257cc5eeSBram Moolenaar 472257cc5eeSBram Moolenaarfunc CatchInFunc() 473257cc5eeSBram Moolenaar try 474257cc5eeSBram Moolenaar call ThrowFromDef() 475257cc5eeSBram Moolenaar catch 476257cc5eeSBram Moolenaar let g:thrown_func = v:exception 477257cc5eeSBram Moolenaar endtry 478257cc5eeSBram Moolenaarendfunc 479257cc5eeSBram Moolenaar 480257cc5eeSBram Moolenaardef CatchInDef() 481257cc5eeSBram Moolenaar try 482257cc5eeSBram Moolenaar ThrowFromDef() 483257cc5eeSBram Moolenaar catch 484257cc5eeSBram Moolenaar g:thrown_def = v:exception 485257cc5eeSBram Moolenaar endtry 486257cc5eeSBram Moolenaarenddef 487257cc5eeSBram Moolenaar 488f575adffSBram Moolenaardef ReturnFinally(): string 489f575adffSBram Moolenaar try 490f575adffSBram Moolenaar return 'intry' 491373863edSBram Moolenaar finall 492f575adffSBram Moolenaar g:in_finally = 'finally' 493f575adffSBram Moolenaar endtry 494f575adffSBram Moolenaar return 'end' 495f575adffSBram Moolenaarenddef 496f575adffSBram Moolenaar 497257cc5eeSBram Moolenaardef Test_try_catch_nested() 498257cc5eeSBram Moolenaar CatchInFunc() 499257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 500257cc5eeSBram Moolenaar 501257cc5eeSBram Moolenaar CatchInDef() 502257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 503f575adffSBram Moolenaar 504f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 505f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 506f575adffSBram Moolenaarenddef 507f575adffSBram Moolenaar 5089939f57bSBram Moolenaardef TryOne(): number 5099939f57bSBram Moolenaar try 5109939f57bSBram Moolenaar return 0 5119939f57bSBram Moolenaar catch 5129939f57bSBram Moolenaar endtry 5139939f57bSBram Moolenaar return 0 5149939f57bSBram Moolenaarenddef 5159939f57bSBram Moolenaar 5169939f57bSBram Moolenaardef TryTwo(n: number): string 5179939f57bSBram Moolenaar try 518cfcd011fSBram Moolenaar var x = {} 5199939f57bSBram Moolenaar catch 5209939f57bSBram Moolenaar endtry 5219939f57bSBram Moolenaar return 'text' 5229939f57bSBram Moolenaarenddef 5239939f57bSBram Moolenaar 5249939f57bSBram Moolenaardef Test_try_catch_twice() 5259939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5269939f57bSBram Moolenaarenddef 5279939f57bSBram Moolenaar 528f575adffSBram Moolenaardef Test_try_catch_match() 529cfcd011fSBram Moolenaar var seq = 'a' 530f575adffSBram Moolenaar try 531f575adffSBram Moolenaar throw 'something' 532f575adffSBram Moolenaar catch /nothing/ 533f575adffSBram Moolenaar seq ..= 'x' 534f575adffSBram Moolenaar catch /some/ 535f575adffSBram Moolenaar seq ..= 'b' 536f575adffSBram Moolenaar catch /asdf/ 537f575adffSBram Moolenaar seq ..= 'x' 538e8c4abbbSBram Moolenaar catch ?a\?sdf? 539e8c4abbbSBram Moolenaar seq ..= 'y' 540f575adffSBram Moolenaar finally 541f575adffSBram Moolenaar seq ..= 'c' 542f575adffSBram Moolenaar endtry 543f575adffSBram Moolenaar assert_equal('abc', seq) 544257cc5eeSBram Moolenaarenddef 545257cc5eeSBram Moolenaar 546e8c4abbbSBram Moolenaardef Test_try_catch_fails() 547d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 548d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 549d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 550d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 551d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 552d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 553d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 554d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 55513106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 556d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 557585fea7bSBram Moolenaar 558d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 559d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 560e8c4abbbSBram Moolenaarenddef 561e8c4abbbSBram Moolenaar 562006ad48bSBram Moolenaardef Test_throw_vimscript() 563f5be8cdbSBram Moolenaar # only checks line continuation 564cfcd011fSBram Moolenaar var lines =<< trim END 565006ad48bSBram Moolenaar vim9script 566006ad48bSBram Moolenaar try 567006ad48bSBram Moolenaar throw 'one' 568006ad48bSBram Moolenaar .. 'two' 569006ad48bSBram Moolenaar catch 570006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 571006ad48bSBram Moolenaar endtry 572006ad48bSBram Moolenaar END 573006ad48bSBram Moolenaar CheckScriptSuccess(lines) 574006ad48bSBram Moolenaarenddef 575006ad48bSBram Moolenaar 576ed677f55SBram Moolenaardef Test_error_in_nested_function() 577ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 578cfcd011fSBram Moolenaar var lines =<< trim END 579ed677f55SBram Moolenaar vim9script 580ed677f55SBram Moolenaar def Func() 581ed677f55SBram Moolenaar Error() 582ed677f55SBram Moolenaar g:test_var = 1 583ed677f55SBram Moolenaar enddef 584ed677f55SBram Moolenaar func Error() abort 585ed677f55SBram Moolenaar eval [][0] 586ed677f55SBram Moolenaar endfunc 587ed677f55SBram Moolenaar Func() 588ed677f55SBram Moolenaar END 589ed677f55SBram Moolenaar g:test_var = 0 590ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 591ed677f55SBram Moolenaar assert_equal(0, g:test_var) 592ed677f55SBram Moolenaarenddef 593ed677f55SBram Moolenaar 59437c83711SBram Moolenaardef Test_cexpr_vimscript() 595f5be8cdbSBram Moolenaar # only checks line continuation 59637c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 597cfcd011fSBram Moolenaar var lines =<< trim END 59837c83711SBram Moolenaar vim9script 59937c83711SBram Moolenaar cexpr 'File' 60037c83711SBram Moolenaar .. ' someFile' .. 60137c83711SBram Moolenaar ' line 19' 60237c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 60337c83711SBram Moolenaar END 60437c83711SBram Moolenaar CheckScriptSuccess(lines) 60537c83711SBram Moolenaar set errorformat& 60637c83711SBram Moolenaarenddef 60737c83711SBram Moolenaar 608c9edd6b5SBram Moolenaardef Test_statusline_syntax() 609c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 610cfcd011fSBram Moolenaar var lines =<< trim END 611c9edd6b5SBram Moolenaar vim9script 612c9edd6b5SBram Moolenaar func g:Status() 613c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 614c9edd6b5SBram Moolenaar endfunc 615c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 616c9edd6b5SBram Moolenaar redrawstatus 617c9edd6b5SBram Moolenaar set laststatus statusline= 618c9edd6b5SBram Moolenaar END 619c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 620c9edd6b5SBram Moolenaarenddef 621c9edd6b5SBram Moolenaar 622b209750bSBram Moolenaardef Test_list_vimscript() 623b209750bSBram Moolenaar # checks line continuation and comments 624cfcd011fSBram Moolenaar var lines =<< trim END 625b209750bSBram Moolenaar vim9script 626cfcd011fSBram Moolenaar var mylist = [ 627b209750bSBram Moolenaar 'one', 628b209750bSBram Moolenaar # comment 629b209750bSBram Moolenaar 'two', # empty line follows 630b209750bSBram Moolenaar 631b209750bSBram Moolenaar 'three', 632b209750bSBram Moolenaar ] 633b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 634b209750bSBram Moolenaar END 635b209750bSBram Moolenaar CheckScriptSuccess(lines) 63666250c93SBram Moolenaar 63766250c93SBram Moolenaar # check all lines from heredoc are kept 63866250c93SBram Moolenaar lines =<< trim END 63966250c93SBram Moolenaar # comment 1 64066250c93SBram Moolenaar two 64166250c93SBram Moolenaar # comment 3 64266250c93SBram Moolenaar 64366250c93SBram Moolenaar five 64466250c93SBram Moolenaar # comment 6 64566250c93SBram Moolenaar END 64666250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 647b209750bSBram Moolenaarenddef 648b209750bSBram Moolenaar 6492a1381c3SBram Moolenaarif has('channel') 65040ee466cSBram Moolenaar let someJob = test_null_job() 65140ee466cSBram Moolenaar 65240ee466cSBram Moolenaar def FuncWithError() 65340ee466cSBram Moolenaar echomsg g:someJob 65440ee466cSBram Moolenaar enddef 65540ee466cSBram Moolenaar 65640ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 65740ee466cSBram Moolenaar try 65840ee466cSBram Moolenaar call FuncWithError() 65940ee466cSBram Moolenaar catch 66040ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 66140ee466cSBram Moolenaar endtry 66240ee466cSBram Moolenaar endfunc 6632a1381c3SBram Moolenaarendif 66440ee466cSBram Moolenaar 6658a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 6668a7d6542SBram Moolenaar vim9script 667cfcd011fSBram Moolenaar var name: string = 'bob' 6688a7d6542SBram Moolenaar def Concat(arg: string): string 6698a7d6542SBram Moolenaar return name .. arg 6708a7d6542SBram Moolenaar enddef 671227a69deSBram Moolenaar g:result = Concat('bie') 672227a69deSBram Moolenaar g:localname = name 6738a7d6542SBram Moolenaar 6748a7d6542SBram Moolenaar export const CONST = 1234 675cfcd011fSBram Moolenaar export var exported = 9876 676cfcd011fSBram Moolenaar export var exp_name = 'John' 6778a7d6542SBram Moolenaar export def Exported(): string 6788a7d6542SBram Moolenaar return 'Exported' 6798a7d6542SBram Moolenaar enddef 6808a7d6542SBram MoolenaarEND 6818a7d6542SBram Moolenaar 682b3ca9824SBram Moolenaardef Undo_export_script_lines() 683b3ca9824SBram Moolenaar unlet g:result 684b3ca9824SBram Moolenaar unlet g:localname 685b3ca9824SBram Moolenaarenddef 686b3ca9824SBram Moolenaar 6875269bd2aSBram Moolenaardef Test_vim9_import_export() 688cfcd011fSBram Moolenaar var import_script_lines =<< trim END 6898a7d6542SBram Moolenaar vim9script 6908a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 6918a7d6542SBram Moolenaar g:imported = exported 6926e587dcbSBram Moolenaar exported += 3 6936e587dcbSBram Moolenaar g:imported_added = exported 6948a7d6542SBram Moolenaar g:imported_func = Exported() 6956e587dcbSBram Moolenaar 69640f4f7a4SBram Moolenaar def GetExported(): string 697cfcd011fSBram Moolenaar var local_dict = #{ref: Exported} 69840f4f7a4SBram Moolenaar return local_dict.ref() 69940f4f7a4SBram Moolenaar enddef 70040f4f7a4SBram Moolenaar g:funcref_result = GetExported() 70140f4f7a4SBram Moolenaar 7026e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7036e587dcbSBram Moolenaar g:imported_name = exp_name 7046e587dcbSBram Moolenaar exp_name ..= ' Doe' 7056e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7065381c7a1SBram Moolenaar g:imported_later = exported 7078a7d6542SBram Moolenaar END 7088a7d6542SBram Moolenaar 7098a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7108a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7118a7d6542SBram Moolenaar 7128a7d6542SBram Moolenaar source Ximport.vim 7138a7d6542SBram Moolenaar 7148a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7158a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7168a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7176e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7185381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 7198a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 72040f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 7216e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 7226e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 7238a7d6542SBram Moolenaar assert_false(exists('g:name')) 7248a7d6542SBram Moolenaar 725b3ca9824SBram Moolenaar Undo_export_script_lines() 7268a7d6542SBram Moolenaar unlet g:imported 7276e587dcbSBram Moolenaar unlet g:imported_added 7285381c7a1SBram Moolenaar unlet g:imported_later 7298a7d6542SBram Moolenaar unlet g:imported_func 7306e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 7318a7d6542SBram Moolenaar delete('Ximport.vim') 732f2d5c240SBram Moolenaar 7331c991144SBram Moolenaar # similar, with line breaks 734cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 7351c991144SBram Moolenaar vim9script 7361c991144SBram Moolenaar import { 7371c991144SBram Moolenaar exported, 7381c991144SBram Moolenaar Exported, 7391c991144SBram Moolenaar } 7401c991144SBram Moolenaar from 7411c991144SBram Moolenaar './Xexport.vim' 7421c991144SBram Moolenaar g:imported = exported 7431c991144SBram Moolenaar exported += 5 7441c991144SBram Moolenaar g:imported_added = exported 7451c991144SBram Moolenaar g:imported_func = Exported() 7461c991144SBram Moolenaar END 7471c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 7481c991144SBram Moolenaar source Ximport_lbr.vim 7491c991144SBram Moolenaar 7501c991144SBram Moolenaar assert_equal(9876, g:imported) 7511c991144SBram Moolenaar assert_equal(9881, g:imported_added) 7521c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 7531c991144SBram Moolenaar 7541c991144SBram Moolenaar # exported script not sourced again 7551c991144SBram Moolenaar assert_false(exists('g:result')) 7561c991144SBram Moolenaar unlet g:imported 7571c991144SBram Moolenaar unlet g:imported_added 7581c991144SBram Moolenaar unlet g:imported_func 7591c991144SBram Moolenaar delete('Ximport_lbr.vim') 7601c991144SBram Moolenaar 7611c991144SBram Moolenaar # import inside :def function 762cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 7635381c7a1SBram Moolenaar vim9script 7645381c7a1SBram Moolenaar def ImportInDef() 7655381c7a1SBram Moolenaar import exported from './Xexport.vim' 7665381c7a1SBram Moolenaar g:imported = exported 7675381c7a1SBram Moolenaar exported += 7 7685381c7a1SBram Moolenaar g:imported_added = exported 7695381c7a1SBram Moolenaar enddef 7705381c7a1SBram Moolenaar ImportInDef() 7715381c7a1SBram Moolenaar END 7725381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 7735381c7a1SBram Moolenaar source Ximport2.vim 774f5be8cdbSBram Moolenaar # TODO: this should be 9879 7755381c7a1SBram Moolenaar assert_equal(9876, g:imported) 7765381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 7775381c7a1SBram Moolenaar unlet g:imported 7785381c7a1SBram Moolenaar unlet g:imported_added 7795381c7a1SBram Moolenaar delete('Ximport2.vim') 7805381c7a1SBram Moolenaar 781cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 782f2d5c240SBram Moolenaar vim9script 783f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 784f2d5c240SBram Moolenaar def UseExport() 785f2d5c240SBram Moolenaar g:imported = Export.exported 786f2d5c240SBram Moolenaar enddef 787f2d5c240SBram Moolenaar UseExport() 788f2d5c240SBram Moolenaar END 789f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 790f2d5c240SBram Moolenaar source Ximport.vim 7915381c7a1SBram Moolenaar assert_equal(9883, g:imported) 792f2d5c240SBram Moolenaar 793cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 794599c89c8SBram Moolenaar vim9script 795599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 796599c89c8SBram Moolenaar def Func() 797cfcd011fSBram Moolenaar var dummy = 1 798cfcd011fSBram Moolenaar var imported = Export + dummy 799599c89c8SBram Moolenaar enddef 800822ba247SBram Moolenaar defcompile 801599c89c8SBram Moolenaar END 802599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 80344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 804599c89c8SBram Moolenaar 805cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 806599c89c8SBram Moolenaar vim9script 807599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 808599c89c8SBram Moolenaar def Func() 809cfcd011fSBram Moolenaar var imported = Export . exported 810599c89c8SBram Moolenaar enddef 811822ba247SBram Moolenaar defcompile 812599c89c8SBram Moolenaar END 813599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 81444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 815599c89c8SBram Moolenaar 816cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 817599c89c8SBram Moolenaar vim9script 818599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 819599c89c8SBram Moolenaar def Func() 820cfcd011fSBram Moolenaar var imported = Export. 821599c89c8SBram Moolenaar enddef 822822ba247SBram Moolenaar defcompile 823599c89c8SBram Moolenaar END 824599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 82544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 826599c89c8SBram Moolenaar 827cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 8281c991144SBram Moolenaar vim9script 8291c991144SBram Moolenaar import * 8301c991144SBram Moolenaar as Export 8311c991144SBram Moolenaar from 8321c991144SBram Moolenaar './Xexport.vim' 8331c991144SBram Moolenaar def UseExport() 8341c991144SBram Moolenaar g:imported = Export.exported 8351c991144SBram Moolenaar enddef 8361c991144SBram Moolenaar UseExport() 8371c991144SBram Moolenaar END 8381c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 8391c991144SBram Moolenaar source Ximport.vim 8401c991144SBram Moolenaar assert_equal(9883, g:imported) 8411c991144SBram Moolenaar 842cfcd011fSBram Moolenaar var import_star_lines =<< trim END 843f2d5c240SBram Moolenaar vim9script 844f2d5c240SBram Moolenaar import * from './Xexport.vim' 845f2d5c240SBram Moolenaar END 846f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 84744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 848f2d5c240SBram Moolenaar 849f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 850cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 851fa29c8abSBram Moolenaar vim9script 852fa29c8abSBram Moolenaar import name from './Xexport.vim' 853fa29c8abSBram Moolenaar END 854fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 85544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 856fa29c8abSBram Moolenaar 857f5be8cdbSBram Moolenaar # try to import something that is already defined 858cfcd011fSBram Moolenaar var import_already_defined =<< trim END 8595269bd2aSBram Moolenaar vim9script 860cfcd011fSBram Moolenaar var exported = 'something' 8615269bd2aSBram Moolenaar import exported from './Xexport.vim' 8625269bd2aSBram Moolenaar END 8635269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 86444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 8655269bd2aSBram Moolenaar 866f5be8cdbSBram Moolenaar # try to import something that is already defined 8675269bd2aSBram Moolenaar import_already_defined =<< trim END 8685269bd2aSBram Moolenaar vim9script 869cfcd011fSBram Moolenaar var exported = 'something' 8705269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 8715269bd2aSBram Moolenaar END 8725269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 87344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 8745269bd2aSBram Moolenaar 875f5be8cdbSBram Moolenaar # try to import something that is already defined 8765269bd2aSBram Moolenaar import_already_defined =<< trim END 8775269bd2aSBram Moolenaar vim9script 878cfcd011fSBram Moolenaar var exported = 'something' 8795269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 8805269bd2aSBram Moolenaar END 8815269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 88244d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 8835269bd2aSBram Moolenaar 884f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 885cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 886fa29c8abSBram Moolenaar vim9script 887fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 888fa29c8abSBram Moolenaar END 889fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 89044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 891fa29c8abSBram Moolenaar 892cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 893fa29c8abSBram Moolenaar vim9script 894fa29c8abSBram Moolenaar import name './Xexport.vim' 895fa29c8abSBram Moolenaar END 896fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 89744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 898fa29c8abSBram Moolenaar 899cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 900fa29c8abSBram Moolenaar vim9script 901fa29c8abSBram Moolenaar import name from Xexport.vim 902fa29c8abSBram Moolenaar END 903fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 90444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 905fa29c8abSBram Moolenaar 906cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 907fa29c8abSBram Moolenaar vim9script 908fa29c8abSBram Moolenaar import name from './XnoExport.vim' 909fa29c8abSBram Moolenaar END 910fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 91144d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 912fa29c8abSBram Moolenaar 913cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 914fa29c8abSBram Moolenaar vim9script 915fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 916fa29c8abSBram Moolenaar END 9175269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 91844d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 919fa29c8abSBram Moolenaar 920f2d5c240SBram Moolenaar delete('Ximport.vim') 9215269bd2aSBram Moolenaar delete('Ximport3.vim') 9228a7d6542SBram Moolenaar delete('Xexport.vim') 9238a7d6542SBram Moolenaar 924f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 925750802b5SBram Moolenaar set cpo&vi 926cfcd011fSBram Moolenaar var cpo_before = &cpo 927cfcd011fSBram Moolenaar var lines =<< trim END 928750802b5SBram Moolenaar vim9script 929750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 930750802b5SBram Moolenaar END 931750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 932750802b5SBram Moolenaar source Xvim9_script 933750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 934750802b5SBram Moolenaar set cpo&vim 935750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 936750802b5SBram Moolenaar delete('Xvim9_script') 937750802b5SBram Moolenaarenddef 938750802b5SBram Moolenaar 939803af686SBram Moolenaarfunc g:Trigger() 940803af686SBram Moolenaar source Ximport.vim 941803af686SBram Moolenaar return "echo 'yes'\<CR>" 942803af686SBram Moolenaarendfunc 943803af686SBram Moolenaar 944803af686SBram Moolenaardef Test_import_export_expr_map() 945803af686SBram Moolenaar # check that :import and :export work when buffer is locked 946cfcd011fSBram Moolenaar var export_lines =<< trim END 947803af686SBram Moolenaar vim9script 948803af686SBram Moolenaar export def That(): string 949803af686SBram Moolenaar return 'yes' 950803af686SBram Moolenaar enddef 951803af686SBram Moolenaar END 952803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 953803af686SBram Moolenaar 954cfcd011fSBram Moolenaar var import_lines =<< trim END 955803af686SBram Moolenaar vim9script 956803af686SBram Moolenaar import That from './Xexport_that.vim' 957803af686SBram Moolenaar assert_equal('yes', That()) 958803af686SBram Moolenaar END 959803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 960803af686SBram Moolenaar 961803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 962803af686SBram Moolenaar feedkeys('trigger', "xt") 963803af686SBram Moolenaar 964730b2483SBram Moolenaar delete('Xexport_that.vim') 965803af686SBram Moolenaar delete('Ximport.vim') 966803af686SBram Moolenaar nunmap trigger 967803af686SBram Moolenaarenddef 968803af686SBram Moolenaar 9698e1986e3SBram Moolenaardef Test_import_in_filetype() 9708e1986e3SBram Moolenaar # check that :import works when the buffer is locked 9718e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 972cfcd011fSBram Moolenaar var export_lines =<< trim END 9738e1986e3SBram Moolenaar vim9script 974cfcd011fSBram Moolenaar export var That = 'yes' 9758e1986e3SBram Moolenaar END 976730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 9778e1986e3SBram Moolenaar 978cfcd011fSBram Moolenaar var import_lines =<< trim END 9798e1986e3SBram Moolenaar vim9script 980730b2483SBram Moolenaar import That from './Xexport_ft.vim' 9818e1986e3SBram Moolenaar assert_equal('yes', That) 9828e1986e3SBram Moolenaar g:did_load_mytpe = 1 9838e1986e3SBram Moolenaar END 9848e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 9858e1986e3SBram Moolenaar 986cfcd011fSBram Moolenaar var save_rtp = &rtp 9878e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 9888e1986e3SBram Moolenaar 9898e1986e3SBram Moolenaar filetype plugin on 9908e1986e3SBram Moolenaar copen 9918e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 9928e1986e3SBram Moolenaar 9938e1986e3SBram Moolenaar quit! 994730b2483SBram Moolenaar delete('Xexport_ft.vim') 9958e1986e3SBram Moolenaar delete('ftplugin', 'rf') 9968e1986e3SBram Moolenaar &rtp = save_rtp 9978e1986e3SBram Moolenaarenddef 9988e1986e3SBram Moolenaar 999efa94447SBram Moolenaardef Test_use_import_in_mapping() 1000cfcd011fSBram Moolenaar var lines =<< trim END 1001efa94447SBram Moolenaar vim9script 1002efa94447SBram Moolenaar export def Funcx() 1003efa94447SBram Moolenaar g:result = 42 1004efa94447SBram Moolenaar enddef 1005efa94447SBram Moolenaar END 1006efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1007efa94447SBram Moolenaar lines =<< trim END 1008efa94447SBram Moolenaar vim9script 1009efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1010b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1011efa94447SBram Moolenaar END 1012efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1013efa94447SBram Moolenaar 1014efa94447SBram Moolenaar source Xmapscript.vim 1015b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1016efa94447SBram Moolenaar assert_equal(42, g:result) 1017efa94447SBram Moolenaar 1018efa94447SBram Moolenaar unlet g:result 1019efa94447SBram Moolenaar delete('XsomeExport.vim') 1020efa94447SBram Moolenaar delete('Xmapscript.vim') 1021b3ca9824SBram Moolenaar nunmap <F3> 1022efa94447SBram Moolenaarenddef 1023efa94447SBram Moolenaar 1024750802b5SBram Moolenaardef Test_vim9script_fails() 10258a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 10268a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1027cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 10289721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1029cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1030750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1031750802b5SBram Moolenaar 1032cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1033c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1034c785b9a7SBram Moolenaar 1035e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1036e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 10378a7d6542SBram Moolenaarenddef 10388a7d6542SBram Moolenaar 1039f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1040101f4810SBram Moolenaar CheckRunVimInTerminal 1041101f4810SBram Moolenaar 10429bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1043c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 10449bb3eb3eSBram Moolenaarendfunc 10459bb3eb3eSBram Moolenaar 1046c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1047cfcd011fSBram Moolenaar var export =<< trim END 1048101f4810SBram Moolenaar vim9script 1049101f4810SBram Moolenaar export def Foo(): number 1050101f4810SBram Moolenaar return 0 1051101f4810SBram Moolenaar enddef 1052101f4810SBram Moolenaar END 1053730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1054101f4810SBram Moolenaar 1055cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', #{ 10569bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 10579bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1058101f4810SBram Moolenaar 1059730b2483SBram Moolenaar delete('XexportCmd.vim') 10609bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 10619bb3eb3eSBram Moolenaarenddef 1062101f4810SBram Moolenaar 10634c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1064cfcd011fSBram Moolenaar var lines =<< trim END 10658a7d6542SBram Moolenaar vim9script 10668a7d6542SBram Moolenaar const var = '' 1067cfcd011fSBram Moolenaar var valone = 1234 10688a7d6542SBram Moolenaar def MyFunc(arg: string) 10698a7d6542SBram Moolenaar valone = 5678 10708a7d6542SBram Moolenaar enddef 10718a7d6542SBram Moolenaar END 1072cfcd011fSBram Moolenaar var morelines =<< trim END 1073cfcd011fSBram Moolenaar var valtwo = 222 10748a7d6542SBram Moolenaar export def GetValtwo(): number 10758a7d6542SBram Moolenaar return valtwo 10768a7d6542SBram Moolenaar enddef 10778a7d6542SBram Moolenaar END 107803afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 10798a7d6542SBram Moolenaar source Xreload.vim 10808a7d6542SBram Moolenaar source Xreload.vim 10818a7d6542SBram Moolenaar source Xreload.vim 10828a7d6542SBram Moolenaar 1083cfcd011fSBram Moolenaar var testlines =<< trim END 10848a7d6542SBram Moolenaar vim9script 10858a7d6542SBram Moolenaar def TheFunc() 10868a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 10878a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 10888a7d6542SBram Moolenaar enddef 10898a7d6542SBram Moolenaar TheFunc() 10908a7d6542SBram Moolenaar END 10918a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 10928a7d6542SBram Moolenaar source Ximport.vim 10938a7d6542SBram Moolenaar 1094f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1095f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 10968a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 10978a7d6542SBram Moolenaar source Ximport.vim 10988a7d6542SBram Moolenaar 1099f5be8cdbSBram Moolenaar # cannot declare a var twice 11008a7d6542SBram Moolenaar lines =<< trim END 11018a7d6542SBram Moolenaar vim9script 1102cfcd011fSBram Moolenaar var valone = 1234 1103cfcd011fSBram Moolenaar var valone = 5678 11048a7d6542SBram Moolenaar END 11058a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 110644d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 11078a7d6542SBram Moolenaar 11088a7d6542SBram Moolenaar delete('Xreload.vim') 11098a7d6542SBram Moolenaar delete('Ximport.vim') 11108a7d6542SBram Moolenaarenddef 11118a7d6542SBram Moolenaar 111295006e3dSBram Moolenaardef s:RetSome(): string 111395006e3dSBram Moolenaar return 'some' 111495006e3dSBram Moolenaarenddef 111595006e3dSBram Moolenaar 1116fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1117fe465a01SBram Moolenaar" script-local name. 1118fe465a01SBram Moolenaardef Test_vim9script_funcref() 1119cfcd011fSBram Moolenaar var sortlines =<< trim END 1120fe465a01SBram Moolenaar vim9script 1121fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1122bed36b93SBram Moolenaar return i2 - i1 1123fe465a01SBram Moolenaar enddef 1124fe465a01SBram Moolenaar 1125fe465a01SBram Moolenaar export def FastSort(): list<number> 1126fe465a01SBram Moolenaar return range(5)->sort(Compare) 1127fe465a01SBram Moolenaar enddef 1128fe465a01SBram Moolenaar END 1129fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1130fe465a01SBram Moolenaar 1131cfcd011fSBram Moolenaar var lines =<< trim END 1132fe465a01SBram Moolenaar vim9script 1133fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1134fe465a01SBram Moolenaar def Test() 1135fe465a01SBram Moolenaar g:result = FastSort() 1136fe465a01SBram Moolenaar enddef 1137fe465a01SBram Moolenaar Test() 1138fe465a01SBram Moolenaar END 1139fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1140fe465a01SBram Moolenaar 1141fe465a01SBram Moolenaar source Xscript.vim 1142fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1143fe465a01SBram Moolenaar 1144fe465a01SBram Moolenaar unlet g:result 1145fe465a01SBram Moolenaar delete('Xsort.vim') 1146fe465a01SBram Moolenaar delete('Xscript.vim') 114795006e3dSBram Moolenaar 1148cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 114995006e3dSBram Moolenaar assert_equal('some', Funcref()) 1150fe465a01SBram Moolenaarenddef 1151fe465a01SBram Moolenaar 1152601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1153601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1154601e76acSBram Moolenaar" function reference. 1155c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1156cfcd011fSBram Moolenaar var filterLines =<< trim END 1157c620c055SBram Moolenaar vim9script 1158c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1159c620c055SBram Moolenaar return idx % 2 == 1 1160c620c055SBram Moolenaar enddef 1161c620c055SBram Moolenaar export def FastFilter(): list<number> 1162c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1163c620c055SBram Moolenaar enddef 1164601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1165601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1166601e76acSBram Moolenaar enddef 1167c620c055SBram Moolenaar END 1168c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1169c620c055SBram Moolenaar 1170cfcd011fSBram Moolenaar var lines =<< trim END 1171c620c055SBram Moolenaar vim9script 1172601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1173c620c055SBram Moolenaar def Test() 1174cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1175c620c055SBram Moolenaar enddef 1176c620c055SBram Moolenaar Test() 1177601e76acSBram Moolenaar def TestDirect() 1178cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1179601e76acSBram Moolenaar enddef 1180601e76acSBram Moolenaar TestDirect() 1181c620c055SBram Moolenaar END 1182601e76acSBram Moolenaar CheckScriptSuccess(lines) 1183c620c055SBram Moolenaar delete('Xfilter.vim') 1184c620c055SBram Moolenaarenddef 1185c620c055SBram Moolenaar 11864c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1187cfcd011fSBram Moolenaar var first_lines =<< trim END 11884c17ad94SBram Moolenaar vim9script 11894c17ad94SBram Moolenaar def FuncYes(): string 11904c17ad94SBram Moolenaar return 'yes' 11914c17ad94SBram Moolenaar enddef 11924c17ad94SBram Moolenaar END 1193cfcd011fSBram Moolenaar var withno_lines =<< trim END 11944c17ad94SBram Moolenaar def FuncNo(): string 11954c17ad94SBram Moolenaar return 'no' 11964c17ad94SBram Moolenaar enddef 11974c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 11984c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 11994c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 120003afdcf1SBram Moolenaar enddef 120103afdcf1SBram Moolenaar END 1202cfcd011fSBram Moolenaar var nono_lines =<< trim END 120303afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 120403afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 120544d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 12064c17ad94SBram Moolenaar enddef 12074c17ad94SBram Moolenaar END 12084c17ad94SBram Moolenaar 12094c17ad94SBram Moolenaar # FuncNo() is defined 121003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12114c17ad94SBram Moolenaar source Xreloaded.vim 12124c17ad94SBram Moolenaar g:DoCheck(true) 12134c17ad94SBram Moolenaar 12144c17ad94SBram Moolenaar # FuncNo() is not redefined 121503afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 12164c17ad94SBram Moolenaar source Xreloaded.vim 121703afdcf1SBram Moolenaar g:DoCheck() 12184c17ad94SBram Moolenaar 12194c17ad94SBram Moolenaar # FuncNo() is back 122003afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 12214c17ad94SBram Moolenaar source Xreloaded.vim 122203afdcf1SBram Moolenaar g:DoCheck() 12234c17ad94SBram Moolenaar 12244c17ad94SBram Moolenaar delete('Xreloaded.vim') 12254c17ad94SBram Moolenaarenddef 12264c17ad94SBram Moolenaar 122789483d40SBram Moolenaardef Test_vim9script_reload_delvar() 122889483d40SBram Moolenaar # write the script with a script-local variable 1229cfcd011fSBram Moolenaar var lines =<< trim END 123089483d40SBram Moolenaar vim9script 1231cfcd011fSBram Moolenaar var name = 'string' 123289483d40SBram Moolenaar END 123389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 123489483d40SBram Moolenaar source XreloadVar.vim 123589483d40SBram Moolenaar 123689483d40SBram Moolenaar # now write the script using the same variable locally - works 123789483d40SBram Moolenaar lines =<< trim END 123889483d40SBram Moolenaar vim9script 123989483d40SBram Moolenaar def Func() 1240cfcd011fSBram Moolenaar var name = 'string' 124189483d40SBram Moolenaar enddef 124289483d40SBram Moolenaar END 124389483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 124489483d40SBram Moolenaar source XreloadVar.vim 124589483d40SBram Moolenaar 124689483d40SBram Moolenaar delete('XreloadVar.vim') 124789483d40SBram Moolenaarenddef 124889483d40SBram Moolenaar 12498a7d6542SBram Moolenaardef Test_import_absolute() 1250cfcd011fSBram Moolenaar var import_lines = [ 1251e6085c53SBram Moolenaar 'vim9script', 1252e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1253e6085c53SBram Moolenaar 'def UseExported()', 1254e6085c53SBram Moolenaar ' g:imported_abs = exported', 1255e6085c53SBram Moolenaar ' exported = 8888', 1256e6085c53SBram Moolenaar ' g:imported_after = exported', 1257e6085c53SBram Moolenaar 'enddef', 1258e6085c53SBram Moolenaar 'UseExported()', 1259e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1260e6085c53SBram Moolenaar ] 12618a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 12628a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 12638a7d6542SBram Moolenaar 12648a7d6542SBram Moolenaar source Ximport_abs.vim 12658a7d6542SBram Moolenaar 12668a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 12674e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1268675f716eSBram Moolenaar assert_match('<SNR>\d\+_UseExported.*' .. 1269675f716eSBram Moolenaar 'g:imported_abs = exported.*' .. 1270675f716eSBram Moolenaar '0 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1271675f716eSBram Moolenaar '1 STOREG g:imported_abs.*' .. 1272675f716eSBram Moolenaar 'exported = 8888.*' .. 1273675f716eSBram Moolenaar '3 STORESCRIPT exported in .*Xexport_abs.vim.*' .. 1274675f716eSBram Moolenaar 'g:imported_after = exported.*' .. 1275675f716eSBram Moolenaar '4 LOADSCRIPT exported from .*Xexport_abs.vim.*' .. 1276675f716eSBram Moolenaar '5 STOREG g:imported_after.*', 1277e6085c53SBram Moolenaar g:import_disassembled) 1278b3ca9824SBram Moolenaar 1279b3ca9824SBram Moolenaar Undo_export_script_lines() 12808a7d6542SBram Moolenaar unlet g:imported_abs 12814e12a5dfSBram Moolenaar unlet g:import_disassembled 12828a7d6542SBram Moolenaar 12838a7d6542SBram Moolenaar delete('Ximport_abs.vim') 12848a7d6542SBram Moolenaar delete('Xexport_abs.vim') 12858a7d6542SBram Moolenaarenddef 12868a7d6542SBram Moolenaar 12878a7d6542SBram Moolenaardef Test_import_rtp() 1288cfcd011fSBram Moolenaar var import_lines = [ 1289e6085c53SBram Moolenaar 'vim9script', 1290e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1291e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1292e6085c53SBram Moolenaar ] 12938a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 12948a7d6542SBram Moolenaar mkdir('import') 12958a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 12968a7d6542SBram Moolenaar 1297cfcd011fSBram Moolenaar var save_rtp = &rtp 12988a7d6542SBram Moolenaar &rtp = getcwd() 12998a7d6542SBram Moolenaar source Ximport_rtp.vim 13008a7d6542SBram Moolenaar &rtp = save_rtp 13018a7d6542SBram Moolenaar 13028a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13038a7d6542SBram Moolenaar 1304b3ca9824SBram Moolenaar Undo_export_script_lines() 1305b3ca9824SBram Moolenaar unlet g:imported_rtp 13068a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 130789483d40SBram Moolenaar delete('import', 'rf') 13088a7d6542SBram Moolenaarenddef 13098a7d6542SBram Moolenaar 131025e0f586SBram Moolenaardef Test_import_compile_error() 1311cfcd011fSBram Moolenaar var export_lines = [ 131225e0f586SBram Moolenaar 'vim9script', 131325e0f586SBram Moolenaar 'export def ExpFunc(): string', 131425e0f586SBram Moolenaar ' return notDefined', 131525e0f586SBram Moolenaar 'enddef', 131625e0f586SBram Moolenaar ] 131725e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 131825e0f586SBram Moolenaar 1319cfcd011fSBram Moolenaar var import_lines = [ 132025e0f586SBram Moolenaar 'vim9script', 132125e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 132225e0f586SBram Moolenaar 'def ImpFunc()', 132325e0f586SBram Moolenaar ' echo ExpFunc()', 132425e0f586SBram Moolenaar 'enddef', 132525e0f586SBram Moolenaar 'defcompile', 132625e0f586SBram Moolenaar ] 132725e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 132825e0f586SBram Moolenaar 132925e0f586SBram Moolenaar try 133025e0f586SBram Moolenaar source Ximport.vim 133125e0f586SBram Moolenaar catch /E1001/ 1332f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 13337707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 133425e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 133525e0f586SBram Moolenaar endtry 133625e0f586SBram Moolenaar 133725e0f586SBram Moolenaar delete('Xexported.vim') 133825e0f586SBram Moolenaar delete('Ximport.vim') 133925e0f586SBram Moolenaarenddef 134025e0f586SBram Moolenaar 1341c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1342cfcd011fSBram Moolenaar var lines = [ 1343c4ce36d4SBram Moolenaar 'vim9script', 1344c4ce36d4SBram Moolenaar 'def Func()', 1345c4ce36d4SBram Moolenaar ' eval [][0]', 1346c4ce36d4SBram Moolenaar 'enddef', 1347c4ce36d4SBram Moolenaar 'Func()', 1348c4ce36d4SBram Moolenaar ] 1349c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1350c4ce36d4SBram Moolenaar 1351c4ce36d4SBram Moolenaar for count in range(3) 1352c4ce36d4SBram Moolenaar try 1353c4ce36d4SBram Moolenaar source Xtestscript.vim 1354c4ce36d4SBram Moolenaar catch /E684/ 1355c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1356c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1357c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1358c4ce36d4SBram Moolenaar endtry 1359c4ce36d4SBram Moolenaar endfor 1360c4ce36d4SBram Moolenaar 1361c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1362c4ce36d4SBram Moolenaarenddef 1363c4ce36d4SBram Moolenaar 1364eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1365cfcd011fSBram Moolenaar var export_lines =<< trim END 1366eef2102eSBram Moolenaar vim9script 1367eef2102eSBram Moolenaar export def Func() 1368eef2102eSBram Moolenaar echo 'imported' 1369eef2102eSBram Moolenaar enddef 1370eef2102eSBram Moolenaar END 1371eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1372eef2102eSBram Moolenaar 1373cfcd011fSBram Moolenaar var lines =<< trim END 1374eef2102eSBram Moolenaar vim9script 1375eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1376eef2102eSBram Moolenaar def Func() 1377eef2102eSBram Moolenaar echo 'local to function' 1378eef2102eSBram Moolenaar enddef 1379eef2102eSBram Moolenaar END 1380eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1381eef2102eSBram Moolenaar 1382eef2102eSBram Moolenaar lines =<< trim END 1383eef2102eSBram Moolenaar vim9script 1384eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1385eef2102eSBram Moolenaar def Outer() 1386eef2102eSBram Moolenaar def Func() 1387eef2102eSBram Moolenaar echo 'local to function' 1388eef2102eSBram Moolenaar enddef 1389eef2102eSBram Moolenaar enddef 1390eef2102eSBram Moolenaar defcompile 1391eef2102eSBram Moolenaar END 1392eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1393eef2102eSBram Moolenaar 1394eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1395eef2102eSBram Moolenaarenddef 1396eef2102eSBram Moolenaar 1397b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1398cfcd011fSBram Moolenaar var lines =<< trim END 1399b9a2cac3SBram Moolenaar vim9script 1400b9a2cac3SBram Moolenaar def Func() 1401b9a2cac3SBram Moolenaar echo 'one' 1402b9a2cac3SBram Moolenaar enddef 1403b9a2cac3SBram Moolenaar def Func() 1404b9a2cac3SBram Moolenaar echo 'two' 1405b9a2cac3SBram Moolenaar enddef 1406b9a2cac3SBram Moolenaar END 1407b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1408fa211f3cSBram Moolenaar 1409fa211f3cSBram Moolenaar lines =<< trim END 1410fa211f3cSBram Moolenaar vim9script 1411fa211f3cSBram Moolenaar def Foo(): string 1412fa211f3cSBram Moolenaar return 'foo' 1413fa211f3cSBram Moolenaar enddef 1414fa211f3cSBram Moolenaar def Func() 1415cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1416fa211f3cSBram Moolenaar enddef 1417fa211f3cSBram Moolenaar defcompile 1418fa211f3cSBram Moolenaar END 1419fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1420b9a2cac3SBram Moolenaarenddef 1421b9a2cac3SBram Moolenaar 14228a7d6542SBram Moolenaardef Test_fixed_size_list() 1423f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1424cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 14258a7d6542SBram Moolenaar l->remove(0) 14268a7d6542SBram Moolenaar l->add(5) 14278a7d6542SBram Moolenaar l->insert(99, 1) 14280f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 14298a7d6542SBram Moolenaarenddef 14308a7d6542SBram Moolenaar 1431ae616494SBram Moolenaardef Test_no_insert_xit() 1432d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1433d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1434d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1435d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1436d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1437ae616494SBram Moolenaar 1438ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1439ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1440ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1441ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1442f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1443f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1444f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1445f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1446f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1447ae616494SBram Moolenaarenddef 1448ae616494SBram Moolenaar 1449158906cfSBram Moolenaardef IfElse(what: number): string 1450cfcd011fSBram Moolenaar var res = '' 1451158906cfSBram Moolenaar if what == 1 1452158906cfSBram Moolenaar res = "one" 1453158906cfSBram Moolenaar elseif what == 2 1454158906cfSBram Moolenaar res = "two" 1455a259d8d3SBram Moolenaar else 1456158906cfSBram Moolenaar res = "three" 1457a259d8d3SBram Moolenaar endif 1458158906cfSBram Moolenaar return res 1459a259d8d3SBram Moolenaarenddef 1460a259d8d3SBram Moolenaar 1461158906cfSBram Moolenaardef Test_if_elseif_else() 1462158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1463158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1464158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 14650f18b6d1SBram Moolenaarenddef 14660f18b6d1SBram Moolenaar 1467e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1468d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1469d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1470d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1471d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1472d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1473e8c4abbbSBram Moolenaarenddef 1474e8c4abbbSBram Moolenaar 14756d69bf60SBram Moolenaarlet g:bool_true = v:true 14766d69bf60SBram Moolenaarlet g:bool_false = v:false 14776d69bf60SBram Moolenaar 14786d69bf60SBram Moolenaardef Test_if_const_expr() 1479cfcd011fSBram Moolenaar var res = false 14806d69bf60SBram Moolenaar if true ? true : false 14816d69bf60SBram Moolenaar res = true 14826d69bf60SBram Moolenaar endif 14836d69bf60SBram Moolenaar assert_equal(true, res) 14846d69bf60SBram Moolenaar 1485585fea7bSBram Moolenaar g:glob = 2 1486585fea7bSBram Moolenaar if false 14876797966dSBram Moolenaar execute('g:glob = 3') 1488585fea7bSBram Moolenaar endif 1489585fea7bSBram Moolenaar assert_equal(2, g:glob) 1490585fea7bSBram Moolenaar if true 14916797966dSBram Moolenaar execute('g:glob = 3') 1492585fea7bSBram Moolenaar endif 1493585fea7bSBram Moolenaar assert_equal(3, g:glob) 1494585fea7bSBram Moolenaar 14956d69bf60SBram Moolenaar res = false 14966d69bf60SBram Moolenaar if g:bool_true ? true : false 14976d69bf60SBram Moolenaar res = true 14986d69bf60SBram Moolenaar endif 14996d69bf60SBram Moolenaar assert_equal(true, res) 15006d69bf60SBram Moolenaar 15016d69bf60SBram Moolenaar res = false 15026d69bf60SBram Moolenaar if true ? g:bool_true : false 15036d69bf60SBram Moolenaar res = true 15046d69bf60SBram Moolenaar endif 15056d69bf60SBram Moolenaar assert_equal(true, res) 15066d69bf60SBram Moolenaar 15076d69bf60SBram Moolenaar res = false 15086d69bf60SBram Moolenaar if true ? true : g:bool_false 15096d69bf60SBram Moolenaar res = true 15106d69bf60SBram Moolenaar endif 15116d69bf60SBram Moolenaar assert_equal(true, res) 15126d69bf60SBram Moolenaar 15136d69bf60SBram Moolenaar res = false 15146d69bf60SBram Moolenaar if true ? false : true 15156d69bf60SBram Moolenaar res = true 15166d69bf60SBram Moolenaar endif 15176d69bf60SBram Moolenaar assert_equal(false, res) 15186d69bf60SBram Moolenaar 15196d69bf60SBram Moolenaar res = false 15206d69bf60SBram Moolenaar if false ? false : true 15216d69bf60SBram Moolenaar res = true 15226d69bf60SBram Moolenaar endif 15236d69bf60SBram Moolenaar assert_equal(true, res) 15246d69bf60SBram Moolenaar 15256d69bf60SBram Moolenaar res = false 15266d69bf60SBram Moolenaar if false ? true : false 15276d69bf60SBram Moolenaar res = true 15286d69bf60SBram Moolenaar endif 15296d69bf60SBram Moolenaar assert_equal(false, res) 15306d69bf60SBram Moolenaar 15316d69bf60SBram Moolenaar res = false 1532e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1533e8c4abbbSBram Moolenaar res = true 1534e8c4abbbSBram Moolenaar endif 1535e8c4abbbSBram Moolenaar assert_equal(false, res) 1536e8c4abbbSBram Moolenaar 1537e8c4abbbSBram Moolenaar res = false 15386d69bf60SBram Moolenaar if true && true 15396d69bf60SBram Moolenaar res = true 15406d69bf60SBram Moolenaar endif 15416d69bf60SBram Moolenaar assert_equal(true, res) 15426d69bf60SBram Moolenaar 15436d69bf60SBram Moolenaar res = false 15446d69bf60SBram Moolenaar if true && false 15456d69bf60SBram Moolenaar res = true 15466d69bf60SBram Moolenaar endif 15476d69bf60SBram Moolenaar assert_equal(false, res) 15486d69bf60SBram Moolenaar 15496d69bf60SBram Moolenaar res = false 15506d69bf60SBram Moolenaar if g:bool_true && false 15516d69bf60SBram Moolenaar res = true 15526d69bf60SBram Moolenaar endif 15536d69bf60SBram Moolenaar assert_equal(false, res) 15546d69bf60SBram Moolenaar 15556d69bf60SBram Moolenaar res = false 15566d69bf60SBram Moolenaar if true && g:bool_false 15576d69bf60SBram Moolenaar res = true 15586d69bf60SBram Moolenaar endif 15596d69bf60SBram Moolenaar assert_equal(false, res) 15606d69bf60SBram Moolenaar 15616d69bf60SBram Moolenaar res = false 15626d69bf60SBram Moolenaar if false && false 15636d69bf60SBram Moolenaar res = true 15646d69bf60SBram Moolenaar endif 15656d69bf60SBram Moolenaar assert_equal(false, res) 15666d69bf60SBram Moolenaar 15676d69bf60SBram Moolenaar res = false 15686d69bf60SBram Moolenaar if true || false 15696d69bf60SBram Moolenaar res = true 15706d69bf60SBram Moolenaar endif 15716d69bf60SBram Moolenaar assert_equal(true, res) 15726d69bf60SBram Moolenaar 15736d69bf60SBram Moolenaar res = false 15746d69bf60SBram Moolenaar if g:bool_true || false 15756d69bf60SBram Moolenaar res = true 15766d69bf60SBram Moolenaar endif 15776d69bf60SBram Moolenaar assert_equal(true, res) 15786d69bf60SBram Moolenaar 15796d69bf60SBram Moolenaar res = false 15806d69bf60SBram Moolenaar if true || g:bool_false 15816d69bf60SBram Moolenaar res = true 15826d69bf60SBram Moolenaar endif 15836d69bf60SBram Moolenaar assert_equal(true, res) 15846d69bf60SBram Moolenaar 15856d69bf60SBram Moolenaar res = false 15866d69bf60SBram Moolenaar if false || false 15876d69bf60SBram Moolenaar res = true 15886d69bf60SBram Moolenaar endif 15896d69bf60SBram Moolenaar assert_equal(false, res) 15903988f64fSBram Moolenaar 15913988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 15923988f64fSBram Moolenaar if false | eval 0 | endif 15933988f64fSBram Moolenaar if false | eval burp + 234 | endif 15943988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 15953988f64fSBram Moolenaar if false 15963988f64fSBram Moolenaar burp 15973988f64fSBram Moolenaar endif 159880c34ca3SBram Moolenaarenddef 15996d69bf60SBram Moolenaar 160080c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1601d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1602d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1603d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1604d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16056d69bf60SBram Moolenaarenddef 16066d69bf60SBram Moolenaar 160772abcf42SBram Moolenaardef RunNested(i: number): number 1608cfcd011fSBram Moolenaar var x: number = 0 160972abcf42SBram Moolenaar if i % 2 161072abcf42SBram Moolenaar if 1 1611f5be8cdbSBram Moolenaar # comment 161272abcf42SBram Moolenaar else 1613f5be8cdbSBram Moolenaar # comment 161472abcf42SBram Moolenaar endif 161572abcf42SBram Moolenaar x += 1 161672abcf42SBram Moolenaar else 161772abcf42SBram Moolenaar x += 1000 161872abcf42SBram Moolenaar endif 161972abcf42SBram Moolenaar return x 162072abcf42SBram Moolenaarenddef 162172abcf42SBram Moolenaar 162272abcf42SBram Moolenaardef Test_nested_if() 162372abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 162472abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 162572abcf42SBram Moolenaarenddef 162672abcf42SBram Moolenaar 1627ad39c094SBram Moolenaardef Test_execute_cmd() 1628ad39c094SBram Moolenaar new 1629ad39c094SBram Moolenaar setline(1, 'default') 1630d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1631ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1632a72cfb80SBram Moolenaar 1633d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1634a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1635a72cfb80SBram Moolenaar 1636cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1637cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1638a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1639ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1640a72cfb80SBram Moolenaar 1641d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1642ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1643a72cfb80SBram Moolenaar 1644cfcd011fSBram Moolenaar var cmd_first = 'call ' 1645cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1646ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1647ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1648ad39c094SBram Moolenaar bwipe! 1649585fea7bSBram Moolenaar 1650cfcd011fSBram Moolenaar var n = true 16512d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 16522d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 16532d6b20d6SBram Moolenaar 1654e5abf7afSBram Moolenaar echomsg [1, 2, 3] #{a: 1, b: 2} 1655e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1656e5abf7afSBram Moolenaar 1657d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1658d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1659d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1660ad39c094SBram Moolenaarenddef 1661ad39c094SBram Moolenaar 166247e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1663f5be8cdbSBram Moolenaar # only checks line continuation 1664cfcd011fSBram Moolenaar var lines =<< trim END 166547e880d6SBram Moolenaar vim9script 166647e880d6SBram Moolenaar execute 'g:someVar' 166747e880d6SBram Moolenaar .. ' = ' .. 166847e880d6SBram Moolenaar '28' 166947e880d6SBram Moolenaar assert_equal(28, g:someVar) 167047e880d6SBram Moolenaar unlet g:someVar 167147e880d6SBram Moolenaar END 167247e880d6SBram Moolenaar CheckScriptSuccess(lines) 167347e880d6SBram Moolenaarenddef 167447e880d6SBram Moolenaar 1675ad39c094SBram Moolenaardef Test_echo_cmd() 1676a72cfb80SBram Moolenaar echo 'some' # comment 1677585fea7bSBram Moolenaar echon 'thing' 1678ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1679ad39c094SBram Moolenaar 1680a72cfb80SBram Moolenaar echo "some" # comment 1681a72cfb80SBram Moolenaar echon "thing" 1682a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1683a72cfb80SBram Moolenaar 1684cfcd011fSBram Moolenaar var str1 = 'some' 1685cfcd011fSBram Moolenaar var str2 = 'more' 1686ad39c094SBram Moolenaar echo str1 str2 1687ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1688a72cfb80SBram Moolenaar 1689d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1690ad39c094SBram Moolenaarenddef 1691ad39c094SBram Moolenaar 1692f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1693f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1694f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1695f93c7feaSBram Moolenaar echo 'clear' 1696df069eecSBram Moolenaar :1messages 1697f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1698f93c7feaSBram Moolenaar 1699d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1700f93c7feaSBram Moolenaarenddef 1701f93c7feaSBram Moolenaar 170247e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1703f5be8cdbSBram Moolenaar # only checks line continuation 1704cfcd011fSBram Moolenaar var lines =<< trim END 170547e880d6SBram Moolenaar vim9script 170647e880d6SBram Moolenaar echomsg 'here' 170747e880d6SBram Moolenaar .. ' is ' .. 170847e880d6SBram Moolenaar 'a message' 170947e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 171047e880d6SBram Moolenaar END 171147e880d6SBram Moolenaar CheckScriptSuccess(lines) 171247e880d6SBram Moolenaarenddef 171347e880d6SBram Moolenaar 1714f93c7feaSBram Moolenaardef Test_echoerr_cmd() 171540ee466cSBram Moolenaar try 171640ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 171740ee466cSBram Moolenaar catch 171840ee466cSBram Moolenaar assert_match('something wrong', v:exception) 171940ee466cSBram Moolenaar endtry 1720f93c7feaSBram Moolenaarenddef 1721f93c7feaSBram Moolenaar 172247e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1723f5be8cdbSBram Moolenaar # only checks line continuation 1724cfcd011fSBram Moolenaar var lines =<< trim END 172547e880d6SBram Moolenaar vim9script 172647e880d6SBram Moolenaar try 172747e880d6SBram Moolenaar echoerr 'this' 172847e880d6SBram Moolenaar .. ' is ' .. 172947e880d6SBram Moolenaar 'wrong' 173047e880d6SBram Moolenaar catch 173147e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 173247e880d6SBram Moolenaar endtry 173347e880d6SBram Moolenaar END 173447e880d6SBram Moolenaar CheckScriptSuccess(lines) 173547e880d6SBram Moolenaarenddef 173647e880d6SBram Moolenaar 173741fe0617SBram Moolenaardef Test_for_outside_of_function() 1738cfcd011fSBram Moolenaar var lines =<< trim END 173941fe0617SBram Moolenaar vim9script 174041fe0617SBram Moolenaar new 174141fe0617SBram Moolenaar for var in range(0, 3) 174241fe0617SBram Moolenaar append(line('$'), var) 174341fe0617SBram Moolenaar endfor 174441fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 174541fe0617SBram Moolenaar bwipe! 174641fe0617SBram Moolenaar END 174741fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 174841fe0617SBram Moolenaar source Xvim9for.vim 174941fe0617SBram Moolenaar delete('Xvim9for.vim') 175041fe0617SBram Moolenaarenddef 17518a7d6542SBram Moolenaar 1752e8c4abbbSBram Moolenaardef Test_for_loop() 1753cfcd011fSBram Moolenaar var result = '' 1754e8c4abbbSBram Moolenaar for cnt in range(7) 1755e8c4abbbSBram Moolenaar if cnt == 4 1756e8c4abbbSBram Moolenaar break 1757e8c4abbbSBram Moolenaar endif 1758e8c4abbbSBram Moolenaar if cnt == 2 1759e8c4abbbSBram Moolenaar continue 1760e8c4abbbSBram Moolenaar endif 1761e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1762e8c4abbbSBram Moolenaar endfor 1763e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 17640ad3e894SBram Moolenaar 1765cfcd011fSBram Moolenaar var concat = '' 17660ad3e894SBram Moolenaar for str in eval('["one", "two"]') 17670ad3e894SBram Moolenaar concat ..= str 17680ad3e894SBram Moolenaar endfor 17690ad3e894SBram Moolenaar assert_equal('onetwo', concat) 1770e8c4abbbSBram Moolenaarenddef 1771e8c4abbbSBram Moolenaar 1772e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1773675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1774675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1775cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1776822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 1777451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1778675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1779675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1780675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1781e8c4abbbSBram Moolenaarenddef 1782e8c4abbbSBram Moolenaar 1783d0df1aacSBram Moolenaardef Test_while_loop() 1784cfcd011fSBram Moolenaar var result = '' 1785cfcd011fSBram Moolenaar var cnt = 0 1786d0df1aacSBram Moolenaar while cnt < 555 1787d0df1aacSBram Moolenaar if cnt == 3 1788d0df1aacSBram Moolenaar break 1789d0df1aacSBram Moolenaar endif 1790d0df1aacSBram Moolenaar cnt += 1 1791d0df1aacSBram Moolenaar if cnt == 2 1792d0df1aacSBram Moolenaar continue 1793d0df1aacSBram Moolenaar endif 1794d0df1aacSBram Moolenaar result ..= cnt .. '_' 1795d0df1aacSBram Moolenaar endwhile 1796d0df1aacSBram Moolenaar assert_equal('1_3_', result) 1797d0df1aacSBram Moolenaarenddef 1798d0df1aacSBram Moolenaar 1799e8c4abbbSBram Moolenaardef Test_while_loop_fails() 1800675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 1801675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 1802675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 1803675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 1804675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 1805675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 1806675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 1807bd5da371SBram Moolenaarenddef 1808bd5da371SBram Moolenaar 18099645e2d9SBram Moolenaardef Test_interrupt_loop() 1810cfcd011fSBram Moolenaar var caught = false 1811cfcd011fSBram Moolenaar var x = 0 181297acfc78SBram Moolenaar try 18139645e2d9SBram Moolenaar while 1 18149645e2d9SBram Moolenaar x += 1 18159645e2d9SBram Moolenaar if x == 100 18169645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 18179645e2d9SBram Moolenaar endif 18189645e2d9SBram Moolenaar endwhile 181997acfc78SBram Moolenaar catch 182097acfc78SBram Moolenaar caught = true 182197acfc78SBram Moolenaar assert_equal(100, x) 182297acfc78SBram Moolenaar endtry 182397acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 182425859dd7SBram Moolenaar # consume the CTRL-C 182525859dd7SBram Moolenaar getchar(0) 18269645e2d9SBram Moolenaarenddef 182720431c9dSBram Moolenaar 18284fdae999SBram Moolenaardef Test_automatic_line_continuation() 1829cfcd011fSBram Moolenaar var mylist = [ 18304fdae999SBram Moolenaar 'one', 18314fdae999SBram Moolenaar 'two', 18324fdae999SBram Moolenaar 'three', 1833f5be8cdbSBram Moolenaar ] # comment 18344fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 18354fdae999SBram Moolenaar 1836cfcd011fSBram Moolenaar var mydict = { 18374fdae999SBram Moolenaar 'one': 1, 18384fdae999SBram Moolenaar 'two': 2, 18394fdae999SBram Moolenaar 'three': 18404fdae999SBram Moolenaar 3, 1841f5be8cdbSBram Moolenaar } # comment 18424fdae999SBram Moolenaar assert_equal({'one': 1, 'two': 2, 'three': 3}, mydict) 18434fdae999SBram Moolenaar mydict = #{ 18442c330432SBram Moolenaar one: 1, # comment 18452c330432SBram Moolenaar two: # comment 18462c330432SBram Moolenaar 2, # comment 18472c330432SBram Moolenaar three: 3 # comment 18482c330432SBram Moolenaar } 18492c330432SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 18502c330432SBram Moolenaar mydict = #{ 18512c330432SBram Moolenaar one: 1, 18524fdae999SBram Moolenaar two: 18534fdae999SBram Moolenaar 2, 18542c330432SBram Moolenaar three: 3 18554fdae999SBram Moolenaar } 18564fdae999SBram Moolenaar assert_equal(#{one: 1, two: 2, three: 3}, mydict) 1857e6085c53SBram Moolenaar 1858e6085c53SBram Moolenaar assert_equal( 1859e6085c53SBram Moolenaar ['one', 'two', 'three'], 1860e6085c53SBram Moolenaar split('one two three') 1861e6085c53SBram Moolenaar ) 18624fdae999SBram Moolenaarenddef 18634fdae999SBram Moolenaar 18647a092245SBram Moolenaardef Test_vim9_comment() 18657a092245SBram Moolenaar CheckScriptSuccess([ 18667a092245SBram Moolenaar 'vim9script', 18677a092245SBram Moolenaar '# something', 18687a092245SBram Moolenaar ]) 18697a092245SBram Moolenaar CheckScriptFailure([ 18707a092245SBram Moolenaar 'vim9script', 18717a092245SBram Moolenaar ':# something', 18727a092245SBram Moolenaar ], 'E488:') 18737a092245SBram Moolenaar CheckScriptFailure([ 18747a092245SBram Moolenaar '# something', 18757a092245SBram Moolenaar ], 'E488:') 18767a092245SBram Moolenaar CheckScriptFailure([ 18777a092245SBram Moolenaar ':# something', 18787a092245SBram Moolenaar ], 'E488:') 18797a092245SBram Moolenaar 18804a8d9f2eSBram Moolenaar { # block start 18814a8d9f2eSBram Moolenaar } # block end 18824a8d9f2eSBram Moolenaar CheckDefFailure([ 18834a8d9f2eSBram Moolenaar '{# comment', 18844a8d9f2eSBram Moolenaar ], 'E488:') 18854a8d9f2eSBram Moolenaar CheckDefFailure([ 18864a8d9f2eSBram Moolenaar '{', 18874a8d9f2eSBram Moolenaar '}# comment', 18884a8d9f2eSBram Moolenaar ], 'E488:') 18894a8d9f2eSBram Moolenaar 18904a8d9f2eSBram Moolenaar echo "yes" # comment 18914a8d9f2eSBram Moolenaar CheckDefFailure([ 18924a8d9f2eSBram Moolenaar 'echo "yes"# comment', 18934a8d9f2eSBram Moolenaar ], 'E488:') 18947a092245SBram Moolenaar CheckScriptSuccess([ 18957a092245SBram Moolenaar 'vim9script', 18967a092245SBram Moolenaar 'echo "yes" # something', 18977a092245SBram Moolenaar ]) 18987a092245SBram Moolenaar CheckScriptFailure([ 18997a092245SBram Moolenaar 'vim9script', 19007a092245SBram Moolenaar 'echo "yes"# something', 19017a092245SBram Moolenaar ], 'E121:') 19027a092245SBram Moolenaar CheckScriptFailure([ 19037a092245SBram Moolenaar 'vim9script', 19047a092245SBram Moolenaar 'echo# something', 19057a092245SBram Moolenaar ], 'E121:') 19067a092245SBram Moolenaar CheckScriptFailure([ 19077a092245SBram Moolenaar 'echo "yes" # something', 19087a092245SBram Moolenaar ], 'E121:') 19097a092245SBram Moolenaar 19104a8d9f2eSBram Moolenaar exe "echo" # comment 19114a8d9f2eSBram Moolenaar CheckDefFailure([ 19124a8d9f2eSBram Moolenaar 'exe "echo"# comment', 19134a8d9f2eSBram Moolenaar ], 'E488:') 19144a8d9f2eSBram Moolenaar CheckScriptSuccess([ 19154a8d9f2eSBram Moolenaar 'vim9script', 19164a8d9f2eSBram Moolenaar 'exe "echo" # something', 19174a8d9f2eSBram Moolenaar ]) 19184a8d9f2eSBram Moolenaar CheckScriptFailure([ 19194a8d9f2eSBram Moolenaar 'vim9script', 19204a8d9f2eSBram Moolenaar 'exe "echo"# something', 19214a8d9f2eSBram Moolenaar ], 'E121:') 19224a8d9f2eSBram Moolenaar CheckDefFailure([ 19234a8d9f2eSBram Moolenaar 'exe # comment', 19244a8d9f2eSBram Moolenaar ], 'E1015:') 19254a8d9f2eSBram Moolenaar CheckScriptFailure([ 19264a8d9f2eSBram Moolenaar 'vim9script', 19274a8d9f2eSBram Moolenaar 'exe# something', 19284a8d9f2eSBram Moolenaar ], 'E121:') 19294a8d9f2eSBram Moolenaar CheckScriptFailure([ 19304a8d9f2eSBram Moolenaar 'exe "echo" # something', 19314a8d9f2eSBram Moolenaar ], 'E121:') 19324a8d9f2eSBram Moolenaar 19337a092245SBram Moolenaar CheckDefFailure([ 19347a092245SBram Moolenaar 'try# comment', 19357a092245SBram Moolenaar ' echo "yes"', 19367a092245SBram Moolenaar 'catch', 19377a092245SBram Moolenaar 'endtry', 19387a092245SBram Moolenaar ], 'E488:') 19392c5ed4e3SBram Moolenaar CheckScriptFailure([ 19402c5ed4e3SBram Moolenaar 'vim9script', 19412c5ed4e3SBram Moolenaar 'try# comment', 19422c5ed4e3SBram Moolenaar 'echo "yes"', 19432c5ed4e3SBram Moolenaar ], 'E488:') 19447a092245SBram Moolenaar CheckDefFailure([ 19457a092245SBram Moolenaar 'try', 1946a72cfb80SBram Moolenaar ' throw#comment', 1947a72cfb80SBram Moolenaar 'catch', 1948a72cfb80SBram Moolenaar 'endtry', 1949a72cfb80SBram Moolenaar ], 'E1015:') 1950a72cfb80SBram Moolenaar CheckDefFailure([ 1951a72cfb80SBram Moolenaar 'try', 1952a72cfb80SBram Moolenaar ' throw "yes"#comment', 1953a72cfb80SBram Moolenaar 'catch', 1954a72cfb80SBram Moolenaar 'endtry', 1955a72cfb80SBram Moolenaar ], 'E488:') 1956a72cfb80SBram Moolenaar CheckDefFailure([ 1957a72cfb80SBram Moolenaar 'try', 19587a092245SBram Moolenaar ' echo "yes"', 19597a092245SBram Moolenaar 'catch# comment', 19607a092245SBram Moolenaar 'endtry', 19617a092245SBram Moolenaar ], 'E488:') 19622c5ed4e3SBram Moolenaar CheckScriptFailure([ 19632c5ed4e3SBram Moolenaar 'vim9script', 19642c5ed4e3SBram Moolenaar 'try', 19652c5ed4e3SBram Moolenaar ' echo "yes"', 19662c5ed4e3SBram Moolenaar 'catch# comment', 19672c5ed4e3SBram Moolenaar 'endtry', 19682c5ed4e3SBram Moolenaar ], 'E654:') 19692c5ed4e3SBram Moolenaar CheckDefFailure([ 19702c5ed4e3SBram Moolenaar 'try', 19712c5ed4e3SBram Moolenaar ' echo "yes"', 19722c5ed4e3SBram Moolenaar 'catch /pat/# comment', 19732c5ed4e3SBram Moolenaar 'endtry', 19742c5ed4e3SBram Moolenaar ], 'E488:') 19757a092245SBram Moolenaar CheckDefFailure([ 19767a092245SBram Moolenaar 'try', 19777a092245SBram Moolenaar 'echo "yes"', 19787a092245SBram Moolenaar 'catch', 19797a092245SBram Moolenaar 'endtry# comment', 19807a092245SBram Moolenaar ], 'E488:') 19812c5ed4e3SBram Moolenaar CheckScriptFailure([ 19822c5ed4e3SBram Moolenaar 'vim9script', 19832c5ed4e3SBram Moolenaar 'try', 19842c5ed4e3SBram Moolenaar ' echo "yes"', 19852c5ed4e3SBram Moolenaar 'catch', 19862c5ed4e3SBram Moolenaar 'endtry# comment', 19879b7bf9e9SBram Moolenaar ], 'E488:') 19882c5ed4e3SBram Moolenaar 19892c5ed4e3SBram Moolenaar CheckScriptSuccess([ 19902c5ed4e3SBram Moolenaar 'vim9script', 19912c5ed4e3SBram Moolenaar 'hi # comment', 19922c5ed4e3SBram Moolenaar ]) 19932c5ed4e3SBram Moolenaar CheckScriptFailure([ 19942c5ed4e3SBram Moolenaar 'vim9script', 19952c5ed4e3SBram Moolenaar 'hi# comment', 19962c5ed4e3SBram Moolenaar ], 'E416:') 19971966c248SBram Moolenaar CheckScriptSuccess([ 19981966c248SBram Moolenaar 'vim9script', 19991966c248SBram Moolenaar 'hi Search # comment', 20001966c248SBram Moolenaar ]) 20011966c248SBram Moolenaar CheckScriptFailure([ 20021966c248SBram Moolenaar 'vim9script', 20031966c248SBram Moolenaar 'hi Search# comment', 20041966c248SBram Moolenaar ], 'E416:') 20051966c248SBram Moolenaar CheckScriptSuccess([ 20061966c248SBram Moolenaar 'vim9script', 20071966c248SBram Moolenaar 'hi link This Search # comment', 20081966c248SBram Moolenaar ]) 20091966c248SBram Moolenaar CheckScriptFailure([ 20101966c248SBram Moolenaar 'vim9script', 20111966c248SBram Moolenaar 'hi link This That# comment', 20121966c248SBram Moolenaar ], 'E413:') 20131966c248SBram Moolenaar CheckScriptSuccess([ 20141966c248SBram Moolenaar 'vim9script', 20151966c248SBram Moolenaar 'hi clear This # comment', 20161966c248SBram Moolenaar 'hi clear # comment', 20171966c248SBram Moolenaar ]) 2018f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2019f5be8cdbSBram Moolenaar # hi clear This# comment', 20201966c248SBram Moolenaar CheckScriptFailure([ 20211966c248SBram Moolenaar 'vim9script', 20221966c248SBram Moolenaar 'hi clear# comment', 20231966c248SBram Moolenaar ], 'E416:') 20241966c248SBram Moolenaar 20251966c248SBram Moolenaar CheckScriptSuccess([ 20261966c248SBram Moolenaar 'vim9script', 20271966c248SBram Moolenaar 'hi Group term=bold', 20281966c248SBram Moolenaar 'match Group /todo/ # comment', 20291966c248SBram Moolenaar ]) 20301966c248SBram Moolenaar CheckScriptFailure([ 20311966c248SBram Moolenaar 'vim9script', 20321966c248SBram Moolenaar 'hi Group term=bold', 20331966c248SBram Moolenaar 'match Group /todo/# comment', 20341966c248SBram Moolenaar ], 'E488:') 20351966c248SBram Moolenaar CheckScriptSuccess([ 20361966c248SBram Moolenaar 'vim9script', 20371966c248SBram Moolenaar 'match # comment', 20381966c248SBram Moolenaar ]) 20391966c248SBram Moolenaar CheckScriptFailure([ 20401966c248SBram Moolenaar 'vim9script', 20411966c248SBram Moolenaar 'match# comment', 20421966c248SBram Moolenaar ], 'E475:') 20431966c248SBram Moolenaar CheckScriptSuccess([ 20441966c248SBram Moolenaar 'vim9script', 20451966c248SBram Moolenaar 'match none # comment', 20461966c248SBram Moolenaar ]) 20471966c248SBram Moolenaar CheckScriptFailure([ 20481966c248SBram Moolenaar 'vim9script', 20491966c248SBram Moolenaar 'match none# comment', 20501966c248SBram Moolenaar ], 'E475:') 20511966c248SBram Moolenaar 20521966c248SBram Moolenaar CheckScriptSuccess([ 20531966c248SBram Moolenaar 'vim9script', 20541966c248SBram Moolenaar 'menutrans clear # comment', 20551966c248SBram Moolenaar ]) 20561966c248SBram Moolenaar CheckScriptFailure([ 20571966c248SBram Moolenaar 'vim9script', 20581966c248SBram Moolenaar 'menutrans clear# comment text', 20591966c248SBram Moolenaar ], 'E474:') 20601966c248SBram Moolenaar 20611966c248SBram Moolenaar CheckScriptSuccess([ 20621966c248SBram Moolenaar 'vim9script', 20631966c248SBram Moolenaar 'syntax clear # comment', 20641966c248SBram Moolenaar ]) 20651966c248SBram Moolenaar CheckScriptFailure([ 20661966c248SBram Moolenaar 'vim9script', 20671966c248SBram Moolenaar 'syntax clear# comment text', 20681966c248SBram Moolenaar ], 'E28:') 20691966c248SBram Moolenaar CheckScriptSuccess([ 20701966c248SBram Moolenaar 'vim9script', 20711966c248SBram Moolenaar 'syntax keyword Word some', 20721966c248SBram Moolenaar 'syntax clear Word # comment', 20731966c248SBram Moolenaar ]) 20741966c248SBram Moolenaar CheckScriptFailure([ 20751966c248SBram Moolenaar 'vim9script', 20761966c248SBram Moolenaar 'syntax keyword Word some', 20771966c248SBram Moolenaar 'syntax clear Word# comment text', 20781966c248SBram Moolenaar ], 'E28:') 20791966c248SBram Moolenaar 20801966c248SBram Moolenaar CheckScriptSuccess([ 20811966c248SBram Moolenaar 'vim9script', 20821966c248SBram Moolenaar 'syntax list # comment', 20831966c248SBram Moolenaar ]) 20841966c248SBram Moolenaar CheckScriptFailure([ 20851966c248SBram Moolenaar 'vim9script', 20861966c248SBram Moolenaar 'syntax list# comment text', 20871966c248SBram Moolenaar ], 'E28:') 20881966c248SBram Moolenaar 20891966c248SBram Moolenaar CheckScriptSuccess([ 20901966c248SBram Moolenaar 'vim9script', 20911966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 20921966c248SBram Moolenaar ]) 20931966c248SBram Moolenaar CheckScriptFailure([ 20941966c248SBram Moolenaar 'vim9script', 20951966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 20961966c248SBram Moolenaar ], 'E475:') 20971966c248SBram Moolenaar 20981966c248SBram Moolenaar CheckScriptSuccess([ 20991966c248SBram Moolenaar 'vim9script', 21001966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 21011966c248SBram Moolenaar ]) 21021966c248SBram Moolenaar CheckScriptFailure([ 21031966c248SBram Moolenaar 'vim9script', 21041966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 21051966c248SBram Moolenaar ], 'E789:') 21061966c248SBram Moolenaar 21071966c248SBram Moolenaar CheckScriptSuccess([ 21081966c248SBram Moolenaar 'vim9script', 21091966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 21101966c248SBram Moolenaar ]) 21111966c248SBram Moolenaar CheckScriptFailure([ 21121966c248SBram Moolenaar 'vim9script', 21131966c248SBram Moolenaar 'syntax match Word /pat/# comment', 21141966c248SBram Moolenaar ], 'E402:') 21151966c248SBram Moolenaar 21161966c248SBram Moolenaar CheckScriptSuccess([ 21171966c248SBram Moolenaar 'vim9script', 21181966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 21191966c248SBram Moolenaar ]) 21201966c248SBram Moolenaar CheckScriptFailure([ 21211966c248SBram Moolenaar 'vim9script', 21221966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 21231966c248SBram Moolenaar ], 'E475:') 21241966c248SBram Moolenaar CheckScriptFailure([ 21251966c248SBram Moolenaar 'vim9script', 21261966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 21271966c248SBram Moolenaar ], 'E406:') 21281966c248SBram Moolenaar CheckScriptFailure([ 21291966c248SBram Moolenaar 'vim9script', 21301966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 21311966c248SBram Moolenaar ], 'E475:') 21321966c248SBram Moolenaar 21331966c248SBram Moolenaar CheckScriptSuccess([ 21341966c248SBram Moolenaar 'vim9script', 21351966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 21361966c248SBram Moolenaar ]) 21371966c248SBram Moolenaar CheckScriptFailure([ 21381966c248SBram Moolenaar 'vim9script', 21391966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2140d032f34aSBram Moolenaar ], 'E402:') 21411966c248SBram Moolenaar 21421966c248SBram Moolenaar CheckScriptSuccess([ 21431966c248SBram Moolenaar 'vim9script', 21441966c248SBram Moolenaar 'syntax sync # comment', 21451966c248SBram Moolenaar ]) 21461966c248SBram Moolenaar CheckScriptFailure([ 21471966c248SBram Moolenaar 'vim9script', 21481966c248SBram Moolenaar 'syntax sync# comment', 21491966c248SBram Moolenaar ], 'E404:') 21501966c248SBram Moolenaar CheckScriptSuccess([ 21511966c248SBram Moolenaar 'vim9script', 21521966c248SBram Moolenaar 'syntax sync ccomment # comment', 21531966c248SBram Moolenaar ]) 21541966c248SBram Moolenaar CheckScriptFailure([ 21551966c248SBram Moolenaar 'vim9script', 21561966c248SBram Moolenaar 'syntax sync ccomment# comment', 21571966c248SBram Moolenaar ], 'E404:') 21581966c248SBram Moolenaar 21591966c248SBram Moolenaar CheckScriptSuccess([ 21601966c248SBram Moolenaar 'vim9script', 21611966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 21621966c248SBram Moolenaar ]) 21631966c248SBram Moolenaar CheckScriptFailure([ 21641966c248SBram Moolenaar 'vim9script', 21651966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 21661966c248SBram Moolenaar ], 'E475:') 2167a72cfb80SBram Moolenaar 2168a72cfb80SBram Moolenaar CheckScriptSuccess([ 2169a72cfb80SBram Moolenaar 'vim9script', 2170a72cfb80SBram Moolenaar 'command Echo echo # comment', 2171a72cfb80SBram Moolenaar 'command Echo # comment', 2172a72cfb80SBram Moolenaar ]) 2173a72cfb80SBram Moolenaar CheckScriptFailure([ 2174a72cfb80SBram Moolenaar 'vim9script', 2175a72cfb80SBram Moolenaar 'command Echo echo# comment', 2176a72cfb80SBram Moolenaar 'Echo', 2177a72cfb80SBram Moolenaar ], 'E121:') 2178a72cfb80SBram Moolenaar CheckScriptFailure([ 2179a72cfb80SBram Moolenaar 'vim9script', 2180a72cfb80SBram Moolenaar 'command Echo# comment', 2181a72cfb80SBram Moolenaar ], 'E182:') 2182a72cfb80SBram Moolenaar CheckScriptFailure([ 2183a72cfb80SBram Moolenaar 'vim9script', 2184a72cfb80SBram Moolenaar 'command Echo echo', 2185a72cfb80SBram Moolenaar 'command Echo# comment', 2186a72cfb80SBram Moolenaar ], 'E182:') 2187a72cfb80SBram Moolenaar 2188a72cfb80SBram Moolenaar CheckScriptSuccess([ 2189a72cfb80SBram Moolenaar 'vim9script', 2190a72cfb80SBram Moolenaar 'function # comment', 2191a72cfb80SBram Moolenaar ]) 2192a72cfb80SBram Moolenaar CheckScriptFailure([ 2193a72cfb80SBram Moolenaar 'vim9script', 21949898107fSBram Moolenaar 'function " comment', 21959898107fSBram Moolenaar ], 'E129:') 21969898107fSBram Moolenaar CheckScriptFailure([ 21979898107fSBram Moolenaar 'vim9script', 2198a72cfb80SBram Moolenaar 'function# comment', 2199a72cfb80SBram Moolenaar ], 'E129:') 2200a72cfb80SBram Moolenaar CheckScriptSuccess([ 2201a72cfb80SBram Moolenaar 'vim9script', 2202a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2203a72cfb80SBram Moolenaar ]) 2204a72cfb80SBram Moolenaar CheckScriptFailure([ 2205a72cfb80SBram Moolenaar 'vim9script', 2206a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2207a72cfb80SBram Moolenaar ], 'E488:') 2208a72cfb80SBram Moolenaar 2209a72cfb80SBram Moolenaar CheckScriptSuccess([ 2210a72cfb80SBram Moolenaar 'vim9script', 22114c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2212a72cfb80SBram Moolenaar 'endfunc', 22134c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2214a72cfb80SBram Moolenaar ]) 2215a72cfb80SBram Moolenaar CheckScriptFailure([ 2216a72cfb80SBram Moolenaar 'vim9script', 22174c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2218a72cfb80SBram Moolenaar 'endfunc', 22194c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2220a72cfb80SBram Moolenaar ], 'E488:') 2221a72cfb80SBram Moolenaar 2222a72cfb80SBram Moolenaar CheckScriptSuccess([ 2223a72cfb80SBram Moolenaar 'vim9script', 2224a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2225a72cfb80SBram Moolenaar ]) 2226a72cfb80SBram Moolenaar CheckScriptFailure([ 2227a72cfb80SBram Moolenaar 'vim9script', 2228a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2229a72cfb80SBram Moolenaar ], 'E488:') 2230e7e4838fSBram Moolenaar 2231e7e4838fSBram Moolenaar CheckScriptFailure([ 2232e7e4838fSBram Moolenaar 'def Test() " comment', 2233e7e4838fSBram Moolenaar 'enddef', 2234e7e4838fSBram Moolenaar ], 'E488:') 2235e7e4838fSBram Moolenaar CheckScriptFailure([ 2236e7e4838fSBram Moolenaar 'vim9script', 2237e7e4838fSBram Moolenaar 'def Test() " comment', 2238e7e4838fSBram Moolenaar 'enddef', 2239e7e4838fSBram Moolenaar ], 'E488:') 2240e7e4838fSBram Moolenaar 2241e7e4838fSBram Moolenaar CheckScriptSuccess([ 2242e7e4838fSBram Moolenaar 'func Test() " comment', 2243e7e4838fSBram Moolenaar 'endfunc', 2244e7e4838fSBram Moolenaar ]) 22459898107fSBram Moolenaar CheckScriptSuccess([ 2246e7e4838fSBram Moolenaar 'vim9script', 2247e7e4838fSBram Moolenaar 'func Test() " comment', 2248e7e4838fSBram Moolenaar 'endfunc', 22499898107fSBram Moolenaar ]) 2250e7e4838fSBram Moolenaar 2251e7e4838fSBram Moolenaar CheckScriptSuccess([ 2252e7e4838fSBram Moolenaar 'def Test() # comment', 2253e7e4838fSBram Moolenaar 'enddef', 2254e7e4838fSBram Moolenaar ]) 2255e7e4838fSBram Moolenaar CheckScriptFailure([ 2256e7e4838fSBram Moolenaar 'func Test() # comment', 2257e7e4838fSBram Moolenaar 'endfunc', 2258e7e4838fSBram Moolenaar ], 'E488:') 22592c5ed4e3SBram Moolenaarenddef 22602c5ed4e3SBram Moolenaar 22612c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 22622c5ed4e3SBram Moolenaar CheckCanRunGui 22632c5ed4e3SBram Moolenaar 22642c5ed4e3SBram Moolenaar CheckScriptFailure([ 22652c5ed4e3SBram Moolenaar 'vim9script', 22662c5ed4e3SBram Moolenaar 'gui#comment' 22672c5ed4e3SBram Moolenaar ], 'E499:') 22682c5ed4e3SBram Moolenaar CheckScriptFailure([ 22692c5ed4e3SBram Moolenaar 'vim9script', 22702c5ed4e3SBram Moolenaar 'gui -f#comment' 22712c5ed4e3SBram Moolenaar ], 'E499:') 22727a092245SBram Moolenaarenddef 22737a092245SBram Moolenaar 2274a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 22756797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 22766797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2277a26b9700SBram Moolenaar 2278a26b9700SBram Moolenaar edit test.vim 2279a26b9700SBram Moolenaar doautocmd TabEnter #comment 2280a26b9700SBram Moolenaar assert_equal(1, g:entered) 2281a26b9700SBram Moolenaar 2282a26b9700SBram Moolenaar doautocmd TabEnter f.x 2283a26b9700SBram Moolenaar assert_equal(2, g:entered) 2284a26b9700SBram Moolenaar 2285a26b9700SBram Moolenaar g:entered = 0 2286a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2287a26b9700SBram Moolenaar assert_equal(2, g:entered) 2288a26b9700SBram Moolenaar 2289a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2290a26b9700SBram Moolenaar 2291a26b9700SBram Moolenaar au! TabEnter 2292a26b9700SBram Moolenaar unlet g:entered 2293d72c1bf0SBram Moolenaar 2294d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2295d72c1bf0SBram Moolenaar 'vim9script', 22966797966dSBram Moolenaar 'g:var = 123', 2297e55b1c09SBram Moolenaar 'b:var = 456', 2298e55b1c09SBram Moolenaar 'w:var = 777', 2299e55b1c09SBram Moolenaar 't:var = 888', 2300d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2301d72c1bf0SBram Moolenaar ]) 2302d72c1bf0SBram Moolenaar 2303d72c1bf0SBram Moolenaar CheckScriptFailure([ 2304d72c1bf0SBram Moolenaar 'vim9script', 2305cfcd011fSBram Moolenaar 'let var = 123', 2306cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2307cfcd011fSBram Moolenaar 2308cfcd011fSBram Moolenaar CheckScriptFailure([ 2309cfcd011fSBram Moolenaar 'vim9script', 2310cfcd011fSBram Moolenaar 'var g:var = 123', 2311e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2312e55b1c09SBram Moolenaar 2313e55b1c09SBram Moolenaar CheckScriptFailure([ 2314e55b1c09SBram Moolenaar 'vim9script', 2315cfcd011fSBram Moolenaar 'var b:var = 123', 2316e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2317e55b1c09SBram Moolenaar 2318e55b1c09SBram Moolenaar CheckScriptFailure([ 2319e55b1c09SBram Moolenaar 'vim9script', 2320cfcd011fSBram Moolenaar 'var w:var = 123', 2321e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2322e55b1c09SBram Moolenaar 2323e55b1c09SBram Moolenaar CheckScriptFailure([ 2324e55b1c09SBram Moolenaar 'vim9script', 2325cfcd011fSBram Moolenaar 'var t:var = 123', 2326e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2327e55b1c09SBram Moolenaar 2328e55b1c09SBram Moolenaar CheckScriptFailure([ 2329e55b1c09SBram Moolenaar 'vim9script', 2330cfcd011fSBram Moolenaar 'var v:version = 123', 2331e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2332e55b1c09SBram Moolenaar 2333e55b1c09SBram Moolenaar CheckScriptFailure([ 2334e55b1c09SBram Moolenaar 'vim9script', 2335cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2336e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 23376797966dSBram Moolenaar 23386797966dSBram Moolenaar CheckScriptFailure([ 23396797966dSBram Moolenaar 'vim9script', 23406797966dSBram Moolenaar 'g:var = 123', 234132e35117SBram Moolenaar 'unlet g:var# comment1', 2342d72c1bf0SBram Moolenaar ], 'E108:') 2343d72c1bf0SBram Moolenaar 2344d72c1bf0SBram Moolenaar CheckScriptFailure([ 2345d72c1bf0SBram Moolenaar 'let g:var = 123', 2346d72c1bf0SBram Moolenaar 'unlet g:var # something', 2347d72c1bf0SBram Moolenaar ], 'E488:') 2348faac4104SBram Moolenaar 2349faac4104SBram Moolenaar CheckScriptSuccess([ 2350faac4104SBram Moolenaar 'vim9script', 235132e35117SBram Moolenaar 'if 1 # comment2', 2352faac4104SBram Moolenaar ' echo "yes"', 2353faac4104SBram Moolenaar 'elseif 2 #comment', 2354faac4104SBram Moolenaar ' echo "no"', 2355faac4104SBram Moolenaar 'endif', 2356faac4104SBram Moolenaar ]) 2357faac4104SBram Moolenaar 2358faac4104SBram Moolenaar CheckScriptFailure([ 2359faac4104SBram Moolenaar 'vim9script', 236032e35117SBram Moolenaar 'if 1# comment3', 2361faac4104SBram Moolenaar ' echo "yes"', 2362faac4104SBram Moolenaar 'endif', 2363faac4104SBram Moolenaar ], 'E15:') 2364faac4104SBram Moolenaar 2365faac4104SBram Moolenaar CheckScriptFailure([ 2366faac4104SBram Moolenaar 'vim9script', 236732e35117SBram Moolenaar 'if 0 # comment4', 2368faac4104SBram Moolenaar ' echo "yes"', 2369faac4104SBram Moolenaar 'elseif 2#comment', 2370faac4104SBram Moolenaar ' echo "no"', 2371faac4104SBram Moolenaar 'endif', 2372faac4104SBram Moolenaar ], 'E15:') 2373faac4104SBram Moolenaar 2374faac4104SBram Moolenaar CheckScriptSuccess([ 2375faac4104SBram Moolenaar 'vim9script', 2376cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2377faac4104SBram Moolenaar ]) 2378faac4104SBram Moolenaar 2379faac4104SBram Moolenaar CheckScriptFailure([ 2380faac4104SBram Moolenaar 'vim9script', 2381cfcd011fSBram Moolenaar 'var v = 1# comment6', 238232e35117SBram Moolenaar ], 'E15:') 2383faac4104SBram Moolenaar 2384faac4104SBram Moolenaar CheckScriptSuccess([ 2385faac4104SBram Moolenaar 'vim9script', 2386faac4104SBram Moolenaar 'new' 2387d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2388df069eecSBram Moolenaar ':$', 2389faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2390faac4104SBram Moolenaar 'bwipe!', 2391faac4104SBram Moolenaar ]) 2392faac4104SBram Moolenaar 2393f5be8cdbSBram Moolenaar CheckScriptFailure([ 2394f5be8cdbSBram Moolenaar 'vim9script', 2395f5be8cdbSBram Moolenaar 'new' 2396d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2397f5be8cdbSBram Moolenaar ':$', 2398f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2399f5be8cdbSBram Moolenaar 'bwipe!', 2400f5be8cdbSBram Moolenaar ], 'E488:') 2401f5be8cdbSBram Moolenaar 2402f5be8cdbSBram Moolenaar CheckScriptFailure([ 2403f5be8cdbSBram Moolenaar 'vim9script', 2404f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2405f5be8cdbSBram Moolenaar ], 'E477:') 2406a26b9700SBram Moolenaarenddef 2407a26b9700SBram Moolenaar 24087e5bd91dSBram Moolenaardef Test_finish() 2409cfcd011fSBram Moolenaar var lines =<< trim END 24107e5bd91dSBram Moolenaar vim9script 24116797966dSBram Moolenaar g:res = 'one' 24127e5bd91dSBram Moolenaar if v:false | finish | endif 24136797966dSBram Moolenaar g:res = 'two' 24147e5bd91dSBram Moolenaar finish 24156797966dSBram Moolenaar g:res = 'three' 24167e5bd91dSBram Moolenaar END 24177e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 24187e5bd91dSBram Moolenaar source Xfinished 24197e5bd91dSBram Moolenaar assert_equal('two', g:res) 24207e5bd91dSBram Moolenaar 24217e5bd91dSBram Moolenaar unlet g:res 24227e5bd91dSBram Moolenaar delete('Xfinished') 24237e5bd91dSBram Moolenaarenddef 24247e5bd91dSBram Moolenaar 2425a5d0077eSBram Moolenaardef Test_forward_declaration() 2426cfcd011fSBram Moolenaar var lines =<< trim END 2427a5d0077eSBram Moolenaar vim9script 2428a5d0077eSBram Moolenaar def GetValue(): string 2429a5d0077eSBram Moolenaar return theVal 2430a5d0077eSBram Moolenaar enddef 2431cfcd011fSBram Moolenaar var theVal = 'something' 2432822ba247SBram Moolenaar g:initVal = GetValue() 2433a5d0077eSBram Moolenaar theVal = 'else' 2434a5d0077eSBram Moolenaar g:laterVal = GetValue() 2435a5d0077eSBram Moolenaar END 2436a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2437a5d0077eSBram Moolenaar source Xforward 2438a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2439a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2440a5d0077eSBram Moolenaar 2441a5d0077eSBram Moolenaar unlet g:initVal 2442a5d0077eSBram Moolenaar unlet g:laterVal 2443a5d0077eSBram Moolenaar delete('Xforward') 2444a5d0077eSBram Moolenaarenddef 2445a5d0077eSBram Moolenaar 24469721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2447cfcd011fSBram Moolenaar var legacy_lines =<< trim END 24489721fb4eSBram Moolenaar source Xvim9_script.vim 24499721fb4eSBram Moolenaar 24509721fb4eSBram Moolenaar call assert_false(exists('local')) 24519721fb4eSBram Moolenaar call assert_false(exists('exported')) 24529721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 24539721fb4eSBram Moolenaar call assert_equal('global', global) 24549721fb4eSBram Moolenaar call assert_equal('global', g:global) 24559721fb4eSBram Moolenaar 24569721fb4eSBram Moolenaar " imported variable becomes script-local 24579721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 24589721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 24599721fb4eSBram Moolenaar call assert_false(exists('exported')) 24609721fb4eSBram Moolenaar 24619721fb4eSBram Moolenaar " imported function becomes script-local 24629721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 24639721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 24649721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 24659721fb4eSBram Moolenaar END 24669721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 24679721fb4eSBram Moolenaar 2468cfcd011fSBram Moolenaar var vim9_lines =<< trim END 24699721fb4eSBram Moolenaar vim9script 2470cfcd011fSBram Moolenaar var local = 'local' 24719721fb4eSBram Moolenaar g:global = 'global' 2472cfcd011fSBram Moolenaar export var exported = 'exported' 24739721fb4eSBram Moolenaar export def GetText(): string 24749721fb4eSBram Moolenaar return 'text' 24759721fb4eSBram Moolenaar enddef 24769721fb4eSBram Moolenaar END 24779721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 24789721fb4eSBram Moolenaar 24799721fb4eSBram Moolenaar source Xlegacy_script.vim 24809721fb4eSBram Moolenaar 24819721fb4eSBram Moolenaar assert_equal('global', g:global) 2482f5be8cdbSBram Moolenaar unlet g:global 24839721fb4eSBram Moolenaar 24849721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 24859721fb4eSBram Moolenaar delete('Xvim9_script.vim') 24869721fb4eSBram Moolenaarenddef 2487a5d0077eSBram Moolenaar 24887d699701SBram Moolenaarfunc Test_vim9script_not_global() 24897d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 24907d699701SBram Moolenaar let vim9lines =<< trim END 24917d699701SBram Moolenaar vim9script 2492cfcd011fSBram Moolenaar var name = 'local' 24937d699701SBram Moolenaar func TheFunc() 24947d699701SBram Moolenaar echo 'local' 24957d699701SBram Moolenaar endfunc 24967d699701SBram Moolenaar def DefFunc() 24977d699701SBram Moolenaar echo 'local' 24987d699701SBram Moolenaar enddef 24997d699701SBram Moolenaar END 25007d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 25017d699701SBram Moolenaar source Xvim9script.vim 25027d699701SBram Moolenaar try 25037d699701SBram Moolenaar echo g:var 25047d699701SBram Moolenaar assert_report('did not fail') 25057d699701SBram Moolenaar catch /E121:/ 25067d699701SBram Moolenaar " caught 25077d699701SBram Moolenaar endtry 25087d699701SBram Moolenaar try 25097d699701SBram Moolenaar call TheFunc() 25107d699701SBram Moolenaar assert_report('did not fail') 25117d699701SBram Moolenaar catch /E117:/ 25127d699701SBram Moolenaar " caught 25137d699701SBram Moolenaar endtry 25147d699701SBram Moolenaar try 25157d699701SBram Moolenaar call DefFunc() 25167d699701SBram Moolenaar assert_report('did not fail') 25177d699701SBram Moolenaar catch /E117:/ 25187d699701SBram Moolenaar " caught 25197d699701SBram Moolenaar endtry 25207d699701SBram Moolenaar 252125859dd7SBram Moolenaar call delete('Xvim9script.vim') 25227d699701SBram Moolenaarendfunc 25237d699701SBram Moolenaar 2524eeb27bfeSBram Moolenaardef Test_vim9_copen() 2525eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2526eeb27bfeSBram Moolenaar copen 2527eeb27bfeSBram Moolenaar quit 2528eeb27bfeSBram Moolenaarenddef 2529eeb27bfeSBram Moolenaar 25302d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 25312d6b20d6SBram Moolenaardef Test_vim9_autoload() 2532cfcd011fSBram Moolenaar var lines =<< trim END 25332d6b20d6SBram Moolenaar vim9script 25342d6b20d6SBram Moolenaar def foo#test() 25352d6b20d6SBram Moolenaar echomsg getreg('"') 25362d6b20d6SBram Moolenaar enddef 25372d6b20d6SBram Moolenaar END 25382d6b20d6SBram Moolenaar 25392d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 25402d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2541cfcd011fSBram Moolenaar var save_rtp = &rtp 25422d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 25432d6b20d6SBram Moolenaar augroup test 25442d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 25452d6b20d6SBram Moolenaar augroup END 25462d6b20d6SBram Moolenaar 25472d6b20d6SBram Moolenaar normal Y 25482d6b20d6SBram Moolenaar 25492d6b20d6SBram Moolenaar augroup test 25502d6b20d6SBram Moolenaar autocmd! 25512d6b20d6SBram Moolenaar augroup END 25522d6b20d6SBram Moolenaar delete('Xdir', 'rf') 25532d6b20d6SBram Moolenaar &rtp = save_rtp 25542d6b20d6SBram Moolenaarenddef 25552d6b20d6SBram Moolenaar 255677e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 255777e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2558cfcd011fSBram Moolenaar var lines =<< trim END 255977e5dcc3SBram Moolenaar vim9script 256077e5dcc3SBram Moolenaar def crash#func() 256177e5dcc3SBram Moolenaar try 256277e5dcc3SBram Moolenaar for x in List() 256377e5dcc3SBram Moolenaar endfor 256477e5dcc3SBram Moolenaar catch 256577e5dcc3SBram Moolenaar endtry 256677e5dcc3SBram Moolenaar g:ok = true 256777e5dcc3SBram Moolenaar enddef 256877e5dcc3SBram Moolenaar fu List() 256977e5dcc3SBram Moolenaar invalid 257077e5dcc3SBram Moolenaar endfu 257177e5dcc3SBram Moolenaar try 257277e5dcc3SBram Moolenaar invalid 257377e5dcc3SBram Moolenaar catch /wontmatch/ 257477e5dcc3SBram Moolenaar endtry 257577e5dcc3SBram Moolenaar END 257677e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 257777e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 257877e5dcc3SBram Moolenaar 257977e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 258077e5dcc3SBram Moolenaar lines =<< trim END 258177e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 258277e5dcc3SBram Moolenaar call crash#func() 258377e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 25849c4f5520SBram Moolenaar qall! 258577e5dcc3SBram Moolenaar END 258677e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 258777e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 258877e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 258977e5dcc3SBram Moolenaar 259077e5dcc3SBram Moolenaar delete('Xdidit') 259177e5dcc3SBram Moolenaar delete('Xscript') 259277e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 259377e5dcc3SBram Moolenaarenddef 259477e5dcc3SBram Moolenaar 259581e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 259681e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 259781e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2598cfcd011fSBram Moolenaar var lines =<< trim END 259981e17fbeSBram Moolenaar let s:counter = 1 260081e17fbeSBram Moolenaar def s:Func() 260181e17fbeSBram Moolenaar au! CursorHold 260281e17fbeSBram Moolenaar au CursorHold * s:counter += 1 260381e17fbeSBram Moolenaar enddef 260481e17fbeSBram Moolenaar call s:Func() 260581e17fbeSBram Moolenaar doau CursorHold 260681e17fbeSBram Moolenaar call assert_equal(2, s:counter) 260781e17fbeSBram Moolenaar au! CursorHold 260881e17fbeSBram Moolenaar END 260981e17fbeSBram Moolenaar CheckScriptSuccess(lines) 261081e17fbeSBram Moolenaarenddef 261181e17fbeSBram Moolenaar 26123896a105SBram Moolenaardef Test_cmdline_win() 26133896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 26143896a105SBram Moolenaar # the command line window. 26153896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2616cfcd011fSBram Moolenaar var export_lines =<< trim END 26173896a105SBram Moolenaar vim9script 2618cfcd011fSBram Moolenaar export var That = 'yes' 26193896a105SBram Moolenaar END 26203896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2621cfcd011fSBram Moolenaar var import_lines =<< trim END 26223896a105SBram Moolenaar vim9script 26233896a105SBram Moolenaar import That from './Xexport.vim' 26243896a105SBram Moolenaar END 26253896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2626cfcd011fSBram Moolenaar var save_rtp = &rtp 26273896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 26283896a105SBram Moolenaar syntax on 26293896a105SBram Moolenaar augroup CmdWin 26303896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 26313896a105SBram Moolenaar augroup END 26323896a105SBram Moolenaar # this will open and also close the cmdline window 26333896a105SBram Moolenaar feedkeys('q:', 'xt') 26343896a105SBram Moolenaar assert_equal('yes', g:got_there) 26353896a105SBram Moolenaar 26363896a105SBram Moolenaar augroup CmdWin 26373896a105SBram Moolenaar au! 26383896a105SBram Moolenaar augroup END 26393896a105SBram Moolenaar &rtp = save_rtp 26403896a105SBram Moolenaar delete('rtp', 'rf') 26413896a105SBram Moolenaarenddef 26423896a105SBram Moolenaar 2643e3d4685fSBram Moolenaardef Test_invalid_sid() 2644e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 264525859dd7SBram Moolenaar 26469c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2647d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2648e3d4685fSBram Moolenaar endif 2649e3d4685fSBram Moolenaar delete('Xdidit') 2650e3d4685fSBram Moolenaarenddef 2651e3d4685fSBram Moolenaar 2652f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2653cfcd011fSBram Moolenaar var lines =<< trim END 2654cfcd011fSBram Moolenaar var name: any 2655cfcd011fSBram Moolenaar assert_equal(0, name) 2656f0afd9e1SBram Moolenaar END 2657f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2658f0afd9e1SBram Moolenaarenddef 2659f0afd9e1SBram Moolenaar 26607e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 266158dbef33SBram Moolenaar CheckRunVimInTerminal 266258dbef33SBram Moolenaar 26637e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 26647e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 26657e9210eaSBram Moolenaarendfunc 26667e9210eaSBram Moolenaar 26677e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 26689c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 2669cfcd011fSBram Moolenaar var lines =<< trim END 26709c4f5520SBram Moolenaar func CheckAndQuit() 26719c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 26729c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 26739c4f5520SBram Moolenaar endfunc 26749c4f5520SBram Moolenaar END 26759c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 26769c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 2677cfcd011fSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', #{rows: 6}) 26789c4f5520SBram Moolenaar # define Afunc() on the command line 26799c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 26809c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 26819c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 26829c4f5520SBram Moolenaar 26839c4f5520SBram Moolenaar call StopVimInTerminal(buf) 26849c4f5520SBram Moolenaar delete('XcallFunc') 26859c4f5520SBram Moolenaar delete('Xdidcmd') 26869c4f5520SBram Moolenaarenddef 26879c4f5520SBram Moolenaar 2688fcdc5d83SBram Moolenaardef Test_script_var_scope() 2689fcdc5d83SBram Moolenaar var lines =<< trim END 2690fcdc5d83SBram Moolenaar vim9script 2691fcdc5d83SBram Moolenaar if true 2692fcdc5d83SBram Moolenaar if true 2693fcdc5d83SBram Moolenaar var one = 'one' 2694fcdc5d83SBram Moolenaar echo one 2695fcdc5d83SBram Moolenaar endif 2696fcdc5d83SBram Moolenaar echo one 2697fcdc5d83SBram Moolenaar endif 2698fcdc5d83SBram Moolenaar END 2699fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2700fcdc5d83SBram Moolenaar 2701fcdc5d83SBram Moolenaar lines =<< trim END 2702fcdc5d83SBram Moolenaar vim9script 2703fcdc5d83SBram Moolenaar if true 2704fcdc5d83SBram Moolenaar if false 2705fcdc5d83SBram Moolenaar var one = 'one' 2706fcdc5d83SBram Moolenaar echo one 2707fcdc5d83SBram Moolenaar else 2708fcdc5d83SBram Moolenaar var one = 'one' 2709fcdc5d83SBram Moolenaar echo one 2710fcdc5d83SBram Moolenaar endif 2711fcdc5d83SBram Moolenaar echo one 2712fcdc5d83SBram Moolenaar endif 2713fcdc5d83SBram Moolenaar END 2714fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 2715fcdc5d83SBram Moolenaar 2716fcdc5d83SBram Moolenaar lines =<< trim END 2717fcdc5d83SBram Moolenaar vim9script 2718fcdc5d83SBram Moolenaar while true 2719fcdc5d83SBram Moolenaar var one = 'one' 2720fcdc5d83SBram Moolenaar echo one 2721fcdc5d83SBram Moolenaar break 2722fcdc5d83SBram Moolenaar endwhile 2723fcdc5d83SBram Moolenaar echo one 2724fcdc5d83SBram Moolenaar END 2725fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2726fcdc5d83SBram Moolenaar 2727fcdc5d83SBram Moolenaar lines =<< trim END 2728fcdc5d83SBram Moolenaar vim9script 2729fcdc5d83SBram Moolenaar for i in range(1) 2730fcdc5d83SBram Moolenaar var one = 'one' 2731fcdc5d83SBram Moolenaar echo one 2732fcdc5d83SBram Moolenaar endfor 2733fcdc5d83SBram Moolenaar echo one 2734fcdc5d83SBram Moolenaar END 2735fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 2736*9becdf2bSBram Moolenaar 2737*9becdf2bSBram Moolenaar lines =<< trim END 2738*9becdf2bSBram Moolenaar vim9script 2739*9becdf2bSBram Moolenaar { 2740*9becdf2bSBram Moolenaar var one = 'one' 2741*9becdf2bSBram Moolenaar assert_equal('one', one) 2742*9becdf2bSBram Moolenaar } 2743*9becdf2bSBram Moolenaar assert_false(exists('one')) 2744*9becdf2bSBram Moolenaar assert_false(exists('s:one')) 2745*9becdf2bSBram Moolenaar END 2746*9becdf2bSBram Moolenaar CheckScriptSuccess(lines) 2747*9becdf2bSBram Moolenaar 2748*9becdf2bSBram Moolenaar lines =<< trim END 2749*9becdf2bSBram Moolenaar vim9script 2750*9becdf2bSBram Moolenaar { 2751*9becdf2bSBram Moolenaar var one = 'one' 2752*9becdf2bSBram Moolenaar echo one 2753*9becdf2bSBram Moolenaar } 2754*9becdf2bSBram Moolenaar echo one 2755*9becdf2bSBram Moolenaar END 2756*9becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 2757fcdc5d83SBram Moolenaarenddef 2758fcdc5d83SBram Moolenaar 2759585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 2760585fea7bSBram Moolenaardef Test_substitute_cmd() 2761585fea7bSBram Moolenaar new 2762585fea7bSBram Moolenaar setline(1, 'something') 2763585fea7bSBram Moolenaar :substitute(some(other( 2764585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2765585fea7bSBram Moolenaar bwipe! 2766585fea7bSBram Moolenaar 2767f5be8cdbSBram Moolenaar # also when the context is Vim9 script 2768cfcd011fSBram Moolenaar var lines =<< trim END 2769585fea7bSBram Moolenaar vim9script 2770585fea7bSBram Moolenaar new 2771585fea7bSBram Moolenaar setline(1, 'something') 2772585fea7bSBram Moolenaar :substitute(some(other( 2773585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 2774585fea7bSBram Moolenaar bwipe! 2775585fea7bSBram Moolenaar END 2776585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 2777585fea7bSBram Moolenaar source Xvim9lines 2778585fea7bSBram Moolenaar 2779585fea7bSBram Moolenaar delete('Xvim9lines') 2780585fea7bSBram Moolenaarenddef 2781585fea7bSBram Moolenaar 27828a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 2783