1import unittest
2from unittest import TestCase
3from metadata_model import *
4
5class TestInnerNamespace(TestCase):
6  def test_combine_children_by_name(self):
7    #
8    # Set up
9    #
10    kind = Kind("some_root_kind", parent=None)
11    ins_outer = InnerNamespace("static", parent=kind)
12    kind._namespaces = [ins_outer]
13
14    ins1 = InnerNamespace("ins1", parent=ins_outer)
15    ins1a = InnerNamespace("ins1", parent=ins_outer)  # same name deliberately
16    entry1 = Entry(name="entry1", type="int32", kind="static",
17                   parent=ins1)
18    entry2 = Entry(name="entry2", type="int32", kind="static",
19                   parent=ins1a)
20    entry3 = Entry(name="entry3", type="int32", kind="static",
21                   parent=ins_outer)
22
23    ins_outer._namespaces = [ins1, ins1a]
24    ins_outer._entries = [entry3]
25
26    ins1._entries = [entry1]
27    ins1a._entries = [entry2]
28
29    #
30    # Test
31    #
32    combined_children_namespace = ins_outer.combine_children_by_name()
33
34    self.assertIsInstance(combined_children_namespace, InnerNamespace)
35    combined_ins = [i for i in combined_children_namespace.namespaces]
36    combined_ent = [i for i in combined_children_namespace.entries]
37
38    self.assertEquals(kind, combined_children_namespace.parent)
39    self.assertEquals(1, len(combined_ins))
40    self.assertEquals(1, len(combined_ent))
41
42    self.assertEquals("ins1", combined_ins[0].name)
43    self.assertEquals("entry3", combined_ent[0].name)
44
45    new_ins = combined_ins[0]
46    self.assertIn(entry1, new_ins.entries)
47    self.assertIn(entry2, new_ins.entries)
48
49
50class TestKind(TestCase):
51  def test_combine_kinds_into_single_node(self):
52    #
53    # Set up
54    #
55    section = Section("some_section", parent=None)
56    kind_static = Kind("static", parent=section)
57    kind_dynamic = Kind("dynamic", parent=section)
58    section._kinds = [kind_static, kind_dynamic]
59
60    ins1 = InnerNamespace("ins1", parent=kind_static)
61    ins2 = InnerNamespace("ins2", parent=kind_dynamic)
62    entry1 = Entry(name="entry1", type="int32", kind="static",
63                   parent=kind_static)
64    entry2 = Entry(name="entry2", type="int32", kind="static",
65                   parent=kind_dynamic)
66
67    kind_static._namespaces = [ins1]
68    kind_static._entries = [entry1]
69
70    kind_dynamic._namespaces = [ins2]
71    kind_dynamic._entries = [entry2]
72
73    #
74    # Test
75    #
76    combined_kind = section.combine_kinds_into_single_node()
77
78    self.assertEquals(section, combined_kind.parent)
79
80    self.assertIn(ins1, combined_kind.namespaces)
81    self.assertIn(ins2, combined_kind.namespaces)
82
83    self.assertIn(entry1, combined_kind.entries)
84    self.assertIn(entry2, combined_kind.entries)
85
86  def test_combine_children_by_name(self):
87    #
88    # Set up
89    #
90    section = Section("some_section", parent=None)
91    kind_static = Kind("static", parent=section)
92    section._kinds = [kind_static]
93
94    ins1 = InnerNamespace("ins1", parent=kind_static)
95    ins1a = InnerNamespace("ins1", parent=kind_static)  # same name deliberately
96    entry1 = Entry(name="entry1", type="int32", kind="static",
97                   parent=ins1)
98    entry2 = Entry(name="entry2", type="int32", kind="static",
99                   parent=ins1a)
100    entry3 = Entry(name="entry3", type="int32", kind="static",
101                   parent=kind_static)
102
103    kind_static._namespaces = [ins1, ins1a]
104    kind_static._entries = [entry3]
105
106    ins1._entries = [entry1]
107    ins1a._entries = [entry2]
108
109    #
110    # Test
111    #
112    combined_children_kind = kind_static.combine_children_by_name()
113
114    self.assertIsInstance(combined_children_kind, Kind)
115    combined_ins = [i for i in combined_children_kind.namespaces]
116    combined_ent = [i for i in combined_children_kind.entries]
117
118    self.assertEquals(section, combined_children_kind.parent)
119    self.assertEquals(1, len(combined_ins))
120    self.assertEquals(1, len(combined_ent))
121
122    self.assertEquals("ins1", combined_ins[0].name)
123    self.assertEquals("entry3", combined_ent[0].name)
124
125    new_ins = combined_ins[0]
126    self.assertIn(entry1, new_ins.entries)
127    self.assertIn(entry2, new_ins.entries)
128
129if __name__ == '__main__':
130    unittest.main()
131