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