feat: initial CTStruct framework
- CTNode: 트리 기본 단위 (전위/후위/BFS 순회, 탐색, 분리) - CTTree: 트리 컨테이너 (빌더 API, TOC, filter/map/merge) - NodeType: 구조/블록/인라인/메타 노드 타입 Enum - MarkdownParser: Markdown → CTTree 파서 - MarkdownRenderer: CTTree → Markdown 렌더러 - JSONRenderer: CTTree → JSON 직렬화 - 27개 단위/통합 테스트 전체 통과
This commit is contained in:
70
tests/test_tree.py
Normal file
70
tests/test_tree.py
Normal file
@@ -0,0 +1,70 @@
|
||||
"""
|
||||
tests/test_tree.py
|
||||
CTTree 단위 테스트
|
||||
"""
|
||||
|
||||
import json
|
||||
import pytest
|
||||
from ctstruct import CTTree, CTNode, NodeType
|
||||
|
||||
|
||||
class TestCTTree:
|
||||
def test_add_node(self):
|
||||
tree = CTTree("My Doc")
|
||||
tree.add(NodeType.PARAGRAPH, "hello")
|
||||
assert len(tree) == 1
|
||||
|
||||
def test_make_list(self):
|
||||
lst = CTTree.make_list(["A", "B", "C"])
|
||||
assert lst.node_type == NodeType.LIST
|
||||
assert len(lst) == 3
|
||||
assert lst[0].content == "A"
|
||||
|
||||
def test_make_table(self):
|
||||
table = CTTree.make_table(
|
||||
headers=["이름", "나이"],
|
||||
rows=[["Alice", "30"], ["Bob", "25"]],
|
||||
)
|
||||
assert table.node_type == NodeType.TABLE
|
||||
assert len(table) == 3 # 헤더행 + 2행
|
||||
|
||||
def test_toc(self):
|
||||
tree = CTTree()
|
||||
tree.add(NodeType.HEADING, "서론", level=1)
|
||||
tree.add(NodeType.HEADING, "본론", level=2)
|
||||
tree.add(NodeType.HEADING, "결론", level=1)
|
||||
toc = tree.toc()
|
||||
assert len(toc) == 3
|
||||
assert toc[0]["text"] == "서론"
|
||||
|
||||
def test_to_dict_and_back(self):
|
||||
tree = CTTree("Test")
|
||||
tree.add(NodeType.PARAGRAPH, "테스트 문단")
|
||||
d = tree.to_dict()
|
||||
restored = CTTree.from_dict(d)
|
||||
paras = restored.find(NodeType.PARAGRAPH)
|
||||
assert len(paras) == 1
|
||||
assert paras[0].content == "테스트 문단"
|
||||
|
||||
def test_filter(self):
|
||||
tree = CTTree()
|
||||
tree.add(NodeType.HEADING, "H", level=1)
|
||||
tree.add(NodeType.PARAGRAPH, "P")
|
||||
filtered = tree.filter(lambda n: n.node_type != NodeType.PARAGRAPH)
|
||||
assert len(filtered.find(NodeType.PARAGRAPH)) == 0
|
||||
assert len(filtered.find(NodeType.HEADING)) == 1
|
||||
|
||||
def test_merge(self):
|
||||
t1 = CTTree()
|
||||
t1.add(NodeType.PARAGRAPH, "t1")
|
||||
t2 = CTTree()
|
||||
t2.add(NodeType.PARAGRAPH, "t2")
|
||||
t1.merge(t2)
|
||||
assert len(t1.find(NodeType.PARAGRAPH)) == 2
|
||||
|
||||
def test_node_count(self):
|
||||
tree = CTTree()
|
||||
tree.add(NodeType.PARAGRAPH, "a")
|
||||
tree.add(NodeType.PARAGRAPH, "b")
|
||||
# root(1) + 2 paragraphs
|
||||
assert tree.node_count == 3
|
||||
Reference in New Issue
Block a user