Merge: nitunit: fix before and after methods
authorJean Privat <jean@pryen.org>
Mon, 6 Feb 2017 13:39:51 +0000 (08:39 -0500)
committerJean Privat <jean@pryen.org>
Mon, 6 Feb 2017 13:39:51 +0000 (08:39 -0500)
Before and after method were not actually called in the test suite process.

This PR enables the compilation and run of these methods.

The new behavior is: if the `before_module` test case fails, all the test cases and the `after_module` are skipped and marked as failed.

Pull-Request: #2359
Reviewed-by: Jean-Christophe Beaupré <jcbrinfo.public@gmail.com>
Reviewed-by: Jean Privat <jean@pryen.org>

lib/test_suite.nit
src/testing/testing_suite.nit
tests/nitunit.args
tests/sav/nitunit_args11.res [new file with mode: 0644]
tests/sav/nitunit_args12.res [new file with mode: 0644]
tests/test_nitunit6.nit [new file with mode: 0644]
tests/test_nitunit7.nit [new file with mode: 0644]

index 6261eea..e7b6f3a 100644 (file)
@@ -38,14 +38,25 @@ class TestSuite
        fun after_test do end
 end
 
-# Method called before each test-suite.
-#
-# Redefine this method to factorize code that have to be
-# executed before every test suite.
-fun before_module do end
+redef class Sys
+       # Internal empty init.
+       private init nitunit do end
 
-# Method called after each test-suite.
-#
-# Redefine this method to factorize code that have to be
-# executed after every test suite.
-fun after_module do end
+       # No before test for the module
+       private fun before_test do end
+
+       # No after test for the module
+       private fun after_test do end
+
+       # Method called before each test-suite.
+       #
+       # Redefine this method to factorize code that have to be
+       # executed before every test suite.
+       fun before_module do end
+
+       # Method called after each test-suite.
+       #
+       # Redefine this method to factorize code that have to be
+       # executed after every test suite.
+       fun after_module do end
+end
index e788067..295598b 100644 (file)
@@ -124,6 +124,9 @@ class TestSuite
 
        # Display test suite status in std-out.
        fun show_status do
+               var test_cases = self.test_cases.to_a
+               if before_module != null then test_cases.add before_module.as(not null)
+               if after_module != null then test_cases.add after_module.as(not null)
                toolcontext.show_unit_status("Test-suite of module " + mmodule.full_name, test_cases)
        end
 
@@ -138,10 +141,8 @@ class TestSuite
                compile
                if failure != null then
                        for case in test_cases do
-                               case.is_done = true
-                               case.error = "Compilation Error"
+                               case.fail "Compilation Error"
                                case.raw_output = failure
-                               toolcontext.modelbuilder.failed_tests += 1
                                toolcontext.clear_progress_bar
                                toolcontext.show_unit(case)
                        end
@@ -150,8 +151,31 @@ class TestSuite
                        return
                end
                toolcontext.info("Execute test-suite {mmodule.name}", 1)
+
                var before_module = self.before_module
-               if not before_module == null then before_module.run
+               var after_module = self.after_module
+
+               if before_module != null then
+                       before_module.run
+                       toolcontext.clear_progress_bar
+                       toolcontext.show_unit(before_module)
+                       if before_module.error != null then
+                               for case in test_cases do
+                                       case.fail "Nitunit Error: before_module test failed"
+                                       toolcontext.clear_progress_bar
+                                       toolcontext.show_unit(case)
+                               end
+                               if after_module != null then
+                                       after_module.fail "Nitunit Error: before_module test failed"
+                                       toolcontext.clear_progress_bar
+                                       toolcontext.show_unit(after_module)
+                               end
+                               show_status
+                               print ""
+                               return
+                       end
+               end
+
                for case in test_cases do
                        case.run
                        toolcontext.clear_progress_bar
@@ -159,8 +183,12 @@ class TestSuite
                        show_status
                end
 
-               var after_module = self.after_module
-               if not after_module == null then after_module.run
+               if not after_module == null then
+                       after_module.run
+                       toolcontext.clear_progress_bar
+                       toolcontext.show_unit(after_module)
+                       show_status
+               end
 
                show_status
                print ""
@@ -172,9 +200,17 @@ class TestSuite
                file.addn "intrude import test_suite"
                file.addn "import {mmodule.name}\n"
                file.addn "var name = args.first"
+               var before_module = self.before_module
+               if before_module != null then
+                       before_module.write_to_nit(file)
+               end
                for case in test_cases do
                        case.write_to_nit(file)
                end
+               var after_module = self.after_module
+               if after_module != null then
+                       after_module.write_to_nit(file)
+               end
                file.write_to_file("{test_file}.nit")
        end
 
@@ -318,6 +354,15 @@ class TestCase
                is_done = true
        end
 
+       # Make the test case fail without testing it
+       #
+       # Useful when the compilation or the before_test failed.
+       fun fail(message: String) do
+               is_done = true
+               error = message
+               toolcontext.modelbuilder.failed_tests += 1
+       end
+
        redef fun xml_classname do
                var a = test_method.full_name.split("$")
                return "nitunit.{a[0]}.{a[1]}"
@@ -337,10 +382,10 @@ redef class MMethodDef
        private fun is_test: Bool do return name.has_prefix("test_")
 
        # Is the method a "before_module"?
-       private fun is_before_module: Bool do return mproperty.is_toplevel and name == "before_module"
+       private fun is_before_module: Bool do return name == "before_module"
 
        # Is the method a "after_module"?
-       private fun is_after_module: Bool do return mproperty.is_toplevel and name == "after_module"
+       private fun is_after_module: Bool do return name == "after_module"
 end
 
 redef class MClassDef
@@ -360,7 +405,7 @@ redef class MModule
        # "before_module" method for this module.
        private fun before_test: nullable MMethodDef do
                for mclassdef in mclassdefs do
-                       if not mclassdef.name == "Object" then continue
+                       if not mclassdef.name == "Sys" then continue
                        for mpropdef in mclassdef.mpropdefs do
                                if mpropdef isa MMethodDef and mpropdef.is_before_module then return mpropdef
                        end
@@ -371,7 +416,7 @@ redef class MModule
        # "after_module" method for this module.
        private fun after_test: nullable MMethodDef do
                for mclassdef in mclassdefs do
-                       if not mclassdef.name == "Object" then continue
+                       if not mclassdef.name == "Sys" then continue
                        for mpropdef in mclassdef.mpropdefs do
                                if mpropdef isa MMethodDef and mpropdef.is_after_module then return mpropdef
                        end
index 6474d63..f11b0b1 100644 (file)
@@ -8,3 +8,5 @@ test_nitunit_md.md --no-color -o $WRITE
 test_doc3.nit --no-color -o $WRITE
 test_nitunit4 --no-color -o $WRITE
 test_nitunit5.nit --no-color -o $WRITE
+test_nitunit6.nit --no-color -o $WRITE
+test_nitunit7.nit --no-color -o $WRITE
diff --git a/tests/sav/nitunit_args11.res b/tests/sav/nitunit_args11.res
new file mode 100644 (file)
index 0000000..0a8b785
--- /dev/null
@@ -0,0 +1,16 @@
+==== Test-suite of module test_nitunit6::test_nitunit6 | tests: 3
+[KO] test_nitunit6::test_nitunit6$core::Sys$before_module
+     test_nitunit6.nit:27,1--29,3: Runtime Error in file nitunit.out/gen_test_nitunit6.nit
+     Output
+       Runtime error: Assert failed (test_nitunit6.nit:28)
+
+[KO] test_nitunit6$TestNitunit6$test_foo
+     test_nitunit6.nit:22,2--24,4: Nitunit Error: before_module test failed
+[KO] test_nitunit6::test_nitunit6$core::Sys$after_module
+     test_nitunit6.nit:31,1--33,3: Nitunit Error: before_module test failed
+
+Docunits: Entities: 5; Documented ones: 0; With nitunits: 0
+Test suites: Classes: 1; Test Cases: 3; Failures: 3
+[FAILURE] 3/3 tests failed.
+`nitunit.out` is not removed for investigation.
+<testsuites><testsuite package="test_nitunit6::test_nitunit6"></testsuite><testsuite package="test_nitunit6"><testcase classname="nitunit.test_nitunit6.TestNitunit6" name="test_foo" time="0.0"><failure message="Nitunit Error: before_module test failed"></failure></testcase></testsuite></testsuites>
\ No newline at end of file
diff --git a/tests/sav/nitunit_args12.res b/tests/sav/nitunit_args12.res
new file mode 100644 (file)
index 0000000..aa79730
--- /dev/null
@@ -0,0 +1,14 @@
+==== Test-suite of module test_nitunit7::test_nitunit7 | tests: 3
+[OK] test_nitunit7::test_nitunit7$core::Sys$before_module
+[OK] test_nitunit7$TestNitunit7$test_foo
+[KO] test_nitunit7::test_nitunit7$core::Sys$after_module
+     test_nitunit7.nit:31,1--33,3: Runtime Error in file nitunit.out/gen_test_nitunit7.nit
+     Output
+       Runtime error: Assert failed (test_nitunit7.nit:32)
+
+
+Docunits: Entities: 5; Documented ones: 0; With nitunits: 0
+Test suites: Classes: 1; Test Cases: 3; Failures: 1
+[FAILURE] 1/3 tests failed.
+`nitunit.out` is not removed for investigation.
+<testsuites><testsuite package="test_nitunit7::test_nitunit7"></testsuite><testsuite package="test_nitunit7"><testcase classname="nitunit.test_nitunit7.TestNitunit7" name="test_foo" time="0.0"><system-err></system-err></testcase></testsuite></testsuites>
\ No newline at end of file
diff --git a/tests/test_nitunit6.nit b/tests/test_nitunit6.nit
new file mode 100644 (file)
index 0000000..97eca0a
--- /dev/null
@@ -0,0 +1,33 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_nitunit6 is test_suite
+
+import test_suite
+
+class TestNitunit6
+       super TestSuite
+
+       fun test_foo do
+               assert true
+       end
+end
+
+redef fun before_module do
+       assert false
+end
+
+redef fun after_module do
+       assert false
+end
diff --git a/tests/test_nitunit7.nit b/tests/test_nitunit7.nit
new file mode 100644 (file)
index 0000000..63f47ea
--- /dev/null
@@ -0,0 +1,33 @@
+# This file is part of NIT ( http://www.nitlanguage.org ).
+#
+# Licensed under the Apache License, Version 2.0 (the "License");
+# you may not use this file except in compliance with the License.
+# You may obtain a copy of the License at
+#
+# http://www.apache.org/licenses/LICENSE-2.0
+#
+# Unless required by applicable law or agreed to in writing, software
+# distributed under the License is distributed on an "AS IS" BASIS,
+# WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+# See the License for the specific language governing permissions and
+# limitations under the License.
+
+module test_nitunit7 is test_suite
+
+import test_suite
+
+class TestNitunit7
+       super TestSuite
+
+       fun test_foo do
+               assert true
+       end
+end
+
+redef fun before_module do
+       assert true
+end
+
+redef fun after_module do
+       assert false
+end