83 lines
2.9 KiB
Python
83 lines
2.9 KiB
Python
"""Пустой заголовок: конвертер не падает, но и не молчит.
|
|
|
|
Методичка МИРЭА (`_method_extract.txt`, строка 156): «…разделы, пункты …
|
|
имеют заголовки, четко и кратко отражающие их содержание». Заголовок без
|
|
текста — нарушение, а не валидный ввод: он даст в документе пронумерованный,
|
|
но безымянный раздел, который попадёт в автособираемое содержание. Значит,
|
|
парсер обязан такую строку пережить, а checker — сообщить о ней.
|
|
"""
|
|
|
|
import unittest
|
|
|
|
from md2gost.checker import check_markdown
|
|
from md2gost.extended_markdown.heading import Heading
|
|
|
|
|
|
MD_EMPTY_HEADING = """# *СОДЕРЖАНИЕ
|
|
[TOC]
|
|
|
|
#
|
|
|
|
Текст раздела без заголовка.
|
|
"""
|
|
|
|
MD_OK_HEADINGS = """# *СОДЕРЖАНИЕ
|
|
[TOC]
|
|
|
|
# Анализ предметной области
|
|
|
|
Текст раздела.
|
|
"""
|
|
|
|
|
|
def _heading(source: str) -> Heading:
|
|
match = Heading.pattern.match(source)
|
|
assert match is not None, f"pattern did not match {source!r}"
|
|
return Heading(match)
|
|
|
|
|
|
class TestEmptyHeadingParsing(unittest.TestCase):
|
|
def test_bare_hash_does_not_raise(self):
|
|
heading = _heading("#\n")
|
|
|
|
self.assertEqual("", heading.inline_body)
|
|
self.assertTrue(heading.numbered)
|
|
self.assertEqual(1, heading.level)
|
|
|
|
def test_bare_hashes_of_deeper_level(self):
|
|
heading = _heading("###\n")
|
|
|
|
self.assertEqual("", heading.inline_body)
|
|
self.assertTrue(heading.numbered)
|
|
self.assertEqual(3, heading.level)
|
|
|
|
def test_asterisk_without_text_is_unnumbered(self):
|
|
heading = _heading("# *\n")
|
|
|
|
self.assertEqual("", heading.inline_body)
|
|
self.assertFalse(heading.numbered)
|
|
|
|
def test_normal_headings_are_unaffected(self):
|
|
numbered = _heading("# Анализ предметной области\n")
|
|
self.assertEqual("Анализ предметной области", numbered.inline_body)
|
|
self.assertTrue(numbered.numbered)
|
|
|
|
unnumbered = _heading("## *ВВЕДЕНИЕ\n")
|
|
self.assertEqual("ВВЕДЕНИЕ", unnumbered.inline_body)
|
|
self.assertFalse(unnumbered.numbered)
|
|
|
|
|
|
class TestEmptyHeadingChecker(unittest.TestCase):
|
|
def test_empty_heading_is_reported(self):
|
|
issues = check_markdown(MD_EMPTY_HEADING, "coursework")
|
|
|
|
found = [i for i in issues if i.id == "heading.empty"]
|
|
self.assertEqual(1, len(found))
|
|
self.assertEqual("warning", found[0].severity)
|
|
self.assertEqual(4, found[0].line)
|
|
|
|
def test_normal_headings_produce_no_issue(self):
|
|
issues = check_markdown(MD_OK_HEADINGS, "coursework")
|
|
|
|
self.assertEqual([], [i for i in issues if i.id == "heading.empty"])
|