- CTNode: 트리 기본 단위 (전위/후위/BFS 순회, 탐색, 분리) - CTTree: 트리 컨테이너 (빌더 API, TOC, filter/map/merge) - NodeType: 구조/블록/인라인/메타 노드 타입 Enum - MarkdownParser: Markdown → CTTree 파서 - MarkdownRenderer: CTTree → Markdown 렌더러 - JSONRenderer: CTTree → JSON 직렬화 - 27개 단위/통합 테스트 전체 통과
105 lines
2.4 KiB
Python
105 lines
2.4 KiB
Python
"""
|
|
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"
|