Signed-off-by: Alexandre Terrasa <alexandre@moz-code.org>
private import parser_util
import testing_base
private import parser_util
import testing_base
import html
import realtime
# Extractor, Executor and Reporter for the tests in a module
class NitUnitExecutor
import html
import realtime
# Extractor, Executor and Reporter for the tests in a module
class NitUnitExecutor
# Toolcontext used to parse Nit code blocks.
var toolcontext: ToolContext
# Toolcontext used to parse Nit code blocks.
var toolcontext: ToolContext
# The name of the suite
var name: String
# 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.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
# The associated documentation object
var mdoc: nullable MDoc = null
self.mdoc = mdoc
# Populate `blocks` from the markdown decorator
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
end
# All extracted docunits
-private class NitunitDecorator
- super HTMLDecorator
+private class NitunitMdVisitor
+ super MdVisitor
var executor: NitUnitExecutor
var executor: NitUnitExecutor
- redef fun add_code(v, block) do
- var code = block.raw_content
- var meta = block.meta or else "nit"
+ redef fun visit(node) do node.accept_nitunit(self)
+
+ fun parse_code(block: MdCodeBlock) do
+ var code = block.literal
+ if code == null then return
+
+ var meta = block.info or else "nit"
# Do not try to test non-nit code.
if meta != "nit" then return
# Do not try to test non-nit code.
if meta != "nit" then return
# Try to parse code blocks
# Try to parse code blocks
+ var executor = self.executor
var ast = executor.toolcontext.parse_something(code)
var mdoc = executor.mdoc
var ast = executor.toolcontext.parse_something(code)
var mdoc = executor.mdoc
# The location is computed according to the starts of the mdoc and the block
# Note, the following assumes that all the comments of the mdoc are correctly aligned.
# The location is computed according to the starts of the mdoc and the block
# Note, the following assumes that all the comments of the mdoc are correctly aligned.
- var loc = block.block.location
+ var loc = block.location
var line_offset = loc.line_start + mdoc.location.line_start - 2
var column_offset = loc.column_start + mdoc.location.column_start
# Hack to handle precise location in blocks
# TODO remove when markdown is more reliable
var line_offset = loc.line_start + mdoc.location.line_start - 2
var column_offset = loc.column_start + mdoc.location.column_start
# Hack to handle precise location in blocks
# TODO remove when markdown is more reliable
- if block isa BlockFence then
+ if block isa MdFencedCodeBlock then
# Skip the starting fence
line_offset += 1
else
# Skip the starting fence
line_offset += 1
else
end
# Return and register a new empty docunit
end
# Return and register a new empty docunit
- fun new_docunit: DocUnit
- do
+ fun new_docunit: DocUnit do
var mdoc = executor.mdoc
assert mdoc != null
var mdoc = executor.mdoc
assert mdoc != null
+redef class MdNode
+ private fun accept_nitunit(v: NitunitMdVisitor) do visit_all(v)
+end
+
+redef class MdCodeBlock
+ redef fun accept_nitunit(v) do v.parse_code(self)
+end
+
# A unit-test extracted from some documentation.
#
# A docunit is extracted from the code-blocks of mdocs.
# A unit-test extracted from some documentation.
#
# A docunit is extracted from the code-blocks of mdocs.
fun real_location(ast_location: Location): Location
do
var mdoc = self.mdoc
fun real_location(ast_location: Location): Location
do
var mdoc = self.mdoc
- var res = new Location(mdoc.location.file, lines[ast_location.line_start-1],
+
+ var res = new Location(mdoc.location.file,
+ lines[ast_location.line_start-1],
lines[ast_location.line_end-1],
columns[ast_location.line_start-1] + ast_location.column_start,
columns[ast_location.line_end-1] + ast_location.column_end)
lines[ast_location.line_end-1],
columns[ast_location.line_start-1] + ast_location.column_start,
columns[ast_location.line_end-1] + ast_location.column_end)