""" tests/test_parsers.py 파서 단위 테스트 """ from ctstruct import NodeType from ctstruct.parsers import MarkdownParser from ctstruct.renderers import MarkdownRenderer, JSONRenderer SAMPLE_MD = """\ --- title: 테스트 문서 author: gm --- # 소개 이 문서는 CTStruct 테스트용 문서입니다. ## 기능 목록 - 트리 자료구조 - 마크다운 파서 - 다양한 렌더러 ## 코드 예제 ```python tree = CTTree() tree.add(NodeType.PARAGRAPH, "hello") ``` > 이것은 인용구입니다. --- # 결론 CTStruct 는 텍스트를 구조화합니다. """ class TestMarkdownParser: def setup_method(self): self.parser = MarkdownParser() self.tree = self.parser.parse(SAMPLE_MD) def test_parse_returns_tree(self): assert self.tree is not None def test_headings_parsed(self): headings = self.tree.find(NodeType.HEADING) assert len(headings) >= 3 def test_paragraph_parsed(self): paras = self.tree.find(NodeType.PARAGRAPH) assert len(paras) >= 1 def test_list_parsed(self): lists = self.tree.find(NodeType.LIST) assert len(lists) >= 1 items = self.tree.find(NodeType.LIST_ITEM) assert len(items) == 3 def test_code_block_parsed(self): codes = self.tree.find(NodeType.CODE_BLOCK) assert len(codes) == 1 assert codes[0].attr("language") == "python" def test_blockquote_parsed(self): quotes = self.tree.find(NodeType.BLOCKQUOTE) assert len(quotes) == 1 def test_divider_parsed(self): dividers = self.tree.find(NodeType.DIVIDER) assert len(dividers) >= 1 def test_toc(self): toc = self.tree.toc() assert toc[0]["text"] == "소개" class TestMarkdownRenderer: def test_roundtrip(self): parser = MarkdownParser() renderer = MarkdownRenderer() tree = parser.parse(SAMPLE_MD) output = renderer.render(tree) # 재파싱 후 헤딩 수 일치 확인 tree2 = parser.parse(output) assert len(tree.find(NodeType.HEADING)) == len(tree2.find(NodeType.HEADING)) class TestJSONRenderer: def test_json_output(self): import json parser = MarkdownParser() renderer = JSONRenderer() tree = parser.parse(SAMPLE_MD) output = renderer.render(tree) data = json.loads(output) assert "type" in data assert data["type"] == "ROOT"