diff options
author | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 |
---|---|---|
committer | chai <chaifix@163.com> | 2021-10-26 11:32:46 +0800 |
commit | 0549b1e5a8a3132005e275d6026db8003cb067d2 (patch) | |
tree | f0d7751ec32ecf5c4d23997fa0ffd3450a5a755a /Data/Libraries/luaunit/run_functional_tests.lua | |
parent | 32345800737b668011a87328cd3dcce59ec2934c (diff) |
*rename folder
Diffstat (limited to 'Data/Libraries/luaunit/run_functional_tests.lua')
-rw-r--r-- | Data/Libraries/luaunit/run_functional_tests.lua | 820 |
1 files changed, 820 insertions, 0 deletions
diff --git a/Data/Libraries/luaunit/run_functional_tests.lua b/Data/Libraries/luaunit/run_functional_tests.lua new file mode 100644 index 0000000..59127c5 --- /dev/null +++ b/Data/Libraries/luaunit/run_functional_tests.lua @@ -0,0 +1,820 @@ +#!/usr/bin/env lua + +require('os') +local lu = require('luaunit') + + +local function report( ... ) + print('>>>>>>>', string.format(...)) +end + +local function error_fmt( ... ) + error(string.format(...), 2) -- (level 2 = report chunk calling error_fmt) +end + +local IS_UNIX = ( package.config:sub(1,1) == '/' ) +local LUA='"'..arg[-1]..'"' + + +-- Escape a string so it can safely be used as a Lua pattern without triggering +-- special semantics. This means prepending any "magic" character ^$()%.[]*+-? +-- with a percent sign. Note: We DON'T expect embedded NUL chars, and thus +-- won't escape those (%z) for Lua 5.1. +local LUA_MAGIC_CHARS = "[%^%$%(%)%%%.%[%]%*%+%-%?]" +local function escape_lua_pattern(s) + return s:gsub(LUA_MAGIC_CHARS, "%%%1") -- substitute with '%' + matched char +end + +local function string_gsub(s, orig, repl) + -- replace occurrence of string orig by string repl + -- just like string.gsub, but with no pattern matching + -- print( 'gsub_input '..s..' '..orig..' '..repl) + return s:gsub( escape_lua_pattern(orig), repl ) +end + +function testStringSub() + lu.assertEquals( string_gsub('aa a % b cc', 'a % b', 'a + b'), 'aa a + b cc' ) + lu.assertEquals( string_gsub('aa: ?cc', ': ?', 'xx?'), 'aaxx?cc' ) + lu.assertEquals( string_gsub('aa b: cc b: ee', 'b:', 'xx'), 'aa xx cc xx ee' ) +end + +local function osExec( ... ) + -- execute a command with os.execute and return true if exit code is 0 + -- false in any other conditions + + local cmd = string.format(...) + if not(IS_UNIX) and cmd:sub(1, 1) == '"' then + -- In case we're running on Windows, and if the command starts with a + -- quote: It's reasonable (or even necessary in some cases) to enclose + -- the entire command string in another pair of quotes. (This is needed + -- to preserve other quotes, due to how os.execute makes use of cmd.exe) + -- see e.g. http://lua-users.org/lists/lua-l/2014-06/msg00551.html + cmd = '"' .. cmd .. '"' + end + + -- print('osExec('..cmd..')') + local exitSuccess, exitReason, exitCode = os.execute( cmd ) + -- print('\n', exitSuccess, exitReason, exitCode) + + if exitReason == nil and exitCode == nil then + -- Lua 5.1 returns only the exit code + exitReason = 'exit' + if IS_UNIX then + -- in C: exitCode = (exitSuccess >> 8) & 0xFF + -- poor approximation that works: + exitCode = (exitSuccess / 256) + else + -- Windows, life is simple + exitCode = exitSuccess + end + end + + -- Use heuristics to determine negative exit codes, + -- assuming that those are in the range -8 to -1: + if exitCode >= 248 then exitCode = exitCode - 256 end + + -- Lua 5.2+ has a weird way of dealing with exit code -1, at least on Windows + if exitReason == 'No error' then + exitReason = 'exit' + exitCode = -1 + end + + if exitReason ~= 'exit' or exitCode ~= 0 then + -- print('return false '..tostring(exitCode)) + return false, exitCode + end + + -- print('return true') + return true, exitCode +end + +local function osExpectedCodeExec( refExitCode, ... ) + local cmd = string.format(...) + local ret, exitCode = osExec( cmd ) + if refExitCode and (exitCode ~= refExitCode) then + error_fmt('Expected exit code %d, but got %d for: %s', refExitCode, exitCode, cmd) + end + return ret +end + +local HAS_XMLLINT +do + local xmllint_output_fname = 'test/has_xmllint.txt' + HAS_XMLLINT = osExec('xmllint --version 2> '..xmllint_output_fname) + if not HAS_XMLLINT then + report('WARNING: xmllint absent, can not validate xml validity') + end + os.remove(xmllint_output_fname) +end + +local function adjustFile( fileOut, fileIn, pattern, mayBeAbsent, verbose ) + --[[ Adjust the content of fileOut by copying lines matching pattern from fileIn + + fileIn lines are read and the first line matching pattern is analysed. The first pattern + capture is memorized. + + fileOut lines are then read, and the first line matching pattern is modified, by applying + the first capture of fileIn. fileOut is then rewritten. + + In most cases, pattern2 may be nil in which case, pattern is used when matching in fileout. + ]] + if verbose then + print('Using reference file: '..fileIn) + end + local source, idxStart, idxEnd, capture = nil + for line in io.lines(fileIn) do + idxStart, idxEnd, capture = line:find( pattern ) + if idxStart ~= nil then + if capture == nil then + error_fmt('Must specify a capture for pattern %s in function adjustFile()', pattern) + end + source = capture + break + end + end + + if source == nil then + if mayBeAbsent then + return -- no capture, just return + end + error_fmt('No line in file %s matching pattern "%s"', fileIn, pattern) + end + + if verbose then + print('Captured in source: '.. source ) + print('Modifying file: '..fileOut) + end + + local dest, linesOut = nil, {} + for line in io.lines(fileOut) do + idxStart, idxEnd, capture = line:find( pattern ) + while idxStart ~= nil do + if capture == nil then + print('missing pattern for outfile!') + end + dest = capture + if verbose then + print('Modifying line: '..line ) + end + line = string_gsub(line, dest, source) + -- line = line:sub(1,idxStart-1)..source..line:sub(idxEnd+1) + -- string.gsub( line, dest, source ) + if verbose then + print('Result : '..line ) + end + idxStart, idxEnd, capture = line:find( pattern, idxEnd ) + end + table.insert( linesOut, line ) + end + + if dest == nil then + if mayBeAbsent then + return -- capture but nothing to adjust, just return + end + error_fmt('No line in file %s matching pattern "%s"', fileOut, pattern) + end + + local f = io.open( fileOut, 'w') + f:write(table.concat(linesOut, '\n'), '\n') + f:close() +end + +local function check_tap_output( fileToRun, options, output, refOutput, refExitCode, envOptions, outputArg ) + -- remove output + envOptions = envOptions or '' + outputArg = outputArg or '' + + -- by default, if nothing is provided, we set output explicitely + -- but we leave the option for the caller to provide either environment and/or output arguments + if envOptions == '' and outputArg == '' then + outputArg = '--output TAP' + end + + if envOptions ~= '' then + envOptions = '/usr/bin/env ' .. envOptions + end + + osExpectedCodeExec(refExitCode, '%s %s %s %s %s > %s', + envOptions, LUA, fileToRun, outputArg, options, output) + + adjustFile( output, refOutput, '# Started on (.*)') + adjustFile( output, refOutput, '# Ran %d+ tests in (%d+.%d*).*') + if _VERSION ~= 'Lua 5.2' and _VERSION ~= 'Lua 5.1' then + -- For Lua 5.3: stack trace uses "method" instead of "function" + adjustFile( output, refOutput, '.*%.lua:%d+: in (%S*) .*', true ) + end + + if not osExec([[diff -NPw -u -I " *\.[/\\]luaunit.lua:[0123456789]\+:.*" %s %s]], refOutput, output) then + error('TAP Output mismatch for file : '..output) + end + -- report('TAP Output ok: '..output) + return 0 +end + + +local function check_text_output( fileToRun, options, output, refOutput, refExitCode ) + -- remove output + osExpectedCodeExec(refExitCode, '%s %s --output text %s > %s', + LUA, fileToRun, options, output) + + if options:find( '--verbose' ) then + adjustFile( output, refOutput, 'Started on (.*)') + end + adjustFile( output, refOutput, 'Ran .* tests in (%d.%d*) seconds' ) + adjustFile( output, refOutput, 'Ran .* tests in (%d.%d*) seconds' ) + adjustFile( output, refOutput, 'thread: (0?x?[%x]+)', true ) + adjustFile( output, refOutput, 'function: (0?x?[%x]+)', true ) + adjustFile( output, refOutput, '<table (01%-0?x?[%x]+)>', true ) + adjustFile( output, refOutput, '<table (02%-0?x?[%x]+)>', true ) + if _VERSION ~= 'Lua 5.2' and _VERSION ~= 'Lua 5.1' then + -- For Lua 5.3: stack trace uses "method" instead of "function" + adjustFile( output, refOutput, '.*%.lua:%d+: in (%S*) .*', true ) + end + + if not osExec([[diff -NPw -u -I " *\.[/\\]luaunit.lua:[0123456789]\+:.*" %s %s]], refOutput, output) then + error('Text Output mismatch for file : '..output) + end + -- report('Text Output ok: '..output) + return 0 +end + +local function check_nil_output( fileToRun, options, output, refOutput, refExitCode ) + -- remove output + osExpectedCodeExec(refExitCode, '%s %s --output nil %s > %s', + LUA, fileToRun, options, output) + + if not osExec([[diff -NPw -u -I " *\.[/\\]luaunit.lua:[0123456789]\+:.*" %s %s]], refOutput, output) then + error('NIL Output mismatch for file : '..output) + end + -- report('NIL Output ok: '..output) + return 0 +end + +local function check_xml_output( fileToRun, options, output, xmlOutput, xmlLintOutput, refOutput, refXmlOutput, refExitCode, envOptions, outputArg ) + local retcode = 0 + + envOptions = envOptions or '' + outputArg = outputArg or '' + + -- by default, if nothing is provided, we set output explicitely + -- but we leave the option for the caller to provide either environment and/or output arguments + if envOptions == '' and outputArg == '' then + outputArg = '--output junit --name '..xmlOutput + end + + if envOptions ~= '' then + envOptions = '/usr/bin/env ' .. envOptions + end + + -- remove output + osExpectedCodeExec(refExitCode, '%s %s %s %s %s > %s', + envOptions, LUA, fileToRun, outputArg, options, output) + + adjustFile( output, refOutput, '# XML output to (.*)') + adjustFile( output, refOutput, '# Started on (.*)') + adjustFile( output, refOutput, '# Ran %d+ tests in (%d+.%d*).*') + adjustFile( xmlOutput, refXmlOutput, '.*<testsuite.*(timestamp=".-" time=".-").*') + adjustFile( xmlOutput, refXmlOutput, '.*<testcase .*(time=".-").*' ) + -- For Lua 5.1 / 5.2 compatibility + adjustFile( xmlOutput, refXmlOutput, '.*<property name="Lua Version" value="(Lua 5%..)"/>') + + if _VERSION ~= 'Lua 5.2' and _VERSION ~= 'Lua 5.1' then + -- For Lua 5.3: stack trace uses "method" instead of "function" + -- For Lua 5.4: stack trace uses "method" or "upvalue" instead of "function" + adjustFile( output, refOutput, '.*%.lua:%d+: in (%S*) .*', true ) + adjustFile( xmlOutput, refXmlOutput, '.*%.lua:%d+: in (%S*) .*', true ) + end + + if HAS_XMLLINT then + -- General xmllint validation + if osExec('xmllint --noout %s > %s', xmlOutput, xmlLintOutput) then + -- report('XMLLint validation ok: file %s', xmlLintOutput) + else + error_fmt('XMLLint reported errors : file %s', xmlLintOutput) + retcode = retcode + 1 + end + + -- we used to validate against apache and/maven xsd but the way it handles skipped test + -- is just too specific. I prefer the jenkins way. + + -- Validation against jenkins/hudson schema + if osExec('xmllint --noout --schema junitxml/junit-jenkins.xsd %s 2> %s', xmlOutput, xmlLintOutput) then + -- report('XMLLint validation ok: file %s', xmlLintOutput) + else + error_fmt('XMLLint reported errors against jenkins schema: file %s', xmlLintOutput) + retcode = retcode + 1 + end + end + + -- ignore change in line numbers for luaunit + if not osExec([[diff -NPw -u -I " *\.[/\\]luaunit.lua:[0123456789]\+:.*" %s %s]], refXmlOutput, xmlOutput) then + error('XML content mismatch for file : '..xmlOutput) + retcode = retcode + 1 + end + + if not osExec([[diff -NPw -u -I " *\.[/\\]luaunit.lua:[0123456789]\+:.*" %s %s]], refOutput, output) then + error('XML Output mismatch for file : '..output) + retcode = retcode + 1 + end + + --[[ + if retcode == 0 then + report('XML Output ok: '..output) + end + --]] + + return retcode +end + +-- check tap output + +function testTapDefault() + lu.assertEquals( 0, + check_tap_output('example_with_luaunit.lua', '', + 'test/exampleTapDefault.txt', + 'test/ref/exampleTapDefault.txt', 12) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '', + 'test/errFailPassTapDefault.txt', + 'test/ref/errFailPassTapDefault.txt', 10 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '-p Succ', + 'test/errFailPassTapDefault-success.txt', + 'test/ref/errFailPassTapDefault-success.txt', 0 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassTapDefault-failures.txt', + 'test/ref/errFailPassTapDefault-failures.txt', 5 ) ) + if IS_UNIX then + -- It is non-trivial to set the environment for new command execution + -- on Windows, so we'll only attempt it on UNIX. These systems should + -- all have /usr/bin/env + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassTapDefault-failures.txt', + 'test/ref/errFailPassTapDefault-failures.txt', 5, + 'LUAUNIT_OUTPUT=TAP' ) ) + + -- force an alternate file format, check that command-line option prevails + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassTapDefault-failures.txt', + 'test/ref/errFailPassTapDefault-failures.txt', 5, + 'LUAUNIT_OUTPUT=TEXT', '--output tap' ) ) + end +end + +function testTapVerbose() + lu.assertEquals( 0, + check_tap_output('example_with_luaunit.lua', '--verbose', + 'test/exampleTapVerbose.txt', + 'test/ref/exampleTapVerbose.txt', 12 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--verbose', + 'test/errFailPassTapVerbose.txt', + 'test/ref/errFailPassTapVerbose.txt', 10 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ', + 'test/errFailPassTapVerbose-success.txt', + 'test/ref/errFailPassTapVerbose-success.txt', 0 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ -p Fail', + 'test/errFailPassTapVerbose-failures.txt', + 'test/ref/errFailPassTapVerbose-failures.txt', 5 ) ) +end + +function testTapQuiet() + lu.assertEquals( 0, + check_tap_output('example_with_luaunit.lua', '--quiet', 'test/exampleTapQuiet.txt', 'test/ref/exampleTapQuiet.txt', 12 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--quiet', + 'test/errFailPassTapQuiet.txt', + 'test/ref/errFailPassTapQuiet.txt', 10 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ', + 'test/errFailPassTapQuiet-success.txt', + 'test/ref/errFailPassTapQuiet-success.txt', 0 ) ) + lu.assertEquals( 0, + check_tap_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ -p Fail', + 'test/errFailPassTapQuiet-failures.txt', + 'test/ref/errFailPassTapQuiet-failures.txt', 5 ) ) +end + +-- check text output + +function testTextDefault() + lu.assertEquals( 0, + check_text_output('example_with_luaunit.lua', '', + 'test/exampleTextDefault.txt', + 'test/ref/exampleTextDefault.txt', 12 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '', + 'test/errFailPassTextDefault.txt', + 'test/ref/errFailPassTextDefault.txt', 10 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '-p Succ', + 'test/errFailPassTextDefault-success.txt', + 'test/ref/errFailPassTextDefault-success.txt', 0 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassTextDefault-failures.txt', + 'test/ref/errFailPassTextDefault-failures.txt', 5 ) ) +end + +function testTextVerbose() + lu.assertEquals( 0, + check_text_output('example_with_luaunit.lua', '--verbose', 'test/exampleTextVerbose.txt', 'test/ref/exampleTextVerbose.txt', 12 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--verbose', + 'test/errFailPassTextVerbose.txt', + 'test/ref/errFailPassTextVerbose.txt', 10 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ', + 'test/errFailPassTextVerbose-success.txt', + 'test/ref/errFailPassTextVerbose-success.txt', 0 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ -p Fail', + 'test/errFailPassTextVerbose-failures.txt', + 'test/ref/errFailPassTextVerbose-failures.txt', 5 ) ) +end + +function testTextQuiet() + lu.assertEquals( 0, + check_text_output('example_with_luaunit.lua', '--quiet', + 'test/exampleTextQuiet.txt', + 'test/ref/exampleTextQuiet.txt', 12 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet', + 'test/errFailPassTextQuiet.txt', + 'test/ref/errFailPassTextQuiet.txt', 10 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ', + 'test/errFailPassTextQuiet-success.txt', + 'test/ref/errFailPassTextQuiet-success.txt', 0 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ -p Fail', + 'test/errFailPassTextQuiet-failures.txt', + 'test/ref/errFailPassTextQuiet-failures.txt', 5 ) ) +end + +-- check nil output + +function testNilDefault() + lu.assertEquals( 0, + check_nil_output('example_with_luaunit.lua', '', 'test/exampleNilDefault.txt', 'test/ref/exampleNilDefault.txt', 12 ) ) + lu.assertEquals( 0, + check_nil_output('test/test_with_err_fail_pass.lua', '', + 'test/errFailPassNilDefault.txt', + 'test/ref/errFailPassNilDefault.txt', 10 ) ) + lu.assertEquals( 0, + check_nil_output('test/test_with_err_fail_pass.lua', ' -p Succ', + 'test/errFailPassNilDefault-success.txt', + 'test/ref/errFailPassNilDefault-success.txt', 0 ) ) + lu.assertEquals( 0, + check_nil_output('test/test_with_err_fail_pass.lua', ' -p Succ -p Fail', + 'test/errFailPassNilDefault-failures.txt', + 'test/ref/errFailPassNilDefault-failures.txt', 5 ) ) +end + +-- check xml output + +function testXmlDefault() + lu.assertEquals( 0, + check_xml_output('example_with_luaunit.lua', '', + 'test/exampleXmlDefault.txt', 'test/exampleXmlDefault.xml', 'test/exampleXmllintDefault.xml', + 'test/ref/exampleXmlDefault.txt', 'test/ref/exampleXmlDefault.xml', 12 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '', + 'test/errFailPassXmlDefault.txt', 'test/errFailPassXmlDefault.xml', 'test/errFailPassXmllintDefault.xml', + 'test/ref/errFailPassXmlDefault.txt', 'test/ref/errFailPassXmlDefault.xml', 10 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '-p Succ', + 'test/errFailPassXmlDefault-success.txt', 'test/errFailPassXmlDefault-success.xml', 'test/errFailPassXmllintDefault.xml', + 'test/ref/errFailPassXmlDefault-success.txt', 'test/ref/errFailPassXmlDefault-success.xml', 0 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassXmlDefault-failures.txt', 'test/errFailPassXmlDefault-failures.xml', 'test/errFailPassXmllintDefault.xml', + 'test/ref/errFailPassXmlDefault-failures.txt', 'test/ref/errFailPassXmlDefault-failures.xml', 5 ) ) + + -- disable this test not working ! + if IS_UNIX and false then + -- It is non-trivial to set the environment for new command execution + -- on Windows, so we'll only attempt it on UNIX. These systems should + -- all have /usr/bin/env + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '-p Succ -p Fail', + 'test/errFailPassXmlDefault-failures.txt', 'test/errFailPassXmlDefault-failures.xml', 'test/errFailPassXmllintDefault.xml', + 'test/ref/errFailPassXmlDefault-failures.txt', 'test/ref/errFailPassXmlDefault-failures.xml', 5, + 'LUAUNIT_OUTPUT=JUNIT LUAUNIT_JUNIT_FNAME=test/ref/errFailPassXmlDefault-failures.xml', '' ) ) + end + +end + +function testXmlVerbose() + lu.assertEquals( 0, + check_xml_output('example_with_luaunit.lua', '--verbose', + 'test/exampleXmlVerbose.txt', 'test/exampleXmlVerbose.xml', 'test/exampleXmllintVerbose.xml', + 'test/ref/exampleXmlVerbose.txt', 'test/ref/exampleXmlVerbose.xml', 12 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--verbose ', + 'test/errFailPassXmlVerbose.txt', 'test/errFailPassXmlVerbose.xml', 'test/errFailPassXmllintVerbose.xml', + 'test/ref/errFailPassXmlVerbose.txt', 'test/ref/errFailPassXmlVerbose.xml', 10 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ', + 'test/errFailPassXmlVerbose-success.txt', 'test/errFailPassXmlVerbose-success.xml', 'test/errFailPassXmllintVerbose.xml', + 'test/ref/errFailPassXmlVerbose-success.txt', 'test/ref/errFailPassXmlVerbose-success.xml', 0 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--verbose -p Succ -p Fail', + 'test/errFailPassXmlVerbose-failures.txt', 'test/errFailPassXmlVerbose-failures.xml', 'test/errFailPassXmllintVerbose.xml', + 'test/ref/errFailPassXmlVerbose-failures.txt', 'test/ref/errFailPassXmlVerbose-failures.xml', 5 ) ) +end + +function testXmlQuiet() + lu.assertEquals( 0, + check_xml_output('example_with_luaunit.lua', '--quiet', 'test/exampleXmlQuiet.txt', 'test/exampleXmlQuiet.xml', + 'test/exampleXmllintQuiet.xml', 'test/ref/exampleXmlQuiet.txt', 'test/ref/exampleXmlQuiet.xml', 12 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--quiet ', + 'test/errFailPassXmlQuiet.txt', 'test/errFailPassXmlQuiet.xml', 'test/errFailPassXmllintQuiet.xml', + 'test/ref/errFailPassXmlQuiet.txt', 'test/ref/errFailPassXmlQuiet.xml', 10 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ', + 'test/errFailPassXmlQuiet-success.txt', 'test/errFailPassXmlQuiet-success.xml', 'test/errFailPassXmllintQuiet.xml', + 'test/ref/errFailPassXmlQuiet-success.txt', 'test/ref/errFailPassXmlQuiet-success.xml', 0 ) ) + lu.assertEquals( 0, + check_xml_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ -p Fail', + 'test/errFailPassXmlQuiet-failures.txt', 'test/errFailPassXmlQuiet-failures.xml', 'test/errFailPassXmllintQuiet.xml', + 'test/ref/errFailPassXmlQuiet-failures.txt', 'test/ref/errFailPassXmlQuiet-failures.xml', 5 ) ) +end + +function testTestWithXmlDefault() + lu.assertEquals( 0, + check_xml_output('test/test_with_xml.lua', '', 'test/testWithXmlDefault.txt', 'test/testWithXmlDefault.xml', + 'test/testWithXmlLintDefault.txt', 'test/ref/testWithXmlDefault.txt', 'test/ref/testWithXmlDefault.xml', 2 ) ) +end + +function testTestWithXmlVerbose() + lu.assertEquals( 0, + check_xml_output('test/test_with_xml.lua', '--verbose', 'test/testWithXmlVerbose.txt', 'test/testWithXmlVerbose.xml', + 'test/testWithXmlLintVerbose.txt', 'test/ref/testWithXmlVerbose.txt', 'test/ref/testWithXmlVerbose.xml', 2 ) ) +end + +function testTestWithXmlQuiet() + lu.assertEquals( 0, + check_xml_output('test/test_with_xml.lua', '--quiet', 'test/testWithXmlQuiet.txt', 'test/testWithXmlQuiet.xml', + 'test/testWithXmlLintQuiet.txt', 'test/ref/testWithXmlQuiet.txt', 'test/ref/testWithXmlQuiet.xml', 2 ) ) +end + +function testListComparison() + -- run test/some_lists_comparisons and check exit status + lu.assertEquals( 0, + check_text_output('test/some_lists_comparisons.lua', '--verbose', + 'test/some_lists_comparisons.txt', + 'test/ref/some_lists_comparisons.txt', 11 ) ) +end + +function testLegacyLuaunitUsage() + -- run test/legacy_example_usage and check exit status (expecting 12 failures) + osExpectedCodeExec(12, '%s %s --output text > %s', LUA, + "test/legacy_example_with_luaunit.lua", "test/legacyExample.txt") +end + +function testLuaunitV2Usage() + osExpectedCodeExec(0, '%s %s --output text 1> %s 2>&1', LUA, + "test/compat_luaunit_v2x.lua", "test/compat_luaunit_v2x.txt") +end + +function testBasicLuaunitOptions() + osExpectedCodeExec(0, '%s example_with_luaunit.lua --help > test/null.txt', LUA) + osExpectedCodeExec(0, '%s example_with_luaunit.lua --version > test/null.txt', LUA) + -- test invalid syntax + osExpectedCodeExec(-1, '%s example_with_luaunit.lua --foobar > test/null.txt', LUA) -- invalid option + osExpectedCodeExec(-1, '%s example_with_luaunit.lua --output foobar > test/null.txt', LUA) -- invalid format + osExpectedCodeExec(-1, '%s example_with_luaunit.lua --output junit > test/null.txt', LUA) -- missing output name + os.remove('test/null.txt') +end + +function testStopOnError() + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p Succ --error --failure', + 'test/errFailPassTextStopOnError-1.txt', + 'test/ref/errFailPassTextStopOnError-1.txt', 0 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p TestSome --error', + 'test/errFailPassTextStopOnError-2.txt', + 'test/ref/errFailPassTextStopOnError-2.txt', -2 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p TestAnoth --failure', + 'test/errFailPassTextStopOnError-3.txt', + 'test/ref/errFailPassTextStopOnError-3.txt', -2 ) ) + lu.assertEquals( 0, + check_text_output('test/test_with_err_fail_pass.lua', '--quiet -p TestSome --failure', + 'test/errFailPassTextStopOnError-4.txt', + 'test/ref/errFailPassTextStopOnError-4.txt', -2 ) ) +end + +local filesToGenerateExampleXml = { + { 'example_with_luaunit.lua', '', '--output junit --name test/ref/exampleXmlDefault.xml', 'test/ref/exampleXmlDefault.txt' }, + { 'example_with_luaunit.lua', '--quiet', '--output junit --name test/ref/exampleXmlQuiet.xml', 'test/ref/exampleXmlQuiet.txt' }, + { 'example_with_luaunit.lua', '--verbose', '--output junit --name test/ref/exampleXmlVerbose.xml', 'test/ref/exampleXmlVerbose.txt' }, +} + +local filesToGenerateExampleTap = { + { 'example_with_luaunit.lua', '', '--output tap', 'test/ref/exampleTapDefault.txt' }, + { 'example_with_luaunit.lua', '--quiet', '--output tap', 'test/ref/exampleTapQuiet.txt' }, + { 'example_with_luaunit.lua', '--verbose', '--output tap', 'test/ref/exampleTapVerbose.txt' }, +} + +local filesToGenerateExampleText = { + { 'example_with_luaunit.lua', '', '--output text', 'test/ref/exampleTextDefault.txt' }, + { 'example_with_luaunit.lua', '--quiet', '--output text', 'test/ref/exampleTextQuiet.txt' }, + { 'example_with_luaunit.lua', '--verbose', '--output text', 'test/ref/exampleTextVerbose.txt' }, +} + +local filesToGenerateExampleNil = { + { 'example_with_luaunit.lua', '', '--output nil', 'test/ref/exampleNilDefault.txt' }, +} + +local filesToGenerateErrFailPassXml = { + { 'test/test_with_err_fail_pass.lua', '', + '--output junit --name test/ref/errFailPassXmlDefault.xml', + 'test/ref/errFailPassXmlDefault.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ --output junit --name test/ref/errFailPassXmlDefault-success.xml', + 'test/ref/errFailPassXmlDefault-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ -p Fail --output junit --name test/ref/errFailPassXmlDefault-failures.xml', + 'test/ref/errFailPassXmlDefault-failures.txt' }, + { 'test/test_with_err_fail_pass.lua', '', '--quiet --output junit --name test/ref/errFailPassXmlQuiet.xml', + 'test/ref/errFailPassXmlQuiet.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ --quiet --output junit --name test/ref/errFailPassXmlQuiet-success.xml', + 'test/ref/errFailPassXmlQuiet-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ -p Fail --quiet --output junit --name test/ref/errFailPassXmlQuiet-failures.xml', + 'test/ref/errFailPassXmlQuiet-failures.txt' }, + { 'test/test_with_err_fail_pass.lua', '', '--verbose --output junit --name test/ref/errFailPassXmlVerbose.xml', 'test/ref/errFailPassXmlVerbose.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ --verbose --output junit --name test/ref/errFailPassXmlVerbose-success.xml', + 'test/ref/errFailPassXmlVerbose-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '', + '-p Succ -p Fail --verbose --output junit --name test/ref/errFailPassXmlVerbose-failures.xml', + 'test/ref/errFailPassXmlVerbose-failures.txt' }, +} + +local filesToGenerateErrFailPassTap = { + { 'test/test_with_err_fail_pass.lua', '', '--output tap', 'test/ref/errFailPassTapDefault.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ', '--output tap', 'test/ref/errFailPassTapDefault-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail', '--output tap', 'test/ref/errFailPassTapDefault-failures.txt' }, + + { 'test/test_with_err_fail_pass.lua', '--quiet', '--output tap', 'test/ref/errFailPassTapQuiet.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ --quiet', + '--output tap', 'test/ref/errFailPassTapQuiet-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail --quiet', + '--output tap', 'test/ref/errFailPassTapQuiet-failures.txt' }, + + { 'test/test_with_err_fail_pass.lua', '--verbose', '--output tap', 'test/ref/errFailPassTapVerbose.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ --verbose', + '--output tap', 'test/ref/errFailPassTapVerbose-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail --verbose', + '--output tap', 'test/ref/errFailPassTapVerbose-failures.txt' }, +} + +local filesToGenerateErrFailPassText = { + { 'test/test_with_err_fail_pass.lua', '', '--output text', 'test/ref/errFailPassTextDefault.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ', '--output text', 'test/ref/errFailPassTextDefault-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail', '--output text', 'test/ref/errFailPassTextDefault-failures.txt' }, + { 'test/test_with_err_fail_pass.lua', '--quiet', '--output text', 'test/ref/errFailPassTextQuiet.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ --quiet', + '--output text', 'test/ref/errFailPassTextQuiet-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail --quiet', + '--output text', 'test/ref/errFailPassTextQuiet-failures.txt' }, + { 'test/test_with_err_fail_pass.lua', '--verbose', '--output text', 'test/ref/errFailPassTextVerbose.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ --verbose', + '--output text', 'test/ref/errFailPassTextVerbose-success.txt' }, + { 'test/test_with_err_fail_pass.lua', '-p Succ -p Fail --verbose', + '--output text', 'test/ref/errFailPassTextVerbose-failures.txt' }, +} + +local filesToGenerateTestXml = { + { 'test/test_with_xml.lua', '', '--output junit --name test/ref/testWithXmlDefault.xml', 'test/ref/testWithXmlDefault.txt' }, + { 'test/test_with_xml.lua', '--verbose', '--output junit --name test/ref/testWithXmlVerbose.xml', 'test/ref/testWithXmlVerbose.txt' }, + { 'test/test_with_xml.lua', '--quiet', '--output junit --name test/ref/testWithXmlQuiet.xml', 'test/ref/testWithXmlQuiet.txt' }, +} + +local filesToGenerateStopOnError = { + { 'test/test_with_err_fail_pass.lua', '', '--output text --quiet -p Succ --error --failure', + 'test/ref/errFailPassTextStopOnError-1.txt'}, + { 'test/test_with_err_fail_pass.lua', '', '--output text --quiet -p TestSome --error', + 'test/ref/errFailPassTextStopOnError-2.txt'}, + { 'test/test_with_err_fail_pass.lua', '', '--output text --quiet -p TestAnoth --failure', + 'test/ref/errFailPassTextStopOnError-3.txt'}, + { 'test/test_with_err_fail_pass.lua', '', '--output text --quiet -p TestSome --failure', + 'test/ref/errFailPassTextStopOnError-4.txt'}, +} + +local filesToGenerateListsComp = { + { 'test/some_lists_comparisons.lua', '', '--output text --verbose', + 'test/ref/some_lists_comparisons.txt'}, +} + +local function table_join(...) + local args = {...} + local ret = {} + for i,t in ipairs(args) do + for _,v in ipairs(t) do + table.insert( ret, v) + end + end + return ret +end + +local filesSetIndex = { + ErrFailPassText=filesToGenerateErrFailPassText, + ErrFailPassTap=filesToGenerateErrFailPassTap, + ErrFailPassXml=filesToGenerateErrFailPassXml, + ErrFail = table_join( filesToGenerateErrFailPassText, + filesToGenerateErrFailPassTap, + filesToGenerateErrFailPassXml ), + ExampleNil=filesToGenerateExampleNil, + ExampleText=filesToGenerateExampleText, + ExampleTap=filesToGenerateExampleTap, + ExampleXml=filesToGenerateExampleXml, + Example = table_join( filesToGenerateExampleNil, + filesToGenerateExampleText, + filesToGenerateExampleTap, + filesToGenerateExampleXml ), + TestXml=filesToGenerateTestXml, + StopOnError=filesToGenerateStopOnError, + ListsComp=filesToGenerateListsComp, +} + +local function updateRefFiles( filesToGenerate ) + local ret + + for _,v in ipairs(filesToGenerate) do + report('Generating '..v[4]) + ret = osExec( '%s %s %s %s > %s', LUA, v[1], v[2], v[3], v[4] ) + --[[ + -- exitcode != 0 is not an error for us ... + if ret == false then + error('Error while generating '..prettystr(v) ) + os.exit(1) + end + ]] + -- neutralize all testcase time values in ref xml output + local refXmlName = string.match(v[3], "--name (test/ref/.*%.xml)$") + if refXmlName then + adjustFile( refXmlName, refXmlName, '.*<testcase .*(time=".-").*' ) + end + end +end + + +local function main() + if arg[1] == '--coverage' then + LUA = LUA .." -lluacov" -- run tests with LuaCov active + table.remove(arg, 1) + end + + if arg[1] ~= '--with-linting' then + HAS_XMLLINT = false + else + table.remove(arg, 1) + end + + if arg[1] == '--update' then + if #arg == 1 then + -- generate all files + -- print('Generating all files' ) + for _,v in pairs(filesSetIndex) do + -- print('Generating '..v ) + updateRefFiles( v ) + end + else + -- generate subset of files + for i = 2, #arg do + local fileSet = filesSetIndex[ arg[i] ] + if fileSet == nil then + local validTarget = '' + for k,_ in pairs(filesSetIndex) do + validTarget = validTarget .. ' '.. k + end + error_fmt('Unable to generate files for target %s\nPossible targets: %s\n', + arg[i], validTarget) + end + -- print('Generating '..arg[i]) + updateRefFiles( fileSet ) + end + end + os.exit(0) + end + + os.exit( lu.LuaUnit.run() ) + -- body +end + +main() + +-- TODO check output of run_unit_tests +-- TODO check return values of execution |