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