""" 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