+ end
+ end
+
+ test_simple_docunits(simple_du)
+ end
+
+ # Executes 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
+ # * 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])
+ do
+ if dus.is_empty then return
+
+ var file = "{prefix}-0.nit"
+
+ 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")
+ var i = 0
+ for du in dus do
+
+ i += 1
+ f.write("fun run_{i} do\n")
+ f.write("# {du.testcase.attrs["name"]}\n")
+ f.write(du.block)
+ f.write("end\n")
+ end
+ f.write("var a = args.first.to_i\n")
+ 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 </dev/null -o '{file}.bin'"
+ var res = sys.system(cmd)
+
+ if res != 0 then
+ # Compilation error.
+ # Fall-back to individual modes:
+ for du in dus do
+ test_single_docunit(du)
+ end
+ return
+ end
+
+ i = 0
+ for du in dus do
+ var tc = du.testcase
+ toolcontext.modelbuilder.unit_entities += 1
+ i += 1
+ toolcontext.info("Execute doc-unit {du.testcase.attrs["name"]} in {file} {i}", 1)
+ var res2 = sys.system("{file.to_program_name}.bin {i} >>'{file}.out1' 2>&1 </dev/null")
+
+ var msg
+ f = new IFStream.open("{file}.out1")
+ var n2
+ n2 = new HTMLTag("system-err")
+ tc.add n2
+ msg = f.read_all
+ f.close
+
+ n2 = new HTMLTag("system-out")
+ tc.add n2
+ n2.append(du.block)
+
+ if res2 != 0 then
+ var ne = new HTMLTag("error")
+ ne.attr("message", msg)
+ tc.add ne
+ toolcontext.warning(du.ndoc.location, "error", "ERROR: {tc.attrs["classname"]}.{tc.attrs["name"]} (in {file}): {msg}")
+ toolcontext.modelbuilder.failed_entities += 1
+ end
+ toolcontext.check_errors
+
+ testsuite.add(tc)