1786e6a6cSAndrew Jefferyimport unittest
2786e6a6cSAndrew Jeffery
3786e6a6cSAndrew Jefferyfrom .pathtree import PathTree
4786e6a6cSAndrew Jeffery
5786e6a6cSAndrew Jefferyclass PathTreeTest(unittest.TestCase):
6786e6a6cSAndrew Jeffery    def test_set_depth_1(self):
7786e6a6cSAndrew Jeffery        pt = PathTree()
8786e6a6cSAndrew Jeffery        pt['/a'] = 1
9786e6a6cSAndrew Jeffery
10786e6a6cSAndrew Jeffery    def test_set_depth_2(self):
11786e6a6cSAndrew Jeffery        pt = PathTree()
12786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
13786e6a6cSAndrew Jeffery
14786e6a6cSAndrew Jeffery    def test_get_no_key(self):
15786e6a6cSAndrew Jeffery        pt = PathTree()
16786e6a6cSAndrew Jeffery        with self.assertRaises(KeyError):
17786e6a6cSAndrew Jeffery            pt['/foo']
18786e6a6cSAndrew Jeffery
19786e6a6cSAndrew Jeffery    def test_get_depth_1(self):
20786e6a6cSAndrew Jeffery        pt = PathTree()
21786e6a6cSAndrew Jeffery        pt['/a'] = 1
22786e6a6cSAndrew Jeffery        self.assertEqual(1, pt['/a'])
23786e6a6cSAndrew Jeffery
24786e6a6cSAndrew Jeffery    def test_get_depth_2(self):
25786e6a6cSAndrew Jeffery        pt = PathTree()
26786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
27786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/a/b']), set(pt.keys()))
28786e6a6cSAndrew Jeffery        self.assertEqual(2, pt['/a/b'])
29786e6a6cSAndrew Jeffery
30786e6a6cSAndrew Jeffery    def test_get_default(self):
31786e6a6cSAndrew Jeffery        self.assertEquals(1, PathTree().get('/a', 1))
32786e6a6cSAndrew Jeffery
33786e6a6cSAndrew Jeffery    def test_get_present(self):
34786e6a6cSAndrew Jeffery        pt = PathTree()
35786e6a6cSAndrew Jeffery        pt['/a'] = 1
36786e6a6cSAndrew Jeffery        self.assertEquals(1, pt.get('/a'))
37786e6a6cSAndrew Jeffery
38786e6a6cSAndrew Jeffery    def test_set_2_depth_1(self):
39786e6a6cSAndrew Jeffery        pt = PathTree()
40786e6a6cSAndrew Jeffery        pt['/a'] = 1.1
41786e6a6cSAndrew Jeffery        pt['/b'] = 1.2
42786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/b']), set(pt.keys()))
43786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a'])
44786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/b'])
45786e6a6cSAndrew Jeffery
46786e6a6cSAndrew Jeffery    def test_set_2_depth_2_common_parent(self):
47786e6a6cSAndrew Jeffery        pt = PathTree()
48786e6a6cSAndrew Jeffery        pt['/a/b'] = 1.1
49786e6a6cSAndrew Jeffery        pt['/a/c'] = 1.2
50786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/a/b', '/a/c']), set(pt.keys()))
51786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a/b'])
52786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/a/c'])
53786e6a6cSAndrew Jeffery
54786e6a6cSAndrew Jeffery    def test_set_2_depth_2_separate_parent(self):
55786e6a6cSAndrew Jeffery        pt = PathTree()
56786e6a6cSAndrew Jeffery        pt['/a/b'] = 1.1
57786e6a6cSAndrew Jeffery        pt['/b/c'] = 1.2
58786e6a6cSAndrew Jeffery        self.assertEqual(set(['/a', '/b', '/a/b', '/b/c']), set(pt.keys()))
59786e6a6cSAndrew Jeffery        self.assertEqual(1.1, pt['/a/b'])
60786e6a6cSAndrew Jeffery        self.assertEqual(1.2, pt['/b/c'])
61786e6a6cSAndrew Jeffery
62786e6a6cSAndrew Jeffery    def test_dumpd_empty(self):
63786e6a6cSAndrew Jeffery        pt = PathTree()
64786e6a6cSAndrew Jeffery        self.assertEquals(dict(), pt.dumpd())
65786e6a6cSAndrew Jeffery
66786e6a6cSAndrew Jeffery    def test_dumpd_populated(self):
67786e6a6cSAndrew Jeffery        pt = PathTree()
68786e6a6cSAndrew Jeffery        pt['/a/b'] = { 1 : 1.1 }
69786e6a6cSAndrew Jeffery        pt['/b/c'] = { 2 : 1.2 }
70786e6a6cSAndrew Jeffery        dump = pt.dumpd()
71786e6a6cSAndrew Jeffery        self.assertEquals(set(['/']), set(dump.keys()))
72786e6a6cSAndrew Jeffery        self.assertEquals(set(['a', 'b']), set(dump['/'].keys()))
73786e6a6cSAndrew Jeffery        self.assertEquals(set(['b']), set(dump['/']['a'].keys()))
74786e6a6cSAndrew Jeffery        self.assertEquals(set(['c']), set(dump['/']['b'].keys()))
75786e6a6cSAndrew Jeffery
76786e6a6cSAndrew Jeffery    def test_del_set_1_depth_1(self):
77786e6a6cSAndrew Jeffery        pt = PathTree()
78786e6a6cSAndrew Jeffery        pt['/a'] = 1
79786e6a6cSAndrew Jeffery        del pt['/a']
80786e6a6cSAndrew Jeffery        self.assertEquals(0, len(pt.keys()))
81786e6a6cSAndrew Jeffery
82786e6a6cSAndrew Jeffery    def test_del_set_2_depth_1(self):
83786e6a6cSAndrew Jeffery        pt = PathTree()
84786e6a6cSAndrew Jeffery        pt['/a'] = 1
85786e6a6cSAndrew Jeffery        pt['/b'] = 2
86786e6a6cSAndrew Jeffery        del pt['/a']
87786e6a6cSAndrew Jeffery        self.assertEquals(set(['/b']), set(pt.keys()))
88786e6a6cSAndrew Jeffery
89786e6a6cSAndrew Jeffery    def test_del_set_2_depth_2(self):
90786e6a6cSAndrew Jeffery        pt = PathTree()
91786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
92786e6a6cSAndrew Jeffery        pt['/b/c'] = 2
93786e6a6cSAndrew Jeffery        del pt['/a/b']
94786e6a6cSAndrew Jeffery        self.assertEquals(set(['/b/c', '/b']), set(pt.keys()))
95786e6a6cSAndrew Jeffery
96786e6a6cSAndrew Jeffery    def test_setdefault_present(self):
97786e6a6cSAndrew Jeffery        pt = PathTree()
98786e6a6cSAndrew Jeffery        pt['/a'] = 1
99786e6a6cSAndrew Jeffery        self.assertEquals(1, pt.setdefault('/a', 2))
100786e6a6cSAndrew Jeffery
101786e6a6cSAndrew Jeffery    def test_setdefault_absent(self):
102786e6a6cSAndrew Jeffery        self.assertEquals(1, PathTree().setdefault('/a', 1))
103786e6a6cSAndrew Jeffery
104786e6a6cSAndrew Jeffery    def test_del_no_key(self):
105786e6a6cSAndrew Jeffery        with self.assertRaises(KeyError):
106786e6a6cSAndrew Jeffery            del PathTree()['/a']
107786e6a6cSAndrew Jeffery
108786e6a6cSAndrew Jeffery    def test_values_1(self):
109786e6a6cSAndrew Jeffery        pt = PathTree()
110786e6a6cSAndrew Jeffery        pt['/a'] = 1
111786e6a6cSAndrew Jeffery        self.assertEquals(set([1]), set(pt.values()))
112786e6a6cSAndrew Jeffery
113786e6a6cSAndrew Jeffery    def test_values_2(self):
114786e6a6cSAndrew Jeffery        pt = PathTree()
115786e6a6cSAndrew Jeffery        pt['/a'] = 1
116786e6a6cSAndrew Jeffery        pt['/b'] = 2
117786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
118786e6a6cSAndrew Jeffery
119786e6a6cSAndrew Jeffery    def test_items_1(self):
120786e6a6cSAndrew Jeffery        pt = PathTree()
121786e6a6cSAndrew Jeffery        pt['/a'] = 1
122786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.items()))
123786e6a6cSAndrew Jeffery
124786e6a6cSAndrew Jeffery    def test_items_2(self):
125786e6a6cSAndrew Jeffery        pt = PathTree()
126786e6a6cSAndrew Jeffery        pt['/a'] = 1
127786e6a6cSAndrew Jeffery        pt['/b'] = 2
128786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1), ('/b', 2)]), set(pt.items()))
129786e6a6cSAndrew Jeffery
130786e6a6cSAndrew Jeffery    def test_items_depth_2(self):
131786e6a6cSAndrew Jeffery        pt = PathTree()
132786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
133786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', None), ('/a/b', 1)]), set(pt.items()))
134786e6a6cSAndrew Jeffery
135786e6a6cSAndrew Jeffery    def test_dataitems_0(self):
136786e6a6cSAndrew Jeffery        pt = PathTree()
137786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.dataitems()))
138786e6a6cSAndrew Jeffery
139786e6a6cSAndrew Jeffery    def test_dataitems_1(self):
140786e6a6cSAndrew Jeffery        pt = PathTree()
141786e6a6cSAndrew Jeffery        pt['/b'] = 1
142786e6a6cSAndrew Jeffery        self.assertEquals(set([('/b', 1)]), set(pt.dataitems()))
143786e6a6cSAndrew Jeffery
144786e6a6cSAndrew Jeffery    def test_dataitems_2(self):
145786e6a6cSAndrew Jeffery        pt = PathTree()
146786e6a6cSAndrew Jeffery        pt['/a'] = 1
147786e6a6cSAndrew Jeffery        pt['/b/c'] = 2
148786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1), ('/b/c', 2)]), set(pt.dataitems()))
149786e6a6cSAndrew Jeffery
150786e6a6cSAndrew Jeffery    def test_get_children(self):
151786e6a6cSAndrew Jeffery        pt = PathTree()
152786e6a6cSAndrew Jeffery        pt['/a'] = 1
153786e6a6cSAndrew Jeffery        self.assertEquals(set(['a']), set(pt.get_children('/')))
154786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.get_children('/a')))
155786e6a6cSAndrew Jeffery
156786e6a6cSAndrew Jeffery    def test_get_children_nested(self):
157786e6a6cSAndrew Jeffery        pt = PathTree()
158786e6a6cSAndrew Jeffery        pt['/a/b'] = 1
159786e6a6cSAndrew Jeffery        self.assertEquals(set(['a']), set(pt.get_children('/')))
160786e6a6cSAndrew Jeffery        self.assertEquals(set(['b']), set(pt.get_children('/a')))
161786e6a6cSAndrew Jeffery        self.assertEquals(set(), set(pt.get_children('/a/b')))
162786e6a6cSAndrew Jeffery
163786e6a6cSAndrew Jeffery    def test_demote_1(self):
164786e6a6cSAndrew Jeffery        pt = PathTree()
165786e6a6cSAndrew Jeffery        pt['/a'] = 1
166786e6a6cSAndrew Jeffery        self.assertEquals([1], pt.values())
167786e6a6cSAndrew Jeffery        pt.demote('/a')
168786e6a6cSAndrew Jeffery        self.assertEquals([None], pt.values())
169786e6a6cSAndrew Jeffery
170786e6a6cSAndrew Jeffery    def test_demote_2(self):
171786e6a6cSAndrew Jeffery        pt = PathTree()
172786e6a6cSAndrew Jeffery        pt['/a'] = 1
173786e6a6cSAndrew Jeffery        pt['/b'] = 2
174786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
175786e6a6cSAndrew Jeffery        pt.demote('/a')
176786e6a6cSAndrew Jeffery        self.assertEquals(set([None, 2]), set(pt.values()))
177786e6a6cSAndrew Jeffery
178786e6a6cSAndrew Jeffery    def test_demote_nested(self):
179786e6a6cSAndrew Jeffery        pt = PathTree()
180786e6a6cSAndrew Jeffery        pt['/a'] = 1
181786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
182786e6a6cSAndrew Jeffery        self.assertEquals(set([1, 2]), set(pt.values()))
183786e6a6cSAndrew Jeffery        pt.demote('/a/b')
184786e6a6cSAndrew Jeffery        self.assertEquals(set([1, None]), set(pt.values()))
185786e6a6cSAndrew Jeffery
186786e6a6cSAndrew Jeffery    def test_iter(self):
187786e6a6cSAndrew Jeffery        pt = PathTree()
188786e6a6cSAndrew Jeffery        pt['/a'] = 1
189786e6a6cSAndrew Jeffery        i = iter(pt)
190786e6a6cSAndrew Jeffery        k, v = next(i)
191786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
192786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
193786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
194786e6a6cSAndrew Jeffery            next(i)
195786e6a6cSAndrew Jeffery
196786e6a6cSAndrew Jeffery    def test_iter_2(self):
197786e6a6cSAndrew Jeffery        pt = PathTree()
198786e6a6cSAndrew Jeffery        pt['/a'] = 1
199786e6a6cSAndrew Jeffery        pt['/b'] = 2
200786e6a6cSAndrew Jeffery        i = iter(pt)
201786e6a6cSAndrew Jeffery        k, v = next(i)
202786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
203786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
204786e6a6cSAndrew Jeffery        k, v = next(i)
205786e6a6cSAndrew Jeffery        self.assertEquals('/b', k)
206786e6a6cSAndrew Jeffery        self.assertEquals(2, v)
207786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
208786e6a6cSAndrew Jeffery            next(i)
209786e6a6cSAndrew Jeffery
210786e6a6cSAndrew Jeffery    def test_iter_2_nested(self):
211786e6a6cSAndrew Jeffery        pt = PathTree()
212786e6a6cSAndrew Jeffery        pt['/a'] = 1
213786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
214786e6a6cSAndrew Jeffery        i = iter(pt)
215786e6a6cSAndrew Jeffery        k, v = next(i)
216786e6a6cSAndrew Jeffery        self.assertEquals('/a', k)
217786e6a6cSAndrew Jeffery        self.assertEquals(1, v)
218786e6a6cSAndrew Jeffery        k, v = next(i)
219786e6a6cSAndrew Jeffery        self.assertEquals('/a/b', k)
220786e6a6cSAndrew Jeffery        self.assertEquals(2, v)
221786e6a6cSAndrew Jeffery        with self.assertRaises(StopIteration):
222786e6a6cSAndrew Jeffery            next(i)
223786e6a6cSAndrew Jeffery
224786e6a6cSAndrew Jeffery    def test_keys_2_nested_depth_1(self):
225786e6a6cSAndrew Jeffery        pt = PathTree()
226786e6a6cSAndrew Jeffery        pt['/a'] = 1
227786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
228786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a']), set(pt.keys(depth=1)))
229786e6a6cSAndrew Jeffery
230786e6a6cSAndrew Jeffery    def test_values_2_nested_depth_1(self):
231786e6a6cSAndrew Jeffery        pt = PathTree()
232786e6a6cSAndrew Jeffery        pt['/a'] = 1
233786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
234786e6a6cSAndrew Jeffery        self.assertEquals(set([1]), set(pt.values(depth=1)))
235786e6a6cSAndrew Jeffery
236786e6a6cSAndrew Jeffery    def test_items_2_nested_depth_1(self):
237786e6a6cSAndrew Jeffery        pt = PathTree()
238786e6a6cSAndrew Jeffery        pt['/a'] = 1
239786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
240786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.items(depth=1)))
241786e6a6cSAndrew Jeffery
242786e6a6cSAndrew Jeffery    def test_dataitems_2_nested_depth_1(self):
243786e6a6cSAndrew Jeffery        pt = PathTree()
244786e6a6cSAndrew Jeffery        pt['/a'] = 1
245786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
246786e6a6cSAndrew Jeffery        pt['/b'] = None
247786e6a6cSAndrew Jeffery        pt['/b/c'] = 1
248786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a', 1)]), set(pt.dataitems(depth=1)))
249786e6a6cSAndrew Jeffery
250786e6a6cSAndrew Jeffery    def test_keys_2_nested_subtree(self):
251786e6a6cSAndrew Jeffery        pt = PathTree()
252786e6a6cSAndrew Jeffery        pt['/a'] = 1
253786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
254786e6a6cSAndrew Jeffery        pt['/b'] = 3
255786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a/b']), set(pt.keys(subtree='/a')))
256786e6a6cSAndrew Jeffery
257786e6a6cSAndrew Jeffery    def test_values_2_nested_subtree(self):
258786e6a6cSAndrew Jeffery        pt = PathTree()
259786e6a6cSAndrew Jeffery        pt['/a'] = 1
260786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
261786e6a6cSAndrew Jeffery        pt['/b'] = 3
262786e6a6cSAndrew Jeffery        self.assertEquals(set([2]), set(pt.values(subtree='/a')))
263786e6a6cSAndrew Jeffery
264786e6a6cSAndrew Jeffery    def test_items_2_nested_subtree(self):
265786e6a6cSAndrew Jeffery        pt = PathTree()
266786e6a6cSAndrew Jeffery        pt['/a'] = 1
267786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
268786e6a6cSAndrew Jeffery        pt['/b'] = 3
269786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.items(subtree='/a')))
270786e6a6cSAndrew Jeffery
271786e6a6cSAndrew Jeffery    def test_dataitems_2_nested_subtree(self):
272786e6a6cSAndrew Jeffery        pt = PathTree()
273786e6a6cSAndrew Jeffery        pt['/a'] = 1
274786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
275786e6a6cSAndrew Jeffery        pt['/a/c'] = None
276786e6a6cSAndrew Jeffery        pt['/b'] = 3
277786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.dataitems(subtree='/a')))
278786e6a6cSAndrew Jeffery
279786e6a6cSAndrew Jeffery    def test_keys_3_nested_subtree_depth_1(self):
280786e6a6cSAndrew Jeffery        pt = PathTree()
281786e6a6cSAndrew Jeffery        pt['/a'] = 1
282786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
283786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
284786e6a6cSAndrew Jeffery        pt['/b'] = 4
285786e6a6cSAndrew Jeffery        self.assertEquals(set(['/a/b']), set(pt.keys(subtree='/a', depth=1)))
286786e6a6cSAndrew Jeffery
287786e6a6cSAndrew Jeffery    def test_values_3_nested_subtree_depth_1(self):
288786e6a6cSAndrew Jeffery        pt = PathTree()
289786e6a6cSAndrew Jeffery        pt['/a'] = 1
290786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
291786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
292786e6a6cSAndrew Jeffery        pt['/b'] = 4
293786e6a6cSAndrew Jeffery        self.assertEquals(set([2]), set(pt.values(subtree='/a', depth=1)))
294786e6a6cSAndrew Jeffery
295786e6a6cSAndrew Jeffery    def test_items_3_nested_subtree_depth_1(self):
296786e6a6cSAndrew Jeffery        pt = PathTree()
297786e6a6cSAndrew Jeffery        pt['/a'] = 1
298786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
299786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
300786e6a6cSAndrew Jeffery        pt['/b'] = 4
301786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.items(subtree='/a', depth=1)))
302786e6a6cSAndrew Jeffery
303786e6a6cSAndrew Jeffery    def test_items_3_nested_subtree_depth_1(self):
304786e6a6cSAndrew Jeffery        pt = PathTree()
305786e6a6cSAndrew Jeffery        pt['/a'] = 1
306786e6a6cSAndrew Jeffery        pt['/a/b'] = 2
307786e6a6cSAndrew Jeffery        pt['/a/b/c'] = 3
308786e6a6cSAndrew Jeffery        pt['/a/c'] = None
309786e6a6cSAndrew Jeffery        pt['/b'] = 4
310786e6a6cSAndrew Jeffery        self.assertEquals(set([('/a/b', 2)]), set(pt.dataitems(subtree='/a', depth=1)))
3113ba497a9SAndrew Jeffery
3123ba497a9SAndrew Jefferyimport timeit
3133ba497a9SAndrew Jefferyimport sys
3143ba497a9SAndrew Jeffery
3153ba497a9SAndrew Jefferydef depth_stress(pt, k):
3163ba497a9SAndrew Jeffery    pt[k] = 1
3173ba497a9SAndrew Jeffery    pt[k] = pt[k] + 1
3183ba497a9SAndrew Jeffery    del pt[k]
3193ba497a9SAndrew Jeffery
3203ba497a9SAndrew Jefferydepth_setup = """\
3213ba497a9SAndrew Jefferyfrom __main__ import depth_stress
3223ba497a9SAndrew Jefferyfrom obmc.utils.pathtree import PathTree
3233ba497a9SAndrew Jefferypt = PathTree()
3243ba497a9SAndrew Jefferykey = '/' + '/'.join(['a'] * {})
3253ba497a9SAndrew Jeffery"""
3263ba497a9SAndrew Jeffery
3273ba497a9SAndrew Jefferydef width_stress(pt, k):
3283ba497a9SAndrew Jeffery    pt.get_children(k)
3293ba497a9SAndrew Jeffery
3303ba497a9SAndrew Jefferywidth_setup = """\
3313ba497a9SAndrew Jefferyfrom __main__ import width_stress
3323ba497a9SAndrew Jefferyfrom obmc.utils.pathtree import PathTree
3333ba497a9SAndrew Jefferypt = PathTree()
3343ba497a9SAndrew Jefferyfor i in range(0, {}):
3353ba497a9SAndrew Jeffery    pt["/{}/a".format(i)] = i
3363ba497a9SAndrew Jefferykey = '/0/a'
3373ba497a9SAndrew Jeffery"""
3383ba497a9SAndrew Jeffery
339*13d0dc9fSAndrew Jefferydef iter_stress(pt):
340*13d0dc9fSAndrew Jeffery    for i in pt.dataitems():
341*13d0dc9fSAndrew Jeffery        pass
342*13d0dc9fSAndrew Jeffery
343*13d0dc9fSAndrew Jefferyiter_setup = """\
344*13d0dc9fSAndrew Jefferyfrom __main__ import iter_stress
345*13d0dc9fSAndrew Jefferyfrom obmc.utils.pathtree import PathTree
346*13d0dc9fSAndrew Jefferypt = PathTree()
347*13d0dc9fSAndrew Jefferyfor i in ('/' + '/'.join([chr(ord('a') + x)] * {}) for x in range(0, 26)):
348*13d0dc9fSAndrew Jeffery    for j in range(0, {}):
349*13d0dc9fSAndrew Jeffery        k = "{}".format(i, j)
350*13d0dc9fSAndrew Jeffery        pt[k] = k
351*13d0dc9fSAndrew Jeffery"""
352*13d0dc9fSAndrew Jeffery
3533ba497a9SAndrew Jefferyif __name__ == "__main__":
3543ba497a9SAndrew Jeffery    print("Depth tests:")
3553ba497a9SAndrew Jeffery    for depth in range(1, 11):
3563ba497a9SAndrew Jeffery        setup = depth_setup.format(depth)
3573ba497a9SAndrew Jeffery        stmt = "depth_stress(pt, key)"
3583ba497a9SAndrew Jeffery        time = timeit.timeit(stmt, setup=setup)
3593ba497a9SAndrew Jeffery        print("\t{}: {}".format(depth, time))
3603ba497a9SAndrew Jeffery    print
3613ba497a9SAndrew Jeffery    print("Width tests:")
3623ba497a9SAndrew Jeffery    for width in map(lambda x: 2 ** x, range(0, 21)):
3633ba497a9SAndrew Jeffery        setup = width_setup.format(width, "{}")
3643ba497a9SAndrew Jeffery        stmt = "width_stress(pt, key)"
3653ba497a9SAndrew Jeffery        time = timeit.timeit(stmt, setup=setup)
3663ba497a9SAndrew Jeffery        print("\t{}: {}".format(width, time))
367*13d0dc9fSAndrew Jeffery    print
368*13d0dc9fSAndrew Jeffery    print("Iteration tests:")
369*13d0dc9fSAndrew Jeffery    n = 1000
370*13d0dc9fSAndrew Jeffery    for depth in range(1, 5):
371*13d0dc9fSAndrew Jeffery        for width in range(1, 5):
372*13d0dc9fSAndrew Jeffery            setup = iter_setup.format(depth, width, "{}/{}")
373*13d0dc9fSAndrew Jeffery            stmt = "iter_stress(pt)"
374*13d0dc9fSAndrew Jeffery            time = timeit.timeit(stmt, setup=setup, number=n)
375*13d0dc9fSAndrew Jeffery            print("\tdepth={}, width={}, n={}: {}".format(depth, width, n, time))
376