markdown2 :: TestGenerator :: ignored_tests=
Ignored testsmarkdown2 :: TestGenerator :: json_file
Input file in containing the tests in JSON formatmarkdown2 :: TestGenerator :: json_file=
Input file in containing the tests in JSON formatmarkdown2 :: TestGenerator :: load_tests
Load the tests files from the JSON inputmarkdown2 :: TestGenerator :: output_dir
Output directory where the Nitunit files will be generatedmarkdown2 :: TestGenerator :: output_dir=
Output directory where the Nitunit files will be generatedmarkdown2 :: TestGenerator :: strip_class_name
Strip class namemarkdown2 :: TestGenerator :: strip_module_name
Strip module namemarkdown2 $ TestGenerator :: SELF
Type of this instance, automatically specialized in every classcore :: Object :: class_factory
Implementation used byget_class
to create the specific class.
core :: Object :: defaultinit
markdown2 :: TestGenerator :: ignored_tests=
Ignored testscore :: Object :: is_same_instance
Return true ifself
and other
are the same instance (i.e. same identity).
core :: Object :: is_same_serialized
Isself
the same as other
in a serialization context?
core :: Object :: is_same_type
Return true ifself
and other
have the same dynamic type.
markdown2 :: TestGenerator :: json_file
Input file in containing the tests in JSON formatmarkdown2 :: TestGenerator :: json_file=
Input file in containing the tests in JSON formatmarkdown2 :: TestGenerator :: load_tests
Load the tests files from the JSON inputcore :: Object :: output_class_name
Display class name on stdout (debug only).markdown2 :: TestGenerator :: output_dir
Output directory where the Nitunit files will be generatedmarkdown2 :: TestGenerator :: output_dir=
Output directory where the Nitunit files will be generatedmarkdown2 :: TestGenerator :: strip_class_name
Strip class namemarkdown2 :: TestGenerator :: strip_module_name
Strip module name
# Generate the test cases from the JSON testfile.
class TestGenerator
# Input file in containing the tests in JSON format
var json_file: String
# Output directory where the Nitunit files will be generated
var output_dir: String
# Ignored tests
#
# We ignore some tests for two reasons:
# * because `nitmd` does not fully support UTF-8
# * because somes tests are wrong
var ignored_tests: Array[Int] do
var ignored = new Array[Int]
ignored.add_all([171, 304, 305, 306, 311, 312, 313, 477, 514]) # utf-8 tests
ignored.add_all([275, 276]) # spec is wrong compared to reference implementation
return ignored
end
# Load the tests files from the JSON input
fun load_tests: Map[String, Array[TestCase]] do
var json = json_file.to_path.read_all.parse_json
var tests = new HashMap[String, Array[TestCase]]
for obj in json.as(JsonArray) do
if not obj isa JsonObject then continue
var number = obj["example"].as(Int)
if ignored_tests.has(number) then continue
var name = "test{number}"
var section = obj["section"].as(String)
if not tests.has_key(section) then
tests[section] = new Array[TestCase]
end
var markdown = obj["markdown"].as(String)
markdown = markdown.replace("\\", "\\\\")
markdown = markdown.replace("\n", "\\n")
markdown = markdown.replace("\t", "\\t")
# fix missing chars in some tests
if number == 162 then
markdown = markdown.replace("my url", "my%20url")
else if number == 467 then
markdown = markdown.replace("my uri", "my%20uri")
end
var html = obj["html"].as(String)
html = html.replace("\\", "\\\\")
html = html.replace("\n", "\\n")
html = html.replace("\t", "\\t")
tests[section].add(new TestCase(name, markdown, html))
end
return tests
end
# Generate the Nitunit test files
fun gen_tests do
var tests = load_tests
for section, test_cases in tests do
var test_file = new TestFile("test_commonmark_{strip_module_name(section)}")
var test_class = new TestClass("TestCommonmark{strip_class_name(section)}")
test_class.test_cases.add_all test_cases
test_file.test_classes.add test_class
test_file.save(output_dir)
end
end
# Strip module name
#
# Used to create a Nitunit module name from a CommonMark section title.
fun strip_module_name(name: String): String do
var b = new FlatBuffer
for c in name do
if c == ' ' then
b.add '_'
else
if not c.is_letter and
not c.is_digit and
not allowed_id_chars.has(c) then continue
b.add c.to_lower
end
end
return b.to_s
end
# Strip class name
#
# Used to create a Nitunit test class name from a CommonMark section title.
fun strip_class_name(name: String): String do
var b = new FlatBuffer
var was_space = false
for c in name do
if c == ' ' then
was_space = true
else
if not c.is_letter and
not c.is_digit and
not allowed_id_chars.has(c) then continue
if was_space then
b.add c.to_upper
was_space = false
else
b.add c
end
end
end
return b.to_s
end
private var allowed_id_chars: Array[Char] = ['-', '_', ':', '.']
end
lib/markdown2/tests/commonmark_gen.nit:30,1--148,3