cobiz / tests /hwp5_tests /test_treeop.py
seawolf2357's picture
Add tests
3315103 verified
# -*- coding: utf-8 -*-
from __future__ import absolute_import
from __future__ import print_function
from __future__ import unicode_literals
from unittest import TestCase
from hwp5.treeop import STARTEVENT, ENDEVENT
from hwp5.treeop import build_subtree
from hwp5.treeop import iter_subevents
from hwp5.treeop import prefix_ancestors_from_level
from hwp5.treeop import tree_events
class Test_ancestors_from_level(TestCase):
def test_ancestors_from_level(self):
level_prefixed = [
(0, 'a0'),
(0, 'b0'), # sibling
(1, 'b0-a1'), # child
(2, 'b0-a1-a2'), # child
(1, 'b0-b1'), # jump to parent level
(2, 'b0-b1-b2'), # child
(0, 'c0'), # jump to grand-parent level
]
ancestors_prefixed = prefix_ancestors_from_level(level_prefixed)
result = list((list(ancestors), item)
for ancestors, item in ancestors_prefixed)
self.assertEqual(result.pop(0), ([None], 'a0'))
self.assertEqual(result.pop(0), ([None], 'b0'))
self.assertEqual(result.pop(0), ([None, 'b0'], 'b0-a1'))
self.assertEqual(result.pop(0), ([None, 'b0', 'b0-a1'], 'b0-a1-a2'))
self.assertEqual(result.pop(0), ([None, 'b0'], 'b0-b1'))
self.assertEqual(result.pop(0), ([None, 'b0', 'b0-b1'], 'b0-b1-b2'))
self.assertEqual(result.pop(0), ([None], 'c0'))
def test_ancestors_from_level_from_nonzero_baselevel(self):
level_prefixed = [
(7, 'a0'), # baselevel 7
(8, 'a0-a1'),
(9, 'a0-a1-a2'),
(7, 'b0'),
]
ancestors_prefixed = prefix_ancestors_from_level(level_prefixed)
result = list((list(ancestors), item)
for ancestors, item in ancestors_prefixed)
self.assertEqual(result.pop(0), ([None], 'a0'))
self.assertEqual(result.pop(0), ([None, 'a0'], 'a0-a1'))
self.assertEqual(result.pop(0), ([None, 'a0', 'a0-a1'], 'a0-a1-a2'))
self.assertEqual(result.pop(0), ([None], 'b0'))
def test_ancestors_from_level_fails_at_level_below_baselevel(self):
level_prefixed = [
(7, 'a7'), # baselevel 7
(8, 'a7-a8'),
(9, 'a7-a8-a9'),
(6, 'b7'), # level below the base level
]
try:
list(prefix_ancestors_from_level(level_prefixed))
# TODO: 현재로서는 스택에 기본으로 root_item을 넣어놓는 구현 방식 때문에
# base level 바로 아래 level은 에러가 나지 않음
# self.fail('exception expected')
except:
pass
level_prefixed = [
(7, 'a7'), # baselevel 7
(8, 'a7-a8'),
(9, 'a7-a8-a9'),
(5, 'b7'), # level below the base level
]
try:
list(prefix_ancestors_from_level(level_prefixed))
self.fail('exception expected')
except:
pass
def test_ancestors_from_level_assert_fails_at_invalid_level_jump(self):
level_prefixed = [
(0, 'a0'),
(2, 'a0-a1-a2'), # invalid level jump
]
ancestors_prefixed = prefix_ancestors_from_level(level_prefixed)
try:
list(ancestors_prefixed)
self.fail('assert fails expected')
except:
pass
class TestTreeEvents(TestCase):
def test_tree_events(self):
event_prefixed_items = [(STARTEVENT, 'a'), (ENDEVENT, 'a')]
rootitem, childs = build_subtree(iter(event_prefixed_items[1:]))
self.assertEqual('a', rootitem)
self.assertEqual(0, len(childs))
event_prefixed_items = [
(STARTEVENT, 'a'),
(STARTEVENT, 'b'),
(ENDEVENT, 'b'),
(ENDEVENT, 'a')
]
self.assertEqual(
('a', [('b', [])]),
build_subtree(iter(event_prefixed_items[1:]))
)
event_prefixed_items = [
(STARTEVENT, 'a'),
(STARTEVENT, 'b'),
(STARTEVENT, 'c'), (ENDEVENT, 'c'),
(STARTEVENT, 'd'), (ENDEVENT, 'd'),
(ENDEVENT, 'b'),
(ENDEVENT, 'a')
]
result = build_subtree(iter(event_prefixed_items[1:]))
self.assertEqual(
('a', [('b', [('c', []), ('d', [])])]),
result
)
back = list(tree_events(*result))
self.assertEqual(event_prefixed_items, back)
class TestSubevents(TestCase):
def test_iter_subevents(self):
events = iter([(STARTEVENT, 'a'), (ENDEVENT, 'a')])
next(events)
subevents = iter_subevents(events)
self.assertEqual([(ENDEVENT, 'a')], list(subevents))
events = iter([(STARTEVENT, 'a'),
(STARTEVENT, 'b'),
(None, 'c'),
(ENDEVENT, 'b'),
(ENDEVENT, 'a')])
next(events)
subevents = iter_subevents(events)
self.assertEqual([(STARTEVENT, 'b'),
(None, 'c'),
(ENDEVENT, 'b'),
(ENDEVENT, 'a')], list(subevents))
events = iter([(STARTEVENT, 'a'),
(None, 'c'),
(ENDEVENT, 'a'),
(STARTEVENT, 'b'),
(None, 'd'),
(ENDEVENT, 'b')])
next(events)
subevents = iter_subevents(events)
self.assertEqual([(None, 'c'),
(ENDEVENT, 'a')], list(subevents))
self.assertEqual([(STARTEVENT, 'b'),
(None, 'd'),
(ENDEVENT, 'b')], list(events))