X-Git-Url: http://nitlanguage.org diff --git a/src/testing/testing_doc.nit b/src/testing/testing_doc.nit index 872bff2..46f5a4a 100644 --- a/src/testing/testing_doc.nit +++ b/src/testing/testing_doc.nit @@ -17,12 +17,12 @@ module testing_doc private import parser_util import testing_base -import markdown +import markdown2 import html +import realtime # Extractor, Executor and Reporter for the tests in a module class NitUnitExecutor - super HTMLDecorator # Toolcontext used to parse Nit code blocks. var toolcontext: ToolContext @@ -39,12 +39,11 @@ class NitUnitExecutor # The name of the suite var name: String - # Markdown processor used to parse markdown comments and extract code. - var mdproc = new MarkdownProcessor + # Markdown parse used to parse markdown comments and extract code + private var md_parser = new MdParser - init do - mdproc.emitter.decorator = new NitunitDecorator(self) - end + # Markdown visitor used to extract markdown code blocks + private var md_visitor = new NitunitMdVisitor(self) is lazy # The associated documentation object var mdoc: nullable MDoc = null @@ -57,8 +56,10 @@ class NitUnitExecutor # Is used because a new code-block might just be added to it. var last_docunit: nullable DocUnit = null + # Unit class name in XML output var xml_classname: String is noautoinit + # Unit name in xml output var xml_name: String is noautoinit # The entry point for a new `ndoc` node @@ -72,20 +73,22 @@ class NitUnitExecutor self.mdoc = mdoc # Populate `blocks` from the markdown decorator - mdproc.process(mdoc.content.join("\n")) + var md_node = md_parser.parse(mdoc.content.join("\n")) + md_visitor.enter_visit(md_node) end # All extracted docunits var docunits = new Array[DocUnit] - fun show_status - do - toolcontext.show_unit_status(name, docunits) - end + # Display current testing status + fun show_status do toolcontext.show_unit_status(name, docunits) + # Update display when a test case is done fun mark_done(du: DocUnit) do du.is_done = true + toolcontext.clear_progress_bar + toolcontext.show_unit(du) show_status end @@ -97,7 +100,8 @@ class NitUnitExecutor end # Try to group each nitunit into a single source file to fasten the compilation - var simple_du = new Array[DocUnit] + var simple_du = new Array[DocUnit] # du that are simple statements + var single_du = new Array[DocUnit] # du that are modules or include classes show_status for du in docunits do # Skip existing errors @@ -108,19 +112,27 @@ class NitUnitExecutor var ast = toolcontext.parse_something(du.block) if ast isa AExpr then simple_du.add du + else + single_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) + # Try to mass compile all the single du in a single nitc invocation with many modules + compile_single_docunits(single_du) + # If the mass compilation fail, then each one will be compiled individually # 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 - # Need to try to compile it, then execute it + # A mass compilation failed + # Need to try to recompile it, then execute it test_single_docunit(du) end mark_done(du) @@ -131,33 +143,33 @@ class NitUnitExecutor print "" for du in docunits do - toolcontext.show_unit(du) - end - - for du in docunits do testsuite.add du.to_xml 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") @@ -176,7 +188,7 @@ class NitUnitExecutor if res != 0 then # Compilation error. - # They will be executed independently + # They should be generated and compiled independently return end @@ -187,6 +199,7 @@ class NitUnitExecutor i += 1 du.test_file = file du.test_arg = i + du.is_compiled = true end end @@ -194,9 +207,11 @@ class NitUnitExecutor fun execute_simple_docunit(du: DocUnit) do var file = du.test_file.as(not null) - var i = du.test_arg.as(not null) + var i = du.test_arg or else 0 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 '{file}.out1' 2>&1 '{file}.out1' 2>&1 '{file}.out1' 2>&1 '{prefix}.out1' 2>&1 ") + d2m.extract(ndoc.to_mdoc, "nitunit." + mclassdef.full_name.replace("$", "."), "") end end for npropdef in nclassdef.n_propdefs do @@ -531,7 +613,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 @@ -563,7 +646,7 @@ redef class ModelBuilder doc_entities += 1 # NOTE: jenkins expects a '.' in the classname attr - d2m.extract(mdoc, "nitunit." + mgroup.full_name, "") + d2m.extract(mdoc, "nitunit." + mgroup.mpackage.name + "." + mgroup.name + ".", "") d2m.run_tests @@ -574,7 +657,7 @@ redef class ModelBuilder fun test_mdoc(mdoc: MDoc): HTMLTag do var ts = new HTMLTag("testsuite") - var file = mdoc.location.file.filename + var file = mdoc.location.file.as(not null).filename toolcontext.info("nitunit: doc-unit file {file}", 2)