X-Git-Url: http://nitlanguage.org diff --git a/src/testing/testing_doc.nit b/src/testing/testing_doc.nit index e975d85..563c418 100644 --- a/src/testing/testing_doc.nit +++ b/src/testing/testing_doc.nit @@ -25,8 +25,8 @@ class NitUnitExecutor # The prefix of the generated Nit source-file var prefix: String - # The module to import - var mmodule: MModule + # The module to import, if any + var mmodule: nullable MModule # The XML node associated to the module var testsuite: HTMLTag @@ -57,8 +57,8 @@ class NitUnitExecutor if not (ast isa AModule or ast isa ABlockExpr or ast isa AExpr) then var message = "" if ast isa AError then message = " At {ast.location}: {ast.message}." - toolcontext.warning(ndoc.location, "invalid-block", "Error: There is a block of code that is not valid Nit, thus not considered a nitunit. To suppress this warning, enclose the block with a fence tagged `nitish` or `raw` (see `man nitdoc`).{message}") - failures.add("{ndoc.location}: Invalid block of code.{message}") + toolcontext.warning(mdoc.location, "invalid-block", "Error: There is a block of code that is not valid Nit, thus not considered a nitunit. To suppress this warning, enclose the block with a fence tagged `nitish` or `raw` (see `man nitdoc`).{message}") + failures.add("{mdoc.location}: Invalid block of code.{message}") return end @@ -72,8 +72,8 @@ class NitUnitExecutor blocks.last.add(text) end - # The associated node to localize warnings - var ndoc: nullable ADoc = null + # The associated documentation object + var mdoc: nullable MDoc = null # used to generate distinct names var cpt = 0 @@ -82,14 +82,14 @@ class NitUnitExecutor # Fill `docunits` with new discovered unit of tests. # # `tc` (testcase) is the pre-filled XML node - fun extract(ndoc: ADoc, tc: HTMLTag) + fun extract(mdoc: MDoc, tc: HTMLTag) do blocks.clear failures.clear - self.ndoc = ndoc + self.mdoc = mdoc - work(ndoc.to_mdoc) + work(mdoc) toolcontext.check_errors @@ -106,7 +106,7 @@ class NitUnitExecutor if blocks.is_empty then return for block in blocks do - docunits.add new DocUnit(ndoc, tc, block.join("")) + docunits.add new DocUnit(mdoc, tc, block.join("")) end end @@ -144,11 +144,7 @@ class NitUnitExecutor var dir = file.dirname if dir != "" then dir.mkdir var f - f = new OFStream.open(file) - f.write("# GENERATED FILE\n") - f.write("# Docunits extracted from comments\n") - f.write("import {mmodule.name}\n") - f.write("\n") + f = create_unitfile(file) var i = 0 for du in dus do @@ -159,21 +155,14 @@ class NitUnitExecutor f.write("end\n") end f.write("var a = args.first.to_i\n") - for j in [1..i[ do + for j in [1..i] do f.write("if a == {j} then run_{j}\n") end f.close if toolcontext.opt_noact.value then return - var nit_dir = toolcontext.nit_dir - var nitg = nit_dir/"bin/nitg" - if not nitg.file_exists then - toolcontext.error(null, "Cannot find nitg. Set envvar NIT_DIR.") - toolcontext.check_errors - end - var cmd = "{nitg} --ignore-visibility --no-color '{file}' -I {mmodule.location.file.filename.dirname} >'{file}.out1' 2>&1 >'{file}.out1' 2>&1 >'{file}.out1' 2>&1 '{file}.out1' 2>&1 ") tc.attr("name", "") - d2m.extract(ndoc, tc) + d2m.extract(ndoc.to_mdoc, tc) end label x for nclassdef in nmodule.n_classdefs do var mclassdef = nclassdef.mclassdef @@ -363,7 +382,7 @@ redef class ModelBuilder tc = new HTMLTag("testcase") tc.attr("classname", "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name) tc.attr("name", "") - d2m.extract(ndoc, tc) + d2m.extract(ndoc.to_mdoc, tc) end end for npropdef in nclassdef.n_propdefs do @@ -376,7 +395,7 @@ redef class ModelBuilder tc = new HTMLTag("testcase") tc.attr("classname", "nitunit." + mmodule.full_name + "." + mclassdef.mclass.full_name) tc.attr("name", mpropdef.mproperty.full_name) - d2m.extract(ndoc, tc) + d2m.extract(ndoc.to_mdoc, tc) end end end @@ -385,4 +404,67 @@ redef class ModelBuilder return ts end + + # Extracts and executes all the docunits in the readme of the `mgroup` + # Returns a JUnit-compatible `` XML element that contains the results of the executions. + fun test_group(mgroup: MGroup): HTMLTag + do + var ts = new HTMLTag("testsuite") + toolcontext.info("nitunit: doc-unit group {mgroup}", 2) + + # usually, only the default module must be imported in the unit test. + var o = mgroup.default_mmodule + + ts.attr("package", mgroup.full_name) + + var prefix = toolcontext.test_dir + prefix = prefix.join_path(mgroup.to_s) + var d2m = new NitUnitExecutor(toolcontext, prefix, o, ts) + + var tc + + total_entities += 1 + var mdoc = mgroup.mdoc + if mdoc == null then return ts + + doc_entities += 1 + tc = new HTMLTag("testcase") + # NOTE: jenkins expects a '.' in the classname attr + tc.attr("classname", "nitunit." + mgroup.full_name) + tc.attr("name", "") + d2m.extract(mdoc, tc) + + d2m.run_tests + + return ts + end + + # Test a document object unrelated to a Nit entity + fun test_mdoc(mdoc: MDoc): HTMLTag + do + var ts = new HTMLTag("testsuite") + var file = mdoc.location.to_s + + toolcontext.info("nitunit: doc-unit file {file}", 2) + + ts.attr("package", file) + + var prefix = toolcontext.test_dir / "file" + var d2m = new NitUnitExecutor(toolcontext, prefix, null, ts) + + var tc + + total_entities += 1 + doc_entities += 1 + + tc = new HTMLTag("testcase") + # NOTE: jenkins expects a '.' in the classname attr + tc.attr("classname", "nitunit.") + tc.attr("name", file) + + d2m.extract(mdoc, tc) + d2m.run_tests + + return ts + end end