nitunit: new class UnitTest to factorize TestCase and DocUnit
authorJean Privat <jean@pryen.org>
Fri, 20 May 2016 18:41:52 +0000 (14:41 -0400)
committerJean Privat <jean@pryen.org>
Fri, 20 May 2016 18:41:52 +0000 (14:41 -0400)
Signed-off-by: Jean Privat <jean@pryen.org>

src/testing/testing_base.nit
src/testing/testing_suite.nit

index 414de9a..4249df5 100644 (file)
@@ -17,6 +17,7 @@ module testing_base
 
 import modelize
 private import parser_util
+import html
 
 redef class ToolContext
        # opt --full
@@ -94,6 +95,47 @@ ulimit -t {{{ulimit_usertime}}} 2> /dev/null
        var ulimit_usertime = 600 is writable
 end
 
+# A unit test is an elementary test discovered, run and reported bu nitunit.
+#
+# This class factorizes `DocUnit` and `TestCase`.
+abstract class UnitTest
+
+       # Error occurred during test-case execution.
+       var error: nullable String = null is writable
+
+       # Was the test case executed at least once?
+       var was_exec = false is writable
+
+       # Return the `TestCase` in XML format compatible with Jenkins.
+       #
+       # See to_xml
+       fun to_xml: HTMLTag do
+               var tc = new HTMLTag("testcase")
+               tc.attr("classname", xml_classname)
+               tc.attr("name", xml_name)
+               var error = self.error
+               if error != null then
+                       if was_exec then
+                               tc.open("error").append("Runtime Error")
+                       else
+                               tc.open("failure").append("Compilation Error")
+                       end
+                       tc.open("system-err").append(error.trunc(8192).filter_nonprintable)
+               end
+               return tc
+       end
+
+       # The `classname` attribute of the XML format.
+       #
+       # NOTE: jenkins expects a '.' in the classname attr
+       fun xml_classname: String is abstract
+
+       # The `name` attribute of the XML format.
+       #
+       # See to_xml
+       fun xml_name: String is abstract
+end
+
 redef class String
        # If needed, truncate `self` at `max_length` characters and append an informative `message`.
        #
index ae1f4a2..ee2701f 100644 (file)
@@ -214,6 +214,7 @@ end
 
 # A test case is a unit test considering only a `MMethodDef`.
 class TestCase
+       super UnitTest
 
        # Test suite wich `self` belongs to.
        var test_suite: TestSuite
@@ -282,32 +283,13 @@ class TestCase
                toolcontext.check_errors
        end
 
-       # Error occured during test-case execution.
-       var error: nullable String = null
-
-       # Was the test case executed at least one?
-       var was_exec = false
-
-       # Return the `TestCase` in XML format compatible with Jenkins.
-       fun to_xml: HTMLTag do
+       redef fun xml_classname do
                var mclassdef = test_method.mclassdef
-               var tc = new HTMLTag("testcase")
-               # NOTE: jenkins expects a '.' in the classname attr
-               tc.attr("classname", "nitunit." + mclassdef.mmodule.full_name + "." + mclassdef.mclass.full_name)
-               tc.attr("name", test_method.mproperty.full_name)
-               if was_exec then
-                       tc.add  new HTMLTag("system-out")
-                       var n = new HTMLTag("system-err")
-                       tc.add n
-                       var error = self.error
-                       if error != null then
-                               n.append error.trunc(8192).filter_nonprintable
-                               n = new HTMLTag("error")
-                               n.attr("message", "Runtime Error")
-                               tc.add n
-                       end
-               end
-               return tc
+               return "nitunit." + mclassdef.mmodule.full_name + "." + mclassdef.mclass.full_name
+       end
+
+       redef fun xml_name do
+               return test_method.mproperty.full_name
        end
 end