"""Пустой заголовок: конвертер не падает, но и не молчит. Методичка МИРЭА (`_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"])