diff options
Diffstat (limited to 'src/testdir/vim9.vim')
-rw-r--r-- | src/testdir/vim9.vim | 275 |
1 files changed, 275 insertions, 0 deletions
diff --git a/src/testdir/vim9.vim b/src/testdir/vim9.vim new file mode 100644 index 0000000..5877a79 --- /dev/null +++ b/src/testdir/vim9.vim @@ -0,0 +1,275 @@ +vim9script + +# Utility functions for testing vim9 script + +# Use a different file name for each run. +var sequence = 1 + +# Check that "lines" inside a ":def" function has no error when called. +export func CheckDefSuccess(lines) + let cwd = getcwd() + let fname = 'XdefSuccess' .. s:sequence + let s:sequence += 1 + call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], fname) + try + exe 'so ' .. fname + call Func() + finally + call chdir(cwd) + call delete(fname) + delfunc! Func + endtry +endfunc + +# Check that "lines" inside a ":def" function has no error when compiled. +export func CheckDefCompileSuccess(lines) + let fname = 'XdefSuccess' .. s:sequence + let s:sequence += 1 + call writefile(['def Func()'] + a:lines + ['enddef', 'defcompile'], fname) + try + exe 'so ' .. fname + finally + call delete(fname) + delfunc! Func + endtry +endfunc + +# Check that "lines" inside ":def" results in an "error" message. +# If "lnum" is given check that the error is reported for this line. +# Add a line before and after to make it less likely that the line number is +# accidentally correct. +export func CheckDefFailure(lines, error, lnum = -3) + let cwd = getcwd() + let fname = 'XdefFailure' .. s:sequence + let s:sequence += 1 + call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef', 'defcompile'], fname) + try + call assert_fails('so ' .. fname, a:error, a:lines, a:lnum + 1) + finally + call chdir(cwd) + call delete(fname) + delfunc! Func + endtry +endfunc + +# Check that "lines" inside ":def" results in an "error" message when executed. +# If "lnum" is given check that the error is reported for this line. +# Add a line before and after to make it less likely that the line number is +# accidentally correct. +export func CheckDefExecFailure(lines, error, lnum = -3) + let cwd = getcwd() + let fname = 'XdefExecFailure' .. s:sequence + let s:sequence += 1 + call writefile(['def Func()', '# comment'] + a:lines + ['#comment', 'enddef'], fname) + try + exe 'so ' .. fname + call assert_fails('call Func()', a:error, a:lines, a:lnum + 1) + finally + call chdir(cwd) + call delete(fname) + delfunc! Func + endtry +endfunc + +export def CheckScriptFailure(lines: list<string>, error: string, lnum = -3) + var cwd = getcwd() + var fname = 'XScriptFailure' .. sequence + sequence += 1 + writefile(lines, fname) + try + assert_fails('so ' .. fname, error, lines, lnum) + finally + chdir(cwd) + delete(fname) + endtry +enddef + +export def CheckScriptFailureList(lines: list<string>, errors: list<string>, lnum = -3) + var cwd = getcwd() + var fname = 'XScriptFailure' .. sequence + sequence += 1 + writefile(lines, fname) + try + assert_fails('so ' .. fname, errors, lines, lnum) + finally + chdir(cwd) + delete(fname) + endtry +enddef + +export def CheckScriptSuccess(lines: list<string>) + var cwd = getcwd() + var fname = 'XScriptSuccess' .. sequence + sequence += 1 + writefile(lines, fname) + try + exe 'so ' .. fname + finally + chdir(cwd) + delete(fname) + endtry +enddef + +export def CheckDefAndScriptSuccess(lines: list<string>) + CheckDefSuccess(lines) + CheckScriptSuccess(['vim9script'] + lines) +enddef + +# Check that a command fails when used in a :def function and when used in +# Vim9 script. +# When "error" is a string, both with the same error. +# When "error" is a list, the :def function fails with "error[0]" , the script +# fails with "error[1]". +export def CheckDefAndScriptFailure(lines: list<string>, error: any, lnum = -3) + var errorDef: string + var errorScript: string + if type(error) == v:t_string + errorDef = error + errorScript = error + elseif type(error) == v:t_list && len(error) == 2 + errorDef = error[0] + errorScript = error[1] + else + echoerr 'error argument must be a string or a list with two items' + return + endif + CheckDefFailure(lines, errorDef, lnum) + CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) +enddef + +# Check that a command fails when executed in a :def function and when used in +# Vim9 script. +# When "error" is a string, both with the same error. +# When "error" is a list, the :def function fails with "error[0]" , the script +# fails with "error[1]". +export def CheckDefExecAndScriptFailure(lines: list<string>, error: any, lnum = -3) + var errorDef: string + var errorScript: string + if type(error) == v:t_string + errorDef = error + errorScript = error + elseif type(error) == v:t_list && len(error) == 2 + errorDef = error[0] + errorScript = error[1] + else + echoerr 'error argument must be a string or a list with two items' + return + endif + CheckDefExecFailure(lines, errorDef, lnum) + CheckScriptFailure(['vim9script'] + lines, errorScript, lnum + 1) +enddef + + +# Check that "lines" inside a legacy function has no error. +export func CheckLegacySuccess(lines) + let cwd = getcwd() + let fname = 'XlegacySuccess' .. s:sequence + let s:sequence += 1 + call writefile(['func Func()'] + a:lines + ['endfunc'], fname) + try + exe 'so ' .. fname + call Func() + finally + delfunc! Func + call chdir(cwd) + call delete(fname) + endtry +endfunc + +# Check that "lines" inside a legacy function results in the expected error +export func CheckLegacyFailure(lines, error) + let cwd = getcwd() + let fname = 'XlegacyFails' .. s:sequence + let s:sequence += 1 + call writefile(['func Func()'] + a:lines + ['endfunc', 'call Func()'], fname) + try + call assert_fails('so ' .. fname, a:error) + finally + delfunc! Func + call chdir(cwd) + call delete(fname) + endtry +endfunc + +# Execute "lines" in a legacy function, translated as in +# CheckLegacyAndVim9Success() +export def CheckTransLegacySuccess(lines: list<string>) + var legacylines = lines->mapnew((_, v) => + v->substitute('\<VAR\>', 'let', 'g') + ->substitute('\<LET\>', 'let', 'g') + ->substitute('\<LSTART\>', '{', 'g') + ->substitute('\<LMIDDLE\>', '->', 'g') + ->substitute('\<LEND\>', '}', 'g') + ->substitute('\<TRUE\>', '1', 'g') + ->substitute('\<FALSE\>', '0', 'g') + ->substitute('#"', ' "', 'g')) + CheckLegacySuccess(legacylines) +enddef + +export def Vim9Trans(lines: list<string>): list<string> + return lines->mapnew((_, v) => + v->substitute('\<VAR\>', 'var', 'g') + ->substitute('\<LET ', '', 'g') + ->substitute('\<LSTART\>', '(', 'g') + ->substitute('\<LMIDDLE\>', ') =>', 'g') + ->substitute(' *\<LEND\> *', '', 'g') + ->substitute('\<TRUE\>', 'true', 'g') + ->substitute('\<FALSE\>', 'false', 'g')) +enddef + +# Execute "lines" in a :def function, translated as in +# CheckLegacyAndVim9Success() +export def CheckTransDefSuccess(lines: list<string>) + CheckDefSuccess(Vim9Trans(lines)) +enddef + +# Execute "lines" in a Vim9 script, translated as in +# CheckLegacyAndVim9Success() +export def CheckTransVim9Success(lines: list<string>) + CheckScriptSuccess(['vim9script'] + Vim9Trans(lines)) +enddef + +# Execute "lines" in a legacy function, :def function and Vim9 script. +# Use 'VAR' for a declaration. +# Use 'LET' for an assignment +# Use ' #"' for a comment +# Use LSTART arg LMIDDLE expr LEND for lambda +# Use 'TRUE' for 1 in legacy, true in Vim9 +# Use 'FALSE' for 0 in legacy, false in Vim9 +export def CheckLegacyAndVim9Success(lines: list<string>) + CheckTransLegacySuccess(lines) + CheckTransDefSuccess(lines) + CheckTransVim9Success(lines) +enddef + +# Execute "lines" in a legacy function, :def function and Vim9 script. +# Use 'VAR' for a declaration. +# Use 'LET' for an assignment +# Use ' #"' for a comment +export def CheckLegacyAndVim9Failure(lines: list<string>, error: any) + var legacyError: string + var defError: string + var scriptError: string + + if type(error) == type('string') + legacyError = error + defError = error + scriptError = error + else + legacyError = error[0] + defError = error[1] + scriptError = error[2] + endif + + var legacylines = lines->mapnew((_, v) => + v->substitute('\<VAR\>', 'let', 'g') + ->substitute('\<LET\>', 'let', 'g') + ->substitute('#"', ' "', 'g')) + CheckLegacyFailure(legacylines, legacyError) + + var vim9lines = lines->mapnew((_, v) => + v->substitute('\<VAR\>', 'var', 'g') + ->substitute('\<LET ', '', 'g')) + CheckDefExecFailure(vim9lines, defError) + CheckScriptFailure(['vim9script'] + vim9lines, scriptError) +enddef |