1*786e6a6cSAndrew Jefferyimport unittest
2*786e6a6cSAndrew Jeffery
3*786e6a6cSAndrew Jefferyfrom .pathtree import PathTree
4*786e6a6cSAndrew Jefferyfrom pprint import pprint
5*786e6a6cSAndrew Jeffery
6*786e6a6cSAndrew Jefferyclass PathTreeTest(unittest.TestCase):
7*786e6a6cSAndrew Jeffery    def test_set_depth_1(self):
8*786e6a6cSAndrew Jeffery        pt = PathTree()
9*786e6a6cSAndrew Jeffery        pt['/a'] = 1
10*786e6a6cSAndrew Jeffery
11*786e6a6cSAndrew Jeffery    def test_set_depth_2(self):
12*786e6a6cSAndrew Jeffery        pt = PathTree()
13*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
14*786e6a6cSAndrew Jeffery
15*786e6a6cSAndrew Jeffery    def test_get_no_key(self):
16*786e6a6cSAndrew Jeffery        pt = PathTree()
17*786e6a6cSAndrew Jeffery        with self.assertRaises(KeyError):
18*786e6a6cSAndrew Jeffery            pt['/foo']
19*786e6a6cSAndrew Jeffery
20*786e6a6cSAndrew Jeffery    def test_get_depth_1(self):
21*786e6a6cSAndrew Jeffery        pt = PathTree()
22*786e6a6cSAndrew Jeffery        pt['/a'] = 1
23*786e6a6cSAndrew Jeffery        self.assertEqual(1, pt['/a'])
24*786e6a6cSAndrew Jeffery
25*786e6a6cSAndrew Jeffery    def test_get_depth_2(self):
26*786e6a6cSAndrew Jeffery        pt = PathTree()
27*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
28*786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/a/b']), set(pt.keys()))
29*786e6a6cSAndrew Jeffery        self.assertEqual(2, pt['/a/b'])
30*786e6a6cSAndrew Jeffery
31*786e6a6cSAndrew Jeffery    def test_get_default(self):
32*786e6a6cSAndrew Jeffery        self.assertEquals(1, PathTree().get('/a', 1))
33*786e6a6cSAndrew Jeffery
34*786e6a6cSAndrew Jeffery    def test_get_present(self):
35*786e6a6cSAndrew Jeffery        pt = PathTree()
36*786e6a6cSAndrew Jeffery        pt['/a'] = 1
37*786e6a6cSAndrew Jeffery        self.assertEquals(1, pt.get('/a'))
38*786e6a6cSAndrew Jeffery
39*786e6a6cSAndrew Jeffery    def test_set_2_depth_1(self):
40*786e6a6cSAndrew Jeffery        pt = PathTree()
41*786e6a6cSAndrew Jeffery        pt['/a'] = 1.1
42*786e6a6cSAndrew Jeffery        pt['/b'] = 1.2
43*786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/b']), set(pt.keys()))
44*786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a'])
45*786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/b'])
46*786e6a6cSAndrew Jeffery
47*786e6a6cSAndrew Jeffery    def test_set_2_depth_2_common_parent(self):
48*786e6a6cSAndrew Jeffery        pt = PathTree()
49*786e6a6cSAndrew Jeffery        pt['/a/b'] = 1.1
50*786e6a6cSAndrew Jeffery        pt['/a/c'] = 1.2
51*786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/a/b', '/a/c']), set(pt.keys()))
52*786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a/b'])
53*786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/a/c'])
54*786e6a6cSAndrew Jeffery
55*786e6a6cSAndrew Jeffery    def test_set_2_depth_2_separate_parent(self):
56*786e6a6cSAndrew Jeffery        pt = PathTree()
57*786e6a6cSAndrew Jeffery        pt['/a/b'] = 1.1
58*786e6a6cSAndrew Jeffery        pt['/b/c'] = 1.2
59*786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/b', '/a/b', '/b/c']), set(pt.keys()))
60*786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a/b'])
61*786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/b/c'])
62*786e6a6cSAndrew Jeffery
63*786e6a6cSAndrew Jeffery    def test_dumpd_empty(self):
64*786e6a6cSAndrew Jeffery        pt = PathTree()
65*786e6a6cSAndrew Jeffery        self.assertEquals(dict(), pt.dumpd())
66*786e6a6cSAndrew Jeffery
67*786e6a6cSAndrew Jeffery    def test_dumpd_populated(self):
68*786e6a6cSAndrew Jeffery        pt = PathTree()
69*786e6a6cSAndrew Jeffery        pt['/a/b'] = { 1 : 1.1 }
70*786e6a6cSAndrew Jeffery        pt['/b/c'] = { 2 : 1.2 }
71*786e6a6cSAndrew Jeffery        dump = pt.dumpd()
72*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/']), set(dump.keys()))
73*786e6a6cSAndrew Jeffery        self.assertEquals(set(['a', 'b']), set(dump['/'].keys()))
74*786e6a6cSAndrew Jeffery        self.assertEquals(set(['b']), set(dump['/']['a'].keys()))
75*786e6a6cSAndrew Jeffery        self.assertEquals(set(['c']), set(dump['/']['b'].keys()))
76*786e6a6cSAndrew Jeffery
77*786e6a6cSAndrew Jeffery    def test_del_set_1_depth_1(self):
78*786e6a6cSAndrew Jeffery        pt = PathTree()
79*786e6a6cSAndrew Jeffery        pt['/a'] = 1
80*786e6a6cSAndrew Jeffery        del pt['/a']
81*786e6a6cSAndrew Jeffery        self.assertEquals(0, len(pt.keys()))
82*786e6a6cSAndrew Jeffery
83*786e6a6cSAndrew Jeffery    def test_del_set_2_depth_1(self):
84*786e6a6cSAndrew Jeffery        pt = PathTree()
85*786e6a6cSAndrew Jeffery        pt['/a'] = 1
86*786e6a6cSAndrew Jeffery        pt['/b'] = 2
87*786e6a6cSAndrew Jeffery        del pt['/a']
88*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/b']), set(pt.keys()))
89*786e6a6cSAndrew Jeffery
90*786e6a6cSAndrew Jeffery    def test_del_set_2_depth_2(self):
91*786e6a6cSAndrew Jeffery        pt = PathTree()
92*786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
93*786e6a6cSAndrew Jeffery        pt['/b/c'] = 2
94*786e6a6cSAndrew Jeffery        del pt['/a/b']
95*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/b/c', '/b']), set(pt.keys()))
96*786e6a6cSAndrew Jeffery
97*786e6a6cSAndrew Jeffery    def test_setdefault_present(self):
98*786e6a6cSAndrew Jeffery        pt = PathTree()
99*786e6a6cSAndrew Jeffery        pt['/a'] = 1
100*786e6a6cSAndrew Jeffery        self.assertEquals(1, pt.setdefault('/a', 2))
101*786e6a6cSAndrew Jeffery
102*786e6a6cSAndrew Jeffery    def test_setdefault_absent(self):
103*786e6a6cSAndrew Jeffery        self.assertEquals(1, PathTree().setdefault('/a', 1))
104*786e6a6cSAndrew Jeffery
105*786e6a6cSAndrew Jeffery    def test_del_no_key(self):
106*786e6a6cSAndrew Jeffery        with self.assertRaises(KeyError):
107*786e6a6cSAndrew Jeffery            del PathTree()['/a']
108*786e6a6cSAndrew Jeffery
109*786e6a6cSAndrew Jeffery    def test_values_1(self):
110*786e6a6cSAndrew Jeffery        pt = PathTree()
111*786e6a6cSAndrew Jeffery        pt['/a'] = 1
112*786e6a6cSAndrew Jeffery        self.assertEquals(set([1]), set(pt.values()))
113*786e6a6cSAndrew Jeffery
114*786e6a6cSAndrew Jeffery    def test_values_2(self):
115*786e6a6cSAndrew Jeffery        pt = PathTree()
116*786e6a6cSAndrew Jeffery        pt['/a'] = 1
117*786e6a6cSAndrew Jeffery        pt['/b'] = 2
118*786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
119*786e6a6cSAndrew Jeffery
120*786e6a6cSAndrew Jeffery    def test_items_1(self):
121*786e6a6cSAndrew Jeffery        pt = PathTree()
122*786e6a6cSAndrew Jeffery        pt['/a'] = 1
123*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.items()))
124*786e6a6cSAndrew Jeffery
125*786e6a6cSAndrew Jeffery    def test_items_2(self):
126*786e6a6cSAndrew Jeffery        pt = PathTree()
127*786e6a6cSAndrew Jeffery        pt['/a'] = 1
128*786e6a6cSAndrew Jeffery        pt['/b'] = 2
129*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1), ('/b', 2)]), set(pt.items()))
130*786e6a6cSAndrew Jeffery
131*786e6a6cSAndrew Jeffery    def test_items_depth_2(self):
132*786e6a6cSAndrew Jeffery        pt = PathTree()
133*786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
134*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', None), ('/a/b', 1)]), set(pt.items()))
135*786e6a6cSAndrew Jeffery
136*786e6a6cSAndrew Jeffery    def test_dataitems_0(self):
137*786e6a6cSAndrew Jeffery        pt = PathTree()
138*786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.dataitems()))
139*786e6a6cSAndrew Jeffery
140*786e6a6cSAndrew Jeffery    def test_dataitems_1(self):
141*786e6a6cSAndrew Jeffery        pt = PathTree()
142*786e6a6cSAndrew Jeffery        pt['/b'] = 1
143*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/b', 1)]), set(pt.dataitems()))
144*786e6a6cSAndrew Jeffery
145*786e6a6cSAndrew Jeffery    def test_dataitems_2(self):
146*786e6a6cSAndrew Jeffery        pt = PathTree()
147*786e6a6cSAndrew Jeffery        pt['/a'] = 1
148*786e6a6cSAndrew Jeffery        pt['/b/c'] = 2
149*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1), ('/b/c', 2)]), set(pt.dataitems()))
150*786e6a6cSAndrew Jeffery
151*786e6a6cSAndrew Jeffery    def test_get_children(self):
152*786e6a6cSAndrew Jeffery        pt = PathTree()
153*786e6a6cSAndrew Jeffery        pt['/a'] = 1
154*786e6a6cSAndrew Jeffery        self.assertEquals(set(['a']), set(pt.get_children('/')))
155*786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.get_children('/a')))
156*786e6a6cSAndrew Jeffery
157*786e6a6cSAndrew Jeffery    def test_get_children_nested(self):
158*786e6a6cSAndrew Jeffery        pt = PathTree()
159*786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
160*786e6a6cSAndrew Jeffery        self.assertEquals(set(['a']), set(pt.get_children('/')))
161*786e6a6cSAndrew Jeffery        self.assertEquals(set(['b']), set(pt.get_children('/a')))
162*786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.get_children('/a/b')))
163*786e6a6cSAndrew Jeffery
164*786e6a6cSAndrew Jeffery    def test_demote_1(self):
165*786e6a6cSAndrew Jeffery        pt = PathTree()
166*786e6a6cSAndrew Jeffery        pt['/a'] = 1
167*786e6a6cSAndrew Jeffery        self.assertEquals([1], pt.values())
168*786e6a6cSAndrew Jeffery        pt.demote('/a')
169*786e6a6cSAndrew Jeffery        self.assertEquals([None], pt.values())
170*786e6a6cSAndrew Jeffery
171*786e6a6cSAndrew Jeffery    def test_demote_2(self):
172*786e6a6cSAndrew Jeffery        pt = PathTree()
173*786e6a6cSAndrew Jeffery        pt['/a'] = 1
174*786e6a6cSAndrew Jeffery        pt['/b'] = 2
175*786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
176*786e6a6cSAndrew Jeffery        pt.demote('/a')
177*786e6a6cSAndrew Jeffery        self.assertEquals(set([None, 2]), set(pt.values()))
178*786e6a6cSAndrew Jeffery
179*786e6a6cSAndrew Jeffery    def test_demote_nested(self):
180*786e6a6cSAndrew Jeffery        pt = PathTree()
181*786e6a6cSAndrew Jeffery        pt['/a'] = 1
182*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
183*786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
184*786e6a6cSAndrew Jeffery        pt.demote('/a/b')
185*786e6a6cSAndrew Jeffery        self.assertEquals(set([1, None]), set(pt.values()))
186*786e6a6cSAndrew Jeffery
187*786e6a6cSAndrew Jeffery    def test_iter(self):
188*786e6a6cSAndrew Jeffery        pt = PathTree()
189*786e6a6cSAndrew Jeffery        pt['/a'] = 1
190*786e6a6cSAndrew Jeffery        i = iter(pt)
191*786e6a6cSAndrew Jeffery        k, v = next(i)
192*786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
193*786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
194*786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
195*786e6a6cSAndrew Jeffery            next(i)
196*786e6a6cSAndrew Jeffery
197*786e6a6cSAndrew Jeffery    def test_iter_2(self):
198*786e6a6cSAndrew Jeffery        pt = PathTree()
199*786e6a6cSAndrew Jeffery        pt['/a'] = 1
200*786e6a6cSAndrew Jeffery        pt['/b'] = 2
201*786e6a6cSAndrew Jeffery        i = iter(pt)
202*786e6a6cSAndrew Jeffery        k, v = next(i)
203*786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
204*786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
205*786e6a6cSAndrew Jeffery        k, v = next(i)
206*786e6a6cSAndrew Jeffery        self.assertEquals('/b', k)
207*786e6a6cSAndrew Jeffery        self.assertEquals(2, v)
208*786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
209*786e6a6cSAndrew Jeffery            next(i)
210*786e6a6cSAndrew Jeffery
211*786e6a6cSAndrew Jeffery    def test_iter_2_nested(self):
212*786e6a6cSAndrew Jeffery        pt = PathTree()
213*786e6a6cSAndrew Jeffery        pt['/a'] = 1
214*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
215*786e6a6cSAndrew Jeffery        i = iter(pt)
216*786e6a6cSAndrew Jeffery        k, v = next(i)
217*786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
218*786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
219*786e6a6cSAndrew Jeffery        k, v = next(i)
220*786e6a6cSAndrew Jeffery        self.assertEquals('/a/b', k)
221*786e6a6cSAndrew Jeffery        self.assertEquals(2, v)
222*786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
223*786e6a6cSAndrew Jeffery            next(i)
224*786e6a6cSAndrew Jeffery
225*786e6a6cSAndrew Jeffery    def test_keys_2_nested_depth_1(self):
226*786e6a6cSAndrew Jeffery        pt = PathTree()
227*786e6a6cSAndrew Jeffery        pt['/a'] = 1
228*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
229*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a']), set(pt.keys(depth=1)))
230*786e6a6cSAndrew Jeffery
231*786e6a6cSAndrew Jeffery    def test_values_2_nested_depth_1(self):
232*786e6a6cSAndrew Jeffery        pt = PathTree()
233*786e6a6cSAndrew Jeffery        pt['/a'] = 1
234*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
235*786e6a6cSAndrew Jeffery        self.assertEquals(set([1]), set(pt.values(depth=1)))
236*786e6a6cSAndrew Jeffery
237*786e6a6cSAndrew Jeffery    def test_items_2_nested_depth_1(self):
238*786e6a6cSAndrew Jeffery        pt = PathTree()
239*786e6a6cSAndrew Jeffery        pt['/a'] = 1
240*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
241*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.items(depth=1)))
242*786e6a6cSAndrew Jeffery
243*786e6a6cSAndrew Jeffery    def test_dataitems_2_nested_depth_1(self):
244*786e6a6cSAndrew Jeffery        pt = PathTree()
245*786e6a6cSAndrew Jeffery        pt['/a'] = 1
246*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
247*786e6a6cSAndrew Jeffery        pt['/b'] = None
248*786e6a6cSAndrew Jeffery        pt['/b/c'] = 1
249*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.dataitems(depth=1)))
250*786e6a6cSAndrew Jeffery
251*786e6a6cSAndrew Jeffery    def test_keys_2_nested_subtree(self):
252*786e6a6cSAndrew Jeffery        pt = PathTree()
253*786e6a6cSAndrew Jeffery        pt['/a'] = 1
254*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
255*786e6a6cSAndrew Jeffery        pt['/b'] = 3
256*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a/b']), set(pt.keys(subtree='/a')))
257*786e6a6cSAndrew Jeffery
258*786e6a6cSAndrew Jeffery    def test_values_2_nested_subtree(self):
259*786e6a6cSAndrew Jeffery        pt = PathTree()
260*786e6a6cSAndrew Jeffery        pt['/a'] = 1
261*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
262*786e6a6cSAndrew Jeffery        pt['/b'] = 3
263*786e6a6cSAndrew Jeffery        self.assertEquals(set([2]), set(pt.values(subtree='/a')))
264*786e6a6cSAndrew Jeffery
265*786e6a6cSAndrew Jeffery    def test_items_2_nested_subtree(self):
266*786e6a6cSAndrew Jeffery        pt = PathTree()
267*786e6a6cSAndrew Jeffery        pt['/a'] = 1
268*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
269*786e6a6cSAndrew Jeffery        pt['/b'] = 3
270*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.items(subtree='/a')))
271*786e6a6cSAndrew Jeffery
272*786e6a6cSAndrew Jeffery    def test_dataitems_2_nested_subtree(self):
273*786e6a6cSAndrew Jeffery        pt = PathTree()
274*786e6a6cSAndrew Jeffery        pt['/a'] = 1
275*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
276*786e6a6cSAndrew Jeffery        pt['/a/c'] = None
277*786e6a6cSAndrew Jeffery        pt['/b'] = 3
278*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.dataitems(subtree='/a')))
279*786e6a6cSAndrew Jeffery
280*786e6a6cSAndrew Jeffery    def test_keys_3_nested_subtree_depth_1(self):
281*786e6a6cSAndrew Jeffery        pt = PathTree()
282*786e6a6cSAndrew Jeffery        pt['/a'] = 1
283*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
284*786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
285*786e6a6cSAndrew Jeffery        pt['/b'] = 4
286*786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a/b']), set(pt.keys(subtree='/a', depth=1)))
287*786e6a6cSAndrew Jeffery
288*786e6a6cSAndrew Jeffery    def test_values_3_nested_subtree_depth_1(self):
289*786e6a6cSAndrew Jeffery        pt = PathTree()
290*786e6a6cSAndrew Jeffery        pt['/a'] = 1
291*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
292*786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
293*786e6a6cSAndrew Jeffery        pt['/b'] = 4
294*786e6a6cSAndrew Jeffery        self.assertEquals(set([2]), set(pt.values(subtree='/a', depth=1)))
295*786e6a6cSAndrew Jeffery
296*786e6a6cSAndrew Jeffery    def test_items_3_nested_subtree_depth_1(self):
297*786e6a6cSAndrew Jeffery        pt = PathTree()
298*786e6a6cSAndrew Jeffery        pt['/a'] = 1
299*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
300*786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
301*786e6a6cSAndrew Jeffery        pt['/b'] = 4
302*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.items(subtree='/a', depth=1)))
303*786e6a6cSAndrew Jeffery
304*786e6a6cSAndrew Jeffery    def test_items_3_nested_subtree_depth_1(self):
305*786e6a6cSAndrew Jeffery        pt = PathTree()
306*786e6a6cSAndrew Jeffery        pt['/a'] = 1
307*786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
308*786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
309*786e6a6cSAndrew Jeffery        pt['/a/c'] = None
310*786e6a6cSAndrew Jeffery        pt['/b'] = 4
311*786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.dataitems(subtree='/a', depth=1)))
312