X-Git-Url: http://nitlanguage.org diff --git a/src/testing/testing_suite.nit b/src/testing/testing_suite.nit index 5936038..ae1f4a2 100644 --- a/src/testing/testing_suite.nit +++ b/src/testing/testing_suite.nit @@ -21,9 +21,9 @@ private import annotation redef class ToolContext # -- target-file - var opt_file = new OptionString("Specify test suite location.", "-t", "--target-file") + var opt_file = new OptionString("Specify test suite location", "-t", "--target-file") # --pattern - var opt_pattern = new OptionString("Only run test case with name that match pattern. Examples: 'TestFoo', 'TestFoo*', 'TestFoo::test_foo', 'TestFoo::test_foo*', 'test_foo', 'test_foo*'", "-p", "--pattern") + var opt_pattern = new OptionString("Only run test case with name that match pattern", "-p", "--pattern") end # Used to test nitunit test files. @@ -58,15 +58,11 @@ class NitUnitTester if not mclassdef.is_test then continue if not suite_match_pattern(mclassdef) then continue toolcontext.modelbuilder.total_classes += 1 - var before_test = mclassdef.before_test - var after_test = mclassdef.after_test for mpropdef in mclassdef.mpropdefs do if not mpropdef isa MMethodDef or not mpropdef.is_test then continue if not case_match_pattern(mpropdef) then continue toolcontext.modelbuilder.total_tests += 1 var test = new TestCase(suite, mpropdef, toolcontext) - test.before_test = before_test - test.after_test = after_test suite.add_test test end end @@ -141,19 +137,26 @@ class TestSuite if not toolcontext.test_dir.file_exists then toolcontext.test_dir.mkdir end + write_to_nit + compile toolcontext.info("Execute test-suite {mmodule.name}", 1) var before_module = self.before_module - if not before_module == null then run_case(before_module) - for case in test_cases do run_case(case) + if not before_module == null then before_module.run + for case in test_cases do case.run var after_module = self.after_module - if not after_module == null then run_case(after_module) + if not after_module == null then after_module.run end - # Execute a test case - fun run_case(test_case: TestCase) do - test_case.write_to_nit - test_case.compile - test_case.run + # Write the test unit for `self` in a nit compilable file. + fun write_to_nit do + var file = new Template + file.addn "intrude import test_suite" + file.addn "import {mmodule.name}\n" + file.addn "var name = args.first" + for case in test_cases do + case.write_to_nit(file) + end + file.write_to_file("{test_file}.nit") end # Return the test suite in XML format compatible with Jenkins. @@ -161,9 +164,52 @@ class TestSuite fun to_xml: HTMLTag do var n = new HTMLTag("testsuite") n.attr("package", mmodule.name) - for test in test_cases do n.add test.to_xml + var failure = self.failure + if failure != null then + var f = new HTMLTag("failure") + f.attr("message", failure.to_s) + n.add f + else + for test in test_cases do n.add test.to_xml + end return n end + + # Generated test file name. + fun test_file: String do + return toolcontext.test_dir / "gen_{mmodule.name.escape_to_c}" + end + + # Compile all `test_cases` cases in one file. + fun compile do + # find nitc + var nitc = toolcontext.find_nitc + # compile test suite + var file = test_file + var module_file = mmodule.location.file + if module_file == null then + toolcontext.error(null, "Error: cannot find module file for {mmodule.name}.") + toolcontext.check_errors + return + end + var include_dir = module_file.filename.dirname + var cmd = "{nitc} --no-color '{file}.nit' -I {include_dir} -o '{file}.bin' > '{file}.out' 2>&1 '{file}.out1' 2>&1 '{res_name}.out1' 2>&1 '{res_name}.diff' 2>&1