Merge: Added contributing guidelines and link from readme
[nit.git] / src / testing / testing_doc.nit
index 723e717..75e0830 100644 (file)
@@ -86,6 +86,8 @@ class NitUnitExecutor
        fun mark_done(du: DocUnit)
        do
                du.is_done = true
+               toolcontext.clear_progress_bar
+               toolcontext.show_unit(du)
                show_status
        end
 
@@ -96,33 +98,41 @@ class NitUnitExecutor
                        return
                end
 
+               # Try to group each nitunit into a single source file to fasten the compilation
                var simple_du = new Array[DocUnit]
                show_status
                for du in docunits do
                        # Skip existing errors
                        if du.error != null then
-                               mark_done(du)
                                continue
                        end
 
                        var ast = toolcontext.parse_something(du.block)
                        if ast isa AExpr then
                                simple_du.add du
+                       end
+               end
+               test_simple_docunits(simple_du)
+
+               # Now test them in order
+               for du in docunits do
+                       if du.error != null then
+                               # Nothing to execute. Conclude
+                       else if du.test_file != null then
+                               # Already compiled. Execute it.
+                               execute_simple_docunit(du)
                        else
+                               # Need to try to compile it, then execute it
                                test_single_docunit(du)
                        end
+                       mark_done(du)
                end
 
-               test_simple_docunits(simple_du)
-
+               # Final status
                show_status
                print ""
 
                for du in docunits do
-                       toolcontext.show_unit(du)
-               end
-
-               for du in docunits do
                        testsuite.add du.to_xml
                end
        end
@@ -164,28 +174,35 @@ class NitUnitExecutor
 
                if res != 0 then
                        # Compilation error.
-                       # Fall-back to individual modes:
-                       for du in dus do
-                               test_single_docunit(du)
-                       end
+                       # They will be executed independently
                        return
                end
 
+               # Compilation was a success.
+               # Store what need to be executed for each one.
                i = 0
                for du in dus do
                        i += 1
-                       toolcontext.info("Execute doc-unit {du.full_name} in {file} {i}", 1)
-                       var res2 = toolcontext.safe_exec("{file.to_program_name}.bin {i} >'{file}.out1' 2>&1 </dev/null")
-                       du.was_exec = true
+                       du.test_file = file
+                       du.test_arg = i
+               end
+       end
 
-                       var content = "{file}.out1".to_path.read_all
-                       du.raw_output = content
+       # Execute a docunit compiled by `test_single_docunit`
+       fun execute_simple_docunit(du: DocUnit)
+       do
+               var file = du.test_file.as(not null)
+               var i = du.test_arg.as(not null)
+               toolcontext.info("Execute doc-unit {du.full_name} in {file} {i}", 1)
+               var res2 = toolcontext.safe_exec("{file.to_program_name}.bin {i} >'{file}.out1' 2>&1 </dev/null")
+               du.was_exec = true
 
-                       if res2 != 0 then
-                               du.error = "Runtime error in {file} with argument {i}"
-                               toolcontext.modelbuilder.failed_entities += 1
-                       end
-                       mark_done(du)
+               var content = "{file}.out1".to_path.read_all
+               du.raw_output = content
+
+               if res2 != 0 then
+                       du.error = "Runtime error in {file} with argument {i}"
+                       toolcontext.modelbuilder.failed_entities += 1
                end
        end
 
@@ -222,7 +239,6 @@ class NitUnitExecutor
                        du.error = "Runtime error in {file}"
                        toolcontext.modelbuilder.failed_entities += 1
                end
-               mark_done(du)
        end
 
        # Create and fill the header of a unit file `file`.
@@ -258,7 +274,7 @@ class NitUnitExecutor
                if mmodule != null then
                        opts.add "-I {mmodule.filepath.dirname}"
                end
-               var cmd = "{nitc} --ignore-visibility --no-color '{file}' {opts.join(" ")} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
+               var cmd = "{nitc} --ignore-visibility --no-color -q '{file}' {opts.join(" ")} >'{file}.out1' 2>&1 </dev/null -o '{file}.bin'"
                var res = toolcontext.safe_exec(cmd)
                return res
        end
@@ -376,6 +392,15 @@ class DocUnit
        # The numbering of self in mdoc (starting with 0)
        var number: Int
 
+       # The generated Nit source file that contains the unit-test
+       #
+       # Note that a same generated file can be used for multiple tests.
+       # See `test_arg` that is used to distinguish them
+       var test_file: nullable String = null
+
+       # The command-line argument to use when executing the test, if any.
+       var test_arg: nullable Int = null
+
        redef fun full_name do
                var mentity = mdoc.original_mentity
                if mentity != null then