nitunit: rename and redocument `test_simple_docunits` as it just compiles
[nit.git] / src / testing / testing_doc.nit
index 936f6dc..6063736 100644 (file)
@@ -19,6 +19,7 @@ private import parser_util
 import testing_base
 import markdown
 import html
+import realtime
 
 # Extractor, Executor and Reporter for the tests in a module
 class NitUnitExecutor
@@ -86,7 +87,7 @@ class NitUnitExecutor
        fun mark_done(du: DocUnit)
        do
                du.is_done = true
-               toolcontext.clear_status
+               toolcontext.clear_progress_bar
                toolcontext.show_unit(du)
                show_status
        end
@@ -112,13 +113,14 @@ class NitUnitExecutor
                                simple_du.add du
                        end
                end
-               test_simple_docunits(simple_du)
 
+               # Try to mass compile all the simple du as a single nit module
+               compile_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
+                       else if du.is_compiled then
                                # Already compiled. Execute it.
                                execute_simple_docunit(du)
                        else
@@ -137,25 +139,29 @@ class NitUnitExecutor
                end
        end
 
-       # Executes multiples doc-units in a shared program.
+       # Compiles multiples doc-units in a shared program.
        # Used for docunits simple block of code (without modules, classes, functions etc.)
        #
-       # In case of compilation error, the method fallbacks to `test_single_docunit` to
+       # In case of success, the docunits are compiled and the caller can call `execute_simple_docunit`.
+       #
+       # In case of compilation error, the docunits are let uncompiled.
+       # The caller should fallbacks to `test_single_docunit` to
        # * locate exactly the compilation problem in the problematic docunit.
        # * permit the execution of the other docunits that may be correct.
-       fun test_simple_docunits(dus: Array[DocUnit])
+       fun compile_simple_docunits(dus: Array[DocUnit])
        do
                if dus.is_empty then return
 
                var file = "{prefix}-0.nit"
 
+               toolcontext.info("Compile {dus.length} simple(s) doc-unit(s) in {file}", 1)
+
                var dir = file.dirname
                if dir != "" then dir.mkdir
                var f
                f = create_unitfile(file)
                var i = 0
                for du in dus do
-
                        i += 1
                        f.write("fun run_{i} do\n")
                        f.write("# {du.full_name}\n")
@@ -174,7 +180,7 @@ class NitUnitExecutor
 
                if res != 0 then
                        # Compilation error.
-                       # They will be executed independently
+                       # They should be generated and compiled independently
                        return
                end
 
@@ -185,6 +191,7 @@ class NitUnitExecutor
                        i += 1
                        du.test_file = file
                        du.test_arg = i
+                       du.is_compiled = true
                end
        end
 
@@ -194,7 +201,9 @@ class NitUnitExecutor
                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 clock = new Clock
                var res2 = toolcontext.safe_exec("{file.to_program_name}.bin {i} >'{file}.out1' 2>&1 </dev/null")
+               if not toolcontext.opt_no_time.value then du.real_time = clock.total
                du.was_exec = true
 
                var content = "{file}.out1".to_path.read_all
@@ -225,7 +234,9 @@ class NitUnitExecutor
                var res = compile_unitfile(file)
                var res2 = 0
                if res == 0 then
+                       var clock = new Clock
                        res2 = toolcontext.safe_exec("{file.to_program_name}.bin >'{file}.out1' 2>&1 </dev/null")
+                       if not toolcontext.opt_no_time.value then du.real_time = clock.total
                        du.was_exec = true
                end
 
@@ -258,7 +269,7 @@ class NitUnitExecutor
                f.write("# GENERATED FILE\n")
                f.write("# Docunits extracted from comments\n")
                if mmodule != null then
-                       f.write("import {mmodule.name}\n")
+                       f.write("intrude import {mmodule.name}\n")
                end
                f.write("\n")
                return f
@@ -274,7 +285,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
@@ -398,6 +409,9 @@ class DocUnit
        # See `test_arg` that is used to distinguish them
        var test_file: nullable String = null
 
+       #  Was `test_file` successfully compiled?
+       var is_compiled = false
+
        # The command-line argument to use when executing the test, if any.
        var test_arg: nullable Int = null
 
@@ -519,7 +533,7 @@ redef class ModelBuilder
                                var ndoc = nclassdef.n_doc
                                if ndoc != null then
                                        doc_entities += 1
-                                       d2m.extract(ndoc.to_mdoc, "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name, "<class>")
+                                       d2m.extract(ndoc.to_mdoc, "nitunit." + mclassdef.full_name.replace("$", "."), "<class>")
                                end
                        end
                        for npropdef in nclassdef.n_propdefs do
@@ -529,7 +543,8 @@ redef class ModelBuilder
                                var ndoc = npropdef.n_doc
                                if ndoc != null then
                                        doc_entities += 1
-                                       d2m.extract(ndoc.to_mdoc, "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name, mpropdef.mproperty.full_name)
+                                       var a = mpropdef.full_name.split("$")
+                                       d2m.extract(ndoc.to_mdoc, "nitunit." + a[0] + "." + a[1], a[2])
                                end
                        end
                end
@@ -561,7 +576,7 @@ redef class ModelBuilder
 
                doc_entities += 1
                # NOTE: jenkins expects a '.' in the classname attr
-               d2m.extract(mdoc, "nitunit." + mgroup.full_name, "<group>")
+               d2m.extract(mdoc, "nitunit." + mgroup.mpackage.name + "." + mgroup.name + ".<group>", "<group>")
 
                d2m.run_tests