def test_dict_with_lists(self): """Test dictionary with lists of dicts and general access""" x = PropertyDict(self.dict_a) # This performs a deep copy self.assertEqual(x.a, 1) self.assertEqual(x['a'], 1) self.assertEqual(x.b, 2) self.assertEqual(x['b'], 2) self.assertEqual(x.c[0], 3) self.assertEqual(x.c[1], 4) self.assertEqual(x.c[2], 5) self.assertEqual(x['c'][0], 3) self.assertEqual(x['c'][1], 4) self.assertEqual(x['c'][2], 5) self.assertEqual(x.d[0].a, 1) self.assertEqual(x.d[1].b, 2) self.assertEqual(x.d[0]['a'], 1) self.assertEqual(x.d[1]['b'], 2) self.assertEqual(x['d'][0].a, 1) self.assertEqual(x['d'][1].b, 2) self.assertEqual(x['d'][0]['a'], 1) self.assertEqual(x['d'][1]['b'], 2) # Check a non-existent attribute self.assertIsNone(x.rock) # Now add one on the fly x.rock = [1, 2, 3] self.assertEqual(x.rock[0], 1) self.assertEqual(x.rock[1], 2) self.assertEqual(x.rock[2], 3) self.assertEqual(x['rock'][0], 1) self.assertEqual(x['rock'][1], 2) self.assertEqual(x['rock'][2], 3) # Now add one on the fly using traditional notation x['rock2'] = [1, 2, 3] self.assertEqual(x.rock2[0], 1) self.assertEqual(x.rock2[1], 2) self.assertEqual(x.rock2[2], 3) self.assertEqual(x['rock2'][0], 1) self.assertEqual(x['rock2'][1], 2) self.assertEqual(x['rock2'][2], 3) # Check adding a list of dictionaries on the fly x.rocky = [{'a': 4}, {'b': 5}, {'c': 6}] self.assertEqual(x.rocky[0].a, 4) self.assertEqual(x.rocky[1].b, 5) self.assertEqual(x.rocky[2].c, 6) self.assertEqual(x.rocky[0]['a'], 4) self.assertEqual(x.rocky[1]['b'], 5) self.assertEqual(x.rocky[2]['c'], 6) self.assertEqual(x['rocky'][0].a, 4) self.assertEqual(x['rocky'][1].b, 5) self.assertEqual(x['rocky'][2].c, 6) self.assertEqual(x['rocky'][0]['a'], 4) self.assertEqual(x['rocky'][1]['b'], 5) self.assertEqual(x['rocky'][2]['c'], 6) # Test deleting an attribute del x.a self.assertIsNone(x.a)