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 180e0de171eSBram Moolenaar var vardict = {five: 5, six: 6} 181e0de171eSBram 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 187e0de171eSBram 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 215e0de171eSBram 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 222e0de171eSBram Moolenaar const dd = {one: 1, two: 2} 2230b4c66c6SBram Moolenaar dd["three"] = 99 2240b4c66c6SBram Moolenaar END 2250b4c66c6SBram Moolenaar CheckDefExecFailure(lines, 'E1120:') 2260b4c66c6SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, 'E741:', 3) 2270b4c66c6SBram Moolenaarenddef 2280b4c66c6SBram Moolenaar 229df069eecSBram Moolenaardef Test_range_no_colon() 230d2c61705SBram Moolenaar CheckDefFailure(['%s/a/b/'], 'E1050:') 231d2c61705SBram Moolenaar CheckDefFailure(['+ s/a/b/'], 'E1050:') 232d2c61705SBram Moolenaar CheckDefFailure(['- s/a/b/'], 'E1050:') 233d2c61705SBram Moolenaar CheckDefFailure(['. s/a/b/'], 'E1050:') 234df069eecSBram Moolenaarenddef 235df069eecSBram Moolenaar 236df069eecSBram Moolenaar 2378a7d6542SBram Moolenaardef Test_block() 238cfcd011fSBram Moolenaar var outer = 1 2398a7d6542SBram Moolenaar { 240cfcd011fSBram Moolenaar var inner = 2 2418a7d6542SBram Moolenaar assert_equal(1, outer) 2428a7d6542SBram Moolenaar assert_equal(2, inner) 2438a7d6542SBram Moolenaar } 2448a7d6542SBram Moolenaar assert_equal(1, outer) 2458a7d6542SBram Moolenaarenddef 2468a7d6542SBram Moolenaar 24708052228SBram Moolenaardef Test_block_failure() 248cfcd011fSBram Moolenaar CheckDefFailure(['{', 'var inner = 1', '}', 'echo inner'], 'E1001:') 24908052228SBram Moolenaar CheckDefFailure(['}'], 'E1025:') 25008052228SBram Moolenaar CheckDefFailure(['{', 'echo 1'], 'E1026:') 25108052228SBram Moolenaarenddef 2528a7d6542SBram Moolenaar 253fbbcd003SBram Moolenaardef Test_block_local_vars() 254fbbcd003SBram Moolenaar var lines =<< trim END 255fbbcd003SBram Moolenaar vim9script 256ed234f24SBram Moolenaar v:testing = 1 257fbbcd003SBram Moolenaar if true 258ed234f24SBram Moolenaar var text = ['hello'] 259ed234f24SBram Moolenaar def SayHello(): list<string> 260fbbcd003SBram Moolenaar return text 261fbbcd003SBram Moolenaar enddef 262fbbcd003SBram Moolenaar def SetText(v: string) 263ed234f24SBram Moolenaar text = [v] 264fbbcd003SBram Moolenaar enddef 265fbbcd003SBram Moolenaar endif 266fbbcd003SBram Moolenaar 267fbbcd003SBram Moolenaar if true 268ed234f24SBram Moolenaar var text = ['again'] 269ed234f24SBram Moolenaar def SayAgain(): list<string> 270fbbcd003SBram Moolenaar return text 271fbbcd003SBram Moolenaar enddef 272fbbcd003SBram Moolenaar endif 273ed234f24SBram Moolenaar 274ed234f24SBram Moolenaar # test that the "text" variables are not cleaned up 275ed234f24SBram Moolenaar test_garbagecollect_now() 276ed234f24SBram Moolenaar 277fbbcd003SBram Moolenaar defcompile 278fbbcd003SBram Moolenaar 279ed234f24SBram Moolenaar assert_equal(['hello'], SayHello()) 280ed234f24SBram Moolenaar assert_equal(['again'], SayAgain()) 281fbbcd003SBram Moolenaar 282fbbcd003SBram Moolenaar SetText('foobar') 283ed234f24SBram Moolenaar assert_equal(['foobar'], SayHello()) 284ed234f24SBram Moolenaar 285ed234f24SBram Moolenaar call writefile(['ok'], 'Xdidit') 286ed234f24SBram Moolenaar qall! 287fbbcd003SBram Moolenaar END 288ed234f24SBram Moolenaar 289ed234f24SBram Moolenaar # need to execute this with a separate Vim instance to avoid the current 290ed234f24SBram Moolenaar # context gets garbage collected. 291ed234f24SBram Moolenaar writefile(lines, 'Xscript') 292ed234f24SBram Moolenaar RunVim([], [], '-S Xscript') 293ed234f24SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 294ed234f24SBram Moolenaar 295ed234f24SBram Moolenaar delete('Xscript') 296ed234f24SBram Moolenaar delete('Xdidit') 297fbbcd003SBram Moolenaarenddef 298fbbcd003SBram Moolenaar 29939ca4127SBram Moolenaardef Test_block_local_vars_with_func() 30039ca4127SBram Moolenaar var lines =<< trim END 30139ca4127SBram Moolenaar vim9script 30239ca4127SBram Moolenaar if true 30339ca4127SBram Moolenaar var foo = 'foo' 30439ca4127SBram Moolenaar if true 30539ca4127SBram Moolenaar var bar = 'bar' 30639ca4127SBram Moolenaar def Func(): list<string> 30739ca4127SBram Moolenaar return [foo, bar] 30839ca4127SBram Moolenaar enddef 30939ca4127SBram Moolenaar endif 31039ca4127SBram Moolenaar endif 31139ca4127SBram Moolenaar # function is compiled here, after blocks have finished, can still access 31239ca4127SBram Moolenaar # "foo" and "bar" 31339ca4127SBram Moolenaar assert_equal(['foo', 'bar'], Func()) 31439ca4127SBram Moolenaar END 31539ca4127SBram Moolenaar CheckScriptSuccess(lines) 31639ca4127SBram Moolenaarenddef 31739ca4127SBram Moolenaar 318d032f34aSBram Moolenaarfunc g:NoSuchFunc() 319d032f34aSBram Moolenaar echo 'none' 320d032f34aSBram Moolenaarendfunc 321d032f34aSBram Moolenaar 3228a7d6542SBram Moolenaardef Test_try_catch() 323cfcd011fSBram Moolenaar var l = [] 3247a092245SBram Moolenaar try # comment 3258a7d6542SBram Moolenaar add(l, '1') 3268a7d6542SBram Moolenaar throw 'wrong' 3278a7d6542SBram Moolenaar add(l, '2') 3287a092245SBram Moolenaar catch # comment 3298a7d6542SBram Moolenaar add(l, v:exception) 3307a092245SBram Moolenaar finally # comment 3318a7d6542SBram Moolenaar add(l, '3') 3327a092245SBram Moolenaar endtry # comment 3338a7d6542SBram Moolenaar assert_equal(['1', 'wrong', '3'], l) 33468d130c6SBram Moolenaar 335e859312eSBram Moolenaar l = [] 336e859312eSBram Moolenaar try 337e859312eSBram Moolenaar try 338e859312eSBram Moolenaar add(l, '1') 339e859312eSBram Moolenaar throw 'wrong' 340e859312eSBram Moolenaar add(l, '2') 341e859312eSBram Moolenaar catch /right/ 342e859312eSBram Moolenaar add(l, v:exception) 343e859312eSBram Moolenaar endtry 344e859312eSBram Moolenaar catch /wrong/ 345e859312eSBram Moolenaar add(l, 'caught') 346373863edSBram Moolenaar fina 347e859312eSBram Moolenaar add(l, 'finally') 348e859312eSBram Moolenaar endtry 349e859312eSBram Moolenaar assert_equal(['1', 'caught', 'finally'], l) 350e859312eSBram Moolenaar 351cfcd011fSBram Moolenaar var n: number 35268d130c6SBram Moolenaar try 35368d130c6SBram Moolenaar n = l[3] 35468d130c6SBram Moolenaar catch /E684:/ 35568d130c6SBram Moolenaar n = 99 35668d130c6SBram Moolenaar endtry 35768d130c6SBram Moolenaar assert_equal(99, n) 35868d130c6SBram Moolenaar 35968d130c6SBram Moolenaar try 360cc673e74SBram Moolenaar # string slice returns a string, not a number 36168d130c6SBram Moolenaar n = g:astring[3] 3625e654230SBram Moolenaar catch /E1012:/ 36368d130c6SBram Moolenaar n = 77 36468d130c6SBram Moolenaar endtry 36568d130c6SBram Moolenaar assert_equal(77, n) 36668d130c6SBram Moolenaar 36768d130c6SBram Moolenaar try 36868d130c6SBram Moolenaar n = l[g:astring] 3695e654230SBram Moolenaar catch /E1012:/ 37056acb094SBram Moolenaar n = 88 37168d130c6SBram Moolenaar endtry 37256acb094SBram Moolenaar assert_equal(88, n) 37368d130c6SBram Moolenaar 37468d130c6SBram Moolenaar try 37568d130c6SBram Moolenaar n = s:does_not_exist 37668d130c6SBram Moolenaar catch /E121:/ 377f0b9f43cSBram Moolenaar n = 111 378f0b9f43cSBram Moolenaar endtry 379f0b9f43cSBram Moolenaar assert_equal(111, n) 380f0b9f43cSBram Moolenaar 381f0b9f43cSBram Moolenaar try 382f0b9f43cSBram Moolenaar n = g:does_not_exist 383f0b9f43cSBram Moolenaar catch /E121:/ 38468d130c6SBram Moolenaar n = 121 38568d130c6SBram Moolenaar endtry 38668d130c6SBram Moolenaar assert_equal(121, n) 38768d130c6SBram Moolenaar 388e0de171eSBram Moolenaar var d = {one: 1} 38968d130c6SBram Moolenaar try 39068d130c6SBram Moolenaar n = d[g:astring] 39168d130c6SBram Moolenaar catch /E716:/ 39268d130c6SBram Moolenaar n = 222 39368d130c6SBram Moolenaar endtry 39468d130c6SBram Moolenaar assert_equal(222, n) 395f0b9f43cSBram Moolenaar 396f0b9f43cSBram Moolenaar try 397f0b9f43cSBram Moolenaar n = -g:astring 398f0b9f43cSBram Moolenaar catch /E39:/ 399f0b9f43cSBram Moolenaar n = 233 400f0b9f43cSBram Moolenaar endtry 401f0b9f43cSBram Moolenaar assert_equal(233, n) 402f0b9f43cSBram Moolenaar 403f0b9f43cSBram Moolenaar try 404f0b9f43cSBram Moolenaar n = +g:astring 405f0b9f43cSBram Moolenaar catch /E1030:/ 406f0b9f43cSBram Moolenaar n = 244 407f0b9f43cSBram Moolenaar endtry 408f0b9f43cSBram Moolenaar assert_equal(244, n) 409f0b9f43cSBram Moolenaar 410f0b9f43cSBram Moolenaar try 411f0b9f43cSBram Moolenaar n = +g:alist 412f0b9f43cSBram Moolenaar catch /E745:/ 413f0b9f43cSBram Moolenaar n = 255 414f0b9f43cSBram Moolenaar endtry 415f0b9f43cSBram Moolenaar assert_equal(255, n) 416f0b9f43cSBram Moolenaar 417cfcd011fSBram Moolenaar var nd: dict<any> 418f0b9f43cSBram Moolenaar try 4192bede173SBram Moolenaar nd = {[g:anumber]: 1} 4205e654230SBram Moolenaar catch /E1012:/ 421f0b9f43cSBram Moolenaar n = 266 422f0b9f43cSBram Moolenaar endtry 423f0b9f43cSBram Moolenaar assert_equal(266, n) 424f0b9f43cSBram Moolenaar 425f0b9f43cSBram Moolenaar try 426f0b9f43cSBram Moolenaar [n] = [1, 2, 3] 427f0b9f43cSBram Moolenaar catch /E1093:/ 428f0b9f43cSBram Moolenaar n = 277 429f0b9f43cSBram Moolenaar endtry 430f0b9f43cSBram Moolenaar assert_equal(277, n) 431f0b9f43cSBram Moolenaar 432e859312eSBram Moolenaar try 433e859312eSBram Moolenaar &ts = g:astring 4345e654230SBram Moolenaar catch /E1012:/ 435e859312eSBram Moolenaar n = 288 436e859312eSBram Moolenaar endtry 437e859312eSBram Moolenaar assert_equal(288, n) 438e859312eSBram Moolenaar 439e859312eSBram Moolenaar try 440e859312eSBram Moolenaar &backspace = 'asdf' 441e859312eSBram Moolenaar catch /E474:/ 442e859312eSBram Moolenaar n = 299 443e859312eSBram Moolenaar endtry 444e859312eSBram Moolenaar assert_equal(299, n) 445e859312eSBram Moolenaar 446e859312eSBram Moolenaar l = [1] 447e859312eSBram Moolenaar try 448e859312eSBram Moolenaar l[3] = 3 449e859312eSBram Moolenaar catch /E684:/ 450e859312eSBram Moolenaar n = 300 451e859312eSBram Moolenaar endtry 452e859312eSBram Moolenaar assert_equal(300, n) 453e859312eSBram Moolenaar 454e859312eSBram Moolenaar try 455e859312eSBram Moolenaar unlet g:does_not_exist 456e859312eSBram Moolenaar catch /E108:/ 457e859312eSBram Moolenaar n = 322 458e859312eSBram Moolenaar endtry 459e859312eSBram Moolenaar assert_equal(322, n) 460e859312eSBram Moolenaar 461e859312eSBram Moolenaar try 4622bede173SBram Moolenaar d = {text: 1, [g:astring]: 2} 463e859312eSBram Moolenaar catch /E721:/ 464e859312eSBram Moolenaar n = 333 465e859312eSBram Moolenaar endtry 466e859312eSBram Moolenaar assert_equal(333, n) 467e859312eSBram Moolenaar 468e859312eSBram Moolenaar try 469e859312eSBram Moolenaar l = DeletedFunc() 470e859312eSBram Moolenaar catch /E933:/ 471e859312eSBram Moolenaar n = 344 472e859312eSBram Moolenaar endtry 473e859312eSBram Moolenaar assert_equal(344, n) 474d032f34aSBram Moolenaar 475d032f34aSBram Moolenaar try 476d032f34aSBram Moolenaar echo len(v:true) 477d032f34aSBram Moolenaar catch /E701:/ 478d032f34aSBram Moolenaar n = 355 479d032f34aSBram Moolenaar endtry 480d032f34aSBram Moolenaar assert_equal(355, n) 481d032f34aSBram Moolenaar 482cfcd011fSBram Moolenaar var P = function('g:NoSuchFunc') 483d032f34aSBram Moolenaar delfunc g:NoSuchFunc 484d032f34aSBram Moolenaar try 485d032f34aSBram Moolenaar echo P() 486d032f34aSBram Moolenaar catch /E117:/ 487d032f34aSBram Moolenaar n = 366 488d032f34aSBram Moolenaar endtry 489d032f34aSBram Moolenaar assert_equal(366, n) 490d032f34aSBram Moolenaar 491d032f34aSBram Moolenaar try 492d032f34aSBram Moolenaar echo g:NoSuchFunc() 493d032f34aSBram Moolenaar catch /E117:/ 494d032f34aSBram Moolenaar n = 377 495d032f34aSBram Moolenaar endtry 496d032f34aSBram Moolenaar assert_equal(377, n) 497d032f34aSBram Moolenaar 498d032f34aSBram Moolenaar try 499d032f34aSBram Moolenaar echo g:alist + 4 500d032f34aSBram Moolenaar catch /E745:/ 501d032f34aSBram Moolenaar n = 388 502d032f34aSBram Moolenaar endtry 503d032f34aSBram Moolenaar assert_equal(388, n) 504d032f34aSBram Moolenaar 505d032f34aSBram Moolenaar try 506d032f34aSBram Moolenaar echo 4 + g:alist 507d032f34aSBram Moolenaar catch /E745:/ 508d032f34aSBram Moolenaar n = 399 509d032f34aSBram Moolenaar endtry 510d032f34aSBram Moolenaar assert_equal(399, n) 511d032f34aSBram Moolenaar 512d032f34aSBram Moolenaar try 513d032f34aSBram Moolenaar echo g:alist.member 514d032f34aSBram Moolenaar catch /E715:/ 515d032f34aSBram Moolenaar n = 400 516d032f34aSBram Moolenaar endtry 517d032f34aSBram Moolenaar assert_equal(400, n) 518d032f34aSBram Moolenaar 519d032f34aSBram Moolenaar try 520d032f34aSBram Moolenaar echo d.member 521d032f34aSBram Moolenaar catch /E716:/ 522d032f34aSBram Moolenaar n = 411 523d032f34aSBram Moolenaar endtry 524d032f34aSBram Moolenaar assert_equal(411, n) 5258a7d6542SBram Moolenaarenddef 5268a7d6542SBram Moolenaar 527e859312eSBram Moolenaardef DeletedFunc(): list<any> 528e859312eSBram Moolenaar return ['delete me'] 529e859312eSBram Moolenaarenddef 530e859312eSBram Moolenaardefcompile 531e859312eSBram Moolenaardelfunc DeletedFunc 532e859312eSBram Moolenaar 533257cc5eeSBram Moolenaardef ThrowFromDef() 534a72cfb80SBram Moolenaar throw "getout" # comment 535257cc5eeSBram Moolenaarenddef 536257cc5eeSBram Moolenaar 537257cc5eeSBram Moolenaarfunc CatchInFunc() 538257cc5eeSBram Moolenaar try 539257cc5eeSBram Moolenaar call ThrowFromDef() 540257cc5eeSBram Moolenaar catch 541257cc5eeSBram Moolenaar let g:thrown_func = v:exception 542257cc5eeSBram Moolenaar endtry 543257cc5eeSBram Moolenaarendfunc 544257cc5eeSBram Moolenaar 545257cc5eeSBram Moolenaardef CatchInDef() 546257cc5eeSBram Moolenaar try 547257cc5eeSBram Moolenaar ThrowFromDef() 548257cc5eeSBram Moolenaar catch 549257cc5eeSBram Moolenaar g:thrown_def = v:exception 550257cc5eeSBram Moolenaar endtry 551257cc5eeSBram Moolenaarenddef 552257cc5eeSBram Moolenaar 553f575adffSBram Moolenaardef ReturnFinally(): string 554f575adffSBram Moolenaar try 555f575adffSBram Moolenaar return 'intry' 556373863edSBram Moolenaar finall 557f575adffSBram Moolenaar g:in_finally = 'finally' 558f575adffSBram Moolenaar endtry 559f575adffSBram Moolenaar return 'end' 560f575adffSBram Moolenaarenddef 561f575adffSBram Moolenaar 562257cc5eeSBram Moolenaardef Test_try_catch_nested() 563257cc5eeSBram Moolenaar CatchInFunc() 564257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_func) 565257cc5eeSBram Moolenaar 566257cc5eeSBram Moolenaar CatchInDef() 567257cc5eeSBram Moolenaar assert_equal('getout', g:thrown_def) 568f575adffSBram Moolenaar 569f575adffSBram Moolenaar assert_equal('intry', ReturnFinally()) 570f575adffSBram Moolenaar assert_equal('finally', g:in_finally) 571f575adffSBram Moolenaarenddef 572f575adffSBram Moolenaar 5739939f57bSBram Moolenaardef TryOne(): number 5749939f57bSBram Moolenaar try 5759939f57bSBram Moolenaar return 0 5769939f57bSBram Moolenaar catch 5779939f57bSBram Moolenaar endtry 5789939f57bSBram Moolenaar return 0 5799939f57bSBram Moolenaarenddef 5809939f57bSBram Moolenaar 5819939f57bSBram Moolenaardef TryTwo(n: number): string 5829939f57bSBram Moolenaar try 583cfcd011fSBram Moolenaar var x = {} 5849939f57bSBram Moolenaar catch 5859939f57bSBram Moolenaar endtry 5869939f57bSBram Moolenaar return 'text' 5879939f57bSBram Moolenaarenddef 5889939f57bSBram Moolenaar 5899939f57bSBram Moolenaardef Test_try_catch_twice() 5909939f57bSBram Moolenaar assert_equal('text', TryOne()->TryTwo()) 5919939f57bSBram Moolenaarenddef 5929939f57bSBram Moolenaar 593f575adffSBram Moolenaardef Test_try_catch_match() 594cfcd011fSBram Moolenaar var seq = 'a' 595f575adffSBram Moolenaar try 596f575adffSBram Moolenaar throw 'something' 597f575adffSBram Moolenaar catch /nothing/ 598f575adffSBram Moolenaar seq ..= 'x' 599f575adffSBram Moolenaar catch /some/ 600f575adffSBram Moolenaar seq ..= 'b' 601f575adffSBram Moolenaar catch /asdf/ 602f575adffSBram Moolenaar seq ..= 'x' 603e8c4abbbSBram Moolenaar catch ?a\?sdf? 604e8c4abbbSBram Moolenaar seq ..= 'y' 605f575adffSBram Moolenaar finally 606f575adffSBram Moolenaar seq ..= 'c' 607f575adffSBram Moolenaar endtry 608f575adffSBram Moolenaar assert_equal('abc', seq) 609257cc5eeSBram Moolenaarenddef 610257cc5eeSBram Moolenaar 611e8c4abbbSBram Moolenaardef Test_try_catch_fails() 612d2c61705SBram Moolenaar CheckDefFailure(['catch'], 'E603:') 613d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch', 'catch'], 'E1033:') 614d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'catch /pat'], 'E1067:') 615d2c61705SBram Moolenaar CheckDefFailure(['finally'], 'E606:') 616d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 0', 'finally', 'echo 1', 'finally'], 'E607:') 617d2c61705SBram Moolenaar CheckDefFailure(['endtry'], 'E602:') 618d2c61705SBram Moolenaar CheckDefFailure(['while 1', 'endtry'], 'E170:') 619d2c61705SBram Moolenaar CheckDefFailure(['for i in range(5)', 'endtry'], 'E170:') 62013106605SBram Moolenaar CheckDefFailure(['if 1', 'endtry'], 'E171:') 621d2c61705SBram Moolenaar CheckDefFailure(['try', 'echo 1', 'endtry'], 'E1032:') 622585fea7bSBram Moolenaar 623d2c61705SBram Moolenaar CheckDefFailure(['throw'], 'E1015:') 624d2c61705SBram Moolenaar CheckDefFailure(['throw xxx'], 'E1001:') 625e8c4abbbSBram Moolenaarenddef 626e8c4abbbSBram Moolenaar 627006ad48bSBram Moolenaardef Test_throw_vimscript() 628f5be8cdbSBram Moolenaar # only checks line continuation 629cfcd011fSBram Moolenaar var lines =<< trim END 630006ad48bSBram Moolenaar vim9script 631006ad48bSBram Moolenaar try 632006ad48bSBram Moolenaar throw 'one' 633006ad48bSBram Moolenaar .. 'two' 634006ad48bSBram Moolenaar catch 635006ad48bSBram Moolenaar assert_equal('onetwo', v:exception) 636006ad48bSBram Moolenaar endtry 637006ad48bSBram Moolenaar END 638006ad48bSBram Moolenaar CheckScriptSuccess(lines) 6391e021e63SBram Moolenaar 6401e021e63SBram Moolenaar lines =<< trim END 6411e021e63SBram Moolenaar vim9script 642352134bbSBram Moolenaar @r = '' 6431e021e63SBram Moolenaar def Func() 6441e021e63SBram Moolenaar throw @r 6451e021e63SBram Moolenaar enddef 6461e021e63SBram Moolenaar var result = '' 6471e021e63SBram Moolenaar try 6481e021e63SBram Moolenaar Func() 6491e021e63SBram Moolenaar catch /E1129:/ 6501e021e63SBram Moolenaar result = 'caught' 6511e021e63SBram Moolenaar endtry 6521e021e63SBram Moolenaar assert_equal('caught', result) 6531e021e63SBram Moolenaar END 6541e021e63SBram Moolenaar CheckScriptSuccess(lines) 655006ad48bSBram Moolenaarenddef 656006ad48bSBram Moolenaar 657ed677f55SBram Moolenaardef Test_error_in_nested_function() 658ed677f55SBram Moolenaar # an error in a nested :function aborts executin in the calling :def function 659cfcd011fSBram Moolenaar var lines =<< trim END 660ed677f55SBram Moolenaar vim9script 661ed677f55SBram Moolenaar def Func() 662ed677f55SBram Moolenaar Error() 663ed677f55SBram Moolenaar g:test_var = 1 664ed677f55SBram Moolenaar enddef 665ed677f55SBram Moolenaar func Error() abort 666ed677f55SBram Moolenaar eval [][0] 667ed677f55SBram Moolenaar endfunc 668ed677f55SBram Moolenaar Func() 669ed677f55SBram Moolenaar END 670ed677f55SBram Moolenaar g:test_var = 0 671ed677f55SBram Moolenaar CheckScriptFailure(lines, 'E684:') 672ed677f55SBram Moolenaar assert_equal(0, g:test_var) 673ed677f55SBram Moolenaarenddef 674ed677f55SBram Moolenaar 67537c83711SBram Moolenaardef Test_cexpr_vimscript() 676f5be8cdbSBram Moolenaar # only checks line continuation 67737c83711SBram Moolenaar set errorformat=File\ %f\ line\ %l 678cfcd011fSBram Moolenaar var lines =<< trim END 67937c83711SBram Moolenaar vim9script 68037c83711SBram Moolenaar cexpr 'File' 68137c83711SBram Moolenaar .. ' someFile' .. 68237c83711SBram Moolenaar ' line 19' 68337c83711SBram Moolenaar assert_equal(19, getqflist()[0].lnum) 68437c83711SBram Moolenaar END 68537c83711SBram Moolenaar CheckScriptSuccess(lines) 68637c83711SBram Moolenaar set errorformat& 68737c83711SBram Moolenaarenddef 68837c83711SBram Moolenaar 689c9edd6b5SBram Moolenaardef Test_statusline_syntax() 690c9edd6b5SBram Moolenaar # legacy syntax is used for 'statusline' 691cfcd011fSBram Moolenaar var lines =<< trim END 692c9edd6b5SBram Moolenaar vim9script 693c9edd6b5SBram Moolenaar func g:Status() 694c9edd6b5SBram Moolenaar return '%{"x" is# "x"}' 695c9edd6b5SBram Moolenaar endfunc 696c9edd6b5SBram Moolenaar set laststatus=2 statusline=%!Status() 697c9edd6b5SBram Moolenaar redrawstatus 698c9edd6b5SBram Moolenaar set laststatus statusline= 699c9edd6b5SBram Moolenaar END 700c9edd6b5SBram Moolenaar CheckScriptSuccess(lines) 701c9edd6b5SBram Moolenaarenddef 702c9edd6b5SBram Moolenaar 703b209750bSBram Moolenaardef Test_list_vimscript() 704b209750bSBram Moolenaar # checks line continuation and comments 705cfcd011fSBram Moolenaar var lines =<< trim END 706b209750bSBram Moolenaar vim9script 707cfcd011fSBram Moolenaar var mylist = [ 708b209750bSBram Moolenaar 'one', 709b209750bSBram Moolenaar # comment 710b209750bSBram Moolenaar 'two', # empty line follows 711b209750bSBram Moolenaar 712b209750bSBram Moolenaar 'three', 713b209750bSBram Moolenaar ] 714b209750bSBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 715b209750bSBram Moolenaar END 716b209750bSBram Moolenaar CheckScriptSuccess(lines) 71766250c93SBram Moolenaar 71866250c93SBram Moolenaar # check all lines from heredoc are kept 71966250c93SBram Moolenaar lines =<< trim END 72066250c93SBram Moolenaar # comment 1 72166250c93SBram Moolenaar two 72266250c93SBram Moolenaar # comment 3 72366250c93SBram Moolenaar 72466250c93SBram Moolenaar five 72566250c93SBram Moolenaar # comment 6 72666250c93SBram Moolenaar END 72766250c93SBram Moolenaar assert_equal(['# comment 1', 'two', '# comment 3', '', 'five', '# comment 6'], lines) 728b209750bSBram Moolenaarenddef 729b209750bSBram Moolenaar 7302a1381c3SBram Moolenaarif has('channel') 73140ee466cSBram Moolenaar let someJob = test_null_job() 73240ee466cSBram Moolenaar 73340ee466cSBram Moolenaar def FuncWithError() 73440ee466cSBram Moolenaar echomsg g:someJob 73540ee466cSBram Moolenaar enddef 73640ee466cSBram Moolenaar 73740ee466cSBram Moolenaar func Test_convert_emsg_to_exception() 73840ee466cSBram Moolenaar try 73940ee466cSBram Moolenaar call FuncWithError() 74040ee466cSBram Moolenaar catch 74140ee466cSBram Moolenaar call assert_match('Vim:E908:', v:exception) 74240ee466cSBram Moolenaar endtry 74340ee466cSBram Moolenaar endfunc 7442a1381c3SBram Moolenaarendif 74540ee466cSBram Moolenaar 7468a7d6542SBram Moolenaarlet s:export_script_lines =<< trim END 7478a7d6542SBram Moolenaar vim9script 748cfcd011fSBram Moolenaar var name: string = 'bob' 7498a7d6542SBram Moolenaar def Concat(arg: string): string 7508a7d6542SBram Moolenaar return name .. arg 7518a7d6542SBram Moolenaar enddef 752227a69deSBram Moolenaar g:result = Concat('bie') 753227a69deSBram Moolenaar g:localname = name 7548a7d6542SBram Moolenaar 7558a7d6542SBram Moolenaar export const CONST = 1234 756cfcd011fSBram Moolenaar export var exported = 9876 757cfcd011fSBram Moolenaar export var exp_name = 'John' 7588a7d6542SBram Moolenaar export def Exported(): string 7598a7d6542SBram Moolenaar return 'Exported' 7608a7d6542SBram Moolenaar enddef 7618a7d6542SBram MoolenaarEND 7628a7d6542SBram Moolenaar 763b3ca9824SBram Moolenaardef Undo_export_script_lines() 764b3ca9824SBram Moolenaar unlet g:result 765b3ca9824SBram Moolenaar unlet g:localname 766b3ca9824SBram Moolenaarenddef 767b3ca9824SBram Moolenaar 7685269bd2aSBram Moolenaardef Test_vim9_import_export() 769cfcd011fSBram Moolenaar var import_script_lines =<< trim END 7708a7d6542SBram Moolenaar vim9script 7718a7d6542SBram Moolenaar import {exported, Exported} from './Xexport.vim' 7728a7d6542SBram Moolenaar g:imported = exported 7736e587dcbSBram Moolenaar exported += 3 7746e587dcbSBram Moolenaar g:imported_added = exported 7758a7d6542SBram Moolenaar g:imported_func = Exported() 7766e587dcbSBram Moolenaar 77740f4f7a4SBram Moolenaar def GetExported(): string 778e0de171eSBram Moolenaar var local_dict = {ref: Exported} 77940f4f7a4SBram Moolenaar return local_dict.ref() 78040f4f7a4SBram Moolenaar enddef 78140f4f7a4SBram Moolenaar g:funcref_result = GetExported() 78240f4f7a4SBram Moolenaar 7836e587dcbSBram Moolenaar import {exp_name} from './Xexport.vim' 7846e587dcbSBram Moolenaar g:imported_name = exp_name 7856e587dcbSBram Moolenaar exp_name ..= ' Doe' 7866e587dcbSBram Moolenaar g:imported_name_appended = exp_name 7875381c7a1SBram Moolenaar g:imported_later = exported 7888a7d6542SBram Moolenaar END 7898a7d6542SBram Moolenaar 7908a7d6542SBram Moolenaar writefile(import_script_lines, 'Ximport.vim') 7918a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport.vim') 7928a7d6542SBram Moolenaar 7938a7d6542SBram Moolenaar source Ximport.vim 7948a7d6542SBram Moolenaar 7958a7d6542SBram Moolenaar assert_equal('bobbie', g:result) 7968a7d6542SBram Moolenaar assert_equal('bob', g:localname) 7978a7d6542SBram Moolenaar assert_equal(9876, g:imported) 7986e587dcbSBram Moolenaar assert_equal(9879, g:imported_added) 7995381c7a1SBram Moolenaar assert_equal(9879, g:imported_later) 8008a7d6542SBram Moolenaar assert_equal('Exported', g:imported_func) 80140f4f7a4SBram Moolenaar assert_equal('Exported', g:funcref_result) 8026e587dcbSBram Moolenaar assert_equal('John', g:imported_name) 8036e587dcbSBram Moolenaar assert_equal('John Doe', g:imported_name_appended) 8048a7d6542SBram Moolenaar assert_false(exists('g:name')) 8058a7d6542SBram Moolenaar 806b3ca9824SBram Moolenaar Undo_export_script_lines() 8078a7d6542SBram Moolenaar unlet g:imported 8086e587dcbSBram Moolenaar unlet g:imported_added 8095381c7a1SBram Moolenaar unlet g:imported_later 8108a7d6542SBram Moolenaar unlet g:imported_func 8116e587dcbSBram Moolenaar unlet g:imported_name g:imported_name_appended 8128a7d6542SBram Moolenaar delete('Ximport.vim') 813f2d5c240SBram Moolenaar 8141c991144SBram Moolenaar # similar, with line breaks 815cfcd011fSBram Moolenaar var import_line_break_script_lines =<< trim END 8161c991144SBram Moolenaar vim9script 8171c991144SBram Moolenaar import { 8181c991144SBram Moolenaar exported, 8191c991144SBram Moolenaar Exported, 8201c991144SBram Moolenaar } 8211c991144SBram Moolenaar from 8221c991144SBram Moolenaar './Xexport.vim' 8231c991144SBram Moolenaar g:imported = exported 8241c991144SBram Moolenaar exported += 5 8251c991144SBram Moolenaar g:imported_added = exported 8261c991144SBram Moolenaar g:imported_func = Exported() 8271c991144SBram Moolenaar END 8281c991144SBram Moolenaar writefile(import_line_break_script_lines, 'Ximport_lbr.vim') 8291c991144SBram Moolenaar source Ximport_lbr.vim 8301c991144SBram Moolenaar 8311c991144SBram Moolenaar assert_equal(9876, g:imported) 8321c991144SBram Moolenaar assert_equal(9881, g:imported_added) 8331c991144SBram Moolenaar assert_equal('Exported', g:imported_func) 8341c991144SBram Moolenaar 8351c991144SBram Moolenaar # exported script not sourced again 8361c991144SBram Moolenaar assert_false(exists('g:result')) 8371c991144SBram Moolenaar unlet g:imported 8381c991144SBram Moolenaar unlet g:imported_added 8391c991144SBram Moolenaar unlet g:imported_func 8401c991144SBram Moolenaar delete('Ximport_lbr.vim') 8411c991144SBram Moolenaar 8421c991144SBram Moolenaar # import inside :def function 843cfcd011fSBram Moolenaar var import_in_def_lines =<< trim END 8445381c7a1SBram Moolenaar vim9script 8455381c7a1SBram Moolenaar def ImportInDef() 8465381c7a1SBram Moolenaar import exported from './Xexport.vim' 8475381c7a1SBram Moolenaar g:imported = exported 8485381c7a1SBram Moolenaar exported += 7 8495381c7a1SBram Moolenaar g:imported_added = exported 8505381c7a1SBram Moolenaar enddef 8515381c7a1SBram Moolenaar ImportInDef() 8525381c7a1SBram Moolenaar END 8535381c7a1SBram Moolenaar writefile(import_in_def_lines, 'Ximport2.vim') 8545381c7a1SBram Moolenaar source Ximport2.vim 855f5be8cdbSBram Moolenaar # TODO: this should be 9879 8565381c7a1SBram Moolenaar assert_equal(9876, g:imported) 8575381c7a1SBram Moolenaar assert_equal(9883, g:imported_added) 8585381c7a1SBram Moolenaar unlet g:imported 8595381c7a1SBram Moolenaar unlet g:imported_added 8605381c7a1SBram Moolenaar delete('Ximport2.vim') 8615381c7a1SBram Moolenaar 862cfcd011fSBram Moolenaar var import_star_as_lines =<< trim END 863f2d5c240SBram Moolenaar vim9script 864f2d5c240SBram Moolenaar import * as Export from './Xexport.vim' 865f2d5c240SBram Moolenaar def UseExport() 866f2d5c240SBram Moolenaar g:imported = Export.exported 867f2d5c240SBram Moolenaar enddef 868f2d5c240SBram Moolenaar UseExport() 869f2d5c240SBram Moolenaar END 870f2d5c240SBram Moolenaar writefile(import_star_as_lines, 'Ximport.vim') 871f2d5c240SBram Moolenaar source Ximport.vim 8725381c7a1SBram Moolenaar assert_equal(9883, g:imported) 873f2d5c240SBram Moolenaar 874cfcd011fSBram Moolenaar var import_star_as_lines_no_dot =<< trim END 875599c89c8SBram Moolenaar vim9script 876599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 877599c89c8SBram Moolenaar def Func() 878cfcd011fSBram Moolenaar var dummy = 1 879cfcd011fSBram Moolenaar var imported = Export + dummy 880599c89c8SBram Moolenaar enddef 881822ba247SBram Moolenaar defcompile 882599c89c8SBram Moolenaar END 883599c89c8SBram Moolenaar writefile(import_star_as_lines_no_dot, 'Ximport.vim') 88444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1060:', '', 2, 'Func') 885599c89c8SBram Moolenaar 886cfcd011fSBram Moolenaar var import_star_as_lines_dot_space =<< trim END 887599c89c8SBram Moolenaar vim9script 888599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 889599c89c8SBram Moolenaar def Func() 890cfcd011fSBram Moolenaar var imported = Export . exported 891599c89c8SBram Moolenaar enddef 892822ba247SBram Moolenaar defcompile 893599c89c8SBram Moolenaar END 894599c89c8SBram Moolenaar writefile(import_star_as_lines_dot_space, 'Ximport.vim') 89544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1074:', '', 1, 'Func') 896599c89c8SBram Moolenaar 897cfcd011fSBram Moolenaar var import_star_as_lines_missing_name =<< trim END 898599c89c8SBram Moolenaar vim9script 899599c89c8SBram Moolenaar import * as Export from './Xexport.vim' 900599c89c8SBram Moolenaar def Func() 901cfcd011fSBram Moolenaar var imported = Export. 902599c89c8SBram Moolenaar enddef 903822ba247SBram Moolenaar defcompile 904599c89c8SBram Moolenaar END 905599c89c8SBram Moolenaar writefile(import_star_as_lines_missing_name, 'Ximport.vim') 90644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 1, 'Func') 907599c89c8SBram Moolenaar 908cfcd011fSBram Moolenaar var import_star_as_lbr_lines =<< trim END 9091c991144SBram Moolenaar vim9script 9101c991144SBram Moolenaar import * 9111c991144SBram Moolenaar as Export 9121c991144SBram Moolenaar from 9131c991144SBram Moolenaar './Xexport.vim' 9141c991144SBram Moolenaar def UseExport() 9151c991144SBram Moolenaar g:imported = Export.exported 9161c991144SBram Moolenaar enddef 9171c991144SBram Moolenaar UseExport() 9181c991144SBram Moolenaar END 9191c991144SBram Moolenaar writefile(import_star_as_lbr_lines, 'Ximport.vim') 9201c991144SBram Moolenaar source Ximport.vim 9211c991144SBram Moolenaar assert_equal(9883, g:imported) 9221c991144SBram Moolenaar 923cfcd011fSBram Moolenaar var import_star_lines =<< trim END 924f2d5c240SBram Moolenaar vim9script 925f2d5c240SBram Moolenaar import * from './Xexport.vim' 926f2d5c240SBram Moolenaar END 927f2d5c240SBram Moolenaar writefile(import_star_lines, 'Ximport.vim') 92844d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1045:', '', 2, 'Ximport.vim') 929f2d5c240SBram Moolenaar 930f5be8cdbSBram Moolenaar # try to import something that exists but is not exported 931cfcd011fSBram Moolenaar var import_not_exported_lines =<< trim END 932fa29c8abSBram Moolenaar vim9script 933fa29c8abSBram Moolenaar import name from './Xexport.vim' 934fa29c8abSBram Moolenaar END 935fa29c8abSBram Moolenaar writefile(import_not_exported_lines, 'Ximport.vim') 93644d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1049:', '', 2, 'Ximport.vim') 937fa29c8abSBram Moolenaar 938f5be8cdbSBram Moolenaar # try to import something that is already defined 939cfcd011fSBram Moolenaar var import_already_defined =<< trim END 9405269bd2aSBram Moolenaar vim9script 941cfcd011fSBram Moolenaar var exported = 'something' 9425269bd2aSBram Moolenaar import exported from './Xexport.vim' 9435269bd2aSBram Moolenaar END 9445269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 94544d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9465269bd2aSBram Moolenaar 947f5be8cdbSBram Moolenaar # try to import something that is already defined 9485269bd2aSBram Moolenaar import_already_defined =<< trim END 9495269bd2aSBram Moolenaar vim9script 950cfcd011fSBram Moolenaar var exported = 'something' 9515269bd2aSBram Moolenaar import * as exported from './Xexport.vim' 9525269bd2aSBram Moolenaar END 9535269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 95444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9555269bd2aSBram Moolenaar 956f5be8cdbSBram Moolenaar # try to import something that is already defined 9575269bd2aSBram Moolenaar import_already_defined =<< trim END 9585269bd2aSBram Moolenaar vim9script 959cfcd011fSBram Moolenaar var exported = 'something' 9605269bd2aSBram Moolenaar import {exported} from './Xexport.vim' 9615269bd2aSBram Moolenaar END 9625269bd2aSBram Moolenaar writefile(import_already_defined, 'Ximport.vim') 96344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1073:', '', 3, 'Ximport.vim') 9645269bd2aSBram Moolenaar 965918a4249SBram Moolenaar # try changing an imported const 966918a4249SBram Moolenaar var import_assign_to_const =<< trim END 967918a4249SBram Moolenaar vim9script 968918a4249SBram Moolenaar import CONST from './Xexport.vim' 969918a4249SBram Moolenaar def Assign() 970918a4249SBram Moolenaar CONST = 987 971918a4249SBram Moolenaar enddef 972918a4249SBram Moolenaar defcompile 973918a4249SBram Moolenaar END 974918a4249SBram Moolenaar writefile(import_assign_to_const, 'Ximport.vim') 975918a4249SBram Moolenaar assert_fails('source Ximport.vim', 'E46:', '', 1, '_Assign') 976918a4249SBram Moolenaar 977f5be8cdbSBram Moolenaar # import a very long name, requires making a copy 978cfcd011fSBram Moolenaar var import_long_name_lines =<< trim END 979fa29c8abSBram Moolenaar vim9script 980fa29c8abSBram Moolenaar import name012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789 from './Xexport.vim' 981fa29c8abSBram Moolenaar END 982fa29c8abSBram Moolenaar writefile(import_long_name_lines, 'Ximport.vim') 98344d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1048:', '', 2, 'Ximport.vim') 984fa29c8abSBram Moolenaar 985cfcd011fSBram Moolenaar var import_no_from_lines =<< trim END 986fa29c8abSBram Moolenaar vim9script 987fa29c8abSBram Moolenaar import name './Xexport.vim' 988fa29c8abSBram Moolenaar END 989fa29c8abSBram Moolenaar writefile(import_no_from_lines, 'Ximport.vim') 99044d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1070:', '', 2, 'Ximport.vim') 991fa29c8abSBram Moolenaar 992cfcd011fSBram Moolenaar var import_invalid_string_lines =<< trim END 993fa29c8abSBram Moolenaar vim9script 994fa29c8abSBram Moolenaar import name from Xexport.vim 995fa29c8abSBram Moolenaar END 996fa29c8abSBram Moolenaar writefile(import_invalid_string_lines, 'Ximport.vim') 99744d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1071:', '', 2, 'Ximport.vim') 998fa29c8abSBram Moolenaar 999cfcd011fSBram Moolenaar var import_wrong_name_lines =<< trim END 1000fa29c8abSBram Moolenaar vim9script 1001fa29c8abSBram Moolenaar import name from './XnoExport.vim' 1002fa29c8abSBram Moolenaar END 1003fa29c8abSBram Moolenaar writefile(import_wrong_name_lines, 'Ximport.vim') 100444d6652dSBram Moolenaar assert_fails('source Ximport.vim', 'E1053:', '', 2, 'Ximport.vim') 1005fa29c8abSBram Moolenaar 1006cfcd011fSBram Moolenaar var import_missing_comma_lines =<< trim END 1007fa29c8abSBram Moolenaar vim9script 1008fa29c8abSBram Moolenaar import {exported name} from './Xexport.vim' 1009fa29c8abSBram Moolenaar END 10105269bd2aSBram Moolenaar writefile(import_missing_comma_lines, 'Ximport3.vim') 101144d6652dSBram Moolenaar assert_fails('source Ximport3.vim', 'E1046:', '', 2, 'Ximport3.vim') 1012fa29c8abSBram Moolenaar 1013f2d5c240SBram Moolenaar delete('Ximport.vim') 10145269bd2aSBram Moolenaar delete('Ximport3.vim') 10158a7d6542SBram Moolenaar delete('Xexport.vim') 10168a7d6542SBram Moolenaar 1017f5be8cdbSBram Moolenaar # Check that in a Vim9 script 'cpo' is set to the Vim default. 1018750802b5SBram Moolenaar set cpo&vi 1019cfcd011fSBram Moolenaar var cpo_before = &cpo 1020cfcd011fSBram Moolenaar var lines =<< trim END 1021750802b5SBram Moolenaar vim9script 1022750802b5SBram Moolenaar g:cpo_in_vim9script = &cpo 1023750802b5SBram Moolenaar END 1024750802b5SBram Moolenaar writefile(lines, 'Xvim9_script') 1025750802b5SBram Moolenaar source Xvim9_script 1026750802b5SBram Moolenaar assert_equal(cpo_before, &cpo) 1027750802b5SBram Moolenaar set cpo&vim 1028750802b5SBram Moolenaar assert_equal(&cpo, g:cpo_in_vim9script) 1029750802b5SBram Moolenaar delete('Xvim9_script') 1030750802b5SBram Moolenaarenddef 1031750802b5SBram Moolenaar 1032803af686SBram Moolenaarfunc g:Trigger() 1033803af686SBram Moolenaar source Ximport.vim 1034803af686SBram Moolenaar return "echo 'yes'\<CR>" 1035803af686SBram Moolenaarendfunc 1036803af686SBram Moolenaar 1037803af686SBram Moolenaardef Test_import_export_expr_map() 1038803af686SBram Moolenaar # check that :import and :export work when buffer is locked 1039cfcd011fSBram Moolenaar var export_lines =<< trim END 1040803af686SBram Moolenaar vim9script 1041803af686SBram Moolenaar export def That(): string 1042803af686SBram Moolenaar return 'yes' 1043803af686SBram Moolenaar enddef 1044803af686SBram Moolenaar END 1045803af686SBram Moolenaar writefile(export_lines, 'Xexport_that.vim') 1046803af686SBram Moolenaar 1047cfcd011fSBram Moolenaar var import_lines =<< trim END 1048803af686SBram Moolenaar vim9script 1049803af686SBram Moolenaar import That from './Xexport_that.vim' 1050803af686SBram Moolenaar assert_equal('yes', That()) 1051803af686SBram Moolenaar END 1052803af686SBram Moolenaar writefile(import_lines, 'Ximport.vim') 1053803af686SBram Moolenaar 1054803af686SBram Moolenaar nnoremap <expr> trigger g:Trigger() 1055803af686SBram Moolenaar feedkeys('trigger', "xt") 1056803af686SBram Moolenaar 1057730b2483SBram Moolenaar delete('Xexport_that.vim') 1058803af686SBram Moolenaar delete('Ximport.vim') 1059803af686SBram Moolenaar nunmap trigger 1060803af686SBram Moolenaarenddef 1061803af686SBram Moolenaar 10628e1986e3SBram Moolenaardef Test_import_in_filetype() 10638e1986e3SBram Moolenaar # check that :import works when the buffer is locked 10648e1986e3SBram Moolenaar mkdir('ftplugin', 'p') 1065cfcd011fSBram Moolenaar var export_lines =<< trim END 10668e1986e3SBram Moolenaar vim9script 1067cfcd011fSBram Moolenaar export var That = 'yes' 10688e1986e3SBram Moolenaar END 1069730b2483SBram Moolenaar writefile(export_lines, 'ftplugin/Xexport_ft.vim') 10708e1986e3SBram Moolenaar 1071cfcd011fSBram Moolenaar var import_lines =<< trim END 10728e1986e3SBram Moolenaar vim9script 1073730b2483SBram Moolenaar import That from './Xexport_ft.vim' 10748e1986e3SBram Moolenaar assert_equal('yes', That) 10758e1986e3SBram Moolenaar g:did_load_mytpe = 1 10768e1986e3SBram Moolenaar END 10778e1986e3SBram Moolenaar writefile(import_lines, 'ftplugin/qf.vim') 10788e1986e3SBram Moolenaar 1079cfcd011fSBram Moolenaar var save_rtp = &rtp 10808e1986e3SBram Moolenaar &rtp = getcwd() .. ',' .. &rtp 10818e1986e3SBram Moolenaar 10828e1986e3SBram Moolenaar filetype plugin on 10838e1986e3SBram Moolenaar copen 10848e1986e3SBram Moolenaar assert_equal(1, g:did_load_mytpe) 10858e1986e3SBram Moolenaar 10868e1986e3SBram Moolenaar quit! 1087730b2483SBram Moolenaar delete('Xexport_ft.vim') 10888e1986e3SBram Moolenaar delete('ftplugin', 'rf') 10898e1986e3SBram Moolenaar &rtp = save_rtp 10908e1986e3SBram Moolenaarenddef 10918e1986e3SBram Moolenaar 1092efa94447SBram Moolenaardef Test_use_import_in_mapping() 1093cfcd011fSBram Moolenaar var lines =<< trim END 1094efa94447SBram Moolenaar vim9script 1095efa94447SBram Moolenaar export def Funcx() 1096efa94447SBram Moolenaar g:result = 42 1097efa94447SBram Moolenaar enddef 1098efa94447SBram Moolenaar END 1099efa94447SBram Moolenaar writefile(lines, 'XsomeExport.vim') 1100efa94447SBram Moolenaar lines =<< trim END 1101efa94447SBram Moolenaar vim9script 1102efa94447SBram Moolenaar import Funcx from './XsomeExport.vim' 1103b3ca9824SBram Moolenaar nnoremap <F3> :call <sid>Funcx()<cr> 1104efa94447SBram Moolenaar END 1105efa94447SBram Moolenaar writefile(lines, 'Xmapscript.vim') 1106efa94447SBram Moolenaar 1107efa94447SBram Moolenaar source Xmapscript.vim 1108b3ca9824SBram Moolenaar feedkeys("\<F3>", "xt") 1109efa94447SBram Moolenaar assert_equal(42, g:result) 1110efa94447SBram Moolenaar 1111efa94447SBram Moolenaar unlet g:result 1112efa94447SBram Moolenaar delete('XsomeExport.vim') 1113efa94447SBram Moolenaar delete('Xmapscript.vim') 1114b3ca9824SBram Moolenaar nunmap <F3> 1115efa94447SBram Moolenaarenddef 1116efa94447SBram Moolenaar 1117750802b5SBram Moolenaardef Test_vim9script_fails() 11188a7d6542SBram Moolenaar CheckScriptFailure(['scriptversion 2', 'vim9script'], 'E1039:') 11198a7d6542SBram Moolenaar CheckScriptFailure(['vim9script', 'scriptversion 2'], 'E1040:') 1120cfcd011fSBram Moolenaar CheckScriptFailure(['export var some = 123'], 'E1042:') 11219721fb4eSBram Moolenaar CheckScriptFailure(['import some from "./Xexport.vim"'], 'E1048:') 1122cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'export var g:some'], 'E1022:') 1123750802b5SBram Moolenaar CheckScriptFailure(['vim9script', 'export echo 134'], 'E1043:') 1124750802b5SBram Moolenaar 1125cfcd011fSBram Moolenaar CheckScriptFailure(['vim9script', 'var str: string', 'str = 1234'], 'E1012:') 1126c785b9a7SBram Moolenaar CheckScriptFailure(['vim9script', 'const str = "asdf"', 'str = "xxx"'], 'E46:') 1127c785b9a7SBram Moolenaar 1128e2e4075fSBram Moolenaar assert_fails('vim9script', 'E1038:') 1129e2e4075fSBram Moolenaar assert_fails('export something', 'E1043:') 11308a7d6542SBram Moolenaarenddef 11318a7d6542SBram Moolenaar 1132f7d267efSBram Moolenaarfunc Test_import_fails_without_script() 1133101f4810SBram Moolenaar CheckRunVimInTerminal 1134101f4810SBram Moolenaar 11359bb3eb3eSBram Moolenaar " call indirectly to avoid compilation error for missing functions 1136c620c055SBram Moolenaar call Run_Test_import_fails_on_command_line() 11379bb3eb3eSBram Moolenaarendfunc 11389bb3eb3eSBram Moolenaar 1139c620c055SBram Moolenaardef Run_Test_import_fails_on_command_line() 1140cfcd011fSBram Moolenaar var export =<< trim END 1141101f4810SBram Moolenaar vim9script 1142101f4810SBram Moolenaar export def Foo(): number 1143101f4810SBram Moolenaar return 0 1144101f4810SBram Moolenaar enddef 1145101f4810SBram Moolenaar END 1146730b2483SBram Moolenaar writefile(export, 'XexportCmd.vim') 1147101f4810SBram Moolenaar 1148e0de171eSBram Moolenaar var buf = RunVimInTerminal('-c "import Foo from ''./XexportCmd.vim''"', { 11499bb3eb3eSBram Moolenaar rows: 6, wait_for_ruler: 0}) 11509bb3eb3eSBram Moolenaar WaitForAssert({-> assert_match('^E1094:', term_getline(buf, 5))}) 1151101f4810SBram Moolenaar 1152730b2483SBram Moolenaar delete('XexportCmd.vim') 11539bb3eb3eSBram Moolenaar StopVimInTerminal(buf) 11549bb3eb3eSBram Moolenaarenddef 1155101f4810SBram Moolenaar 11564c17ad94SBram Moolenaardef Test_vim9script_reload_import() 1157cfcd011fSBram Moolenaar var lines =<< trim END 11588a7d6542SBram Moolenaar vim9script 11598a7d6542SBram Moolenaar const var = '' 1160cfcd011fSBram Moolenaar var valone = 1234 11618a7d6542SBram Moolenaar def MyFunc(arg: string) 11628a7d6542SBram Moolenaar valone = 5678 11638a7d6542SBram Moolenaar enddef 11648a7d6542SBram Moolenaar END 1165cfcd011fSBram Moolenaar var morelines =<< trim END 1166cfcd011fSBram Moolenaar var valtwo = 222 11678a7d6542SBram Moolenaar export def GetValtwo(): number 11688a7d6542SBram Moolenaar return valtwo 11698a7d6542SBram Moolenaar enddef 11708a7d6542SBram Moolenaar END 117103afdcf1SBram Moolenaar writefile(lines + morelines, 'Xreload.vim') 11728a7d6542SBram Moolenaar source Xreload.vim 11738a7d6542SBram Moolenaar source Xreload.vim 11748a7d6542SBram Moolenaar source Xreload.vim 11758a7d6542SBram Moolenaar 1176cfcd011fSBram Moolenaar var testlines =<< trim END 11778a7d6542SBram Moolenaar vim9script 11788a7d6542SBram Moolenaar def TheFunc() 11798a7d6542SBram Moolenaar import GetValtwo from './Xreload.vim' 11808a7d6542SBram Moolenaar assert_equal(222, GetValtwo()) 11818a7d6542SBram Moolenaar enddef 11828a7d6542SBram Moolenaar TheFunc() 11838a7d6542SBram Moolenaar END 11848a7d6542SBram Moolenaar writefile(testlines, 'Ximport.vim') 11858a7d6542SBram Moolenaar source Ximport.vim 11868a7d6542SBram Moolenaar 1187f5be8cdbSBram Moolenaar # Test that when not using "morelines" GetValtwo() and valtwo are still 1188f5be8cdbSBram Moolenaar # defined, because import doesn't reload a script. 11898a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 11908a7d6542SBram Moolenaar source Ximport.vim 11918a7d6542SBram Moolenaar 1192f5be8cdbSBram Moolenaar # cannot declare a var twice 11938a7d6542SBram Moolenaar lines =<< trim END 11948a7d6542SBram Moolenaar vim9script 1195cfcd011fSBram Moolenaar var valone = 1234 1196cfcd011fSBram Moolenaar var valone = 5678 11978a7d6542SBram Moolenaar END 11988a7d6542SBram Moolenaar writefile(lines, 'Xreload.vim') 119944d6652dSBram Moolenaar assert_fails('source Xreload.vim', 'E1041:', '', 3, 'Xreload.vim') 12008a7d6542SBram Moolenaar 12018a7d6542SBram Moolenaar delete('Xreload.vim') 12028a7d6542SBram Moolenaar delete('Ximport.vim') 12038a7d6542SBram Moolenaarenddef 12048a7d6542SBram Moolenaar 120595006e3dSBram Moolenaardef s:RetSome(): string 120695006e3dSBram Moolenaar return 'some' 120795006e3dSBram Moolenaarenddef 120895006e3dSBram Moolenaar 1209fe465a01SBram Moolenaar" Not exported function that is referenced needs to be accessed by the 1210fe465a01SBram Moolenaar" script-local name. 1211fe465a01SBram Moolenaardef Test_vim9script_funcref() 1212cfcd011fSBram Moolenaar var sortlines =<< trim END 1213fe465a01SBram Moolenaar vim9script 1214fe465a01SBram Moolenaar def Compare(i1: number, i2: number): number 1215bed36b93SBram Moolenaar return i2 - i1 1216fe465a01SBram Moolenaar enddef 1217fe465a01SBram Moolenaar 1218fe465a01SBram Moolenaar export def FastSort(): list<number> 1219fe465a01SBram Moolenaar return range(5)->sort(Compare) 1220fe465a01SBram Moolenaar enddef 1221fe465a01SBram Moolenaar END 1222fe465a01SBram Moolenaar writefile(sortlines, 'Xsort.vim') 1223fe465a01SBram Moolenaar 1224cfcd011fSBram Moolenaar var lines =<< trim END 1225fe465a01SBram Moolenaar vim9script 1226fe465a01SBram Moolenaar import FastSort from './Xsort.vim' 1227fe465a01SBram Moolenaar def Test() 1228fe465a01SBram Moolenaar g:result = FastSort() 1229fe465a01SBram Moolenaar enddef 1230fe465a01SBram Moolenaar Test() 1231fe465a01SBram Moolenaar END 1232fe465a01SBram Moolenaar writefile(lines, 'Xscript.vim') 1233fe465a01SBram Moolenaar 1234fe465a01SBram Moolenaar source Xscript.vim 1235fe465a01SBram Moolenaar assert_equal([4, 3, 2, 1, 0], g:result) 1236fe465a01SBram Moolenaar 1237fe465a01SBram Moolenaar unlet g:result 1238fe465a01SBram Moolenaar delete('Xsort.vim') 1239fe465a01SBram Moolenaar delete('Xscript.vim') 124095006e3dSBram Moolenaar 1241cfcd011fSBram Moolenaar var Funcref = function('s:RetSome') 124295006e3dSBram Moolenaar assert_equal('some', Funcref()) 1243fe465a01SBram Moolenaarenddef 1244fe465a01SBram Moolenaar 1245601e76acSBram Moolenaar" Check that when searching for "FilterFunc" it finds the import in the 1246601e76acSBram Moolenaar" script where FastFilter() is called from, both as a string and as a direct 1247601e76acSBram Moolenaar" function reference. 1248c620c055SBram Moolenaardef Test_vim9script_funcref_other_script() 1249cfcd011fSBram Moolenaar var filterLines =<< trim END 1250c620c055SBram Moolenaar vim9script 1251c620c055SBram Moolenaar export def FilterFunc(idx: number, val: number): bool 1252c620c055SBram Moolenaar return idx % 2 == 1 1253c620c055SBram Moolenaar enddef 1254c620c055SBram Moolenaar export def FastFilter(): list<number> 1255c620c055SBram Moolenaar return range(10)->filter('FilterFunc') 1256c620c055SBram Moolenaar enddef 1257601e76acSBram Moolenaar export def FastFilterDirect(): list<number> 1258601e76acSBram Moolenaar return range(10)->filter(FilterFunc) 1259601e76acSBram Moolenaar enddef 1260c620c055SBram Moolenaar END 1261c620c055SBram Moolenaar writefile(filterLines, 'Xfilter.vim') 1262c620c055SBram Moolenaar 1263cfcd011fSBram Moolenaar var lines =<< trim END 1264c620c055SBram Moolenaar vim9script 1265601e76acSBram Moolenaar import {FilterFunc, FastFilter, FastFilterDirect} from './Xfilter.vim' 1266c620c055SBram Moolenaar def Test() 1267cfcd011fSBram Moolenaar var x: list<number> = FastFilter() 1268c620c055SBram Moolenaar enddef 1269c620c055SBram Moolenaar Test() 1270601e76acSBram Moolenaar def TestDirect() 1271cfcd011fSBram Moolenaar var x: list<number> = FastFilterDirect() 1272601e76acSBram Moolenaar enddef 1273601e76acSBram Moolenaar TestDirect() 1274c620c055SBram Moolenaar END 1275601e76acSBram Moolenaar CheckScriptSuccess(lines) 1276c620c055SBram Moolenaar delete('Xfilter.vim') 1277c620c055SBram Moolenaarenddef 1278c620c055SBram Moolenaar 12794c17ad94SBram Moolenaardef Test_vim9script_reload_delfunc() 1280cfcd011fSBram Moolenaar var first_lines =<< trim END 12814c17ad94SBram Moolenaar vim9script 12824c17ad94SBram Moolenaar def FuncYes(): string 12834c17ad94SBram Moolenaar return 'yes' 12844c17ad94SBram Moolenaar enddef 12854c17ad94SBram Moolenaar END 1286cfcd011fSBram Moolenaar var withno_lines =<< trim END 12874c17ad94SBram Moolenaar def FuncNo(): string 12884c17ad94SBram Moolenaar return 'no' 12894c17ad94SBram Moolenaar enddef 12904c17ad94SBram Moolenaar def g:DoCheck(no_exists: bool) 12914c17ad94SBram Moolenaar assert_equal('yes', FuncYes()) 12924c17ad94SBram Moolenaar assert_equal('no', FuncNo()) 129303afdcf1SBram Moolenaar enddef 129403afdcf1SBram Moolenaar END 1295cfcd011fSBram Moolenaar var nono_lines =<< trim END 129603afdcf1SBram Moolenaar def g:DoCheck(no_exists: bool) 129703afdcf1SBram Moolenaar assert_equal('yes', FuncYes()) 129844d6652dSBram Moolenaar assert_fails('FuncNo()', 'E117:', '', 2, 'DoCheck') 12994c17ad94SBram Moolenaar enddef 13004c17ad94SBram Moolenaar END 13014c17ad94SBram Moolenaar 13024c17ad94SBram Moolenaar # FuncNo() is defined 130303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13044c17ad94SBram Moolenaar source Xreloaded.vim 13054c17ad94SBram Moolenaar g:DoCheck(true) 13064c17ad94SBram Moolenaar 13074c17ad94SBram Moolenaar # FuncNo() is not redefined 130803afdcf1SBram Moolenaar writefile(first_lines + nono_lines, 'Xreloaded.vim') 13094c17ad94SBram Moolenaar source Xreloaded.vim 131003afdcf1SBram Moolenaar g:DoCheck() 13114c17ad94SBram Moolenaar 13124c17ad94SBram Moolenaar # FuncNo() is back 131303afdcf1SBram Moolenaar writefile(first_lines + withno_lines, 'Xreloaded.vim') 13144c17ad94SBram Moolenaar source Xreloaded.vim 131503afdcf1SBram Moolenaar g:DoCheck() 13164c17ad94SBram Moolenaar 13174c17ad94SBram Moolenaar delete('Xreloaded.vim') 13184c17ad94SBram Moolenaarenddef 13194c17ad94SBram Moolenaar 132089483d40SBram Moolenaardef Test_vim9script_reload_delvar() 132189483d40SBram Moolenaar # write the script with a script-local variable 1322cfcd011fSBram Moolenaar var lines =<< trim END 132389483d40SBram Moolenaar vim9script 1324cfcd011fSBram Moolenaar var name = 'string' 132589483d40SBram Moolenaar END 132689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 132789483d40SBram Moolenaar source XreloadVar.vim 132889483d40SBram Moolenaar 132989483d40SBram Moolenaar # now write the script using the same variable locally - works 133089483d40SBram Moolenaar lines =<< trim END 133189483d40SBram Moolenaar vim9script 133289483d40SBram Moolenaar def Func() 1333cfcd011fSBram Moolenaar var name = 'string' 133489483d40SBram Moolenaar enddef 133589483d40SBram Moolenaar END 133689483d40SBram Moolenaar writefile(lines, 'XreloadVar.vim') 133789483d40SBram Moolenaar source XreloadVar.vim 133889483d40SBram Moolenaar 133989483d40SBram Moolenaar delete('XreloadVar.vim') 134089483d40SBram Moolenaarenddef 134189483d40SBram Moolenaar 13428a7d6542SBram Moolenaardef Test_import_absolute() 1343cfcd011fSBram Moolenaar var import_lines = [ 1344e6085c53SBram Moolenaar 'vim9script', 1345e6085c53SBram Moolenaar 'import exported from "' .. escape(getcwd(), '\') .. '/Xexport_abs.vim"', 1346e6085c53SBram Moolenaar 'def UseExported()', 1347e6085c53SBram Moolenaar ' g:imported_abs = exported', 1348e6085c53SBram Moolenaar ' exported = 8888', 1349e6085c53SBram Moolenaar ' g:imported_after = exported', 1350e6085c53SBram Moolenaar 'enddef', 1351e6085c53SBram Moolenaar 'UseExported()', 1352e6085c53SBram Moolenaar 'g:import_disassembled = execute("disass UseExported")', 1353e6085c53SBram Moolenaar ] 13548a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_abs.vim') 13558a7d6542SBram Moolenaar writefile(s:export_script_lines, 'Xexport_abs.vim') 13568a7d6542SBram Moolenaar 13578a7d6542SBram Moolenaar source Ximport_abs.vim 13588a7d6542SBram Moolenaar 13598a7d6542SBram Moolenaar assert_equal(9876, g:imported_abs) 13604e12a5dfSBram Moolenaar assert_equal(8888, g:imported_after) 1361fbbcd003SBram Moolenaar assert_match('<SNR>\d\+_UseExported\_s*' .. 1362fbbcd003SBram Moolenaar 'g:imported_abs = exported\_s*' .. 1363fbbcd003SBram Moolenaar '0 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1364fbbcd003SBram Moolenaar '1 STOREG g:imported_abs\_s*' .. 1365fbbcd003SBram Moolenaar 'exported = 8888\_s*' .. 1366fbbcd003SBram Moolenaar '2 PUSHNR 8888\_s*' .. 1367fbbcd003SBram Moolenaar '3 STORESCRIPT exported-2 in .*Xexport_abs.vim\_s*' .. 1368fbbcd003SBram Moolenaar 'g:imported_after = exported\_s*' .. 1369fbbcd003SBram Moolenaar '4 LOADSCRIPT exported-2 from .*Xexport_abs.vim\_s*' .. 1370fbbcd003SBram Moolenaar '5 STOREG g:imported_after', 1371e6085c53SBram Moolenaar g:import_disassembled) 1372b3ca9824SBram Moolenaar 1373b3ca9824SBram Moolenaar Undo_export_script_lines() 13748a7d6542SBram Moolenaar unlet g:imported_abs 13754e12a5dfSBram Moolenaar unlet g:import_disassembled 13768a7d6542SBram Moolenaar 13778a7d6542SBram Moolenaar delete('Ximport_abs.vim') 13788a7d6542SBram Moolenaar delete('Xexport_abs.vim') 13798a7d6542SBram Moolenaarenddef 13808a7d6542SBram Moolenaar 13818a7d6542SBram Moolenaardef Test_import_rtp() 1382cfcd011fSBram Moolenaar var import_lines = [ 1383e6085c53SBram Moolenaar 'vim9script', 1384e6085c53SBram Moolenaar 'import exported from "Xexport_rtp.vim"', 1385e6085c53SBram Moolenaar 'g:imported_rtp = exported', 1386e6085c53SBram Moolenaar ] 13878a7d6542SBram Moolenaar writefile(import_lines, 'Ximport_rtp.vim') 13888a7d6542SBram Moolenaar mkdir('import') 13898a7d6542SBram Moolenaar writefile(s:export_script_lines, 'import/Xexport_rtp.vim') 13908a7d6542SBram Moolenaar 1391cfcd011fSBram Moolenaar var save_rtp = &rtp 13928a7d6542SBram Moolenaar &rtp = getcwd() 13938a7d6542SBram Moolenaar source Ximport_rtp.vim 13948a7d6542SBram Moolenaar &rtp = save_rtp 13958a7d6542SBram Moolenaar 13968a7d6542SBram Moolenaar assert_equal(9876, g:imported_rtp) 13978a7d6542SBram Moolenaar 1398b3ca9824SBram Moolenaar Undo_export_script_lines() 1399b3ca9824SBram Moolenaar unlet g:imported_rtp 14008a7d6542SBram Moolenaar delete('Ximport_rtp.vim') 140189483d40SBram Moolenaar delete('import', 'rf') 14028a7d6542SBram Moolenaarenddef 14038a7d6542SBram Moolenaar 140425e0f586SBram Moolenaardef Test_import_compile_error() 1405cfcd011fSBram Moolenaar var export_lines = [ 140625e0f586SBram Moolenaar 'vim9script', 140725e0f586SBram Moolenaar 'export def ExpFunc(): string', 140825e0f586SBram Moolenaar ' return notDefined', 140925e0f586SBram Moolenaar 'enddef', 141025e0f586SBram Moolenaar ] 141125e0f586SBram Moolenaar writefile(export_lines, 'Xexported.vim') 141225e0f586SBram Moolenaar 1413cfcd011fSBram Moolenaar var import_lines = [ 141425e0f586SBram Moolenaar 'vim9script', 141525e0f586SBram Moolenaar 'import ExpFunc from "./Xexported.vim"', 141625e0f586SBram Moolenaar 'def ImpFunc()', 141725e0f586SBram Moolenaar ' echo ExpFunc()', 141825e0f586SBram Moolenaar 'enddef', 141925e0f586SBram Moolenaar 'defcompile', 142025e0f586SBram Moolenaar ] 142125e0f586SBram Moolenaar writefile(import_lines, 'Ximport.vim') 142225e0f586SBram Moolenaar 142325e0f586SBram Moolenaar try 142425e0f586SBram Moolenaar source Ximport.vim 142525e0f586SBram Moolenaar catch /E1001/ 1426f5be8cdbSBram Moolenaar # Error should be fore the Xexported.vim file. 14277707228aSBram Moolenaar assert_match('E1001: Variable not found: notDefined', v:exception) 142825e0f586SBram Moolenaar assert_match('function <SNR>\d\+_ImpFunc\[1\]..<SNR>\d\+_ExpFunc, line 1', v:throwpoint) 142925e0f586SBram Moolenaar endtry 143025e0f586SBram Moolenaar 143125e0f586SBram Moolenaar delete('Xexported.vim') 143225e0f586SBram Moolenaar delete('Ximport.vim') 143325e0f586SBram Moolenaarenddef 143425e0f586SBram Moolenaar 1435c4ce36d4SBram Moolenaardef Test_func_redefine_error() 1436cfcd011fSBram Moolenaar var lines = [ 1437c4ce36d4SBram Moolenaar 'vim9script', 1438c4ce36d4SBram Moolenaar 'def Func()', 1439c4ce36d4SBram Moolenaar ' eval [][0]', 1440c4ce36d4SBram Moolenaar 'enddef', 1441c4ce36d4SBram Moolenaar 'Func()', 1442c4ce36d4SBram Moolenaar ] 1443c4ce36d4SBram Moolenaar writefile(lines, 'Xtestscript.vim') 1444c4ce36d4SBram Moolenaar 1445c4ce36d4SBram Moolenaar for count in range(3) 1446c4ce36d4SBram Moolenaar try 1447c4ce36d4SBram Moolenaar source Xtestscript.vim 1448c4ce36d4SBram Moolenaar catch /E684/ 1449c4ce36d4SBram Moolenaar # function name should contain <SNR> every time 1450c4ce36d4SBram Moolenaar assert_match('E684: list index out of range', v:exception) 1451c4ce36d4SBram Moolenaar assert_match('function <SNR>\d\+_Func, line 1', v:throwpoint) 1452c4ce36d4SBram Moolenaar endtry 1453c4ce36d4SBram Moolenaar endfor 1454c4ce36d4SBram Moolenaar 1455c4ce36d4SBram Moolenaar delete('Xtestscript.vim') 1456c4ce36d4SBram Moolenaarenddef 1457c4ce36d4SBram Moolenaar 1458eef2102eSBram Moolenaardef Test_func_overrules_import_fails() 1459cfcd011fSBram Moolenaar var export_lines =<< trim END 1460eef2102eSBram Moolenaar vim9script 1461eef2102eSBram Moolenaar export def Func() 1462eef2102eSBram Moolenaar echo 'imported' 1463eef2102eSBram Moolenaar enddef 1464eef2102eSBram Moolenaar END 1465eef2102eSBram Moolenaar writefile(export_lines, 'XexportedFunc.vim') 1466eef2102eSBram Moolenaar 1467cfcd011fSBram Moolenaar var lines =<< trim END 1468eef2102eSBram Moolenaar vim9script 1469eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1470eef2102eSBram Moolenaar def Func() 1471eef2102eSBram Moolenaar echo 'local to function' 1472eef2102eSBram Moolenaar enddef 1473eef2102eSBram Moolenaar END 1474eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1475eef2102eSBram Moolenaar 1476eef2102eSBram Moolenaar lines =<< trim END 1477eef2102eSBram Moolenaar vim9script 1478eef2102eSBram Moolenaar import Func from './XexportedFunc.vim' 1479eef2102eSBram Moolenaar def Outer() 1480eef2102eSBram Moolenaar def Func() 1481eef2102eSBram Moolenaar echo 'local to function' 1482eef2102eSBram Moolenaar enddef 1483eef2102eSBram Moolenaar enddef 1484eef2102eSBram Moolenaar defcompile 1485eef2102eSBram Moolenaar END 1486eef2102eSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1487eef2102eSBram Moolenaar 1488eef2102eSBram Moolenaar delete('XexportedFunc.vim') 1489eef2102eSBram Moolenaarenddef 1490eef2102eSBram Moolenaar 1491b9a2cac3SBram Moolenaardef Test_func_redefine_fails() 1492cfcd011fSBram Moolenaar var lines =<< trim END 1493b9a2cac3SBram Moolenaar vim9script 1494b9a2cac3SBram Moolenaar def Func() 1495b9a2cac3SBram Moolenaar echo 'one' 1496b9a2cac3SBram Moolenaar enddef 1497b9a2cac3SBram Moolenaar def Func() 1498b9a2cac3SBram Moolenaar echo 'two' 1499b9a2cac3SBram Moolenaar enddef 1500b9a2cac3SBram Moolenaar END 1501b9a2cac3SBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1502fa211f3cSBram Moolenaar 1503fa211f3cSBram Moolenaar lines =<< trim END 1504fa211f3cSBram Moolenaar vim9script 1505fa211f3cSBram Moolenaar def Foo(): string 1506fa211f3cSBram Moolenaar return 'foo' 1507fa211f3cSBram Moolenaar enddef 1508fa211f3cSBram Moolenaar def Func() 1509cfcd011fSBram Moolenaar var Foo = {-> 'lambda'} 1510fa211f3cSBram Moolenaar enddef 1511fa211f3cSBram Moolenaar defcompile 1512fa211f3cSBram Moolenaar END 1513fa211f3cSBram Moolenaar CheckScriptFailure(lines, 'E1073:') 1514b9a2cac3SBram Moolenaarenddef 1515b9a2cac3SBram Moolenaar 15168a7d6542SBram Moolenaardef Test_fixed_size_list() 1517f5be8cdbSBram Moolenaar # will be allocated as one piece of memory, check that changes work 1518cfcd011fSBram Moolenaar var l = [1, 2, 3, 4] 15198a7d6542SBram Moolenaar l->remove(0) 15208a7d6542SBram Moolenaar l->add(5) 15218a7d6542SBram Moolenaar l->insert(99, 1) 15220f18b6d1SBram Moolenaar assert_equal([2, 99, 3, 4, 5], l) 15238a7d6542SBram Moolenaarenddef 15248a7d6542SBram Moolenaar 1525ae616494SBram Moolenaardef Test_no_insert_xit() 1526d2c61705SBram Moolenaar CheckDefExecFailure(['a = 1'], 'E1100:') 1527d2c61705SBram Moolenaar CheckDefExecFailure(['c = 1'], 'E1100:') 1528d2c61705SBram Moolenaar CheckDefExecFailure(['i = 1'], 'E1100:') 1529d2c61705SBram Moolenaar CheckDefExecFailure(['t = 1'], 'E1100:') 1530d2c61705SBram Moolenaar CheckDefExecFailure(['x = 1'], 'E1100:') 1531ae616494SBram Moolenaar 1532ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a = 1'], 'E488:') 1533ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'a'], 'E1100:') 1534ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c = 1'], 'E488:') 1535ae616494SBram Moolenaar CheckScriptFailure(['vim9script', 'c'], 'E1100:') 1536f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i = 1'], 'E488:') 1537f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'i'], 'E1100:') 1538f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't'], 'E1100:') 1539f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 't = 1'], 'E1100:') 1540f5a48010SBram Moolenaar CheckScriptFailure(['vim9script', 'x = 1'], 'E1100:') 1541ae616494SBram Moolenaarenddef 1542ae616494SBram Moolenaar 1543158906cfSBram Moolenaardef IfElse(what: number): string 1544cfcd011fSBram Moolenaar var res = '' 1545158906cfSBram Moolenaar if what == 1 1546158906cfSBram Moolenaar res = "one" 1547158906cfSBram Moolenaar elseif what == 2 1548158906cfSBram Moolenaar res = "two" 1549a259d8d3SBram Moolenaar else 1550158906cfSBram Moolenaar res = "three" 1551a259d8d3SBram Moolenaar endif 1552158906cfSBram Moolenaar return res 1553a259d8d3SBram Moolenaarenddef 1554a259d8d3SBram Moolenaar 1555158906cfSBram Moolenaardef Test_if_elseif_else() 1556158906cfSBram Moolenaar assert_equal('one', IfElse(1)) 1557158906cfSBram Moolenaar assert_equal('two', IfElse(2)) 1558158906cfSBram Moolenaar assert_equal('three', IfElse(3)) 15590f18b6d1SBram Moolenaarenddef 15600f18b6d1SBram Moolenaar 1561e8c4abbbSBram Moolenaardef Test_if_elseif_else_fails() 1562d2c61705SBram Moolenaar CheckDefFailure(['elseif true'], 'E582:') 1563d2c61705SBram Moolenaar CheckDefFailure(['else'], 'E581:') 1564d2c61705SBram Moolenaar CheckDefFailure(['endif'], 'E580:') 1565d2c61705SBram Moolenaar CheckDefFailure(['if true', 'elseif xxx'], 'E1001:') 1566d2c61705SBram Moolenaar CheckDefFailure(['if true', 'echo 1'], 'E171:') 1567e8c4abbbSBram Moolenaarenddef 1568e8c4abbbSBram Moolenaar 15696d69bf60SBram Moolenaarlet g:bool_true = v:true 15706d69bf60SBram Moolenaarlet g:bool_false = v:false 15716d69bf60SBram Moolenaar 15726d69bf60SBram Moolenaardef Test_if_const_expr() 1573cfcd011fSBram Moolenaar var res = false 15746d69bf60SBram Moolenaar if true ? true : false 15756d69bf60SBram Moolenaar res = true 15766d69bf60SBram Moolenaar endif 15776d69bf60SBram Moolenaar assert_equal(true, res) 15786d69bf60SBram Moolenaar 1579585fea7bSBram Moolenaar g:glob = 2 1580585fea7bSBram Moolenaar if false 15816797966dSBram Moolenaar execute('g:glob = 3') 1582585fea7bSBram Moolenaar endif 1583585fea7bSBram Moolenaar assert_equal(2, g:glob) 1584585fea7bSBram Moolenaar if true 15856797966dSBram Moolenaar execute('g:glob = 3') 1586585fea7bSBram Moolenaar endif 1587585fea7bSBram Moolenaar assert_equal(3, g:glob) 1588585fea7bSBram Moolenaar 15896d69bf60SBram Moolenaar res = false 15906d69bf60SBram Moolenaar if g:bool_true ? true : false 15916d69bf60SBram Moolenaar res = true 15926d69bf60SBram Moolenaar endif 15936d69bf60SBram Moolenaar assert_equal(true, res) 15946d69bf60SBram Moolenaar 15956d69bf60SBram Moolenaar res = false 15966d69bf60SBram Moolenaar if true ? g:bool_true : false 15976d69bf60SBram Moolenaar res = true 15986d69bf60SBram Moolenaar endif 15996d69bf60SBram Moolenaar assert_equal(true, res) 16006d69bf60SBram Moolenaar 16016d69bf60SBram Moolenaar res = false 16026d69bf60SBram Moolenaar if true ? true : g:bool_false 16036d69bf60SBram Moolenaar res = true 16046d69bf60SBram Moolenaar endif 16056d69bf60SBram Moolenaar assert_equal(true, res) 16066d69bf60SBram Moolenaar 16076d69bf60SBram Moolenaar res = false 16086d69bf60SBram Moolenaar if true ? false : true 16096d69bf60SBram Moolenaar res = true 16106d69bf60SBram Moolenaar endif 16116d69bf60SBram Moolenaar assert_equal(false, res) 16126d69bf60SBram Moolenaar 16136d69bf60SBram Moolenaar res = false 16146d69bf60SBram Moolenaar if false ? false : true 16156d69bf60SBram Moolenaar res = true 16166d69bf60SBram Moolenaar endif 16176d69bf60SBram Moolenaar assert_equal(true, res) 16186d69bf60SBram Moolenaar 16196d69bf60SBram Moolenaar res = false 16206d69bf60SBram Moolenaar if false ? true : false 16216d69bf60SBram Moolenaar res = true 16226d69bf60SBram Moolenaar endif 16236d69bf60SBram Moolenaar assert_equal(false, res) 16246d69bf60SBram Moolenaar 16256d69bf60SBram Moolenaar res = false 1626e8c4abbbSBram Moolenaar if has('xyz') ? true : false 1627e8c4abbbSBram Moolenaar res = true 1628e8c4abbbSBram Moolenaar endif 1629e8c4abbbSBram Moolenaar assert_equal(false, res) 1630e8c4abbbSBram Moolenaar 1631e8c4abbbSBram Moolenaar res = false 16326d69bf60SBram Moolenaar if true && true 16336d69bf60SBram Moolenaar res = true 16346d69bf60SBram Moolenaar endif 16356d69bf60SBram Moolenaar assert_equal(true, res) 16366d69bf60SBram Moolenaar 16376d69bf60SBram Moolenaar res = false 16386d69bf60SBram Moolenaar if true && false 16396d69bf60SBram Moolenaar res = true 16406d69bf60SBram Moolenaar endif 16416d69bf60SBram Moolenaar assert_equal(false, res) 16426d69bf60SBram Moolenaar 16436d69bf60SBram Moolenaar res = false 16446d69bf60SBram Moolenaar if g:bool_true && false 16456d69bf60SBram Moolenaar res = true 16466d69bf60SBram Moolenaar endif 16476d69bf60SBram Moolenaar assert_equal(false, res) 16486d69bf60SBram Moolenaar 16496d69bf60SBram Moolenaar res = false 16506d69bf60SBram Moolenaar if true && g:bool_false 16516d69bf60SBram Moolenaar res = true 16526d69bf60SBram Moolenaar endif 16536d69bf60SBram Moolenaar assert_equal(false, res) 16546d69bf60SBram Moolenaar 16556d69bf60SBram Moolenaar res = false 16566d69bf60SBram Moolenaar if false && false 16576d69bf60SBram Moolenaar res = true 16586d69bf60SBram Moolenaar endif 16596d69bf60SBram Moolenaar assert_equal(false, res) 16606d69bf60SBram Moolenaar 16616d69bf60SBram Moolenaar res = false 16626d69bf60SBram Moolenaar if true || false 16636d69bf60SBram Moolenaar res = true 16646d69bf60SBram Moolenaar endif 16656d69bf60SBram Moolenaar assert_equal(true, res) 16666d69bf60SBram Moolenaar 16676d69bf60SBram Moolenaar res = false 16686d69bf60SBram Moolenaar if g:bool_true || false 16696d69bf60SBram Moolenaar res = true 16706d69bf60SBram Moolenaar endif 16716d69bf60SBram Moolenaar assert_equal(true, res) 16726d69bf60SBram Moolenaar 16736d69bf60SBram Moolenaar res = false 16746d69bf60SBram Moolenaar if true || g:bool_false 16756d69bf60SBram Moolenaar res = true 16766d69bf60SBram Moolenaar endif 16776d69bf60SBram Moolenaar assert_equal(true, res) 16786d69bf60SBram Moolenaar 16796d69bf60SBram Moolenaar res = false 16806d69bf60SBram Moolenaar if false || false 16816d69bf60SBram Moolenaar res = true 16826d69bf60SBram Moolenaar endif 16836d69bf60SBram Moolenaar assert_equal(false, res) 16843988f64fSBram Moolenaar 16853988f64fSBram Moolenaar # with constant "false" expression may be invalid so long as the syntax is OK 16863988f64fSBram Moolenaar if false | eval 0 | endif 16873988f64fSBram Moolenaar if false | eval burp + 234 | endif 16883988f64fSBram Moolenaar if false | echo burp 234 'asd' | endif 16893988f64fSBram Moolenaar if false 16903988f64fSBram Moolenaar burp 16913988f64fSBram Moolenaar endif 169280c34ca3SBram Moolenaarenddef 16936d69bf60SBram Moolenaar 169480c34ca3SBram Moolenaardef Test_if_const_expr_fails() 1695d2c61705SBram Moolenaar CheckDefFailure(['if "aaa" == "bbb'], 'E114:') 1696d2c61705SBram Moolenaar CheckDefFailure(["if 'aaa' == 'bbb"], 'E115:') 1697d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa'"], 'E110:') 1698d2c61705SBram Moolenaar CheckDefFailure(["if has('aaa') ? true false"], 'E109:') 16996d69bf60SBram Moolenaarenddef 17006d69bf60SBram Moolenaar 170172abcf42SBram Moolenaardef RunNested(i: number): number 1702cfcd011fSBram Moolenaar var x: number = 0 170372abcf42SBram Moolenaar if i % 2 170472abcf42SBram Moolenaar if 1 1705f5be8cdbSBram Moolenaar # comment 170672abcf42SBram Moolenaar else 1707f5be8cdbSBram Moolenaar # comment 170872abcf42SBram Moolenaar endif 170972abcf42SBram Moolenaar x += 1 171072abcf42SBram Moolenaar else 171172abcf42SBram Moolenaar x += 1000 171272abcf42SBram Moolenaar endif 171372abcf42SBram Moolenaar return x 171472abcf42SBram Moolenaarenddef 171572abcf42SBram Moolenaar 171672abcf42SBram Moolenaardef Test_nested_if() 171772abcf42SBram Moolenaar assert_equal(1, RunNested(1)) 171872abcf42SBram Moolenaar assert_equal(1000, RunNested(2)) 171972abcf42SBram Moolenaarenddef 172072abcf42SBram Moolenaar 1721ad39c094SBram Moolenaardef Test_execute_cmd() 1722ad39c094SBram Moolenaar new 1723ad39c094SBram Moolenaar setline(1, 'default') 1724d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1725ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1726a72cfb80SBram Moolenaar 1727d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1728a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1729a72cfb80SBram Moolenaar 1730cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1731cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1732a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1733ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1734a72cfb80SBram Moolenaar 1735d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1736ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1737a72cfb80SBram Moolenaar 1738cfcd011fSBram Moolenaar var cmd_first = 'call ' 1739cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1740ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1741ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1742ad39c094SBram Moolenaar bwipe! 1743585fea7bSBram Moolenaar 1744cfcd011fSBram Moolenaar var n = true 17452d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 17462d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 17472d6b20d6SBram Moolenaar 1748e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1749e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1750e5abf7afSBram Moolenaar 1751d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1752d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1753d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1754ad39c094SBram Moolenaarenddef 1755ad39c094SBram Moolenaar 175647e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1757f5be8cdbSBram Moolenaar # only checks line continuation 1758cfcd011fSBram Moolenaar var lines =<< trim END 175947e880d6SBram Moolenaar vim9script 176047e880d6SBram Moolenaar execute 'g:someVar' 176147e880d6SBram Moolenaar .. ' = ' .. 176247e880d6SBram Moolenaar '28' 176347e880d6SBram Moolenaar assert_equal(28, g:someVar) 176447e880d6SBram Moolenaar unlet g:someVar 176547e880d6SBram Moolenaar END 176647e880d6SBram Moolenaar CheckScriptSuccess(lines) 176747e880d6SBram Moolenaarenddef 176847e880d6SBram Moolenaar 1769ad39c094SBram Moolenaardef Test_echo_cmd() 1770a72cfb80SBram Moolenaar echo 'some' # comment 1771585fea7bSBram Moolenaar echon 'thing' 1772ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1773ad39c094SBram Moolenaar 1774a72cfb80SBram Moolenaar echo "some" # comment 1775a72cfb80SBram Moolenaar echon "thing" 1776a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1777a72cfb80SBram Moolenaar 1778cfcd011fSBram Moolenaar var str1 = 'some' 1779cfcd011fSBram Moolenaar var str2 = 'more' 1780ad39c094SBram Moolenaar echo str1 str2 1781ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1782a72cfb80SBram Moolenaar 1783d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1784ad39c094SBram Moolenaarenddef 1785ad39c094SBram Moolenaar 1786f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1787f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1788f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1789f93c7feaSBram Moolenaar echo 'clear' 1790df069eecSBram Moolenaar :1messages 1791f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1792f93c7feaSBram Moolenaar 1793d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1794f93c7feaSBram Moolenaarenddef 1795f93c7feaSBram Moolenaar 179647e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1797f5be8cdbSBram Moolenaar # only checks line continuation 1798cfcd011fSBram Moolenaar var lines =<< trim END 179947e880d6SBram Moolenaar vim9script 180047e880d6SBram Moolenaar echomsg 'here' 180147e880d6SBram Moolenaar .. ' is ' .. 180247e880d6SBram Moolenaar 'a message' 180347e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 180447e880d6SBram Moolenaar END 180547e880d6SBram Moolenaar CheckScriptSuccess(lines) 180647e880d6SBram Moolenaarenddef 180747e880d6SBram Moolenaar 1808f93c7feaSBram Moolenaardef Test_echoerr_cmd() 180940ee466cSBram Moolenaar try 181040ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 181140ee466cSBram Moolenaar catch 181240ee466cSBram Moolenaar assert_match('something wrong', v:exception) 181340ee466cSBram Moolenaar endtry 1814f93c7feaSBram Moolenaarenddef 1815f93c7feaSBram Moolenaar 181647e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1817f5be8cdbSBram Moolenaar # only checks line continuation 1818cfcd011fSBram Moolenaar var lines =<< trim END 181947e880d6SBram Moolenaar vim9script 182047e880d6SBram Moolenaar try 182147e880d6SBram Moolenaar echoerr 'this' 182247e880d6SBram Moolenaar .. ' is ' .. 182347e880d6SBram Moolenaar 'wrong' 182447e880d6SBram Moolenaar catch 182547e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 182647e880d6SBram Moolenaar endtry 182747e880d6SBram Moolenaar END 182847e880d6SBram Moolenaar CheckScriptSuccess(lines) 182947e880d6SBram Moolenaarenddef 183047e880d6SBram Moolenaar 183141fe0617SBram Moolenaardef Test_for_outside_of_function() 1832cfcd011fSBram Moolenaar var lines =<< trim END 183341fe0617SBram Moolenaar vim9script 183441fe0617SBram Moolenaar new 183541fe0617SBram Moolenaar for var in range(0, 3) 183641fe0617SBram Moolenaar append(line('$'), var) 183741fe0617SBram Moolenaar endfor 183841fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 183941fe0617SBram Moolenaar bwipe! 184041fe0617SBram Moolenaar END 184141fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 184241fe0617SBram Moolenaar source Xvim9for.vim 184341fe0617SBram Moolenaar delete('Xvim9for.vim') 184441fe0617SBram Moolenaarenddef 18458a7d6542SBram Moolenaar 1846e8c4abbbSBram Moolenaardef Test_for_loop() 1847cfcd011fSBram Moolenaar var result = '' 1848e8c4abbbSBram Moolenaar for cnt in range(7) 1849e8c4abbbSBram Moolenaar if cnt == 4 1850e8c4abbbSBram Moolenaar break 1851e8c4abbbSBram Moolenaar endif 1852e8c4abbbSBram Moolenaar if cnt == 2 1853e8c4abbbSBram Moolenaar continue 1854e8c4abbbSBram Moolenaar endif 1855e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1856e8c4abbbSBram Moolenaar endfor 1857e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 18580ad3e894SBram Moolenaar 1859cfcd011fSBram Moolenaar var concat = '' 18600ad3e894SBram Moolenaar for str in eval('["one", "two"]') 18610ad3e894SBram Moolenaar concat ..= str 18620ad3e894SBram Moolenaar endfor 18630ad3e894SBram Moolenaar assert_equal('onetwo', concat) 186438bd8de5SBram Moolenaar 186538bd8de5SBram Moolenaar var total = 0 186638bd8de5SBram Moolenaar for nr in 186738bd8de5SBram Moolenaar [1, 2, 3] 186838bd8de5SBram Moolenaar total += nr 186938bd8de5SBram Moolenaar endfor 187038bd8de5SBram Moolenaar assert_equal(6, total) 187138bd8de5SBram Moolenaar 187238bd8de5SBram Moolenaar total = 0 187338bd8de5SBram Moolenaar for nr 187438bd8de5SBram Moolenaar in [1, 2, 3] 187538bd8de5SBram Moolenaar total += nr 187638bd8de5SBram Moolenaar endfor 187738bd8de5SBram Moolenaar assert_equal(6, total) 187838bd8de5SBram Moolenaar 187938bd8de5SBram Moolenaar total = 0 188038bd8de5SBram Moolenaar for nr 188138bd8de5SBram Moolenaar in 188238bd8de5SBram Moolenaar [1, 2, 3] 188338bd8de5SBram Moolenaar total += nr 188438bd8de5SBram Moolenaar endfor 188538bd8de5SBram Moolenaar assert_equal(6, total) 1886e8c4abbbSBram Moolenaarenddef 1887e8c4abbbSBram Moolenaar 1888e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1889675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1890675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1891cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1892822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 18932d870f8dSBram Moolenaar delfunc! g:Func 1894451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1895675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1896675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1897675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1898e8c4abbbSBram Moolenaarenddef 1899e8c4abbbSBram Moolenaar 1900ea87069dSBram Moolenaardef Test_for_loop_script_var() 1901ea87069dSBram Moolenaar # cannot use s:var in a :def function 1902ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 1903ea87069dSBram Moolenaar 1904ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 1905ea87069dSBram Moolenaar var lines =<< trim END 1906ea87069dSBram Moolenaar vim9script 1907ea87069dSBram Moolenaar var total = 0 1908ea87069dSBram Moolenaar for s:var in [1, 2, 3] 1909ea87069dSBram Moolenaar total += s:var 1910ea87069dSBram Moolenaar endfor 1911ea87069dSBram Moolenaar assert_equal(6, total) 1912ea87069dSBram Moolenaar 1913ea87069dSBram Moolenaar total = 0 1914ea87069dSBram Moolenaar for var in [1, 2, 3] 1915ea87069dSBram Moolenaar total += var 1916ea87069dSBram Moolenaar endfor 1917ea87069dSBram Moolenaar assert_equal(6, total) 1918ea87069dSBram Moolenaar END 1919ea87069dSBram Moolenaarenddef 1920ea87069dSBram Moolenaar 1921792f786aSBram Moolenaardef Test_for_loop_unpack() 19224b8a0651SBram Moolenaar var lines =<< trim END 1923792f786aSBram Moolenaar var result = [] 1924792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 1925792f786aSBram Moolenaar result->add(v1) 1926792f786aSBram Moolenaar result->add(v2) 1927792f786aSBram Moolenaar endfor 1928792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 1929792f786aSBram Moolenaar 1930792f786aSBram Moolenaar result = [] 1931792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 1932792f786aSBram Moolenaar result->add(v1) 1933792f786aSBram Moolenaar result->add(v2) 1934792f786aSBram Moolenaar result->add(v3) 1935792f786aSBram Moolenaar endfor 1936792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 1937792f786aSBram Moolenaar 19384b8a0651SBram Moolenaar result = [] 19394b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 19404b8a0651SBram Moolenaar result->add(&ts) 19414b8a0651SBram Moolenaar result->add(&sw) 19424b8a0651SBram Moolenaar endfor 19434b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 19444b8a0651SBram Moolenaar 19454b8a0651SBram Moolenaar var slist: list<string> 19464b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 19474b8a0651SBram Moolenaar slist->add($LOOPVAR) 19484b8a0651SBram Moolenaar slist->add(@r) 19494b8a0651SBram Moolenaar slist->add(v:errmsg) 19504b8a0651SBram Moolenaar endfor 19514b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 19524b8a0651SBram Moolenaar 19534b8a0651SBram Moolenaar slist = [] 19544b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 19554b8a0651SBram Moolenaar slist->add(g:globalvar) 19564b8a0651SBram Moolenaar slist->add(b:bufvar) 19574b8a0651SBram Moolenaar slist->add(w:winvar) 19584b8a0651SBram Moolenaar slist->add(t:tabvar) 19594b8a0651SBram Moolenaar endfor 19604b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 1961f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 19624b8a0651SBram Moolenaar END 19634b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 19644b8a0651SBram Moolenaar 19654b8a0651SBram Moolenaar lines =<< trim END 1966792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 1967792f786aSBram Moolenaar echo v1 v2 1968792f786aSBram Moolenaar endfor 1969792f786aSBram Moolenaar END 1970792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 1971792f786aSBram Moolenaar 1972792f786aSBram Moolenaar lines =<< trim END 1973792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 1974792f786aSBram Moolenaar echo v1 v2 1975792f786aSBram Moolenaar endfor 1976792f786aSBram Moolenaar END 1977792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 1978792f786aSBram Moolenaar 1979792f786aSBram Moolenaar lines =<< trim END 1980792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 1981792f786aSBram Moolenaar echo v1 1982792f786aSBram Moolenaar endfor 1983792f786aSBram Moolenaar END 1984792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 1985792f786aSBram Moolenaarenddef 1986792f786aSBram Moolenaar 1987d0df1aacSBram Moolenaardef Test_while_loop() 1988cfcd011fSBram Moolenaar var result = '' 1989cfcd011fSBram Moolenaar var cnt = 0 1990d0df1aacSBram Moolenaar while cnt < 555 1991d0df1aacSBram Moolenaar if cnt == 3 1992d0df1aacSBram Moolenaar break 1993d0df1aacSBram Moolenaar endif 1994d0df1aacSBram Moolenaar cnt += 1 1995d0df1aacSBram Moolenaar if cnt == 2 1996d0df1aacSBram Moolenaar continue 1997d0df1aacSBram Moolenaar endif 1998d0df1aacSBram Moolenaar result ..= cnt .. '_' 1999d0df1aacSBram Moolenaar endwhile 2000d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2001d0df1aacSBram Moolenaarenddef 2002d0df1aacSBram Moolenaar 2003e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2004675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2005675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2006675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2007675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2008675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2009675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2010675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2011bd5da371SBram Moolenaarenddef 2012bd5da371SBram Moolenaar 20139645e2d9SBram Moolenaardef Test_interrupt_loop() 2014cfcd011fSBram Moolenaar var caught = false 2015cfcd011fSBram Moolenaar var x = 0 201697acfc78SBram Moolenaar try 20179645e2d9SBram Moolenaar while 1 20189645e2d9SBram Moolenaar x += 1 20199645e2d9SBram Moolenaar if x == 100 20209645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 20219645e2d9SBram Moolenaar endif 20229645e2d9SBram Moolenaar endwhile 202397acfc78SBram Moolenaar catch 202497acfc78SBram Moolenaar caught = true 202597acfc78SBram Moolenaar assert_equal(100, x) 202697acfc78SBram Moolenaar endtry 202797acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 202825859dd7SBram Moolenaar # consume the CTRL-C 202925859dd7SBram Moolenaar getchar(0) 20309645e2d9SBram Moolenaarenddef 203120431c9dSBram Moolenaar 20324fdae999SBram Moolenaardef Test_automatic_line_continuation() 2033cfcd011fSBram Moolenaar var mylist = [ 20344fdae999SBram Moolenaar 'one', 20354fdae999SBram Moolenaar 'two', 20364fdae999SBram Moolenaar 'three', 2037f5be8cdbSBram Moolenaar ] # comment 20384fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 20394fdae999SBram Moolenaar 2040cfcd011fSBram Moolenaar var mydict = { 2041e0de171eSBram Moolenaar ['one']: 1, 2042e0de171eSBram Moolenaar ['two']: 2, 2043e0de171eSBram Moolenaar ['three']: 20444fdae999SBram Moolenaar 3, 2045f5be8cdbSBram Moolenaar } # comment 2046e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2047e0de171eSBram Moolenaar mydict = { 20482c330432SBram Moolenaar one: 1, # comment 20492c330432SBram Moolenaar two: # comment 20502c330432SBram Moolenaar 2, # comment 20512c330432SBram Moolenaar three: 3 # comment 20522c330432SBram Moolenaar } 2053e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2054e0de171eSBram Moolenaar mydict = { 20552c330432SBram Moolenaar one: 1, 20564fdae999SBram Moolenaar two: 20574fdae999SBram Moolenaar 2, 20582c330432SBram Moolenaar three: 3 20594fdae999SBram Moolenaar } 2060e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2061e6085c53SBram Moolenaar 2062e6085c53SBram Moolenaar assert_equal( 2063e6085c53SBram Moolenaar ['one', 'two', 'three'], 2064e6085c53SBram Moolenaar split('one two three') 2065e6085c53SBram Moolenaar ) 20664fdae999SBram Moolenaarenddef 20674fdae999SBram Moolenaar 20687a092245SBram Moolenaardef Test_vim9_comment() 20697a092245SBram Moolenaar CheckScriptSuccess([ 20707a092245SBram Moolenaar 'vim9script', 20717a092245SBram Moolenaar '# something', 2072*93f82cbeSBram Moolenaar '#something', 2073*93f82cbeSBram Moolenaar '#{something', 20747a092245SBram Moolenaar ]) 2075*93f82cbeSBram Moolenaar 2076*93f82cbeSBram Moolenaar split Xfile 2077*93f82cbeSBram Moolenaar CheckScriptSuccess([ 2078*93f82cbeSBram Moolenaar 'vim9script', 2079*93f82cbeSBram Moolenaar 'edit #something', 2080*93f82cbeSBram Moolenaar ]) 2081*93f82cbeSBram Moolenaar CheckScriptSuccess([ 2082*93f82cbeSBram Moolenaar 'vim9script', 2083*93f82cbeSBram Moolenaar 'edit #{something', 2084*93f82cbeSBram Moolenaar ]) 2085*93f82cbeSBram Moolenaar close 2086*93f82cbeSBram Moolenaar 20877a092245SBram Moolenaar CheckScriptFailure([ 20887a092245SBram Moolenaar 'vim9script', 20897a092245SBram Moolenaar ':# something', 20907a092245SBram Moolenaar ], 'E488:') 20917a092245SBram Moolenaar CheckScriptFailure([ 20927a092245SBram Moolenaar '# something', 20937a092245SBram Moolenaar ], 'E488:') 20947a092245SBram Moolenaar CheckScriptFailure([ 20957a092245SBram Moolenaar ':# something', 20967a092245SBram Moolenaar ], 'E488:') 20977a092245SBram Moolenaar 20984a8d9f2eSBram Moolenaar { # block start 20994a8d9f2eSBram Moolenaar } # block end 21004a8d9f2eSBram Moolenaar CheckDefFailure([ 21014a8d9f2eSBram Moolenaar '{# comment', 21024a8d9f2eSBram Moolenaar ], 'E488:') 21034a8d9f2eSBram Moolenaar CheckDefFailure([ 21044a8d9f2eSBram Moolenaar '{', 21054a8d9f2eSBram Moolenaar '}# comment', 21064a8d9f2eSBram Moolenaar ], 'E488:') 21074a8d9f2eSBram Moolenaar 21084a8d9f2eSBram Moolenaar echo "yes" # comment 21094a8d9f2eSBram Moolenaar CheckDefFailure([ 21104a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21114a8d9f2eSBram Moolenaar ], 'E488:') 21127a092245SBram Moolenaar CheckScriptSuccess([ 21137a092245SBram Moolenaar 'vim9script', 21147a092245SBram Moolenaar 'echo "yes" # something', 21157a092245SBram Moolenaar ]) 21167a092245SBram Moolenaar CheckScriptFailure([ 21177a092245SBram Moolenaar 'vim9script', 21187a092245SBram Moolenaar 'echo "yes"# something', 21197a092245SBram Moolenaar ], 'E121:') 21207a092245SBram Moolenaar CheckScriptFailure([ 21217a092245SBram Moolenaar 'vim9script', 21227a092245SBram Moolenaar 'echo# something', 21237a092245SBram Moolenaar ], 'E121:') 21247a092245SBram Moolenaar CheckScriptFailure([ 21257a092245SBram Moolenaar 'echo "yes" # something', 21267a092245SBram Moolenaar ], 'E121:') 21277a092245SBram Moolenaar 21284a8d9f2eSBram Moolenaar exe "echo" # comment 21294a8d9f2eSBram Moolenaar CheckDefFailure([ 21304a8d9f2eSBram Moolenaar 'exe "echo"# comment', 21314a8d9f2eSBram Moolenaar ], 'E488:') 21324a8d9f2eSBram Moolenaar CheckScriptSuccess([ 21334a8d9f2eSBram Moolenaar 'vim9script', 21344a8d9f2eSBram Moolenaar 'exe "echo" # something', 21354a8d9f2eSBram Moolenaar ]) 21364a8d9f2eSBram Moolenaar CheckScriptFailure([ 21374a8d9f2eSBram Moolenaar 'vim9script', 21384a8d9f2eSBram Moolenaar 'exe "echo"# something', 21394a8d9f2eSBram Moolenaar ], 'E121:') 21404a8d9f2eSBram Moolenaar CheckDefFailure([ 21414a8d9f2eSBram Moolenaar 'exe # comment', 21424a8d9f2eSBram Moolenaar ], 'E1015:') 21434a8d9f2eSBram Moolenaar CheckScriptFailure([ 21444a8d9f2eSBram Moolenaar 'vim9script', 21454a8d9f2eSBram Moolenaar 'exe# something', 21464a8d9f2eSBram Moolenaar ], 'E121:') 21474a8d9f2eSBram Moolenaar CheckScriptFailure([ 21484a8d9f2eSBram Moolenaar 'exe "echo" # something', 21494a8d9f2eSBram Moolenaar ], 'E121:') 21504a8d9f2eSBram Moolenaar 21517a092245SBram Moolenaar CheckDefFailure([ 21527a092245SBram Moolenaar 'try# comment', 21537a092245SBram Moolenaar ' echo "yes"', 21547a092245SBram Moolenaar 'catch', 21557a092245SBram Moolenaar 'endtry', 21567a092245SBram Moolenaar ], 'E488:') 21572c5ed4e3SBram Moolenaar CheckScriptFailure([ 21582c5ed4e3SBram Moolenaar 'vim9script', 21592c5ed4e3SBram Moolenaar 'try# comment', 21602c5ed4e3SBram Moolenaar 'echo "yes"', 21612c5ed4e3SBram Moolenaar ], 'E488:') 21627a092245SBram Moolenaar CheckDefFailure([ 21637a092245SBram Moolenaar 'try', 2164a72cfb80SBram Moolenaar ' throw#comment', 2165a72cfb80SBram Moolenaar 'catch', 2166a72cfb80SBram Moolenaar 'endtry', 2167a72cfb80SBram Moolenaar ], 'E1015:') 2168a72cfb80SBram Moolenaar CheckDefFailure([ 2169a72cfb80SBram Moolenaar 'try', 2170a72cfb80SBram Moolenaar ' throw "yes"#comment', 2171a72cfb80SBram Moolenaar 'catch', 2172a72cfb80SBram Moolenaar 'endtry', 2173a72cfb80SBram Moolenaar ], 'E488:') 2174a72cfb80SBram Moolenaar CheckDefFailure([ 2175a72cfb80SBram Moolenaar 'try', 21767a092245SBram Moolenaar ' echo "yes"', 21777a092245SBram Moolenaar 'catch# comment', 21787a092245SBram Moolenaar 'endtry', 21797a092245SBram Moolenaar ], 'E488:') 21802c5ed4e3SBram Moolenaar CheckScriptFailure([ 21812c5ed4e3SBram Moolenaar 'vim9script', 21822c5ed4e3SBram Moolenaar 'try', 21832c5ed4e3SBram Moolenaar ' echo "yes"', 21842c5ed4e3SBram Moolenaar 'catch# comment', 21852c5ed4e3SBram Moolenaar 'endtry', 21862c5ed4e3SBram Moolenaar ], 'E654:') 21872c5ed4e3SBram Moolenaar CheckDefFailure([ 21882c5ed4e3SBram Moolenaar 'try', 21892c5ed4e3SBram Moolenaar ' echo "yes"', 21902c5ed4e3SBram Moolenaar 'catch /pat/# comment', 21912c5ed4e3SBram Moolenaar 'endtry', 21922c5ed4e3SBram Moolenaar ], 'E488:') 21937a092245SBram Moolenaar CheckDefFailure([ 21947a092245SBram Moolenaar 'try', 21957a092245SBram Moolenaar 'echo "yes"', 21967a092245SBram Moolenaar 'catch', 21977a092245SBram Moolenaar 'endtry# comment', 21987a092245SBram Moolenaar ], 'E488:') 21992c5ed4e3SBram Moolenaar CheckScriptFailure([ 22002c5ed4e3SBram Moolenaar 'vim9script', 22012c5ed4e3SBram Moolenaar 'try', 22022c5ed4e3SBram Moolenaar ' echo "yes"', 22032c5ed4e3SBram Moolenaar 'catch', 22042c5ed4e3SBram Moolenaar 'endtry# comment', 22059b7bf9e9SBram Moolenaar ], 'E488:') 22062c5ed4e3SBram Moolenaar 22072c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22082c5ed4e3SBram Moolenaar 'vim9script', 22092c5ed4e3SBram Moolenaar 'hi # comment', 22102c5ed4e3SBram Moolenaar ]) 22112c5ed4e3SBram Moolenaar CheckScriptFailure([ 22122c5ed4e3SBram Moolenaar 'vim9script', 22132c5ed4e3SBram Moolenaar 'hi# comment', 22142c5ed4e3SBram Moolenaar ], 'E416:') 22151966c248SBram Moolenaar CheckScriptSuccess([ 22161966c248SBram Moolenaar 'vim9script', 22171966c248SBram Moolenaar 'hi Search # comment', 22181966c248SBram Moolenaar ]) 22191966c248SBram Moolenaar CheckScriptFailure([ 22201966c248SBram Moolenaar 'vim9script', 22211966c248SBram Moolenaar 'hi Search# comment', 22221966c248SBram Moolenaar ], 'E416:') 22231966c248SBram Moolenaar CheckScriptSuccess([ 22241966c248SBram Moolenaar 'vim9script', 22251966c248SBram Moolenaar 'hi link This Search # comment', 22261966c248SBram Moolenaar ]) 22271966c248SBram Moolenaar CheckScriptFailure([ 22281966c248SBram Moolenaar 'vim9script', 22291966c248SBram Moolenaar 'hi link This That# comment', 22301966c248SBram Moolenaar ], 'E413:') 22311966c248SBram Moolenaar CheckScriptSuccess([ 22321966c248SBram Moolenaar 'vim9script', 22331966c248SBram Moolenaar 'hi clear This # comment', 22341966c248SBram Moolenaar 'hi clear # comment', 22351966c248SBram Moolenaar ]) 2236f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2237f5be8cdbSBram Moolenaar # hi clear This# comment', 22381966c248SBram Moolenaar CheckScriptFailure([ 22391966c248SBram Moolenaar 'vim9script', 22401966c248SBram Moolenaar 'hi clear# comment', 22411966c248SBram Moolenaar ], 'E416:') 22421966c248SBram Moolenaar 22431966c248SBram Moolenaar CheckScriptSuccess([ 22441966c248SBram Moolenaar 'vim9script', 22451966c248SBram Moolenaar 'hi Group term=bold', 22461966c248SBram Moolenaar 'match Group /todo/ # comment', 22471966c248SBram Moolenaar ]) 22481966c248SBram Moolenaar CheckScriptFailure([ 22491966c248SBram Moolenaar 'vim9script', 22501966c248SBram Moolenaar 'hi Group term=bold', 22511966c248SBram Moolenaar 'match Group /todo/# comment', 22521966c248SBram Moolenaar ], 'E488:') 22531966c248SBram Moolenaar CheckScriptSuccess([ 22541966c248SBram Moolenaar 'vim9script', 22551966c248SBram Moolenaar 'match # comment', 22561966c248SBram Moolenaar ]) 22571966c248SBram Moolenaar CheckScriptFailure([ 22581966c248SBram Moolenaar 'vim9script', 22591966c248SBram Moolenaar 'match# comment', 22601966c248SBram Moolenaar ], 'E475:') 22611966c248SBram Moolenaar CheckScriptSuccess([ 22621966c248SBram Moolenaar 'vim9script', 22631966c248SBram Moolenaar 'match none # comment', 22641966c248SBram Moolenaar ]) 22651966c248SBram Moolenaar CheckScriptFailure([ 22661966c248SBram Moolenaar 'vim9script', 22671966c248SBram Moolenaar 'match none# comment', 22681966c248SBram Moolenaar ], 'E475:') 22691966c248SBram Moolenaar 22701966c248SBram Moolenaar CheckScriptSuccess([ 22711966c248SBram Moolenaar 'vim9script', 22721966c248SBram Moolenaar 'menutrans clear # comment', 22731966c248SBram Moolenaar ]) 22741966c248SBram Moolenaar CheckScriptFailure([ 22751966c248SBram Moolenaar 'vim9script', 22761966c248SBram Moolenaar 'menutrans clear# comment text', 22771966c248SBram Moolenaar ], 'E474:') 22781966c248SBram Moolenaar 22791966c248SBram Moolenaar CheckScriptSuccess([ 22801966c248SBram Moolenaar 'vim9script', 22811966c248SBram Moolenaar 'syntax clear # comment', 22821966c248SBram Moolenaar ]) 22831966c248SBram Moolenaar CheckScriptFailure([ 22841966c248SBram Moolenaar 'vim9script', 22851966c248SBram Moolenaar 'syntax clear# comment text', 22861966c248SBram Moolenaar ], 'E28:') 22871966c248SBram Moolenaar CheckScriptSuccess([ 22881966c248SBram Moolenaar 'vim9script', 22891966c248SBram Moolenaar 'syntax keyword Word some', 22901966c248SBram Moolenaar 'syntax clear Word # comment', 22911966c248SBram Moolenaar ]) 22921966c248SBram Moolenaar CheckScriptFailure([ 22931966c248SBram Moolenaar 'vim9script', 22941966c248SBram Moolenaar 'syntax keyword Word some', 22951966c248SBram Moolenaar 'syntax clear Word# comment text', 22961966c248SBram Moolenaar ], 'E28:') 22971966c248SBram Moolenaar 22981966c248SBram Moolenaar CheckScriptSuccess([ 22991966c248SBram Moolenaar 'vim9script', 23001966c248SBram Moolenaar 'syntax list # comment', 23011966c248SBram Moolenaar ]) 23021966c248SBram Moolenaar CheckScriptFailure([ 23031966c248SBram Moolenaar 'vim9script', 23041966c248SBram Moolenaar 'syntax list# comment text', 23051966c248SBram Moolenaar ], 'E28:') 23061966c248SBram Moolenaar 23071966c248SBram Moolenaar CheckScriptSuccess([ 23081966c248SBram Moolenaar 'vim9script', 23091966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23101966c248SBram Moolenaar ]) 23111966c248SBram Moolenaar CheckScriptFailure([ 23121966c248SBram Moolenaar 'vim9script', 23131966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23141966c248SBram Moolenaar ], 'E475:') 23151966c248SBram Moolenaar 23161966c248SBram Moolenaar CheckScriptSuccess([ 23171966c248SBram Moolenaar 'vim9script', 23181966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23191966c248SBram Moolenaar ]) 23201966c248SBram Moolenaar CheckScriptFailure([ 23211966c248SBram Moolenaar 'vim9script', 23221966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 23231966c248SBram Moolenaar ], 'E789:') 23241966c248SBram Moolenaar 23251966c248SBram Moolenaar CheckScriptSuccess([ 23261966c248SBram Moolenaar 'vim9script', 23271966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 23281966c248SBram Moolenaar ]) 23291966c248SBram Moolenaar CheckScriptFailure([ 23301966c248SBram Moolenaar 'vim9script', 23311966c248SBram Moolenaar 'syntax match Word /pat/# comment', 23321966c248SBram Moolenaar ], 'E402:') 23331966c248SBram Moolenaar 23341966c248SBram Moolenaar CheckScriptSuccess([ 23351966c248SBram Moolenaar 'vim9script', 23361966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 23371966c248SBram Moolenaar ]) 23381966c248SBram Moolenaar CheckScriptFailure([ 23391966c248SBram Moolenaar 'vim9script', 23401966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 23411966c248SBram Moolenaar ], 'E475:') 23421966c248SBram Moolenaar CheckScriptFailure([ 23431966c248SBram Moolenaar 'vim9script', 23441966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 23451966c248SBram Moolenaar ], 'E406:') 23461966c248SBram Moolenaar CheckScriptFailure([ 23471966c248SBram Moolenaar 'vim9script', 23481966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 23491966c248SBram Moolenaar ], 'E475:') 23501966c248SBram Moolenaar 23511966c248SBram Moolenaar CheckScriptSuccess([ 23521966c248SBram Moolenaar 'vim9script', 23531966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 23541966c248SBram Moolenaar ]) 23551966c248SBram Moolenaar CheckScriptFailure([ 23561966c248SBram Moolenaar 'vim9script', 23571966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2358d032f34aSBram Moolenaar ], 'E402:') 23591966c248SBram Moolenaar 23601966c248SBram Moolenaar CheckScriptSuccess([ 23611966c248SBram Moolenaar 'vim9script', 23621966c248SBram Moolenaar 'syntax sync # comment', 23631966c248SBram Moolenaar ]) 23641966c248SBram Moolenaar CheckScriptFailure([ 23651966c248SBram Moolenaar 'vim9script', 23661966c248SBram Moolenaar 'syntax sync# comment', 23671966c248SBram Moolenaar ], 'E404:') 23681966c248SBram Moolenaar CheckScriptSuccess([ 23691966c248SBram Moolenaar 'vim9script', 23701966c248SBram Moolenaar 'syntax sync ccomment # comment', 23711966c248SBram Moolenaar ]) 23721966c248SBram Moolenaar CheckScriptFailure([ 23731966c248SBram Moolenaar 'vim9script', 23741966c248SBram Moolenaar 'syntax sync ccomment# comment', 23751966c248SBram Moolenaar ], 'E404:') 23761966c248SBram Moolenaar 23771966c248SBram Moolenaar CheckScriptSuccess([ 23781966c248SBram Moolenaar 'vim9script', 23791966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 23801966c248SBram Moolenaar ]) 23811966c248SBram Moolenaar CheckScriptFailure([ 23821966c248SBram Moolenaar 'vim9script', 23831966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 23841966c248SBram Moolenaar ], 'E475:') 2385a72cfb80SBram Moolenaar 2386a72cfb80SBram Moolenaar CheckScriptSuccess([ 2387a72cfb80SBram Moolenaar 'vim9script', 2388a72cfb80SBram Moolenaar 'command Echo echo # comment', 2389a72cfb80SBram Moolenaar 'command Echo # comment', 23902d870f8dSBram Moolenaar 'delcommand Echo', 2391a72cfb80SBram Moolenaar ]) 2392a72cfb80SBram Moolenaar CheckScriptFailure([ 2393a72cfb80SBram Moolenaar 'vim9script', 2394a72cfb80SBram Moolenaar 'command Echo echo# comment', 2395a72cfb80SBram Moolenaar 'Echo', 2396a72cfb80SBram Moolenaar ], 'E121:') 23972d870f8dSBram Moolenaar delcommand Echo 239870249ee8SBram Moolenaar 239970249ee8SBram Moolenaar var curdir = getcwd() 240070249ee8SBram Moolenaar CheckScriptSuccess([ 240170249ee8SBram Moolenaar 'command Echo cd " comment', 240270249ee8SBram Moolenaar 'Echo', 240370249ee8SBram Moolenaar 'delcommand Echo', 240470249ee8SBram Moolenaar ]) 240570249ee8SBram Moolenaar CheckScriptSuccess([ 240670249ee8SBram Moolenaar 'vim9script' 240770249ee8SBram Moolenaar 'command Echo cd # comment', 240870249ee8SBram Moolenaar 'Echo', 240970249ee8SBram Moolenaar 'delcommand Echo', 241070249ee8SBram Moolenaar ]) 241170249ee8SBram Moolenaar CheckScriptFailure([ 241270249ee8SBram Moolenaar 'vim9script', 241370249ee8SBram Moolenaar 'command Echo cd " comment', 241470249ee8SBram Moolenaar 'Echo', 241570249ee8SBram Moolenaar ], 'E344:') 241670249ee8SBram Moolenaar delcommand Echo 241770249ee8SBram Moolenaar chdir(curdir) 241870249ee8SBram Moolenaar 2419a72cfb80SBram Moolenaar CheckScriptFailure([ 2420a72cfb80SBram Moolenaar 'vim9script', 2421a72cfb80SBram Moolenaar 'command Echo# comment', 2422a72cfb80SBram Moolenaar ], 'E182:') 2423a72cfb80SBram Moolenaar CheckScriptFailure([ 2424a72cfb80SBram Moolenaar 'vim9script', 2425a72cfb80SBram Moolenaar 'command Echo echo', 2426a72cfb80SBram Moolenaar 'command Echo# comment', 2427a72cfb80SBram Moolenaar ], 'E182:') 24282d870f8dSBram Moolenaar delcommand Echo 2429a72cfb80SBram Moolenaar 2430a72cfb80SBram Moolenaar CheckScriptSuccess([ 2431a72cfb80SBram Moolenaar 'vim9script', 2432a72cfb80SBram Moolenaar 'function # comment', 2433a72cfb80SBram Moolenaar ]) 2434a72cfb80SBram Moolenaar CheckScriptFailure([ 2435a72cfb80SBram Moolenaar 'vim9script', 24369898107fSBram Moolenaar 'function " comment', 24379898107fSBram Moolenaar ], 'E129:') 24389898107fSBram Moolenaar CheckScriptFailure([ 24399898107fSBram Moolenaar 'vim9script', 2440a72cfb80SBram Moolenaar 'function# comment', 2441a72cfb80SBram Moolenaar ], 'E129:') 2442a72cfb80SBram Moolenaar CheckScriptSuccess([ 2443a72cfb80SBram Moolenaar 'vim9script', 2444a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2445a72cfb80SBram Moolenaar ]) 2446a72cfb80SBram Moolenaar CheckScriptFailure([ 2447a72cfb80SBram Moolenaar 'vim9script', 2448a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2449a72cfb80SBram Moolenaar ], 'E488:') 2450a72cfb80SBram Moolenaar 2451a72cfb80SBram Moolenaar CheckScriptSuccess([ 2452a72cfb80SBram Moolenaar 'vim9script', 24534c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2454a72cfb80SBram Moolenaar 'endfunc', 24554c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2456a72cfb80SBram Moolenaar ]) 2457a72cfb80SBram Moolenaar CheckScriptFailure([ 2458a72cfb80SBram Moolenaar 'vim9script', 24594c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2460a72cfb80SBram Moolenaar 'endfunc', 24614c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2462a72cfb80SBram Moolenaar ], 'E488:') 2463a72cfb80SBram Moolenaar 2464a72cfb80SBram Moolenaar CheckScriptSuccess([ 2465a72cfb80SBram Moolenaar 'vim9script', 2466a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2467a72cfb80SBram Moolenaar ]) 2468a72cfb80SBram Moolenaar CheckScriptFailure([ 2469a72cfb80SBram Moolenaar 'vim9script', 2470a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2471a72cfb80SBram Moolenaar ], 'E488:') 2472e7e4838fSBram Moolenaar 2473e7e4838fSBram Moolenaar CheckScriptFailure([ 2474e7e4838fSBram Moolenaar 'def Test() " comment', 2475e7e4838fSBram Moolenaar 'enddef', 2476e7e4838fSBram Moolenaar ], 'E488:') 2477e7e4838fSBram Moolenaar CheckScriptFailure([ 2478e7e4838fSBram Moolenaar 'vim9script', 2479e7e4838fSBram Moolenaar 'def Test() " comment', 2480e7e4838fSBram Moolenaar 'enddef', 2481e7e4838fSBram Moolenaar ], 'E488:') 2482e7e4838fSBram Moolenaar 2483e7e4838fSBram Moolenaar CheckScriptSuccess([ 2484e7e4838fSBram Moolenaar 'func Test() " comment', 2485e7e4838fSBram Moolenaar 'endfunc', 24862d870f8dSBram Moolenaar 'delfunc Test', 2487e7e4838fSBram Moolenaar ]) 24889898107fSBram Moolenaar CheckScriptSuccess([ 2489e7e4838fSBram Moolenaar 'vim9script', 2490e7e4838fSBram Moolenaar 'func Test() " comment', 2491e7e4838fSBram Moolenaar 'endfunc', 24929898107fSBram Moolenaar ]) 2493e7e4838fSBram Moolenaar 2494e7e4838fSBram Moolenaar CheckScriptSuccess([ 2495e7e4838fSBram Moolenaar 'def Test() # comment', 2496e7e4838fSBram Moolenaar 'enddef', 2497e7e4838fSBram Moolenaar ]) 2498e7e4838fSBram Moolenaar CheckScriptFailure([ 2499e7e4838fSBram Moolenaar 'func Test() # comment', 2500e7e4838fSBram Moolenaar 'endfunc', 2501e7e4838fSBram Moolenaar ], 'E488:') 25022c5ed4e3SBram Moolenaarenddef 25032c5ed4e3SBram Moolenaar 25042c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25052c5ed4e3SBram Moolenaar CheckCanRunGui 25062c5ed4e3SBram Moolenaar 25072c5ed4e3SBram Moolenaar CheckScriptFailure([ 25082c5ed4e3SBram Moolenaar 'vim9script', 25092c5ed4e3SBram Moolenaar 'gui#comment' 25102c5ed4e3SBram Moolenaar ], 'E499:') 25112c5ed4e3SBram Moolenaar CheckScriptFailure([ 25122c5ed4e3SBram Moolenaar 'vim9script', 25132c5ed4e3SBram Moolenaar 'gui -f#comment' 25142c5ed4e3SBram Moolenaar ], 'E499:') 25157a092245SBram Moolenaarenddef 25167a092245SBram Moolenaar 2517a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 25186797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 25196797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2520a26b9700SBram Moolenaar 2521a26b9700SBram Moolenaar edit test.vim 2522a26b9700SBram Moolenaar doautocmd TabEnter #comment 2523a26b9700SBram Moolenaar assert_equal(1, g:entered) 2524a26b9700SBram Moolenaar 2525a26b9700SBram Moolenaar doautocmd TabEnter f.x 2526a26b9700SBram Moolenaar assert_equal(2, g:entered) 2527a26b9700SBram Moolenaar 2528a26b9700SBram Moolenaar g:entered = 0 2529a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2530a26b9700SBram Moolenaar assert_equal(2, g:entered) 2531a26b9700SBram Moolenaar 2532a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2533a26b9700SBram Moolenaar 2534a26b9700SBram Moolenaar au! TabEnter 2535a26b9700SBram Moolenaar unlet g:entered 2536d72c1bf0SBram Moolenaar 2537d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2538d72c1bf0SBram Moolenaar 'vim9script', 25396797966dSBram Moolenaar 'g:var = 123', 2540e55b1c09SBram Moolenaar 'b:var = 456', 2541e55b1c09SBram Moolenaar 'w:var = 777', 2542e55b1c09SBram Moolenaar 't:var = 888', 2543d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2544d72c1bf0SBram Moolenaar ]) 2545d72c1bf0SBram Moolenaar 2546d72c1bf0SBram Moolenaar CheckScriptFailure([ 2547d72c1bf0SBram Moolenaar 'vim9script', 2548cfcd011fSBram Moolenaar 'let var = 123', 2549cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2550cfcd011fSBram Moolenaar 2551cfcd011fSBram Moolenaar CheckScriptFailure([ 2552cfcd011fSBram Moolenaar 'vim9script', 2553cfcd011fSBram Moolenaar 'var g:var = 123', 2554e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2555e55b1c09SBram Moolenaar 2556e55b1c09SBram Moolenaar CheckScriptFailure([ 2557e55b1c09SBram Moolenaar 'vim9script', 2558cfcd011fSBram Moolenaar 'var b:var = 123', 2559e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2560e55b1c09SBram Moolenaar 2561e55b1c09SBram Moolenaar CheckScriptFailure([ 2562e55b1c09SBram Moolenaar 'vim9script', 2563cfcd011fSBram Moolenaar 'var w:var = 123', 2564e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2565e55b1c09SBram Moolenaar 2566e55b1c09SBram Moolenaar CheckScriptFailure([ 2567e55b1c09SBram Moolenaar 'vim9script', 2568cfcd011fSBram Moolenaar 'var t:var = 123', 2569e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2570e55b1c09SBram Moolenaar 2571e55b1c09SBram Moolenaar CheckScriptFailure([ 2572e55b1c09SBram Moolenaar 'vim9script', 2573cfcd011fSBram Moolenaar 'var v:version = 123', 2574e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2575e55b1c09SBram Moolenaar 2576e55b1c09SBram Moolenaar CheckScriptFailure([ 2577e55b1c09SBram Moolenaar 'vim9script', 2578cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2579e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 25806797966dSBram Moolenaar 25816797966dSBram Moolenaar CheckScriptFailure([ 25826797966dSBram Moolenaar 'vim9script', 25836797966dSBram Moolenaar 'g:var = 123', 258432e35117SBram Moolenaar 'unlet g:var# comment1', 2585d72c1bf0SBram Moolenaar ], 'E108:') 2586d72c1bf0SBram Moolenaar 2587d72c1bf0SBram Moolenaar CheckScriptFailure([ 2588d72c1bf0SBram Moolenaar 'let g:var = 123', 2589d72c1bf0SBram Moolenaar 'unlet g:var # something', 2590d72c1bf0SBram Moolenaar ], 'E488:') 2591faac4104SBram Moolenaar 2592faac4104SBram Moolenaar CheckScriptSuccess([ 2593faac4104SBram Moolenaar 'vim9script', 259432e35117SBram Moolenaar 'if 1 # comment2', 2595faac4104SBram Moolenaar ' echo "yes"', 2596faac4104SBram Moolenaar 'elseif 2 #comment', 2597faac4104SBram Moolenaar ' echo "no"', 2598faac4104SBram Moolenaar 'endif', 2599faac4104SBram Moolenaar ]) 2600faac4104SBram Moolenaar 2601faac4104SBram Moolenaar CheckScriptFailure([ 2602faac4104SBram Moolenaar 'vim9script', 260332e35117SBram Moolenaar 'if 1# comment3', 2604faac4104SBram Moolenaar ' echo "yes"', 2605faac4104SBram Moolenaar 'endif', 2606faac4104SBram Moolenaar ], 'E15:') 2607faac4104SBram Moolenaar 2608faac4104SBram Moolenaar CheckScriptFailure([ 2609faac4104SBram Moolenaar 'vim9script', 261032e35117SBram Moolenaar 'if 0 # comment4', 2611faac4104SBram Moolenaar ' echo "yes"', 2612faac4104SBram Moolenaar 'elseif 2#comment', 2613faac4104SBram Moolenaar ' echo "no"', 2614faac4104SBram Moolenaar 'endif', 2615faac4104SBram Moolenaar ], 'E15:') 2616faac4104SBram Moolenaar 2617faac4104SBram Moolenaar CheckScriptSuccess([ 2618faac4104SBram Moolenaar 'vim9script', 2619cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2620faac4104SBram Moolenaar ]) 2621faac4104SBram Moolenaar 2622faac4104SBram Moolenaar CheckScriptFailure([ 2623faac4104SBram Moolenaar 'vim9script', 2624cfcd011fSBram Moolenaar 'var v = 1# comment6', 262532e35117SBram Moolenaar ], 'E15:') 2626faac4104SBram Moolenaar 2627faac4104SBram Moolenaar CheckScriptSuccess([ 2628faac4104SBram Moolenaar 'vim9script', 2629faac4104SBram Moolenaar 'new' 2630d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2631df069eecSBram Moolenaar ':$', 2632faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2633faac4104SBram Moolenaar 'bwipe!', 2634faac4104SBram Moolenaar ]) 2635faac4104SBram Moolenaar 2636f5be8cdbSBram Moolenaar CheckScriptFailure([ 2637f5be8cdbSBram Moolenaar 'vim9script', 2638f5be8cdbSBram Moolenaar 'new' 2639d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2640f5be8cdbSBram Moolenaar ':$', 2641f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2642f5be8cdbSBram Moolenaar 'bwipe!', 2643f5be8cdbSBram Moolenaar ], 'E488:') 2644f5be8cdbSBram Moolenaar 2645f5be8cdbSBram Moolenaar CheckScriptFailure([ 2646f5be8cdbSBram Moolenaar 'vim9script', 2647f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2648f5be8cdbSBram Moolenaar ], 'E477:') 2649a26b9700SBram Moolenaarenddef 2650a26b9700SBram Moolenaar 26517e5bd91dSBram Moolenaardef Test_finish() 2652cfcd011fSBram Moolenaar var lines =<< trim END 26537e5bd91dSBram Moolenaar vim9script 26546797966dSBram Moolenaar g:res = 'one' 26557e5bd91dSBram Moolenaar if v:false | finish | endif 26566797966dSBram Moolenaar g:res = 'two' 26577e5bd91dSBram Moolenaar finish 26586797966dSBram Moolenaar g:res = 'three' 26597e5bd91dSBram Moolenaar END 26607e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 26617e5bd91dSBram Moolenaar source Xfinished 26627e5bd91dSBram Moolenaar assert_equal('two', g:res) 26637e5bd91dSBram Moolenaar 26647e5bd91dSBram Moolenaar unlet g:res 26657e5bd91dSBram Moolenaar delete('Xfinished') 26667e5bd91dSBram Moolenaarenddef 26677e5bd91dSBram Moolenaar 2668a5d0077eSBram Moolenaardef Test_forward_declaration() 2669cfcd011fSBram Moolenaar var lines =<< trim END 2670a5d0077eSBram Moolenaar vim9script 2671a5d0077eSBram Moolenaar def GetValue(): string 2672a5d0077eSBram Moolenaar return theVal 2673a5d0077eSBram Moolenaar enddef 2674cfcd011fSBram Moolenaar var theVal = 'something' 2675822ba247SBram Moolenaar g:initVal = GetValue() 2676a5d0077eSBram Moolenaar theVal = 'else' 2677a5d0077eSBram Moolenaar g:laterVal = GetValue() 2678a5d0077eSBram Moolenaar END 2679a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2680a5d0077eSBram Moolenaar source Xforward 2681a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2682a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2683a5d0077eSBram Moolenaar 2684a5d0077eSBram Moolenaar unlet g:initVal 2685a5d0077eSBram Moolenaar unlet g:laterVal 2686a5d0077eSBram Moolenaar delete('Xforward') 2687a5d0077eSBram Moolenaarenddef 2688a5d0077eSBram Moolenaar 26899721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2690cfcd011fSBram Moolenaar var legacy_lines =<< trim END 26919721fb4eSBram Moolenaar source Xvim9_script.vim 26929721fb4eSBram Moolenaar 26939721fb4eSBram Moolenaar call assert_false(exists('local')) 26949721fb4eSBram Moolenaar call assert_false(exists('exported')) 26959721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 26969721fb4eSBram Moolenaar call assert_equal('global', global) 26979721fb4eSBram Moolenaar call assert_equal('global', g:global) 26989721fb4eSBram Moolenaar 26999721fb4eSBram Moolenaar " imported variable becomes script-local 27009721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 27019721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 27029721fb4eSBram Moolenaar call assert_false(exists('exported')) 27039721fb4eSBram Moolenaar 27049721fb4eSBram Moolenaar " imported function becomes script-local 27059721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 27069721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 27079721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 27089721fb4eSBram Moolenaar END 27099721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 27109721fb4eSBram Moolenaar 2711cfcd011fSBram Moolenaar var vim9_lines =<< trim END 27129721fb4eSBram Moolenaar vim9script 2713cfcd011fSBram Moolenaar var local = 'local' 27149721fb4eSBram Moolenaar g:global = 'global' 2715cfcd011fSBram Moolenaar export var exported = 'exported' 27169721fb4eSBram Moolenaar export def GetText(): string 27179721fb4eSBram Moolenaar return 'text' 27189721fb4eSBram Moolenaar enddef 27199721fb4eSBram Moolenaar END 27209721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 27219721fb4eSBram Moolenaar 27229721fb4eSBram Moolenaar source Xlegacy_script.vim 27239721fb4eSBram Moolenaar 27249721fb4eSBram Moolenaar assert_equal('global', g:global) 2725f5be8cdbSBram Moolenaar unlet g:global 27269721fb4eSBram Moolenaar 27279721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 27289721fb4eSBram Moolenaar delete('Xvim9_script.vim') 27299721fb4eSBram Moolenaarenddef 2730a5d0077eSBram Moolenaar 27317d699701SBram Moolenaarfunc Test_vim9script_not_global() 27327d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 27337d699701SBram Moolenaar let vim9lines =<< trim END 27347d699701SBram Moolenaar vim9script 2735cfcd011fSBram Moolenaar var name = 'local' 27367d699701SBram Moolenaar func TheFunc() 27377d699701SBram Moolenaar echo 'local' 27387d699701SBram Moolenaar endfunc 27397d699701SBram Moolenaar def DefFunc() 27407d699701SBram Moolenaar echo 'local' 27417d699701SBram Moolenaar enddef 27427d699701SBram Moolenaar END 27437d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 27447d699701SBram Moolenaar source Xvim9script.vim 27457d699701SBram Moolenaar try 27467d699701SBram Moolenaar echo g:var 27477d699701SBram Moolenaar assert_report('did not fail') 27487d699701SBram Moolenaar catch /E121:/ 27497d699701SBram Moolenaar " caught 27507d699701SBram Moolenaar endtry 27517d699701SBram Moolenaar try 27527d699701SBram Moolenaar call TheFunc() 27537d699701SBram Moolenaar assert_report('did not fail') 27547d699701SBram Moolenaar catch /E117:/ 27557d699701SBram Moolenaar " caught 27567d699701SBram Moolenaar endtry 27577d699701SBram Moolenaar try 27587d699701SBram Moolenaar call DefFunc() 27597d699701SBram Moolenaar assert_report('did not fail') 27607d699701SBram Moolenaar catch /E117:/ 27617d699701SBram Moolenaar " caught 27627d699701SBram Moolenaar endtry 27637d699701SBram Moolenaar 276425859dd7SBram Moolenaar call delete('Xvim9script.vim') 27657d699701SBram Moolenaarendfunc 27667d699701SBram Moolenaar 2767eeb27bfeSBram Moolenaardef Test_vim9_copen() 2768eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2769eeb27bfeSBram Moolenaar copen 2770eeb27bfeSBram Moolenaar quit 2771eeb27bfeSBram Moolenaarenddef 2772eeb27bfeSBram Moolenaar 27732d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 27742d6b20d6SBram Moolenaardef Test_vim9_autoload() 2775cfcd011fSBram Moolenaar var lines =<< trim END 27762d6b20d6SBram Moolenaar vim9script 27772d6b20d6SBram Moolenaar def foo#test() 27782d6b20d6SBram Moolenaar echomsg getreg('"') 27792d6b20d6SBram Moolenaar enddef 27802d6b20d6SBram Moolenaar END 27812d6b20d6SBram Moolenaar 27822d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 27832d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2784cfcd011fSBram Moolenaar var save_rtp = &rtp 27852d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 27862d6b20d6SBram Moolenaar augroup test 27872d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 27882d6b20d6SBram Moolenaar augroup END 27892d6b20d6SBram Moolenaar 27902d6b20d6SBram Moolenaar normal Y 27912d6b20d6SBram Moolenaar 27922d6b20d6SBram Moolenaar augroup test 27932d6b20d6SBram Moolenaar autocmd! 27942d6b20d6SBram Moolenaar augroup END 27952d6b20d6SBram Moolenaar delete('Xdir', 'rf') 27962d6b20d6SBram Moolenaar &rtp = save_rtp 27972d6b20d6SBram Moolenaarenddef 27982d6b20d6SBram Moolenaar 279977e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 280077e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2801cfcd011fSBram Moolenaar var lines =<< trim END 280277e5dcc3SBram Moolenaar vim9script 280377e5dcc3SBram Moolenaar def crash#func() 280477e5dcc3SBram Moolenaar try 280577e5dcc3SBram Moolenaar for x in List() 280677e5dcc3SBram Moolenaar endfor 280777e5dcc3SBram Moolenaar catch 280877e5dcc3SBram Moolenaar endtry 280977e5dcc3SBram Moolenaar g:ok = true 281077e5dcc3SBram Moolenaar enddef 281177e5dcc3SBram Moolenaar fu List() 281277e5dcc3SBram Moolenaar invalid 281377e5dcc3SBram Moolenaar endfu 281477e5dcc3SBram Moolenaar try 281577e5dcc3SBram Moolenaar invalid 281677e5dcc3SBram Moolenaar catch /wontmatch/ 281777e5dcc3SBram Moolenaar endtry 281877e5dcc3SBram Moolenaar END 281977e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 282077e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 282177e5dcc3SBram Moolenaar 282277e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 282377e5dcc3SBram Moolenaar lines =<< trim END 282477e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 282577e5dcc3SBram Moolenaar call crash#func() 282677e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 28279c4f5520SBram Moolenaar qall! 282877e5dcc3SBram Moolenaar END 282977e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 283077e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 283177e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 283277e5dcc3SBram Moolenaar 283377e5dcc3SBram Moolenaar delete('Xdidit') 283477e5dcc3SBram Moolenaar delete('Xscript') 283577e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 283677e5dcc3SBram Moolenaarenddef 283777e5dcc3SBram Moolenaar 283881e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 283981e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 284081e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2841cfcd011fSBram Moolenaar var lines =<< trim END 284281e17fbeSBram Moolenaar let s:counter = 1 284381e17fbeSBram Moolenaar def s:Func() 284481e17fbeSBram Moolenaar au! CursorHold 284581e17fbeSBram Moolenaar au CursorHold * s:counter += 1 284681e17fbeSBram Moolenaar enddef 284781e17fbeSBram Moolenaar call s:Func() 284881e17fbeSBram Moolenaar doau CursorHold 284981e17fbeSBram Moolenaar call assert_equal(2, s:counter) 285081e17fbeSBram Moolenaar au! CursorHold 285181e17fbeSBram Moolenaar END 285281e17fbeSBram Moolenaar CheckScriptSuccess(lines) 285381e17fbeSBram Moolenaarenddef 285481e17fbeSBram Moolenaar 28553896a105SBram Moolenaardef Test_cmdline_win() 28563896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 28573896a105SBram Moolenaar # the command line window. 28583896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2859cfcd011fSBram Moolenaar var export_lines =<< trim END 28603896a105SBram Moolenaar vim9script 2861cfcd011fSBram Moolenaar export var That = 'yes' 28623896a105SBram Moolenaar END 28633896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2864cfcd011fSBram Moolenaar var import_lines =<< trim END 28653896a105SBram Moolenaar vim9script 28663896a105SBram Moolenaar import That from './Xexport.vim' 28673896a105SBram Moolenaar END 28683896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2869cfcd011fSBram Moolenaar var save_rtp = &rtp 28703896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 28713896a105SBram Moolenaar syntax on 28723896a105SBram Moolenaar augroup CmdWin 28733896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 28743896a105SBram Moolenaar augroup END 28753896a105SBram Moolenaar # this will open and also close the cmdline window 28763896a105SBram Moolenaar feedkeys('q:', 'xt') 28773896a105SBram Moolenaar assert_equal('yes', g:got_there) 28783896a105SBram Moolenaar 28793896a105SBram Moolenaar augroup CmdWin 28803896a105SBram Moolenaar au! 28813896a105SBram Moolenaar augroup END 28823896a105SBram Moolenaar &rtp = save_rtp 28833896a105SBram Moolenaar delete('rtp', 'rf') 28843896a105SBram Moolenaarenddef 28853896a105SBram Moolenaar 2886e3d4685fSBram Moolenaardef Test_invalid_sid() 2887e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 288825859dd7SBram Moolenaar 28899c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2890d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2891e3d4685fSBram Moolenaar endif 2892e3d4685fSBram Moolenaar delete('Xdidit') 2893e3d4685fSBram Moolenaarenddef 2894e3d4685fSBram Moolenaar 28959ec7026fSBram Moolenaardef Test_restoring_cpo() 28969ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 28979ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 28989ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 28999ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 29009ec7026fSBram Moolenaar endif 29019ec7026fSBram Moolenaar delete('Xsourced') 29029ec7026fSBram Moolenaar delete('Xclose') 29039ec7026fSBram Moolenaarenddef 29049ec7026fSBram Moolenaar 29059ec7026fSBram Moolenaar 2906f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2907cfcd011fSBram Moolenaar var lines =<< trim END 2908cfcd011fSBram Moolenaar var name: any 2909cfcd011fSBram Moolenaar assert_equal(0, name) 2910f0afd9e1SBram Moolenaar END 2911f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2912f0afd9e1SBram Moolenaarenddef 2913f0afd9e1SBram Moolenaar 29147e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 291558dbef33SBram Moolenaar CheckRunVimInTerminal 291658dbef33SBram Moolenaar 29177e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 29187e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 29197e9210eaSBram Moolenaarendfunc 29207e9210eaSBram Moolenaar 29217e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 29229c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 2923cfcd011fSBram Moolenaar var lines =<< trim END 29249c4f5520SBram Moolenaar func CheckAndQuit() 29259c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 29269c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 29279c4f5520SBram Moolenaar endfunc 29289c4f5520SBram Moolenaar END 29299c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 29309c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 2931e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 29329c4f5520SBram Moolenaar # define Afunc() on the command line 29339c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 29349c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 29359c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 29369c4f5520SBram Moolenaar 29379c4f5520SBram Moolenaar call StopVimInTerminal(buf) 29389c4f5520SBram Moolenaar delete('XcallFunc') 29399c4f5520SBram Moolenaar delete('Xdidcmd') 29409c4f5520SBram Moolenaarenddef 29419c4f5520SBram Moolenaar 2942fcdc5d83SBram Moolenaardef Test_script_var_scope() 2943fcdc5d83SBram Moolenaar var lines =<< trim END 2944fcdc5d83SBram Moolenaar vim9script 2945fcdc5d83SBram Moolenaar if true 2946fcdc5d83SBram Moolenaar if true 2947fcdc5d83SBram Moolenaar var one = 'one' 2948fcdc5d83SBram Moolenaar echo one 2949fcdc5d83SBram Moolenaar endif 2950fcdc5d83SBram Moolenaar echo one 2951fcdc5d83SBram Moolenaar endif 2952fcdc5d83SBram Moolenaar END 2953fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2954fcdc5d83SBram Moolenaar 2955fcdc5d83SBram Moolenaar lines =<< trim END 2956fcdc5d83SBram Moolenaar vim9script 2957fcdc5d83SBram Moolenaar if true 2958fcdc5d83SBram Moolenaar if false 2959fcdc5d83SBram Moolenaar var one = 'one' 2960fcdc5d83SBram Moolenaar echo one 2961fcdc5d83SBram Moolenaar else 2962fcdc5d83SBram Moolenaar var one = 'one' 2963fcdc5d83SBram Moolenaar echo one 2964fcdc5d83SBram Moolenaar endif 2965fcdc5d83SBram Moolenaar echo one 2966fcdc5d83SBram Moolenaar endif 2967fcdc5d83SBram Moolenaar END 2968fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 2969fcdc5d83SBram Moolenaar 2970fcdc5d83SBram Moolenaar lines =<< trim END 2971fcdc5d83SBram Moolenaar vim9script 2972fcdc5d83SBram Moolenaar while true 2973fcdc5d83SBram Moolenaar var one = 'one' 2974fcdc5d83SBram Moolenaar echo one 2975fcdc5d83SBram Moolenaar break 2976fcdc5d83SBram Moolenaar endwhile 2977fcdc5d83SBram Moolenaar echo one 2978fcdc5d83SBram Moolenaar END 2979fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2980fcdc5d83SBram Moolenaar 2981fcdc5d83SBram Moolenaar lines =<< trim END 2982fcdc5d83SBram Moolenaar vim9script 2983fcdc5d83SBram Moolenaar for i in range(1) 2984fcdc5d83SBram Moolenaar var one = 'one' 2985fcdc5d83SBram Moolenaar echo one 2986fcdc5d83SBram Moolenaar endfor 2987fcdc5d83SBram Moolenaar echo one 2988fcdc5d83SBram Moolenaar END 2989fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 29909becdf2bSBram Moolenaar 29919becdf2bSBram Moolenaar lines =<< trim END 29929becdf2bSBram Moolenaar vim9script 29939becdf2bSBram Moolenaar { 29949becdf2bSBram Moolenaar var one = 'one' 29959becdf2bSBram Moolenaar assert_equal('one', one) 29969becdf2bSBram Moolenaar } 29979becdf2bSBram Moolenaar assert_false(exists('one')) 29989becdf2bSBram Moolenaar assert_false(exists('s:one')) 29999becdf2bSBram Moolenaar END 30009becdf2bSBram Moolenaar CheckScriptSuccess(lines) 30019becdf2bSBram Moolenaar 30029becdf2bSBram Moolenaar lines =<< trim END 30039becdf2bSBram Moolenaar vim9script 30049becdf2bSBram Moolenaar { 30059becdf2bSBram Moolenaar var one = 'one' 30069becdf2bSBram Moolenaar echo one 30079becdf2bSBram Moolenaar } 30089becdf2bSBram Moolenaar echo one 30099becdf2bSBram Moolenaar END 30109becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3011fcdc5d83SBram Moolenaarenddef 3012fcdc5d83SBram Moolenaar 3013352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3014352134bbSBram Moolenaar var lines =<< trim END 3015352134bbSBram Moolenaar vim9script 3016352134bbSBram Moolenaar def Callback(...l: any) 3017352134bbSBram Moolenaar try 3018352134bbSBram Moolenaar var x: string 3019352134bbSBram Moolenaar var y: string 3020352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3021352134bbSBram Moolenaar [x, y] = [''] 3022352134bbSBram Moolenaar catch 3023352134bbSBram Moolenaar g:caught = 'yes' 3024352134bbSBram Moolenaar endtry 3025352134bbSBram Moolenaar enddef 3026e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3027352134bbSBram Moolenaar feedkeys("\r", 'xt') 3028352134bbSBram Moolenaar END 3029352134bbSBram Moolenaar CheckScriptSuccess(lines) 3030352134bbSBram Moolenaar 3031352134bbSBram Moolenaar unlet g:caught 3032352134bbSBram Moolenaarenddef 3033352134bbSBram Moolenaar 3034631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3035631e8f93SBram Moolenaar if !has('unix') || !has('job') 3036631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3037631e8f93SBram Moolenaar endif 3038631e8f93SBram Moolenaar var lines =<< trim END 3039631e8f93SBram Moolenaar vim9script 3040631e8f93SBram Moolenaar var source: list<number> 3041631e8f93SBram Moolenaar def Out_cb(...l: any) 3042631e8f93SBram Moolenaar eval [][0] 3043631e8f93SBram Moolenaar enddef 3044631e8f93SBram Moolenaar def Exit_cb(...l: any) 3045631e8f93SBram Moolenaar sleep 1m 3046631e8f93SBram Moolenaar source += l 3047631e8f93SBram Moolenaar enddef 3048e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 3049631e8f93SBram Moolenaar sleep 100m 3050631e8f93SBram Moolenaar END 3051631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3052631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3053631e8f93SBram Moolenaar delete('Xdef') 3054631e8f93SBram Moolenaarenddef 3055631e8f93SBram Moolenaar 3056b4bcea47SBram Moolenaardef Test_put_with_linebreak() 3057b4bcea47SBram Moolenaar new 3058b4bcea47SBram Moolenaar var lines =<< trim END 3059b4bcea47SBram Moolenaar vim9script 3060b4bcea47SBram Moolenaar pu=split('abc', '\zs') 3061b4bcea47SBram Moolenaar ->join() 3062b4bcea47SBram Moolenaar END 3063b4bcea47SBram Moolenaar CheckScriptSuccess(lines) 3064b4bcea47SBram Moolenaar getline(2)->assert_equal('a b c') 3065b4bcea47SBram Moolenaar bwipe! 3066b4bcea47SBram Moolenaarenddef 3067b4bcea47SBram Moolenaar 30684324d87aSBram Moolenaardef InvokeNormal() 30694324d87aSBram Moolenaar exe "norm! :m+1\r" 30704324d87aSBram Moolenaarenddef 30714324d87aSBram Moolenaar 30724324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 30734324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 30744324d87aSBram Moolenaar new 30754324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 30764324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 30774324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 30784324d87aSBram Moolenaar xunmap <F3> 30794324d87aSBram Moolenaarenddef 30804324d87aSBram Moolenaar 3081585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3082585fea7bSBram Moolenaardef Test_substitute_cmd() 3083585fea7bSBram Moolenaar new 3084585fea7bSBram Moolenaar setline(1, 'something') 3085585fea7bSBram Moolenaar :substitute(some(other( 3086585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3087585fea7bSBram Moolenaar bwipe! 3088585fea7bSBram Moolenaar 3089f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3090cfcd011fSBram Moolenaar var lines =<< trim END 3091585fea7bSBram Moolenaar vim9script 3092585fea7bSBram Moolenaar new 3093585fea7bSBram Moolenaar setline(1, 'something') 3094585fea7bSBram Moolenaar :substitute(some(other( 3095585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3096585fea7bSBram Moolenaar bwipe! 3097585fea7bSBram Moolenaar END 3098585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3099585fea7bSBram Moolenaar source Xvim9lines 3100585fea7bSBram Moolenaar 3101585fea7bSBram Moolenaar delete('Xvim9lines') 3102585fea7bSBram Moolenaarenddef 3103585fea7bSBram Moolenaar 31048a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3105