1cfe435d7SBram Moolenaar" Utility functions for testing vim9 script 2cfe435d7SBram Moolenaar 32d870f8dSBram Moolenaar" Use a different file name for each run. 42d870f8dSBram Moolenaarlet s:sequence = 1 52d870f8dSBram Moolenaar 62d870f8dSBram Moolenaar" Check that "lines" inside a ":def" function has no error. 73e06a1e2SBram Moolenaarfunc CheckDefSuccess(lines) 8090728adSBram Moolenaar let cwd = getcwd() 9090728adSBram Moolenaar let fname = 'XdefSuccess' .. s:sequence 102d870f8dSBram Moolenaar let s:sequence += 1 112d870f8dSBram Moolenaar call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], fname) 12090728adSBram Moolenaar try 132d870f8dSBram Moolenaar exe 'so ' .. fname 143e06a1e2SBram Moolenaar call Func() 15090728adSBram Moolenaar finally 16090728adSBram Moolenaar call chdir(cwd) 172d870f8dSBram Moolenaar call delete(fname) 18*88c89c77SBram Moolenaar delfunc! Func 19090728adSBram Moolenaar endtry 203e06a1e2SBram Moolenaarendfunc 213e06a1e2SBram Moolenaar 22cfe435d7SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message. 231d634542SBram Moolenaar" If "lnum" is given check that the error is reported for this line. 243affe7a6SBram Moolenaar" Add a line before and after to make it less likely that the line number is 253affe7a6SBram Moolenaar" accidentally correct. 263affe7a6SBram Moolenaarfunc CheckDefFailure(lines, error, lnum = -3) 27090728adSBram Moolenaar let cwd = getcwd() 28090728adSBram Moolenaar let fname = 'XdefFailure' .. s:sequence 292d870f8dSBram Moolenaar let s:sequence += 1 30090728adSBram Moolenaar call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef', 'defcompile'], fname) 31090728adSBram Moolenaar try 32090728adSBram Moolenaar call assert_fails('so ' .. fname, a:error, a:lines, a:lnum + 1) 33090728adSBram Moolenaar finally 34090728adSBram Moolenaar call chdir(cwd) 35090728adSBram Moolenaar call delete(fname) 36090728adSBram Moolenaar delfunc! Func 37090728adSBram Moolenaar endtry 38cfe435d7SBram Moolenaarendfunc 39cfe435d7SBram Moolenaar 40015f4267SBram Moolenaar" Check that "lines" inside ":def" results in an "error" message when executed. 411d634542SBram Moolenaar" If "lnum" is given check that the error is reported for this line. 423affe7a6SBram Moolenaar" Add a line before and after to make it less likely that the line number is 433affe7a6SBram Moolenaar" accidentally correct. 443affe7a6SBram Moolenaarfunc CheckDefExecFailure(lines, error, lnum = -3) 45090728adSBram Moolenaar let cwd = getcwd() 46090728adSBram Moolenaar let fname = 'XdefExecFailure' .. s:sequence 472d870f8dSBram Moolenaar let s:sequence += 1 482d870f8dSBram Moolenaar call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef'], fname) 49090728adSBram Moolenaar try 502d870f8dSBram Moolenaar exe 'so ' .. fname 513affe7a6SBram Moolenaar call assert_fails('call Func()', a:error, a:lines, a:lnum + 1) 52090728adSBram Moolenaar finally 53090728adSBram Moolenaar call chdir(cwd) 542d870f8dSBram Moolenaar call delete(fname) 55090728adSBram Moolenaar delfunc! Func 56090728adSBram Moolenaar endtry 57015f4267SBram Moolenaarendfunc 58015f4267SBram Moolenaar 593affe7a6SBram Moolenaardef CheckScriptFailure(lines: list<string>, error: string, lnum = -3) 60090728adSBram Moolenaar var cwd = getcwd() 61090728adSBram Moolenaar var fname = 'XScriptFailure' .. s:sequence 622d870f8dSBram Moolenaar s:sequence += 1 632d870f8dSBram Moolenaar writefile(lines, fname) 64090728adSBram Moolenaar try 652d870f8dSBram Moolenaar assert_fails('so ' .. fname, error, lines, lnum) 66090728adSBram Moolenaar finally 67090728adSBram Moolenaar chdir(cwd) 682d870f8dSBram Moolenaar delete(fname) 69090728adSBram Moolenaar endtry 70cfe435d7SBram Moolenaarenddef 71cfe435d7SBram Moolenaar 72c5f59fabSBram Moolenaardef CheckScriptFailureList(lines: list<string>, errors: list<string>, lnum = -3) 73c5f59fabSBram Moolenaar var cwd = getcwd() 74c5f59fabSBram Moolenaar var fname = 'XScriptFailure' .. s:sequence 75c5f59fabSBram Moolenaar s:sequence += 1 76c5f59fabSBram Moolenaar writefile(lines, fname) 77c5f59fabSBram Moolenaar try 78c5f59fabSBram Moolenaar assert_fails('so ' .. fname, errors, lines, lnum) 79c5f59fabSBram Moolenaar finally 80c5f59fabSBram Moolenaar chdir(cwd) 81c5f59fabSBram Moolenaar delete(fname) 82c5f59fabSBram Moolenaar endtry 83c5f59fabSBram Moolenaarenddef 84c5f59fabSBram Moolenaar 85cfe435d7SBram Moolenaardef CheckScriptSuccess(lines: list<string>) 86090728adSBram Moolenaar var cwd = getcwd() 87090728adSBram Moolenaar var fname = 'XScriptSuccess' .. s:sequence 882d870f8dSBram Moolenaar s:sequence += 1 892d870f8dSBram Moolenaar writefile(lines, fname) 90090728adSBram Moolenaar try 912d870f8dSBram Moolenaar exe 'so ' .. fname 92090728adSBram Moolenaar finally 93090728adSBram Moolenaar chdir(cwd) 942d870f8dSBram Moolenaar delete(fname) 95090728adSBram Moolenaar endtry 96cfe435d7SBram Moolenaarenddef 977cb6fc29SBram Moolenaar 982e800955SBram Moolenaardef CheckDefAndScriptSuccess(lines: list<string>) 992e800955SBram Moolenaar CheckDefSuccess(lines) 1002e800955SBram Moolenaar CheckScriptSuccess(['vim9script'] + lines) 1012e800955SBram Moolenaarenddef 1022e800955SBram Moolenaar 1032d870f8dSBram Moolenaar" Check that a command fails with the same error when used in a :def function 1042d870f8dSBram Moolenaar" and when used in Vim9 script. 105ba7c0d7bSBram Moolenaardef CheckDefAndScriptFailure(lines: list<string>, error: string, lnum = -3) 1067cb6fc29SBram Moolenaar CheckDefFailure(lines, error, lnum) 1077cb6fc29SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, error, lnum + 1) 1087cb6fc29SBram Moolenaarenddef 10913106605SBram Moolenaar 1103e9c0b96SBram Moolenaar" As CheckDefAndScriptFailure() but with two different expected errors. 11190193e61SBram Moolenaardef CheckDefAndScriptFailure2( 11290193e61SBram Moolenaar lines: list<string>, 11390193e61SBram Moolenaar errorDef: string, 11490193e61SBram Moolenaar errorScript: string, 11590193e61SBram Moolenaar lnum = -3) 11690193e61SBram Moolenaar CheckDefFailure(lines, errorDef, lnum) 11790193e61SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) 11890193e61SBram Moolenaarenddef 11990193e61SBram Moolenaar 1202d870f8dSBram Moolenaar" Check that a command fails with the same error when executed in a :def 1212d870f8dSBram Moolenaar" function and when used in Vim9 script. 12213106605SBram Moolenaardef CheckDefExecAndScriptFailure(lines: list<string>, error: string, lnum = -3) 12313106605SBram Moolenaar CheckDefExecFailure(lines, error, lnum) 12413106605SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, error, lnum + 1) 12513106605SBram Moolenaarenddef 12690193e61SBram Moolenaar 12790193e61SBram Moolenaar" As CheckDefExecAndScriptFailure() but with two different expected errors. 12890193e61SBram Moolenaardef CheckDefExecAndScriptFailure2( 12990193e61SBram Moolenaar lines: list<string>, 13090193e61SBram Moolenaar errorDef: string, 13190193e61SBram Moolenaar errorScript: string, 13290193e61SBram Moolenaar lnum = -3) 13390193e61SBram Moolenaar CheckDefExecFailure(lines, errorDef, lnum) 13490193e61SBram Moolenaar CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) 13590193e61SBram Moolenaarenddef 13668452177SBram Moolenaar 13768452177SBram Moolenaar 13868452177SBram Moolenaar" Check that "lines" inside a legacy function has no error. 13968452177SBram Moolenaarfunc CheckLegacySuccess(lines) 14068452177SBram Moolenaar let cwd = getcwd() 14168452177SBram Moolenaar let fname = 'XlegacySuccess' .. s:sequence 14268452177SBram Moolenaar let s:sequence += 1 14368452177SBram Moolenaar call writefile(['func Func()'] + a:lines + ['endfunc'], fname) 14468452177SBram Moolenaar try 14568452177SBram Moolenaar exe 'so ' .. fname 14668452177SBram Moolenaar call Func() 14768452177SBram Moolenaar finally 1480e3ff191SBram Moolenaar delfunc! Func 1490e3ff191SBram Moolenaar call chdir(cwd) 1500e3ff191SBram Moolenaar call delete(fname) 1510e3ff191SBram Moolenaar endtry 1520e3ff191SBram Moolenaarendfunc 1530e3ff191SBram Moolenaar 1540e3ff191SBram Moolenaar" Check that "lines" inside a legacy function results in the expected error 1550e3ff191SBram Moolenaarfunc CheckLegacyFailure(lines, error) 1560e3ff191SBram Moolenaar let cwd = getcwd() 1570e3ff191SBram Moolenaar let fname = 'XlegacyFails' .. s:sequence 1580e3ff191SBram Moolenaar let s:sequence += 1 1590e3ff191SBram Moolenaar call writefile(['func Func()'] + a:lines + ['endfunc', 'call Func()'], fname) 1600e3ff191SBram Moolenaar try 1610e3ff191SBram Moolenaar call assert_fails('so ' .. fname, a:error) 1620e3ff191SBram Moolenaar finally 1630e3ff191SBram Moolenaar delfunc! Func 16468452177SBram Moolenaar call chdir(cwd) 16568452177SBram Moolenaar call delete(fname) 16668452177SBram Moolenaar endtry 16768452177SBram Moolenaarendfunc 16868452177SBram Moolenaar 1693e9c0b96SBram Moolenaar" Execute "lines" in a legacy function, translated as in 1703e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success() 1713e9c0b96SBram Moolenaardef CheckTransLegacySuccess(lines: list<string>) 17268452177SBram Moolenaar var legacylines = lines->mapnew((_, v) => 17368452177SBram Moolenaar v->substitute('\<VAR\>', 'let', 'g') 17468452177SBram Moolenaar ->substitute('\<LET\>', 'let', 'g') 175ef982575SBram Moolenaar ->substitute('\<LSTART\>', '{', 'g') 176ef982575SBram Moolenaar ->substitute('\<LMIDDLE\>', '->', 'g') 177ef982575SBram Moolenaar ->substitute('\<LEND\>', '}', 'g') 17868452177SBram Moolenaar ->substitute('#"', ' "', 'g')) 17968452177SBram Moolenaar CheckLegacySuccess(legacylines) 1803e9c0b96SBram Moolenaarenddef 18168452177SBram Moolenaar 1823e9c0b96SBram Moolenaar" Execute "lines" in a :def function, translated as in 1833e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success() 1843e9c0b96SBram Moolenaardef CheckTransDefSuccess(lines: list<string>) 18568452177SBram Moolenaar var vim9lines = lines->mapnew((_, v) => 18668452177SBram Moolenaar v->substitute('\<VAR\>', 'var', 'g') 187ef982575SBram Moolenaar ->substitute('\<LET ', '', 'g') 188ef982575SBram Moolenaar ->substitute('\<LSTART\>', '(', 'g') 189ef982575SBram Moolenaar ->substitute('\<LMIDDLE\>', ') =>', 'g') 190ef982575SBram Moolenaar ->substitute(' *\<LEND\> *', '', 'g')) 19168452177SBram Moolenaar CheckDefSuccess(vim9lines) 1923e9c0b96SBram Moolenaarenddef 1933e9c0b96SBram Moolenaar 1943e9c0b96SBram Moolenaar" Execute "lines" in a Vim9 script, translated as in 1953e9c0b96SBram Moolenaar" CheckLegacyAndVim9Success() 1963e9c0b96SBram Moolenaardef CheckTransVim9Success(lines: list<string>) 1973e9c0b96SBram Moolenaar var vim9lines = lines->mapnew((_, v) => 1983e9c0b96SBram Moolenaar v->substitute('\<VAR\>', 'var', 'g') 199ef982575SBram Moolenaar ->substitute('\<LET ', '', 'g') 200ef982575SBram Moolenaar ->substitute('\<LSTART\>', '(', 'g') 201ef982575SBram Moolenaar ->substitute('\<LMIDDLE\>', ') =>', 'g') 202ef982575SBram Moolenaar ->substitute(' *\<LEND\> *', '', 'g')) 20368452177SBram Moolenaar CheckScriptSuccess(['vim9script'] + vim9lines) 20468452177SBram Moolenaarenddef 2050e3ff191SBram Moolenaar 2060e3ff191SBram Moolenaar" Execute "lines" in a legacy function, :def function and Vim9 script. 2070e3ff191SBram Moolenaar" Use 'VAR' for a declaration. 2080e3ff191SBram Moolenaar" Use 'LET' for an assignment 2090e3ff191SBram Moolenaar" Use ' #"' for a comment 210ef982575SBram Moolenaar" Use LSTART arg LMIDDLE expr LEND for lambda 2113e9c0b96SBram Moolenaardef CheckLegacyAndVim9Success(lines: list<string>) 2123e9c0b96SBram Moolenaar CheckTransLegacySuccess(lines) 2133e9c0b96SBram Moolenaar CheckTransDefSuccess(lines) 2143e9c0b96SBram Moolenaar CheckTransVim9Success(lines) 2153e9c0b96SBram Moolenaarenddef 2163e9c0b96SBram Moolenaar 2173e9c0b96SBram Moolenaar" Execute "lines" in a legacy function, :def function and Vim9 script. 2183e9c0b96SBram Moolenaar" Use 'VAR' for a declaration. 2193e9c0b96SBram Moolenaar" Use 'LET' for an assignment 2203e9c0b96SBram Moolenaar" Use ' #"' for a comment 2210e3ff191SBram Moolenaardef CheckLegacyAndVim9Failure(lines: list<string>, error: any) 2220e3ff191SBram Moolenaar var legacyError: string 2230e3ff191SBram Moolenaar var defError: string 2240e3ff191SBram Moolenaar var scriptError: string 2250e3ff191SBram Moolenaar 2260e3ff191SBram Moolenaar if type(error) == type('string') 2270e3ff191SBram Moolenaar legacyError = error 2280e3ff191SBram Moolenaar defError = error 2290e3ff191SBram Moolenaar scriptError = error 2300e3ff191SBram Moolenaar else 2310e3ff191SBram Moolenaar legacyError = error[0] 2320e3ff191SBram Moolenaar defError = error[1] 2330e3ff191SBram Moolenaar scriptError = error[2] 2340e3ff191SBram Moolenaar endif 2350e3ff191SBram Moolenaar 2360e3ff191SBram Moolenaar var legacylines = lines->mapnew((_, v) => 2370e3ff191SBram Moolenaar v->substitute('\<VAR\>', 'let', 'g') 2380e3ff191SBram Moolenaar ->substitute('\<LET\>', 'let', 'g') 2390e3ff191SBram Moolenaar ->substitute('#"', ' "', 'g')) 2400e3ff191SBram Moolenaar CheckLegacyFailure(legacylines, legacyError) 2410e3ff191SBram Moolenaar 2420e3ff191SBram Moolenaar var vim9lines = lines->mapnew((_, v) => 2430e3ff191SBram Moolenaar v->substitute('\<VAR\>', 'var', 'g') 2440e3ff191SBram Moolenaar ->substitute('\<LET ', '', 'g')) 2450e3ff191SBram Moolenaar CheckDefExecFailure(vim9lines, defError) 2460e3ff191SBram Moolenaar CheckScriptFailure(['vim9script'] + vim9lines, scriptError) 2470e3ff191SBram Moolenaarenddef 248