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 623e4984290SBram Moolenaar CheckDefFailure(['throw'], 'E1143:') 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() 1722e4984290SBram Moolenaar # missing argument is ignored 1723e4984290SBram Moolenaar execute 1724e4984290SBram Moolenaar execute # comment 1725e4984290SBram Moolenaar 1726ad39c094SBram Moolenaar new 1727ad39c094SBram Moolenaar setline(1, 'default') 1728d2c61705SBram Moolenaar execute 'setline(1, "execute-string")' 1729ad39c094SBram Moolenaar assert_equal('execute-string', getline(1)) 1730a72cfb80SBram Moolenaar 1731d2c61705SBram Moolenaar execute "setline(1, 'execute-string')" 1732a72cfb80SBram Moolenaar assert_equal('execute-string', getline(1)) 1733a72cfb80SBram Moolenaar 1734cfcd011fSBram Moolenaar var cmd1 = 'setline(1,' 1735cfcd011fSBram Moolenaar var cmd2 = '"execute-var")' 1736a72cfb80SBram Moolenaar execute cmd1 cmd2 # comment 1737ad39c094SBram Moolenaar assert_equal('execute-var', getline(1)) 1738a72cfb80SBram Moolenaar 1739d2c61705SBram Moolenaar execute cmd1 cmd2 '|setline(1, "execute-var-string")' 1740ad39c094SBram Moolenaar assert_equal('execute-var-string', getline(1)) 1741a72cfb80SBram Moolenaar 1742cfcd011fSBram Moolenaar var cmd_first = 'call ' 1743cfcd011fSBram Moolenaar var cmd_last = 'setline(1, "execute-var-var")' 1744ad39c094SBram Moolenaar execute cmd_first .. cmd_last 1745ad39c094SBram Moolenaar assert_equal('execute-var-var', getline(1)) 1746ad39c094SBram Moolenaar bwipe! 1747585fea7bSBram Moolenaar 1748cfcd011fSBram Moolenaar var n = true 17492d6b20d6SBram Moolenaar execute 'echomsg' (n ? '"true"' : '"no"') 17502d6b20d6SBram Moolenaar assert_match('^true$', Screenline(&lines)) 17512d6b20d6SBram Moolenaar 1752e0de171eSBram Moolenaar echomsg [1, 2, 3] {a: 1, b: 2} 1753e5abf7afSBram Moolenaar assert_match('^\[1, 2, 3\] {''a'': 1, ''b'': 2}$', Screenline(&lines)) 1754e5abf7afSBram Moolenaar 1755d2c61705SBram Moolenaar CheckDefFailure(['execute xxx'], 'E1001:', 1) 1756d2c61705SBram Moolenaar CheckDefExecFailure(['execute "tabnext " .. 8'], 'E475:', 1) 1757d2c61705SBram Moolenaar CheckDefFailure(['execute "cmd"# comment'], 'E488:', 1) 1758ad39c094SBram Moolenaarenddef 1759ad39c094SBram Moolenaar 176047e880d6SBram Moolenaardef Test_execute_cmd_vimscript() 1761f5be8cdbSBram Moolenaar # only checks line continuation 1762cfcd011fSBram Moolenaar var lines =<< trim END 176347e880d6SBram Moolenaar vim9script 176447e880d6SBram Moolenaar execute 'g:someVar' 176547e880d6SBram Moolenaar .. ' = ' .. 176647e880d6SBram Moolenaar '28' 176747e880d6SBram Moolenaar assert_equal(28, g:someVar) 176847e880d6SBram Moolenaar unlet g:someVar 176947e880d6SBram Moolenaar END 177047e880d6SBram Moolenaar CheckScriptSuccess(lines) 177147e880d6SBram Moolenaarenddef 177247e880d6SBram Moolenaar 1773ad39c094SBram Moolenaardef Test_echo_cmd() 1774a72cfb80SBram Moolenaar echo 'some' # comment 1775585fea7bSBram Moolenaar echon 'thing' 1776ad39c094SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1777ad39c094SBram Moolenaar 1778a72cfb80SBram Moolenaar echo "some" # comment 1779a72cfb80SBram Moolenaar echon "thing" 1780a72cfb80SBram Moolenaar assert_match('^something$', Screenline(&lines)) 1781a72cfb80SBram Moolenaar 1782cfcd011fSBram Moolenaar var str1 = 'some' 1783cfcd011fSBram Moolenaar var str2 = 'more' 1784ad39c094SBram Moolenaar echo str1 str2 1785ad39c094SBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1786a72cfb80SBram Moolenaar 1787d2c61705SBram Moolenaar CheckDefFailure(['echo "xxx"# comment'], 'E488:') 1788ad39c094SBram Moolenaarenddef 1789ad39c094SBram Moolenaar 1790f93c7feaSBram Moolenaardef Test_echomsg_cmd() 1791f93c7feaSBram Moolenaar echomsg 'some' 'more' # comment 1792f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1793f93c7feaSBram Moolenaar echo 'clear' 1794df069eecSBram Moolenaar :1messages 1795f93c7feaSBram Moolenaar assert_match('^some more$', Screenline(&lines)) 1796f93c7feaSBram Moolenaar 1797d2c61705SBram Moolenaar CheckDefFailure(['echomsg "xxx"# comment'], 'E488:') 1798f93c7feaSBram Moolenaarenddef 1799f93c7feaSBram Moolenaar 180047e880d6SBram Moolenaardef Test_echomsg_cmd_vimscript() 1801f5be8cdbSBram Moolenaar # only checks line continuation 1802cfcd011fSBram Moolenaar var lines =<< trim END 180347e880d6SBram Moolenaar vim9script 180447e880d6SBram Moolenaar echomsg 'here' 180547e880d6SBram Moolenaar .. ' is ' .. 180647e880d6SBram Moolenaar 'a message' 180747e880d6SBram Moolenaar assert_match('^here is a message$', Screenline(&lines)) 180847e880d6SBram Moolenaar END 180947e880d6SBram Moolenaar CheckScriptSuccess(lines) 181047e880d6SBram Moolenaarenddef 181147e880d6SBram Moolenaar 1812f93c7feaSBram Moolenaardef Test_echoerr_cmd() 181340ee466cSBram Moolenaar try 181440ee466cSBram Moolenaar echoerr 'something' 'wrong' # comment 181540ee466cSBram Moolenaar catch 181640ee466cSBram Moolenaar assert_match('something wrong', v:exception) 181740ee466cSBram Moolenaar endtry 1818f93c7feaSBram Moolenaarenddef 1819f93c7feaSBram Moolenaar 182047e880d6SBram Moolenaardef Test_echoerr_cmd_vimscript() 1821f5be8cdbSBram Moolenaar # only checks line continuation 1822cfcd011fSBram Moolenaar var lines =<< trim END 182347e880d6SBram Moolenaar vim9script 182447e880d6SBram Moolenaar try 182547e880d6SBram Moolenaar echoerr 'this' 182647e880d6SBram Moolenaar .. ' is ' .. 182747e880d6SBram Moolenaar 'wrong' 182847e880d6SBram Moolenaar catch 182947e880d6SBram Moolenaar assert_match('this is wrong', v:exception) 183047e880d6SBram Moolenaar endtry 183147e880d6SBram Moolenaar END 183247e880d6SBram Moolenaar CheckScriptSuccess(lines) 183347e880d6SBram Moolenaarenddef 183447e880d6SBram Moolenaar 183541fe0617SBram Moolenaardef Test_for_outside_of_function() 1836cfcd011fSBram Moolenaar var lines =<< trim END 183741fe0617SBram Moolenaar vim9script 183841fe0617SBram Moolenaar new 183941fe0617SBram Moolenaar for var in range(0, 3) 184041fe0617SBram Moolenaar append(line('$'), var) 184141fe0617SBram Moolenaar endfor 184241fe0617SBram Moolenaar assert_equal(['', '0', '1', '2', '3'], getline(1, '$')) 184341fe0617SBram Moolenaar bwipe! 184441fe0617SBram Moolenaar END 184541fe0617SBram Moolenaar writefile(lines, 'Xvim9for.vim') 184641fe0617SBram Moolenaar source Xvim9for.vim 184741fe0617SBram Moolenaar delete('Xvim9for.vim') 184841fe0617SBram Moolenaarenddef 18498a7d6542SBram Moolenaar 1850e8c4abbbSBram Moolenaardef Test_for_loop() 1851cfcd011fSBram Moolenaar var result = '' 1852e8c4abbbSBram Moolenaar for cnt in range(7) 1853e8c4abbbSBram Moolenaar if cnt == 4 1854e8c4abbbSBram Moolenaar break 1855e8c4abbbSBram Moolenaar endif 1856e8c4abbbSBram Moolenaar if cnt == 2 1857e8c4abbbSBram Moolenaar continue 1858e8c4abbbSBram Moolenaar endif 1859e8c4abbbSBram Moolenaar result ..= cnt .. '_' 1860e8c4abbbSBram Moolenaar endfor 1861e8c4abbbSBram Moolenaar assert_equal('0_1_3_', result) 18620ad3e894SBram Moolenaar 1863cfcd011fSBram Moolenaar var concat = '' 18640ad3e894SBram Moolenaar for str in eval('["one", "two"]') 18650ad3e894SBram Moolenaar concat ..= str 18660ad3e894SBram Moolenaar endfor 18670ad3e894SBram Moolenaar assert_equal('onetwo', concat) 186838bd8de5SBram Moolenaar 186938bd8de5SBram Moolenaar var total = 0 187038bd8de5SBram Moolenaar for nr in 187138bd8de5SBram Moolenaar [1, 2, 3] 187238bd8de5SBram Moolenaar total += nr 187338bd8de5SBram Moolenaar endfor 187438bd8de5SBram Moolenaar assert_equal(6, total) 187538bd8de5SBram Moolenaar 187638bd8de5SBram Moolenaar total = 0 187738bd8de5SBram Moolenaar for nr 187838bd8de5SBram Moolenaar in [1, 2, 3] 187938bd8de5SBram Moolenaar total += nr 188038bd8de5SBram Moolenaar endfor 188138bd8de5SBram Moolenaar assert_equal(6, total) 188238bd8de5SBram Moolenaar 188338bd8de5SBram Moolenaar total = 0 188438bd8de5SBram Moolenaar for nr 188538bd8de5SBram Moolenaar in 188638bd8de5SBram Moolenaar [1, 2, 3] 188738bd8de5SBram Moolenaar total += nr 188838bd8de5SBram Moolenaar endfor 188938bd8de5SBram Moolenaar assert_equal(6, total) 1890e8c4abbbSBram Moolenaarenddef 1891e8c4abbbSBram Moolenaar 1892e8c4abbbSBram Moolenaardef Test_for_loop_fails() 1893675f716eSBram Moolenaar CheckDefFailure(['for # in range(5)'], 'E690:') 1894675f716eSBram Moolenaar CheckDefFailure(['for i In range(5)'], 'E690:') 1895cfcd011fSBram Moolenaar CheckDefFailure(['var x = 5', 'for x in range(5)'], 'E1017:') 1896822ba247SBram Moolenaar CheckScriptFailure(['def Func(arg: any)', 'for arg in range(5)', 'enddef', 'defcompile'], 'E1006:') 18972d870f8dSBram Moolenaar delfunc! g:Func 1898451c2e35SBram Moolenaar CheckDefFailure(['for i in "text"'], 'E1012:') 1899675f716eSBram Moolenaar CheckDefFailure(['for i in xxx'], 'E1001:') 1900675f716eSBram Moolenaar CheckDefFailure(['endfor'], 'E588:') 1901675f716eSBram Moolenaar CheckDefFailure(['for i in range(3)', 'echo 3'], 'E170:') 1902e8c4abbbSBram Moolenaarenddef 1903e8c4abbbSBram Moolenaar 1904ea87069dSBram Moolenaardef Test_for_loop_script_var() 1905ea87069dSBram Moolenaar # cannot use s:var in a :def function 1906ea87069dSBram Moolenaar CheckDefFailure(['for s:var in range(3)', 'echo 3'], 'E1101:') 1907ea87069dSBram Moolenaar 1908ea87069dSBram Moolenaar # can use s:var in Vim9 script, with or without s: 1909ea87069dSBram Moolenaar var lines =<< trim END 1910ea87069dSBram Moolenaar vim9script 1911ea87069dSBram Moolenaar var total = 0 1912ea87069dSBram Moolenaar for s:var in [1, 2, 3] 1913ea87069dSBram Moolenaar total += s:var 1914ea87069dSBram Moolenaar endfor 1915ea87069dSBram Moolenaar assert_equal(6, total) 1916ea87069dSBram Moolenaar 1917ea87069dSBram Moolenaar total = 0 1918ea87069dSBram Moolenaar for var in [1, 2, 3] 1919ea87069dSBram Moolenaar total += var 1920ea87069dSBram Moolenaar endfor 1921ea87069dSBram Moolenaar assert_equal(6, total) 1922ea87069dSBram Moolenaar END 1923ea87069dSBram Moolenaarenddef 1924ea87069dSBram Moolenaar 1925792f786aSBram Moolenaardef Test_for_loop_unpack() 19264b8a0651SBram Moolenaar var lines =<< trim END 1927792f786aSBram Moolenaar var result = [] 1928792f786aSBram Moolenaar for [v1, v2] in [[1, 2], [3, 4]] 1929792f786aSBram Moolenaar result->add(v1) 1930792f786aSBram Moolenaar result->add(v2) 1931792f786aSBram Moolenaar endfor 1932792f786aSBram Moolenaar assert_equal([1, 2, 3, 4], result) 1933792f786aSBram Moolenaar 1934792f786aSBram Moolenaar result = [] 1935792f786aSBram Moolenaar for [v1, v2; v3] in [[1, 2], [3, 4, 5, 6]] 1936792f786aSBram Moolenaar result->add(v1) 1937792f786aSBram Moolenaar result->add(v2) 1938792f786aSBram Moolenaar result->add(v3) 1939792f786aSBram Moolenaar endfor 1940792f786aSBram Moolenaar assert_equal([1, 2, [], 3, 4, [5, 6]], result) 1941792f786aSBram Moolenaar 19424b8a0651SBram Moolenaar result = [] 19434b8a0651SBram Moolenaar for [&ts, &sw] in [[1, 2], [3, 4]] 19444b8a0651SBram Moolenaar result->add(&ts) 19454b8a0651SBram Moolenaar result->add(&sw) 19464b8a0651SBram Moolenaar endfor 19474b8a0651SBram Moolenaar assert_equal([1, 2, 3, 4], result) 19484b8a0651SBram Moolenaar 19494b8a0651SBram Moolenaar var slist: list<string> 19504b8a0651SBram Moolenaar for [$LOOPVAR, @r, v:errmsg] in [['a', 'b', 'c'], ['d', 'e', 'f']] 19514b8a0651SBram Moolenaar slist->add($LOOPVAR) 19524b8a0651SBram Moolenaar slist->add(@r) 19534b8a0651SBram Moolenaar slist->add(v:errmsg) 19544b8a0651SBram Moolenaar endfor 19554b8a0651SBram Moolenaar assert_equal(['a', 'b', 'c', 'd', 'e', 'f'], slist) 19564b8a0651SBram Moolenaar 19574b8a0651SBram Moolenaar slist = [] 19584b8a0651SBram Moolenaar for [g:globalvar, b:bufvar, w:winvar, t:tabvar] in [['global', 'buf', 'win', 'tab'], ['1', '2', '3', '4']] 19594b8a0651SBram Moolenaar slist->add(g:globalvar) 19604b8a0651SBram Moolenaar slist->add(b:bufvar) 19614b8a0651SBram Moolenaar slist->add(w:winvar) 19624b8a0651SBram Moolenaar slist->add(t:tabvar) 19634b8a0651SBram Moolenaar endfor 19644b8a0651SBram Moolenaar assert_equal(['global', 'buf', 'win', 'tab', '1', '2', '3', '4'], slist) 1965f6c177abSBram Moolenaar unlet! g:globalvar b:bufvar w:winvar t:tabvar 19664b8a0651SBram Moolenaar END 19674b8a0651SBram Moolenaar CheckDefAndScriptSuccess(lines) 19684b8a0651SBram Moolenaar 19694b8a0651SBram Moolenaar lines =<< trim END 1970792f786aSBram Moolenaar for [v1, v2] in [[1, 2, 3], [3, 4]] 1971792f786aSBram Moolenaar echo v1 v2 1972792f786aSBram Moolenaar endfor 1973792f786aSBram Moolenaar END 1974792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E710:', 1) 1975792f786aSBram Moolenaar 1976792f786aSBram Moolenaar lines =<< trim END 1977792f786aSBram Moolenaar for [v1, v2] in [[1], [3, 4]] 1978792f786aSBram Moolenaar echo v1 v2 1979792f786aSBram Moolenaar endfor 1980792f786aSBram Moolenaar END 1981792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E711:', 1) 1982792f786aSBram Moolenaar 1983792f786aSBram Moolenaar lines =<< trim END 1984792f786aSBram Moolenaar for [v1, v1] in [[1, 2], [3, 4]] 1985792f786aSBram Moolenaar echo v1 1986792f786aSBram Moolenaar endfor 1987792f786aSBram Moolenaar END 1988792f786aSBram Moolenaar CheckDefExecFailure(lines, 'E1017:', 1) 1989792f786aSBram Moolenaarenddef 1990792f786aSBram Moolenaar 1991d0df1aacSBram Moolenaardef Test_while_loop() 1992cfcd011fSBram Moolenaar var result = '' 1993cfcd011fSBram Moolenaar var cnt = 0 1994d0df1aacSBram Moolenaar while cnt < 555 1995d0df1aacSBram Moolenaar if cnt == 3 1996d0df1aacSBram Moolenaar break 1997d0df1aacSBram Moolenaar endif 1998d0df1aacSBram Moolenaar cnt += 1 1999d0df1aacSBram Moolenaar if cnt == 2 2000d0df1aacSBram Moolenaar continue 2001d0df1aacSBram Moolenaar endif 2002d0df1aacSBram Moolenaar result ..= cnt .. '_' 2003d0df1aacSBram Moolenaar endwhile 2004d0df1aacSBram Moolenaar assert_equal('1_3_', result) 2005d0df1aacSBram Moolenaarenddef 2006d0df1aacSBram Moolenaar 2007e8c4abbbSBram Moolenaardef Test_while_loop_fails() 2008675f716eSBram Moolenaar CheckDefFailure(['while xxx'], 'E1001:') 2009675f716eSBram Moolenaar CheckDefFailure(['endwhile'], 'E588:') 2010675f716eSBram Moolenaar CheckDefFailure(['continue'], 'E586:') 2011675f716eSBram Moolenaar CheckDefFailure(['if true', 'continue'], 'E586:') 2012675f716eSBram Moolenaar CheckDefFailure(['break'], 'E587:') 2013675f716eSBram Moolenaar CheckDefFailure(['if true', 'break'], 'E587:') 2014675f716eSBram Moolenaar CheckDefFailure(['while 1', 'echo 3'], 'E170:') 2015bd5da371SBram Moolenaarenddef 2016bd5da371SBram Moolenaar 20179645e2d9SBram Moolenaardef Test_interrupt_loop() 2018cfcd011fSBram Moolenaar var caught = false 2019cfcd011fSBram Moolenaar var x = 0 202097acfc78SBram Moolenaar try 20219645e2d9SBram Moolenaar while 1 20229645e2d9SBram Moolenaar x += 1 20239645e2d9SBram Moolenaar if x == 100 20249645e2d9SBram Moolenaar feedkeys("\<C-C>", 'Lt') 20259645e2d9SBram Moolenaar endif 20269645e2d9SBram Moolenaar endwhile 202797acfc78SBram Moolenaar catch 202897acfc78SBram Moolenaar caught = true 202997acfc78SBram Moolenaar assert_equal(100, x) 203097acfc78SBram Moolenaar endtry 203197acfc78SBram Moolenaar assert_true(caught, 'should have caught an exception') 203225859dd7SBram Moolenaar # consume the CTRL-C 203325859dd7SBram Moolenaar getchar(0) 20349645e2d9SBram Moolenaarenddef 203520431c9dSBram Moolenaar 20364fdae999SBram Moolenaardef Test_automatic_line_continuation() 2037cfcd011fSBram Moolenaar var mylist = [ 20384fdae999SBram Moolenaar 'one', 20394fdae999SBram Moolenaar 'two', 20404fdae999SBram Moolenaar 'three', 2041f5be8cdbSBram Moolenaar ] # comment 20424fdae999SBram Moolenaar assert_equal(['one', 'two', 'three'], mylist) 20434fdae999SBram Moolenaar 2044cfcd011fSBram Moolenaar var mydict = { 2045e0de171eSBram Moolenaar ['one']: 1, 2046e0de171eSBram Moolenaar ['two']: 2, 2047e0de171eSBram Moolenaar ['three']: 20484fdae999SBram Moolenaar 3, 2049f5be8cdbSBram Moolenaar } # comment 2050e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2051e0de171eSBram Moolenaar mydict = { 20522c330432SBram Moolenaar one: 1, # comment 20532c330432SBram Moolenaar two: # comment 20542c330432SBram Moolenaar 2, # comment 20552c330432SBram Moolenaar three: 3 # comment 20562c330432SBram Moolenaar } 2057e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2058e0de171eSBram Moolenaar mydict = { 20592c330432SBram Moolenaar one: 1, 20604fdae999SBram Moolenaar two: 20614fdae999SBram Moolenaar 2, 20622c330432SBram Moolenaar three: 3 20634fdae999SBram Moolenaar } 2064e0de171eSBram Moolenaar assert_equal({one: 1, two: 2, three: 3}, mydict) 2065e6085c53SBram Moolenaar 2066e6085c53SBram Moolenaar assert_equal( 2067e6085c53SBram Moolenaar ['one', 'two', 'three'], 2068e6085c53SBram Moolenaar split('one two three') 2069e6085c53SBram Moolenaar ) 20704fdae999SBram Moolenaarenddef 20714fdae999SBram Moolenaar 20727a092245SBram Moolenaardef Test_vim9_comment() 20737a092245SBram Moolenaar CheckScriptSuccess([ 20747a092245SBram Moolenaar 'vim9script', 20757a092245SBram Moolenaar '# something', 207693f82cbeSBram Moolenaar '#something', 207793f82cbeSBram Moolenaar '#{something', 20787a092245SBram Moolenaar ]) 207993f82cbeSBram Moolenaar 208093f82cbeSBram Moolenaar split Xfile 208193f82cbeSBram Moolenaar CheckScriptSuccess([ 208293f82cbeSBram Moolenaar 'vim9script', 208393f82cbeSBram Moolenaar 'edit #something', 208493f82cbeSBram Moolenaar ]) 208593f82cbeSBram Moolenaar CheckScriptSuccess([ 208693f82cbeSBram Moolenaar 'vim9script', 208793f82cbeSBram Moolenaar 'edit #{something', 208893f82cbeSBram Moolenaar ]) 208993f82cbeSBram Moolenaar close 209093f82cbeSBram Moolenaar 20917a092245SBram Moolenaar CheckScriptFailure([ 20927a092245SBram Moolenaar 'vim9script', 20937a092245SBram Moolenaar ':# something', 20947a092245SBram Moolenaar ], 'E488:') 20957a092245SBram Moolenaar CheckScriptFailure([ 20967a092245SBram Moolenaar '# something', 20977a092245SBram Moolenaar ], 'E488:') 20987a092245SBram Moolenaar CheckScriptFailure([ 20997a092245SBram Moolenaar ':# something', 21007a092245SBram Moolenaar ], 'E488:') 21017a092245SBram Moolenaar 21024a8d9f2eSBram Moolenaar { # block start 21034a8d9f2eSBram Moolenaar } # block end 21044a8d9f2eSBram Moolenaar CheckDefFailure([ 21054a8d9f2eSBram Moolenaar '{# comment', 21064a8d9f2eSBram Moolenaar ], 'E488:') 21074a8d9f2eSBram Moolenaar CheckDefFailure([ 21084a8d9f2eSBram Moolenaar '{', 21094a8d9f2eSBram Moolenaar '}# comment', 21104a8d9f2eSBram Moolenaar ], 'E488:') 21114a8d9f2eSBram Moolenaar 21124a8d9f2eSBram Moolenaar echo "yes" # comment 21134a8d9f2eSBram Moolenaar CheckDefFailure([ 21144a8d9f2eSBram Moolenaar 'echo "yes"# comment', 21154a8d9f2eSBram Moolenaar ], 'E488:') 21167a092245SBram Moolenaar CheckScriptSuccess([ 21177a092245SBram Moolenaar 'vim9script', 21187a092245SBram Moolenaar 'echo "yes" # something', 21197a092245SBram Moolenaar ]) 21207a092245SBram Moolenaar CheckScriptFailure([ 21217a092245SBram Moolenaar 'vim9script', 21227a092245SBram Moolenaar 'echo "yes"# something', 21237a092245SBram Moolenaar ], 'E121:') 21247a092245SBram Moolenaar CheckScriptFailure([ 21257a092245SBram Moolenaar 'vim9script', 21267a092245SBram Moolenaar 'echo# something', 21277a092245SBram Moolenaar ], 'E121:') 21287a092245SBram Moolenaar CheckScriptFailure([ 21297a092245SBram Moolenaar 'echo "yes" # something', 21307a092245SBram Moolenaar ], 'E121:') 21317a092245SBram Moolenaar 21324a8d9f2eSBram Moolenaar exe "echo" # comment 21334a8d9f2eSBram Moolenaar CheckDefFailure([ 21344a8d9f2eSBram Moolenaar 'exe "echo"# comment', 21354a8d9f2eSBram Moolenaar ], 'E488:') 21364a8d9f2eSBram Moolenaar CheckScriptSuccess([ 21374a8d9f2eSBram Moolenaar 'vim9script', 21384a8d9f2eSBram Moolenaar 'exe "echo" # something', 21394a8d9f2eSBram Moolenaar ]) 21404a8d9f2eSBram Moolenaar CheckScriptFailure([ 21414a8d9f2eSBram Moolenaar 'vim9script', 21424a8d9f2eSBram Moolenaar 'exe "echo"# something', 21434a8d9f2eSBram Moolenaar ], 'E121:') 21444a8d9f2eSBram Moolenaar CheckScriptFailure([ 21454a8d9f2eSBram Moolenaar 'vim9script', 21464a8d9f2eSBram Moolenaar 'exe# something', 21474a8d9f2eSBram Moolenaar ], 'E121:') 21484a8d9f2eSBram Moolenaar CheckScriptFailure([ 21494a8d9f2eSBram Moolenaar 'exe "echo" # something', 21504a8d9f2eSBram Moolenaar ], 'E121:') 21514a8d9f2eSBram Moolenaar 21527a092245SBram Moolenaar CheckDefFailure([ 21537a092245SBram Moolenaar 'try# comment', 21547a092245SBram Moolenaar ' echo "yes"', 21557a092245SBram Moolenaar 'catch', 21567a092245SBram Moolenaar 'endtry', 21577a092245SBram Moolenaar ], 'E488:') 21582c5ed4e3SBram Moolenaar CheckScriptFailure([ 21592c5ed4e3SBram Moolenaar 'vim9script', 21602c5ed4e3SBram Moolenaar 'try# comment', 21612c5ed4e3SBram Moolenaar 'echo "yes"', 21622c5ed4e3SBram Moolenaar ], 'E488:') 21637a092245SBram Moolenaar CheckDefFailure([ 21647a092245SBram Moolenaar 'try', 2165a72cfb80SBram Moolenaar ' throw#comment', 2166a72cfb80SBram Moolenaar 'catch', 2167a72cfb80SBram Moolenaar 'endtry', 2168e4984290SBram Moolenaar ], 'E1143:') 2169a72cfb80SBram Moolenaar CheckDefFailure([ 2170a72cfb80SBram Moolenaar 'try', 2171a72cfb80SBram Moolenaar ' throw "yes"#comment', 2172a72cfb80SBram Moolenaar 'catch', 2173a72cfb80SBram Moolenaar 'endtry', 2174a72cfb80SBram Moolenaar ], 'E488:') 2175a72cfb80SBram Moolenaar CheckDefFailure([ 2176a72cfb80SBram Moolenaar 'try', 21777a092245SBram Moolenaar ' echo "yes"', 21787a092245SBram Moolenaar 'catch# comment', 21797a092245SBram Moolenaar 'endtry', 21807a092245SBram Moolenaar ], 'E488:') 21812c5ed4e3SBram Moolenaar CheckScriptFailure([ 21822c5ed4e3SBram Moolenaar 'vim9script', 21832c5ed4e3SBram Moolenaar 'try', 21842c5ed4e3SBram Moolenaar ' echo "yes"', 21852c5ed4e3SBram Moolenaar 'catch# comment', 21862c5ed4e3SBram Moolenaar 'endtry', 21872c5ed4e3SBram Moolenaar ], 'E654:') 21882c5ed4e3SBram Moolenaar CheckDefFailure([ 21892c5ed4e3SBram Moolenaar 'try', 21902c5ed4e3SBram Moolenaar ' echo "yes"', 21912c5ed4e3SBram Moolenaar 'catch /pat/# comment', 21922c5ed4e3SBram Moolenaar 'endtry', 21932c5ed4e3SBram Moolenaar ], 'E488:') 21947a092245SBram Moolenaar CheckDefFailure([ 21957a092245SBram Moolenaar 'try', 21967a092245SBram Moolenaar 'echo "yes"', 21977a092245SBram Moolenaar 'catch', 21987a092245SBram Moolenaar 'endtry# comment', 21997a092245SBram Moolenaar ], 'E488:') 22002c5ed4e3SBram Moolenaar CheckScriptFailure([ 22012c5ed4e3SBram Moolenaar 'vim9script', 22022c5ed4e3SBram Moolenaar 'try', 22032c5ed4e3SBram Moolenaar ' echo "yes"', 22042c5ed4e3SBram Moolenaar 'catch', 22052c5ed4e3SBram Moolenaar 'endtry# comment', 22069b7bf9e9SBram Moolenaar ], 'E488:') 22072c5ed4e3SBram Moolenaar 22082c5ed4e3SBram Moolenaar CheckScriptSuccess([ 22092c5ed4e3SBram Moolenaar 'vim9script', 22102c5ed4e3SBram Moolenaar 'hi # comment', 22112c5ed4e3SBram Moolenaar ]) 22122c5ed4e3SBram Moolenaar CheckScriptFailure([ 22132c5ed4e3SBram Moolenaar 'vim9script', 22142c5ed4e3SBram Moolenaar 'hi# comment', 22152c5ed4e3SBram Moolenaar ], 'E416:') 22161966c248SBram Moolenaar CheckScriptSuccess([ 22171966c248SBram Moolenaar 'vim9script', 22181966c248SBram Moolenaar 'hi Search # comment', 22191966c248SBram Moolenaar ]) 22201966c248SBram Moolenaar CheckScriptFailure([ 22211966c248SBram Moolenaar 'vim9script', 22221966c248SBram Moolenaar 'hi Search# comment', 22231966c248SBram Moolenaar ], 'E416:') 22241966c248SBram Moolenaar CheckScriptSuccess([ 22251966c248SBram Moolenaar 'vim9script', 22261966c248SBram Moolenaar 'hi link This Search # comment', 22271966c248SBram Moolenaar ]) 22281966c248SBram Moolenaar CheckScriptFailure([ 22291966c248SBram Moolenaar 'vim9script', 22301966c248SBram Moolenaar 'hi link This That# comment', 22311966c248SBram Moolenaar ], 'E413:') 22321966c248SBram Moolenaar CheckScriptSuccess([ 22331966c248SBram Moolenaar 'vim9script', 22341966c248SBram Moolenaar 'hi clear This # comment', 22351966c248SBram Moolenaar 'hi clear # comment', 22361966c248SBram Moolenaar ]) 2237f5be8cdbSBram Moolenaar # not tested, because it doesn't give an error but a warning: 2238f5be8cdbSBram Moolenaar # hi clear This# comment', 22391966c248SBram Moolenaar CheckScriptFailure([ 22401966c248SBram Moolenaar 'vim9script', 22411966c248SBram Moolenaar 'hi clear# comment', 22421966c248SBram Moolenaar ], 'E416:') 22431966c248SBram Moolenaar 22441966c248SBram Moolenaar CheckScriptSuccess([ 22451966c248SBram Moolenaar 'vim9script', 22461966c248SBram Moolenaar 'hi Group term=bold', 22471966c248SBram Moolenaar 'match Group /todo/ # comment', 22481966c248SBram Moolenaar ]) 22491966c248SBram Moolenaar CheckScriptFailure([ 22501966c248SBram Moolenaar 'vim9script', 22511966c248SBram Moolenaar 'hi Group term=bold', 22521966c248SBram Moolenaar 'match Group /todo/# comment', 22531966c248SBram Moolenaar ], 'E488:') 22541966c248SBram Moolenaar CheckScriptSuccess([ 22551966c248SBram Moolenaar 'vim9script', 22561966c248SBram Moolenaar 'match # comment', 22571966c248SBram Moolenaar ]) 22581966c248SBram Moolenaar CheckScriptFailure([ 22591966c248SBram Moolenaar 'vim9script', 22601966c248SBram Moolenaar 'match# comment', 22611966c248SBram Moolenaar ], 'E475:') 22621966c248SBram Moolenaar CheckScriptSuccess([ 22631966c248SBram Moolenaar 'vim9script', 22641966c248SBram Moolenaar 'match none # comment', 22651966c248SBram Moolenaar ]) 22661966c248SBram Moolenaar CheckScriptFailure([ 22671966c248SBram Moolenaar 'vim9script', 22681966c248SBram Moolenaar 'match none# comment', 22691966c248SBram Moolenaar ], 'E475:') 22701966c248SBram Moolenaar 22711966c248SBram Moolenaar CheckScriptSuccess([ 22721966c248SBram Moolenaar 'vim9script', 22731966c248SBram Moolenaar 'menutrans clear # comment', 22741966c248SBram Moolenaar ]) 22751966c248SBram Moolenaar CheckScriptFailure([ 22761966c248SBram Moolenaar 'vim9script', 22771966c248SBram Moolenaar 'menutrans clear# comment text', 22781966c248SBram Moolenaar ], 'E474:') 22791966c248SBram Moolenaar 22801966c248SBram Moolenaar CheckScriptSuccess([ 22811966c248SBram Moolenaar 'vim9script', 22821966c248SBram Moolenaar 'syntax clear # comment', 22831966c248SBram Moolenaar ]) 22841966c248SBram Moolenaar CheckScriptFailure([ 22851966c248SBram Moolenaar 'vim9script', 22861966c248SBram Moolenaar 'syntax clear# comment text', 22871966c248SBram Moolenaar ], 'E28:') 22881966c248SBram Moolenaar CheckScriptSuccess([ 22891966c248SBram Moolenaar 'vim9script', 22901966c248SBram Moolenaar 'syntax keyword Word some', 22911966c248SBram Moolenaar 'syntax clear Word # comment', 22921966c248SBram Moolenaar ]) 22931966c248SBram Moolenaar CheckScriptFailure([ 22941966c248SBram Moolenaar 'vim9script', 22951966c248SBram Moolenaar 'syntax keyword Word some', 22961966c248SBram Moolenaar 'syntax clear Word# comment text', 22971966c248SBram Moolenaar ], 'E28:') 22981966c248SBram Moolenaar 22991966c248SBram Moolenaar CheckScriptSuccess([ 23001966c248SBram Moolenaar 'vim9script', 23011966c248SBram Moolenaar 'syntax list # comment', 23021966c248SBram Moolenaar ]) 23031966c248SBram Moolenaar CheckScriptFailure([ 23041966c248SBram Moolenaar 'vim9script', 23051966c248SBram Moolenaar 'syntax list# comment text', 23061966c248SBram Moolenaar ], 'E28:') 23071966c248SBram Moolenaar 23081966c248SBram Moolenaar CheckScriptSuccess([ 23091966c248SBram Moolenaar 'vim9script', 23101966c248SBram Moolenaar 'syntax match Word /pat/ oneline # comment', 23111966c248SBram Moolenaar ]) 23121966c248SBram Moolenaar CheckScriptFailure([ 23131966c248SBram Moolenaar 'vim9script', 23141966c248SBram Moolenaar 'syntax match Word /pat/ oneline# comment', 23151966c248SBram Moolenaar ], 'E475:') 23161966c248SBram Moolenaar 23171966c248SBram Moolenaar CheckScriptSuccess([ 23181966c248SBram Moolenaar 'vim9script', 23191966c248SBram Moolenaar 'syntax keyword Word word # comm[ent', 23201966c248SBram Moolenaar ]) 23211966c248SBram Moolenaar CheckScriptFailure([ 23221966c248SBram Moolenaar 'vim9script', 23231966c248SBram Moolenaar 'syntax keyword Word word# comm[ent', 23241966c248SBram Moolenaar ], 'E789:') 23251966c248SBram Moolenaar 23261966c248SBram Moolenaar CheckScriptSuccess([ 23271966c248SBram Moolenaar 'vim9script', 23281966c248SBram Moolenaar 'syntax match Word /pat/ # comment', 23291966c248SBram Moolenaar ]) 23301966c248SBram Moolenaar CheckScriptFailure([ 23311966c248SBram Moolenaar 'vim9script', 23321966c248SBram Moolenaar 'syntax match Word /pat/# comment', 23331966c248SBram Moolenaar ], 'E402:') 23341966c248SBram Moolenaar 23351966c248SBram Moolenaar CheckScriptSuccess([ 23361966c248SBram Moolenaar 'vim9script', 23371966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something # comment', 23381966c248SBram Moolenaar ]) 23391966c248SBram Moolenaar CheckScriptFailure([ 23401966c248SBram Moolenaar 'vim9script', 23411966c248SBram Moolenaar 'syntax match Word /pat/ contains=Something# comment', 23421966c248SBram Moolenaar ], 'E475:') 23431966c248SBram Moolenaar CheckScriptFailure([ 23441966c248SBram Moolenaar 'vim9script', 23451966c248SBram Moolenaar 'syntax match Word /pat/ contains= # comment', 23461966c248SBram Moolenaar ], 'E406:') 23471966c248SBram Moolenaar CheckScriptFailure([ 23481966c248SBram Moolenaar 'vim9script', 23491966c248SBram Moolenaar 'syntax match Word /pat/ contains=# comment', 23501966c248SBram Moolenaar ], 'E475:') 23511966c248SBram Moolenaar 23521966c248SBram Moolenaar CheckScriptSuccess([ 23531966c248SBram Moolenaar 'vim9script', 23541966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/ # comment', 23551966c248SBram Moolenaar ]) 23561966c248SBram Moolenaar CheckScriptFailure([ 23571966c248SBram Moolenaar 'vim9script', 23581966c248SBram Moolenaar 'syntax region Word start=/pat/ end=/pat/# comment', 2359d032f34aSBram Moolenaar ], 'E402:') 23601966c248SBram Moolenaar 23611966c248SBram Moolenaar CheckScriptSuccess([ 23621966c248SBram Moolenaar 'vim9script', 23631966c248SBram Moolenaar 'syntax sync # comment', 23641966c248SBram Moolenaar ]) 23651966c248SBram Moolenaar CheckScriptFailure([ 23661966c248SBram Moolenaar 'vim9script', 23671966c248SBram Moolenaar 'syntax sync# comment', 23681966c248SBram Moolenaar ], 'E404:') 23691966c248SBram Moolenaar CheckScriptSuccess([ 23701966c248SBram Moolenaar 'vim9script', 23711966c248SBram Moolenaar 'syntax sync ccomment # comment', 23721966c248SBram Moolenaar ]) 23731966c248SBram Moolenaar CheckScriptFailure([ 23741966c248SBram Moolenaar 'vim9script', 23751966c248SBram Moolenaar 'syntax sync ccomment# comment', 23761966c248SBram Moolenaar ], 'E404:') 23771966c248SBram Moolenaar 23781966c248SBram Moolenaar CheckScriptSuccess([ 23791966c248SBram Moolenaar 'vim9script', 23801966c248SBram Moolenaar 'syntax cluster Some contains=Word # comment', 23811966c248SBram Moolenaar ]) 23821966c248SBram Moolenaar CheckScriptFailure([ 23831966c248SBram Moolenaar 'vim9script', 23841966c248SBram Moolenaar 'syntax cluster Some contains=Word# comment', 23851966c248SBram Moolenaar ], 'E475:') 2386a72cfb80SBram Moolenaar 2387a72cfb80SBram Moolenaar CheckScriptSuccess([ 2388a72cfb80SBram Moolenaar 'vim9script', 2389a72cfb80SBram Moolenaar 'command Echo echo # comment', 2390a72cfb80SBram Moolenaar 'command Echo # comment', 23912d870f8dSBram Moolenaar 'delcommand Echo', 2392a72cfb80SBram Moolenaar ]) 2393a72cfb80SBram Moolenaar CheckScriptFailure([ 2394a72cfb80SBram Moolenaar 'vim9script', 2395a72cfb80SBram Moolenaar 'command Echo echo# comment', 2396a72cfb80SBram Moolenaar 'Echo', 2397a72cfb80SBram Moolenaar ], 'E121:') 23982d870f8dSBram Moolenaar delcommand Echo 239970249ee8SBram Moolenaar 240070249ee8SBram Moolenaar var curdir = getcwd() 240170249ee8SBram Moolenaar CheckScriptSuccess([ 240270249ee8SBram Moolenaar 'command Echo cd " comment', 240370249ee8SBram Moolenaar 'Echo', 240470249ee8SBram Moolenaar 'delcommand Echo', 240570249ee8SBram Moolenaar ]) 240670249ee8SBram Moolenaar CheckScriptSuccess([ 240770249ee8SBram Moolenaar 'vim9script' 240870249ee8SBram Moolenaar 'command Echo cd # comment', 240970249ee8SBram Moolenaar 'Echo', 241070249ee8SBram Moolenaar 'delcommand Echo', 241170249ee8SBram Moolenaar ]) 241270249ee8SBram Moolenaar CheckScriptFailure([ 241370249ee8SBram Moolenaar 'vim9script', 241470249ee8SBram Moolenaar 'command Echo cd " comment', 241570249ee8SBram Moolenaar 'Echo', 241670249ee8SBram Moolenaar ], 'E344:') 241770249ee8SBram Moolenaar delcommand Echo 241870249ee8SBram Moolenaar chdir(curdir) 241970249ee8SBram Moolenaar 2420a72cfb80SBram Moolenaar CheckScriptFailure([ 2421a72cfb80SBram Moolenaar 'vim9script', 2422a72cfb80SBram Moolenaar 'command Echo# comment', 2423a72cfb80SBram Moolenaar ], 'E182:') 2424a72cfb80SBram Moolenaar CheckScriptFailure([ 2425a72cfb80SBram Moolenaar 'vim9script', 2426a72cfb80SBram Moolenaar 'command Echo echo', 2427a72cfb80SBram Moolenaar 'command Echo# comment', 2428a72cfb80SBram Moolenaar ], 'E182:') 24292d870f8dSBram Moolenaar delcommand Echo 2430a72cfb80SBram Moolenaar 2431a72cfb80SBram Moolenaar CheckScriptSuccess([ 2432a72cfb80SBram Moolenaar 'vim9script', 2433a72cfb80SBram Moolenaar 'function # comment', 2434a72cfb80SBram Moolenaar ]) 2435a72cfb80SBram Moolenaar CheckScriptFailure([ 2436a72cfb80SBram Moolenaar 'vim9script', 24379898107fSBram Moolenaar 'function " comment', 24389898107fSBram Moolenaar ], 'E129:') 24399898107fSBram Moolenaar CheckScriptFailure([ 24409898107fSBram Moolenaar 'vim9script', 2441a72cfb80SBram Moolenaar 'function# comment', 2442a72cfb80SBram Moolenaar ], 'E129:') 2443a72cfb80SBram Moolenaar CheckScriptSuccess([ 2444a72cfb80SBram Moolenaar 'vim9script', 2445a72cfb80SBram Moolenaar 'function CheckScriptSuccess # comment', 2446a72cfb80SBram Moolenaar ]) 2447a72cfb80SBram Moolenaar CheckScriptFailure([ 2448a72cfb80SBram Moolenaar 'vim9script', 2449a72cfb80SBram Moolenaar 'function CheckScriptSuccess# comment', 2450a72cfb80SBram Moolenaar ], 'E488:') 2451a72cfb80SBram Moolenaar 2452a72cfb80SBram Moolenaar CheckScriptSuccess([ 2453a72cfb80SBram Moolenaar 'vim9script', 24544c17ad94SBram Moolenaar 'func g:DeleteMeA()', 2455a72cfb80SBram Moolenaar 'endfunc', 24564c17ad94SBram Moolenaar 'delfunction g:DeleteMeA # comment', 2457a72cfb80SBram Moolenaar ]) 2458a72cfb80SBram Moolenaar CheckScriptFailure([ 2459a72cfb80SBram Moolenaar 'vim9script', 24604c17ad94SBram Moolenaar 'func g:DeleteMeB()', 2461a72cfb80SBram Moolenaar 'endfunc', 24624c17ad94SBram Moolenaar 'delfunction g:DeleteMeB# comment', 2463a72cfb80SBram Moolenaar ], 'E488:') 2464a72cfb80SBram Moolenaar 2465a72cfb80SBram Moolenaar CheckScriptSuccess([ 2466a72cfb80SBram Moolenaar 'vim9script', 2467a72cfb80SBram Moolenaar 'call execute("ls") # comment', 2468a72cfb80SBram Moolenaar ]) 2469a72cfb80SBram Moolenaar CheckScriptFailure([ 2470a72cfb80SBram Moolenaar 'vim9script', 2471a72cfb80SBram Moolenaar 'call execute("ls")# comment', 2472a72cfb80SBram Moolenaar ], 'E488:') 2473e7e4838fSBram Moolenaar 2474e7e4838fSBram Moolenaar CheckScriptFailure([ 2475e7e4838fSBram Moolenaar 'def Test() " comment', 2476e7e4838fSBram Moolenaar 'enddef', 2477e7e4838fSBram Moolenaar ], 'E488:') 2478e7e4838fSBram Moolenaar CheckScriptFailure([ 2479e7e4838fSBram Moolenaar 'vim9script', 2480e7e4838fSBram Moolenaar 'def Test() " comment', 2481e7e4838fSBram Moolenaar 'enddef', 2482e7e4838fSBram Moolenaar ], 'E488:') 2483e7e4838fSBram Moolenaar 2484e7e4838fSBram Moolenaar CheckScriptSuccess([ 2485e7e4838fSBram Moolenaar 'func Test() " comment', 2486e7e4838fSBram Moolenaar 'endfunc', 24872d870f8dSBram Moolenaar 'delfunc Test', 2488e7e4838fSBram Moolenaar ]) 24899898107fSBram Moolenaar CheckScriptSuccess([ 2490e7e4838fSBram Moolenaar 'vim9script', 2491e7e4838fSBram Moolenaar 'func Test() " comment', 2492e7e4838fSBram Moolenaar 'endfunc', 24939898107fSBram Moolenaar ]) 2494e7e4838fSBram Moolenaar 2495e7e4838fSBram Moolenaar CheckScriptSuccess([ 2496e7e4838fSBram Moolenaar 'def Test() # comment', 2497e7e4838fSBram Moolenaar 'enddef', 2498e7e4838fSBram Moolenaar ]) 2499e7e4838fSBram Moolenaar CheckScriptFailure([ 2500e7e4838fSBram Moolenaar 'func Test() # comment', 2501e7e4838fSBram Moolenaar 'endfunc', 2502e7e4838fSBram Moolenaar ], 'E488:') 25032c5ed4e3SBram Moolenaarenddef 25042c5ed4e3SBram Moolenaar 25052c5ed4e3SBram Moolenaardef Test_vim9_comment_gui() 25062c5ed4e3SBram Moolenaar CheckCanRunGui 25072c5ed4e3SBram Moolenaar 25082c5ed4e3SBram Moolenaar CheckScriptFailure([ 25092c5ed4e3SBram Moolenaar 'vim9script', 25102c5ed4e3SBram Moolenaar 'gui#comment' 25112c5ed4e3SBram Moolenaar ], 'E499:') 25122c5ed4e3SBram Moolenaar CheckScriptFailure([ 25132c5ed4e3SBram Moolenaar 'vim9script', 25142c5ed4e3SBram Moolenaar 'gui -f#comment' 25152c5ed4e3SBram Moolenaar ], 'E499:') 25167a092245SBram Moolenaarenddef 25177a092245SBram Moolenaar 2518a26b9700SBram Moolenaardef Test_vim9_comment_not_compiled() 25196797966dSBram Moolenaar au TabEnter *.vim g:entered = 1 25206797966dSBram Moolenaar au TabEnter *.x g:entered = 2 2521a26b9700SBram Moolenaar 2522a26b9700SBram Moolenaar edit test.vim 2523a26b9700SBram Moolenaar doautocmd TabEnter #comment 2524a26b9700SBram Moolenaar assert_equal(1, g:entered) 2525a26b9700SBram Moolenaar 2526a26b9700SBram Moolenaar doautocmd TabEnter f.x 2527a26b9700SBram Moolenaar assert_equal(2, g:entered) 2528a26b9700SBram Moolenaar 2529a26b9700SBram Moolenaar g:entered = 0 2530a26b9700SBram Moolenaar doautocmd TabEnter f.x #comment 2531a26b9700SBram Moolenaar assert_equal(2, g:entered) 2532a26b9700SBram Moolenaar 2533a26b9700SBram Moolenaar assert_fails('doautocmd Syntax#comment', 'E216:') 2534a26b9700SBram Moolenaar 2535a26b9700SBram Moolenaar au! TabEnter 2536a26b9700SBram Moolenaar unlet g:entered 2537d72c1bf0SBram Moolenaar 2538d72c1bf0SBram Moolenaar CheckScriptSuccess([ 2539d72c1bf0SBram Moolenaar 'vim9script', 25406797966dSBram Moolenaar 'g:var = 123', 2541e55b1c09SBram Moolenaar 'b:var = 456', 2542e55b1c09SBram Moolenaar 'w:var = 777', 2543e55b1c09SBram Moolenaar 't:var = 888', 2544d72c1bf0SBram Moolenaar 'unlet g:var w:var # something', 2545d72c1bf0SBram Moolenaar ]) 2546d72c1bf0SBram Moolenaar 2547d72c1bf0SBram Moolenaar CheckScriptFailure([ 2548d72c1bf0SBram Moolenaar 'vim9script', 2549cfcd011fSBram Moolenaar 'let var = 123', 2550cfcd011fSBram Moolenaar ], 'E1126: Cannot use :let in Vim9 script') 2551cfcd011fSBram Moolenaar 2552cfcd011fSBram Moolenaar CheckScriptFailure([ 2553cfcd011fSBram Moolenaar 'vim9script', 2554cfcd011fSBram Moolenaar 'var g:var = 123', 2555e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a global variable:') 2556e55b1c09SBram Moolenaar 2557e55b1c09SBram Moolenaar CheckScriptFailure([ 2558e55b1c09SBram Moolenaar 'vim9script', 2559cfcd011fSBram Moolenaar 'var b:var = 123', 2560e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a buffer variable:') 2561e55b1c09SBram Moolenaar 2562e55b1c09SBram Moolenaar CheckScriptFailure([ 2563e55b1c09SBram Moolenaar 'vim9script', 2564cfcd011fSBram Moolenaar 'var w:var = 123', 2565e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a window variable:') 2566e55b1c09SBram Moolenaar 2567e55b1c09SBram Moolenaar CheckScriptFailure([ 2568e55b1c09SBram Moolenaar 'vim9script', 2569cfcd011fSBram Moolenaar 'var t:var = 123', 2570e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a tab variable:') 2571e55b1c09SBram Moolenaar 2572e55b1c09SBram Moolenaar CheckScriptFailure([ 2573e55b1c09SBram Moolenaar 'vim9script', 2574cfcd011fSBram Moolenaar 'var v:version = 123', 2575e55b1c09SBram Moolenaar ], 'E1016: Cannot declare a v: variable:') 2576e55b1c09SBram Moolenaar 2577e55b1c09SBram Moolenaar CheckScriptFailure([ 2578e55b1c09SBram Moolenaar 'vim9script', 2579cfcd011fSBram Moolenaar 'var $VARIABLE = "text"', 2580e55b1c09SBram Moolenaar ], 'E1016: Cannot declare an environment variable:') 25816797966dSBram Moolenaar 25826797966dSBram Moolenaar CheckScriptFailure([ 25836797966dSBram Moolenaar 'vim9script', 25846797966dSBram Moolenaar 'g:var = 123', 258532e35117SBram Moolenaar 'unlet g:var# comment1', 2586d72c1bf0SBram Moolenaar ], 'E108:') 2587d72c1bf0SBram Moolenaar 2588d72c1bf0SBram Moolenaar CheckScriptFailure([ 2589d72c1bf0SBram Moolenaar 'let g:var = 123', 2590d72c1bf0SBram Moolenaar 'unlet g:var # something', 2591d72c1bf0SBram Moolenaar ], 'E488:') 2592faac4104SBram Moolenaar 2593faac4104SBram Moolenaar CheckScriptSuccess([ 2594faac4104SBram Moolenaar 'vim9script', 259532e35117SBram Moolenaar 'if 1 # comment2', 2596faac4104SBram Moolenaar ' echo "yes"', 2597faac4104SBram Moolenaar 'elseif 2 #comment', 2598faac4104SBram Moolenaar ' echo "no"', 2599faac4104SBram Moolenaar 'endif', 2600faac4104SBram Moolenaar ]) 2601faac4104SBram Moolenaar 2602faac4104SBram Moolenaar CheckScriptFailure([ 2603faac4104SBram Moolenaar 'vim9script', 260432e35117SBram Moolenaar 'if 1# comment3', 2605faac4104SBram Moolenaar ' echo "yes"', 2606faac4104SBram Moolenaar 'endif', 2607faac4104SBram Moolenaar ], 'E15:') 2608faac4104SBram Moolenaar 2609faac4104SBram Moolenaar CheckScriptFailure([ 2610faac4104SBram Moolenaar 'vim9script', 261132e35117SBram Moolenaar 'if 0 # comment4', 2612faac4104SBram Moolenaar ' echo "yes"', 2613faac4104SBram Moolenaar 'elseif 2#comment', 2614faac4104SBram Moolenaar ' echo "no"', 2615faac4104SBram Moolenaar 'endif', 2616faac4104SBram Moolenaar ], 'E15:') 2617faac4104SBram Moolenaar 2618faac4104SBram Moolenaar CheckScriptSuccess([ 2619faac4104SBram Moolenaar 'vim9script', 2620cfcd011fSBram Moolenaar 'var v = 1 # comment5', 2621faac4104SBram Moolenaar ]) 2622faac4104SBram Moolenaar 2623faac4104SBram Moolenaar CheckScriptFailure([ 2624faac4104SBram Moolenaar 'vim9script', 2625cfcd011fSBram Moolenaar 'var v = 1# comment6', 262632e35117SBram Moolenaar ], 'E15:') 2627faac4104SBram Moolenaar 2628faac4104SBram Moolenaar CheckScriptSuccess([ 2629faac4104SBram Moolenaar 'vim9script', 2630faac4104SBram Moolenaar 'new' 2631d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2632df069eecSBram Moolenaar ':$', 2633faac4104SBram Moolenaar 'dsearch /pat/ #comment', 2634faac4104SBram Moolenaar 'bwipe!', 2635faac4104SBram Moolenaar ]) 2636faac4104SBram Moolenaar 2637f5be8cdbSBram Moolenaar CheckScriptFailure([ 2638f5be8cdbSBram Moolenaar 'vim9script', 2639f5be8cdbSBram Moolenaar 'new' 2640d2c61705SBram Moolenaar 'setline(1, ["# define pat", "last"])', 2641f5be8cdbSBram Moolenaar ':$', 2642f5be8cdbSBram Moolenaar 'dsearch /pat/#comment', 2643f5be8cdbSBram Moolenaar 'bwipe!', 2644f5be8cdbSBram Moolenaar ], 'E488:') 2645f5be8cdbSBram Moolenaar 2646f5be8cdbSBram Moolenaar CheckScriptFailure([ 2647f5be8cdbSBram Moolenaar 'vim9script', 2648f5be8cdbSBram Moolenaar 'func! SomeFunc()', 2649f5be8cdbSBram Moolenaar ], 'E477:') 2650a26b9700SBram Moolenaarenddef 2651a26b9700SBram Moolenaar 26527e5bd91dSBram Moolenaardef Test_finish() 2653cfcd011fSBram Moolenaar var lines =<< trim END 26547e5bd91dSBram Moolenaar vim9script 26556797966dSBram Moolenaar g:res = 'one' 26567e5bd91dSBram Moolenaar if v:false | finish | endif 26576797966dSBram Moolenaar g:res = 'two' 26587e5bd91dSBram Moolenaar finish 26596797966dSBram Moolenaar g:res = 'three' 26607e5bd91dSBram Moolenaar END 26617e5bd91dSBram Moolenaar writefile(lines, 'Xfinished') 26627e5bd91dSBram Moolenaar source Xfinished 26637e5bd91dSBram Moolenaar assert_equal('two', g:res) 26647e5bd91dSBram Moolenaar 26657e5bd91dSBram Moolenaar unlet g:res 26667e5bd91dSBram Moolenaar delete('Xfinished') 26677e5bd91dSBram Moolenaarenddef 26687e5bd91dSBram Moolenaar 2669a5d0077eSBram Moolenaardef Test_forward_declaration() 2670cfcd011fSBram Moolenaar var lines =<< trim END 2671a5d0077eSBram Moolenaar vim9script 2672a5d0077eSBram Moolenaar def GetValue(): string 2673a5d0077eSBram Moolenaar return theVal 2674a5d0077eSBram Moolenaar enddef 2675cfcd011fSBram Moolenaar var theVal = 'something' 2676822ba247SBram Moolenaar g:initVal = GetValue() 2677a5d0077eSBram Moolenaar theVal = 'else' 2678a5d0077eSBram Moolenaar g:laterVal = GetValue() 2679a5d0077eSBram Moolenaar END 2680a5d0077eSBram Moolenaar writefile(lines, 'Xforward') 2681a5d0077eSBram Moolenaar source Xforward 2682a5d0077eSBram Moolenaar assert_equal('something', g:initVal) 2683a5d0077eSBram Moolenaar assert_equal('else', g:laterVal) 2684a5d0077eSBram Moolenaar 2685a5d0077eSBram Moolenaar unlet g:initVal 2686a5d0077eSBram Moolenaar unlet g:laterVal 2687a5d0077eSBram Moolenaar delete('Xforward') 2688a5d0077eSBram Moolenaarenddef 2689a5d0077eSBram Moolenaar 26909721fb4eSBram Moolenaardef Test_source_vim9_from_legacy() 2691cfcd011fSBram Moolenaar var legacy_lines =<< trim END 26929721fb4eSBram Moolenaar source Xvim9_script.vim 26939721fb4eSBram Moolenaar 26949721fb4eSBram Moolenaar call assert_false(exists('local')) 26959721fb4eSBram Moolenaar call assert_false(exists('exported')) 26969721fb4eSBram Moolenaar call assert_false(exists('s:exported')) 26979721fb4eSBram Moolenaar call assert_equal('global', global) 26989721fb4eSBram Moolenaar call assert_equal('global', g:global) 26999721fb4eSBram Moolenaar 27009721fb4eSBram Moolenaar " imported variable becomes script-local 27019721fb4eSBram Moolenaar import exported from './Xvim9_script.vim' 27029721fb4eSBram Moolenaar call assert_equal('exported', s:exported) 27039721fb4eSBram Moolenaar call assert_false(exists('exported')) 27049721fb4eSBram Moolenaar 27059721fb4eSBram Moolenaar " imported function becomes script-local 27069721fb4eSBram Moolenaar import GetText from './Xvim9_script.vim' 27079721fb4eSBram Moolenaar call assert_equal('text', s:GetText()) 27089721fb4eSBram Moolenaar call assert_false(exists('*GetText')) 27099721fb4eSBram Moolenaar END 27109721fb4eSBram Moolenaar writefile(legacy_lines, 'Xlegacy_script.vim') 27119721fb4eSBram Moolenaar 2712cfcd011fSBram Moolenaar var vim9_lines =<< trim END 27139721fb4eSBram Moolenaar vim9script 2714cfcd011fSBram Moolenaar var local = 'local' 27159721fb4eSBram Moolenaar g:global = 'global' 2716cfcd011fSBram Moolenaar export var exported = 'exported' 27179721fb4eSBram Moolenaar export def GetText(): string 27189721fb4eSBram Moolenaar return 'text' 27199721fb4eSBram Moolenaar enddef 27209721fb4eSBram Moolenaar END 27219721fb4eSBram Moolenaar writefile(vim9_lines, 'Xvim9_script.vim') 27229721fb4eSBram Moolenaar 27239721fb4eSBram Moolenaar source Xlegacy_script.vim 27249721fb4eSBram Moolenaar 27259721fb4eSBram Moolenaar assert_equal('global', g:global) 2726f5be8cdbSBram Moolenaar unlet g:global 27279721fb4eSBram Moolenaar 27289721fb4eSBram Moolenaar delete('Xlegacy_script.vim') 27299721fb4eSBram Moolenaar delete('Xvim9_script.vim') 27309721fb4eSBram Moolenaarenddef 2731a5d0077eSBram Moolenaar 27327d699701SBram Moolenaarfunc Test_vim9script_not_global() 27337d699701SBram Moolenaar " check that items defined in Vim9 script are script-local, not global 27347d699701SBram Moolenaar let vim9lines =<< trim END 27357d699701SBram Moolenaar vim9script 2736cfcd011fSBram Moolenaar var name = 'local' 27377d699701SBram Moolenaar func TheFunc() 27387d699701SBram Moolenaar echo 'local' 27397d699701SBram Moolenaar endfunc 27407d699701SBram Moolenaar def DefFunc() 27417d699701SBram Moolenaar echo 'local' 27427d699701SBram Moolenaar enddef 27437d699701SBram Moolenaar END 27447d699701SBram Moolenaar call writefile(vim9lines, 'Xvim9script.vim') 27457d699701SBram Moolenaar source Xvim9script.vim 27467d699701SBram Moolenaar try 27477d699701SBram Moolenaar echo g:var 27487d699701SBram Moolenaar assert_report('did not fail') 27497d699701SBram Moolenaar catch /E121:/ 27507d699701SBram Moolenaar " caught 27517d699701SBram Moolenaar endtry 27527d699701SBram Moolenaar try 27537d699701SBram Moolenaar call TheFunc() 27547d699701SBram Moolenaar assert_report('did not fail') 27557d699701SBram Moolenaar catch /E117:/ 27567d699701SBram Moolenaar " caught 27577d699701SBram Moolenaar endtry 27587d699701SBram Moolenaar try 27597d699701SBram Moolenaar call DefFunc() 27607d699701SBram Moolenaar assert_report('did not fail') 27617d699701SBram Moolenaar catch /E117:/ 27627d699701SBram Moolenaar " caught 27637d699701SBram Moolenaar endtry 27647d699701SBram Moolenaar 276525859dd7SBram Moolenaar call delete('Xvim9script.vim') 27667d699701SBram Moolenaarendfunc 27677d699701SBram Moolenaar 2768eeb27bfeSBram Moolenaardef Test_vim9_copen() 2769eeb27bfeSBram Moolenaar # this was giving an error for setting w:quickfix_title 2770eeb27bfeSBram Moolenaar copen 2771eeb27bfeSBram Moolenaar quit 2772eeb27bfeSBram Moolenaarenddef 2773eeb27bfeSBram Moolenaar 27742d6b20d6SBram Moolenaar" test using a vim9script that is auto-loaded from an autocmd 27752d6b20d6SBram Moolenaardef Test_vim9_autoload() 2776cfcd011fSBram Moolenaar var lines =<< trim END 27772d6b20d6SBram Moolenaar vim9script 27782d6b20d6SBram Moolenaar def foo#test() 27792d6b20d6SBram Moolenaar echomsg getreg('"') 27802d6b20d6SBram Moolenaar enddef 27812d6b20d6SBram Moolenaar END 27822d6b20d6SBram Moolenaar 27832d6b20d6SBram Moolenaar mkdir('Xdir/autoload', 'p') 27842d6b20d6SBram Moolenaar writefile(lines, 'Xdir/autoload/foo.vim') 2785cfcd011fSBram Moolenaar var save_rtp = &rtp 27862d6b20d6SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xdir' 27872d6b20d6SBram Moolenaar augroup test 27882d6b20d6SBram Moolenaar autocmd TextYankPost * call foo#test() 27892d6b20d6SBram Moolenaar augroup END 27902d6b20d6SBram Moolenaar 27912d6b20d6SBram Moolenaar normal Y 27922d6b20d6SBram Moolenaar 27932d6b20d6SBram Moolenaar augroup test 27942d6b20d6SBram Moolenaar autocmd! 27952d6b20d6SBram Moolenaar augroup END 27962d6b20d6SBram Moolenaar delete('Xdir', 'rf') 27972d6b20d6SBram Moolenaar &rtp = save_rtp 27982d6b20d6SBram Moolenaarenddef 27992d6b20d6SBram Moolenaar 280077e5dcc3SBram Moolenaar" This was causing a crash because suppress_errthrow wasn't reset. 280177e5dcc3SBram Moolenaardef Test_vim9_autoload_error() 2802cfcd011fSBram Moolenaar var lines =<< trim END 280377e5dcc3SBram Moolenaar vim9script 280477e5dcc3SBram Moolenaar def crash#func() 280577e5dcc3SBram Moolenaar try 280677e5dcc3SBram Moolenaar for x in List() 280777e5dcc3SBram Moolenaar endfor 280877e5dcc3SBram Moolenaar catch 280977e5dcc3SBram Moolenaar endtry 281077e5dcc3SBram Moolenaar g:ok = true 281177e5dcc3SBram Moolenaar enddef 281277e5dcc3SBram Moolenaar fu List() 281377e5dcc3SBram Moolenaar invalid 281477e5dcc3SBram Moolenaar endfu 281577e5dcc3SBram Moolenaar try 281677e5dcc3SBram Moolenaar invalid 281777e5dcc3SBram Moolenaar catch /wontmatch/ 281877e5dcc3SBram Moolenaar endtry 281977e5dcc3SBram Moolenaar END 282077e5dcc3SBram Moolenaar call mkdir('Xruntime/autoload', 'p') 282177e5dcc3SBram Moolenaar call writefile(lines, 'Xruntime/autoload/crash.vim') 282277e5dcc3SBram Moolenaar 282377e5dcc3SBram Moolenaar # run in a separate Vim to avoid the side effects of assert_fails() 282477e5dcc3SBram Moolenaar lines =<< trim END 282577e5dcc3SBram Moolenaar exe 'set rtp^=' .. getcwd() .. '/Xruntime' 282677e5dcc3SBram Moolenaar call crash#func() 282777e5dcc3SBram Moolenaar call writefile(['ok'], 'Xdidit') 28289c4f5520SBram Moolenaar qall! 282977e5dcc3SBram Moolenaar END 283077e5dcc3SBram Moolenaar writefile(lines, 'Xscript') 283177e5dcc3SBram Moolenaar RunVim([], [], '-S Xscript') 283277e5dcc3SBram Moolenaar assert_equal(['ok'], readfile('Xdidit')) 283377e5dcc3SBram Moolenaar 283477e5dcc3SBram Moolenaar delete('Xdidit') 283577e5dcc3SBram Moolenaar delete('Xscript') 283677e5dcc3SBram Moolenaar delete('Xruntime', 'rf') 283777e5dcc3SBram Moolenaarenddef 283877e5dcc3SBram Moolenaar 283981e17fbeSBram Moolenaardef Test_script_var_in_autocmd() 284081e17fbeSBram Moolenaar # using a script variable from an autocommand, defined in a :def function in a 284181e17fbeSBram Moolenaar # legacy Vim script, cannot check the variable type. 2842cfcd011fSBram Moolenaar var lines =<< trim END 284381e17fbeSBram Moolenaar let s:counter = 1 284481e17fbeSBram Moolenaar def s:Func() 284581e17fbeSBram Moolenaar au! CursorHold 284681e17fbeSBram Moolenaar au CursorHold * s:counter += 1 284781e17fbeSBram Moolenaar enddef 284881e17fbeSBram Moolenaar call s:Func() 284981e17fbeSBram Moolenaar doau CursorHold 285081e17fbeSBram Moolenaar call assert_equal(2, s:counter) 285181e17fbeSBram Moolenaar au! CursorHold 285281e17fbeSBram Moolenaar END 285381e17fbeSBram Moolenaar CheckScriptSuccess(lines) 285481e17fbeSBram Moolenaarenddef 285581e17fbeSBram Moolenaar 28563896a105SBram Moolenaardef Test_cmdline_win() 28573896a105SBram Moolenaar # if the Vim syntax highlighting uses Vim9 constructs they can be used from 28583896a105SBram Moolenaar # the command line window. 28593896a105SBram Moolenaar mkdir('rtp/syntax', 'p') 2860cfcd011fSBram Moolenaar var export_lines =<< trim END 28613896a105SBram Moolenaar vim9script 2862cfcd011fSBram Moolenaar export var That = 'yes' 28633896a105SBram Moolenaar END 28643896a105SBram Moolenaar writefile(export_lines, 'rtp/syntax/Xexport.vim') 2865cfcd011fSBram Moolenaar var import_lines =<< trim END 28663896a105SBram Moolenaar vim9script 28673896a105SBram Moolenaar import That from './Xexport.vim' 28683896a105SBram Moolenaar END 28693896a105SBram Moolenaar writefile(import_lines, 'rtp/syntax/vim.vim') 2870cfcd011fSBram Moolenaar var save_rtp = &rtp 28713896a105SBram Moolenaar &rtp = getcwd() .. '/rtp' .. ',' .. &rtp 28723896a105SBram Moolenaar syntax on 28733896a105SBram Moolenaar augroup CmdWin 28743896a105SBram Moolenaar autocmd CmdwinEnter * g:got_there = 'yes' 28753896a105SBram Moolenaar augroup END 28763896a105SBram Moolenaar # this will open and also close the cmdline window 28773896a105SBram Moolenaar feedkeys('q:', 'xt') 28783896a105SBram Moolenaar assert_equal('yes', g:got_there) 28793896a105SBram Moolenaar 28803896a105SBram Moolenaar augroup CmdWin 28813896a105SBram Moolenaar au! 28823896a105SBram Moolenaar augroup END 28833896a105SBram Moolenaar &rtp = save_rtp 28843896a105SBram Moolenaar delete('rtp', 'rf') 28853896a105SBram Moolenaarenddef 28863896a105SBram Moolenaar 2887e3d4685fSBram Moolenaardef Test_invalid_sid() 2888e3d4685fSBram Moolenaar assert_fails('func <SNR>1234_func', 'E123:') 288925859dd7SBram Moolenaar 28909c4f5520SBram Moolenaar if RunVim([], ['wq! Xdidit'], '+"func <SNR>1_func"') 2891d2c61705SBram Moolenaar assert_equal([], readfile('Xdidit')) 2892e3d4685fSBram Moolenaar endif 2893e3d4685fSBram Moolenaar delete('Xdidit') 2894e3d4685fSBram Moolenaarenddef 2895e3d4685fSBram Moolenaar 28969ec7026fSBram Moolenaardef Test_restoring_cpo() 28979ec7026fSBram Moolenaar writefile(['vim9script', 'set nocp'], 'Xsourced') 28989ec7026fSBram Moolenaar writefile(['call writefile(["done"], "Xdone")', 'quit!'], 'Xclose') 28999ec7026fSBram Moolenaar if RunVim([], [], '-u NONE +"set cpo+=a" -S Xsourced -S Xclose') 29009ec7026fSBram Moolenaar assert_equal(['done'], readfile('Xdone')) 29019ec7026fSBram Moolenaar endif 29029ec7026fSBram Moolenaar delete('Xsourced') 29039ec7026fSBram Moolenaar delete('Xclose') 29049ec7026fSBram Moolenaarenddef 29059ec7026fSBram Moolenaar 29069ec7026fSBram Moolenaar 2907f0afd9e1SBram Moolenaardef Test_unset_any_variable() 2908cfcd011fSBram Moolenaar var lines =<< trim END 2909cfcd011fSBram Moolenaar var name: any 2910cfcd011fSBram Moolenaar assert_equal(0, name) 2911f0afd9e1SBram Moolenaar END 2912f0afd9e1SBram Moolenaar CheckDefAndScriptSuccess(lines) 2913f0afd9e1SBram Moolenaarenddef 2914f0afd9e1SBram Moolenaar 29157e9210eaSBram Moolenaarfunc Test_define_func_at_command_line() 291658dbef33SBram Moolenaar CheckRunVimInTerminal 291758dbef33SBram Moolenaar 29187e9210eaSBram Moolenaar " call indirectly to avoid compilation error for missing functions 29197e9210eaSBram Moolenaar call Run_Test_define_func_at_command_line() 29207e9210eaSBram Moolenaarendfunc 29217e9210eaSBram Moolenaar 29227e9210eaSBram Moolenaardef Run_Test_define_func_at_command_line() 29239c4f5520SBram Moolenaar # run in a separate Vim instance to avoid the script context 2924cfcd011fSBram Moolenaar var lines =<< trim END 29259c4f5520SBram Moolenaar func CheckAndQuit() 29269c4f5520SBram Moolenaar call assert_fails('call Afunc()', 'E117: Unknown function: Bfunc') 29279c4f5520SBram Moolenaar call writefile(['errors: ' .. string(v:errors)], 'Xdidcmd') 29289c4f5520SBram Moolenaar endfunc 29299c4f5520SBram Moolenaar END 29309c4f5520SBram Moolenaar writefile([''], 'Xdidcmd') 29319c4f5520SBram Moolenaar writefile(lines, 'XcallFunc') 2932e0de171eSBram Moolenaar var buf = RunVimInTerminal('-S XcallFunc', {rows: 6}) 29339c4f5520SBram Moolenaar # define Afunc() on the command line 29349c4f5520SBram Moolenaar term_sendkeys(buf, ":def Afunc()\<CR>Bfunc()\<CR>enddef\<CR>") 29359c4f5520SBram Moolenaar term_sendkeys(buf, ":call CheckAndQuit()\<CR>") 29369c4f5520SBram Moolenaar WaitForAssert({-> assert_equal(['errors: []'], readfile('Xdidcmd'))}) 29379c4f5520SBram Moolenaar 29389c4f5520SBram Moolenaar call StopVimInTerminal(buf) 29399c4f5520SBram Moolenaar delete('XcallFunc') 29409c4f5520SBram Moolenaar delete('Xdidcmd') 29419c4f5520SBram Moolenaarenddef 29429c4f5520SBram Moolenaar 2943fcdc5d83SBram Moolenaardef Test_script_var_scope() 2944fcdc5d83SBram Moolenaar var lines =<< trim END 2945fcdc5d83SBram Moolenaar vim9script 2946fcdc5d83SBram Moolenaar if true 2947fcdc5d83SBram Moolenaar if true 2948fcdc5d83SBram Moolenaar var one = 'one' 2949fcdc5d83SBram Moolenaar echo one 2950fcdc5d83SBram Moolenaar endif 2951fcdc5d83SBram Moolenaar echo one 2952fcdc5d83SBram Moolenaar endif 2953fcdc5d83SBram Moolenaar END 2954fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2955fcdc5d83SBram Moolenaar 2956fcdc5d83SBram Moolenaar lines =<< trim END 2957fcdc5d83SBram Moolenaar vim9script 2958fcdc5d83SBram Moolenaar if true 2959fcdc5d83SBram Moolenaar if false 2960fcdc5d83SBram Moolenaar var one = 'one' 2961fcdc5d83SBram Moolenaar echo one 2962fcdc5d83SBram Moolenaar else 2963fcdc5d83SBram Moolenaar var one = 'one' 2964fcdc5d83SBram Moolenaar echo one 2965fcdc5d83SBram Moolenaar endif 2966fcdc5d83SBram Moolenaar echo one 2967fcdc5d83SBram Moolenaar endif 2968fcdc5d83SBram Moolenaar END 2969fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 10) 2970fcdc5d83SBram Moolenaar 2971fcdc5d83SBram Moolenaar lines =<< trim END 2972fcdc5d83SBram Moolenaar vim9script 2973fcdc5d83SBram Moolenaar while true 2974fcdc5d83SBram Moolenaar var one = 'one' 2975fcdc5d83SBram Moolenaar echo one 2976fcdc5d83SBram Moolenaar break 2977fcdc5d83SBram Moolenaar endwhile 2978fcdc5d83SBram Moolenaar echo one 2979fcdc5d83SBram Moolenaar END 2980fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 7) 2981fcdc5d83SBram Moolenaar 2982fcdc5d83SBram Moolenaar lines =<< trim END 2983fcdc5d83SBram Moolenaar vim9script 2984fcdc5d83SBram Moolenaar for i in range(1) 2985fcdc5d83SBram Moolenaar var one = 'one' 2986fcdc5d83SBram Moolenaar echo one 2987fcdc5d83SBram Moolenaar endfor 2988fcdc5d83SBram Moolenaar echo one 2989fcdc5d83SBram Moolenaar END 2990fcdc5d83SBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 29919becdf2bSBram Moolenaar 29929becdf2bSBram Moolenaar lines =<< trim END 29939becdf2bSBram Moolenaar vim9script 29949becdf2bSBram Moolenaar { 29959becdf2bSBram Moolenaar var one = 'one' 29969becdf2bSBram Moolenaar assert_equal('one', one) 29979becdf2bSBram Moolenaar } 29989becdf2bSBram Moolenaar assert_false(exists('one')) 29999becdf2bSBram Moolenaar assert_false(exists('s:one')) 30009becdf2bSBram Moolenaar END 30019becdf2bSBram Moolenaar CheckScriptSuccess(lines) 30029becdf2bSBram Moolenaar 30039becdf2bSBram Moolenaar lines =<< trim END 30049becdf2bSBram Moolenaar vim9script 30059becdf2bSBram Moolenaar { 30069becdf2bSBram Moolenaar var one = 'one' 30079becdf2bSBram Moolenaar echo one 30089becdf2bSBram Moolenaar } 30099becdf2bSBram Moolenaar echo one 30109becdf2bSBram Moolenaar END 30119becdf2bSBram Moolenaar CheckScriptFailure(lines, 'E121:', 6) 3012fcdc5d83SBram Moolenaarenddef 3013fcdc5d83SBram Moolenaar 3014352134bbSBram Moolenaardef Test_catch_exception_in_callback() 3015352134bbSBram Moolenaar var lines =<< trim END 3016352134bbSBram Moolenaar vim9script 3017352134bbSBram Moolenaar def Callback(...l: any) 3018352134bbSBram Moolenaar try 3019352134bbSBram Moolenaar var x: string 3020352134bbSBram Moolenaar var y: string 3021352134bbSBram Moolenaar # this error should be caught with CHECKLEN 3022352134bbSBram Moolenaar [x, y] = [''] 3023352134bbSBram Moolenaar catch 3024352134bbSBram Moolenaar g:caught = 'yes' 3025352134bbSBram Moolenaar endtry 3026352134bbSBram Moolenaar enddef 3027e0de171eSBram Moolenaar popup_menu('popup', {callback: Callback}) 3028352134bbSBram Moolenaar feedkeys("\r", 'xt') 3029352134bbSBram Moolenaar END 3030352134bbSBram Moolenaar CheckScriptSuccess(lines) 3031352134bbSBram Moolenaar 3032352134bbSBram Moolenaar unlet g:caught 3033352134bbSBram Moolenaarenddef 3034352134bbSBram Moolenaar 3035631e8f93SBram Moolenaardef Test_no_unknown_error_after_error() 3036631e8f93SBram Moolenaar if !has('unix') || !has('job') 3037631e8f93SBram Moolenaar throw 'Skipped: not unix of missing +job feature' 3038631e8f93SBram Moolenaar endif 3039631e8f93SBram Moolenaar var lines =<< trim END 3040631e8f93SBram Moolenaar vim9script 3041631e8f93SBram Moolenaar var source: list<number> 3042631e8f93SBram Moolenaar def Out_cb(...l: any) 3043631e8f93SBram Moolenaar eval [][0] 3044631e8f93SBram Moolenaar enddef 3045631e8f93SBram Moolenaar def Exit_cb(...l: any) 3046631e8f93SBram Moolenaar sleep 1m 3047631e8f93SBram Moolenaar source += l 3048631e8f93SBram Moolenaar enddef 3049e0de171eSBram Moolenaar var myjob = job_start('echo burp', {out_cb: Out_cb, exit_cb: Exit_cb, mode: 'raw'}) 3050631e8f93SBram Moolenaar sleep 100m 3051631e8f93SBram Moolenaar END 3052631e8f93SBram Moolenaar writefile(lines, 'Xdef') 3053631e8f93SBram Moolenaar assert_fails('so Xdef', ['E684:', 'E1012:']) 3054631e8f93SBram Moolenaar delete('Xdef') 3055631e8f93SBram Moolenaarenddef 3056631e8f93SBram Moolenaar 3057b4bcea47SBram Moolenaardef Test_put_with_linebreak() 3058b4bcea47SBram Moolenaar new 3059b4bcea47SBram Moolenaar var lines =<< trim END 3060b4bcea47SBram Moolenaar vim9script 3061b4bcea47SBram Moolenaar pu =split('abc', '\zs') 3062b4bcea47SBram Moolenaar ->join() 3063b4bcea47SBram Moolenaar END 3064b4bcea47SBram Moolenaar CheckScriptSuccess(lines) 3065b4bcea47SBram Moolenaar getline(2)->assert_equal('a b c') 3066b4bcea47SBram Moolenaar bwipe! 3067b4bcea47SBram Moolenaarenddef 3068b4bcea47SBram Moolenaar 30694324d87aSBram Moolenaardef InvokeNormal() 30704324d87aSBram Moolenaar exe "norm! :m+1\r" 30714324d87aSBram Moolenaarenddef 30724324d87aSBram Moolenaar 30734324d87aSBram Moolenaardef Test_invoke_normal_in_visual_mode() 30744324d87aSBram Moolenaar xnoremap <F3> <Cmd>call <SID>InvokeNormal()<CR> 30754324d87aSBram Moolenaar new 30764324d87aSBram Moolenaar setline(1, ['aaa', 'bbb']) 30774324d87aSBram Moolenaar feedkeys("V\<F3>", 'xt') 30784324d87aSBram Moolenaar assert_equal(['bbb', 'aaa'], getline(1, 2)) 30794324d87aSBram Moolenaar xunmap <F3> 3080*b5b9480eSBram Moolenaarenddef 3081*b5b9480eSBram Moolenaar 3082*b5b9480eSBram Moolenaardef Test_white_space_after_command() 3083*b5b9480eSBram Moolenaar var lines =<< trim END 3084*b5b9480eSBram Moolenaar exit_cb: Func}) 3085*b5b9480eSBram Moolenaar END 3086*b5b9480eSBram Moolenaar CheckDefAndScriptFailure(lines, 'E1144:', 1) 30874324d87aSBram Moolenaarenddef 30884324d87aSBram Moolenaar 3089585fea7bSBram Moolenaar" Keep this last, it messes up highlighting. 3090585fea7bSBram Moolenaardef Test_substitute_cmd() 3091585fea7bSBram Moolenaar new 3092585fea7bSBram Moolenaar setline(1, 'something') 3093585fea7bSBram Moolenaar :substitute(some(other( 3094585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3095585fea7bSBram Moolenaar bwipe! 3096585fea7bSBram Moolenaar 3097f5be8cdbSBram Moolenaar # also when the context is Vim9 script 3098cfcd011fSBram Moolenaar var lines =<< trim END 3099585fea7bSBram Moolenaar vim9script 3100585fea7bSBram Moolenaar new 3101585fea7bSBram Moolenaar setline(1, 'something') 3102585fea7bSBram Moolenaar :substitute(some(other( 3103585fea7bSBram Moolenaar assert_equal('otherthing', getline(1)) 3104585fea7bSBram Moolenaar bwipe! 3105585fea7bSBram Moolenaar END 3106585fea7bSBram Moolenaar writefile(lines, 'Xvim9lines') 3107585fea7bSBram Moolenaar source Xvim9lines 3108585fea7bSBram Moolenaar 3109585fea7bSBram Moolenaar delete('Xvim9lines') 3110585fea7bSBram Moolenaarenddef 3111585fea7bSBram Moolenaar 31128a7d6542SBram Moolenaar" vim: ts=8 sw=2 sts=2 expandtab tw=80 fdm=marker 3113