|
|
|
|
|
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'), |
|
|
(1, 'b0-a1'), |
|
|
(2, 'b0-a1-a2'), |
|
|
(1, 'b0-b1'), |
|
|
(2, 'b0-b1-b2'), |
|
|
(0, 'c0'), |
|
|
] |
|
|
|
|
|
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'), |
|
|
(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'), |
|
|
(8, 'a7-a8'), |
|
|
(9, 'a7-a8-a9'), |
|
|
(6, 'b7'), |
|
|
] |
|
|
try: |
|
|
list(prefix_ancestors_from_level(level_prefixed)) |
|
|
|
|
|
|
|
|
|
|
|
except: |
|
|
pass |
|
|
|
|
|
level_prefixed = [ |
|
|
(7, 'a7'), |
|
|
(8, 'a7-a8'), |
|
|
(9, 'a7-a8-a9'), |
|
|
(5, 'b7'), |
|
|
] |
|
|
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'), |
|
|
] |
|
|
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)) |
|
|
|