nitunit: factorize the search of a compiler
[nit.git] / src / testing / testing_suite.nit
index faf4b79..f79b03b 100644 (file)
@@ -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
@@ -168,6 +164,7 @@ class TestSuite
        fun to_xml: HTMLTag do
                var n = new HTMLTag("testsuite")
                n.attr("package", mmodule.name)
+               var failure = self.failure
                if failure != null then
                        var f = new HTMLTag("failure")
                        f.attr("message", failure.to_s)
@@ -186,15 +183,16 @@ class TestSuite
        # Compile all `test_cases` cases in one file.
        fun compile do
                # find nitc
-               var nit_dir = toolcontext.nit_dir
-               var nitc = nit_dir/"bin/nitc"
-               if not nitc.file_exists then
-                       toolcontext.error(null, "Error: cannot find nitc. Set envvar NIT_DIR.")
-                       toolcontext.check_errors
-               end
+               var nitc = toolcontext.find_nitc
                # compile test suite
                var file = test_file
-               var include_dir = mmodule.location.file.filename.dirname
+               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 </dev/null"
                var res = sys.system(cmd)
                var f = new FileReader.open("{file}.out")
@@ -226,12 +224,6 @@ class TestCase
        # `ToolContext` to use to display messages and find `nitc` bin.
        var toolcontext: ToolContext
 
-       # `MMethodDef` to call before the test case.
-       var before_test: nullable MMethodDef = null
-
-       # `MMethodDef` to call after the test case.
-       var after_test: nullable MMethodDef = null
-
        # Generate the test unit for `self` in `file`.
        fun write_to_nit(file: Template) do
                var name = test_method.name
@@ -240,9 +232,9 @@ class TestCase
                        file.addn "\t{name}"
                else
                        file.addn "\tvar subject = new {test_method.mclassdef.name}.nitunit"
-                       if before_test != null then file.addn "\tsubject.{before_test.name}"
+                       file.addn "\tsubject.before_test"
                        file.addn "\tsubject.{name}"
-                       if after_test != null then file.addn "\tsubject.{after_test.name}"
+                       file.addn "\tsubject.after_test"
                end
                file.addn "end"
        end
@@ -289,6 +281,7 @@ class TestCase
                        var n = new HTMLTag("system-out")
                        n.append "out"
                        tc.add n
+                       var error = self.error
                        if error != null then
                                n = new HTMLTag("error")
                                n.attr("message", error.to_s)
@@ -306,12 +299,6 @@ redef class MMethodDef
        # i.e. begins with "test_"
        private fun is_test: Bool do return name.has_prefix("test_")
 
-       # Is the method a "before_test"?
-       private fun is_before: Bool do return name == "before_test"
-
-       # Is the method a "after_test"?
-       private fun is_after: Bool do return name == "after_test"
-
        # Is the method a "before_module"?
        private fun is_before_module: Bool do return mproperty.is_toplevel and name == "before_module"
 
@@ -323,27 +310,13 @@ redef class MClassDef
        # Is the class a TestClass?
        # i.e. begins with "Test"
        private fun is_test: Bool do
+               var in_hierarchy = self.in_hierarchy
+               if in_hierarchy == null then return false
                for sup in in_hierarchy.greaters do
                        if sup.name == "TestSuite" then return true
                end
                return false
        end
-
-       # "before_test" method for this classdef.
-       private fun before_test: nullable MMethodDef do
-               for mpropdef in mpropdefs do
-                       if mpropdef isa MMethodDef and mpropdef.is_before then return mpropdef
-               end
-               return null
-       end
-
-       # "after_test" method for this classdef.
-       private fun after_test: nullable MMethodDef do
-               for mpropdef in mpropdefs do
-                       if mpropdef isa MMethodDef and mpropdef.is_after then return mpropdef
-               end
-               return null
-       end
 end
 
 redef class MModule
@@ -389,7 +362,12 @@ redef class ModelBuilder
                if f != null then
                        test_file = f
                else if not test_file.file_exists then
-                       var include_dir = mmodule.location.file.filename.dirname
+                       var module_file = mmodule.location.file
+                       if module_file == null then
+                               toolcontext.info("Skip test for {mmodule}, no file found", 2)
+                               return ts
+                       end
+                       var include_dir = module_file.filename.dirname
                        test_file = "{include_dir}/{test_file}"
                end
                if not test_file.file_exists then