def test_dict_items(self): d = SparseDict({1: 10, "a": "ABC"}) items = d.viewitems() self.assertEqual(len(items), 2) self.assertEqual(set(items), set([(1, 10), ("a", "ABC")])) self.assertEqual(items, set([(1, 10), ("a", "ABC")])) self.assertNotEqual(items, set([(1, 10), ("a", "ABC"), "junk"])) self.assertNotEqual(items, set([(1, 10), ("a", "def")])) self.assertNotEqual(items, set([(1, 10)])) self.assertNotEqual(items, 42) self.assertIn((1, 10), items) self.assertIn(("a", "ABC"), items) self.assertNotIn((1, 11), items) self.assertNotIn(1, items) self.assertNotIn((), items) self.assertNotIn((1,), items) self.assertNotIn((1, 2, 3), items) self.assertEqual(d.viewitems(), d.viewitems()) e = d.copy() self.assertEqual(d.viewitems(), e.viewitems()) e["a"] = "def" self.assertNotEqual(d.viewitems(), e.viewitems())
def test_track_dynamic(self): # Test GC-optimization of dynamically-created dicts class MyObject(object): pass x, y, z, w, o = 1.5, "a", (1, object()), [], MyObject() d = SparseDict() self._not_tracked(d) d[1] = "a" self._not_tracked(d) d[y] = 2 self._not_tracked(d) d[z] = 3 self._not_tracked(d) self._not_tracked(d.copy()) d[4] = w self._tracked(d) self._tracked(d.copy()) # Unlike dict, we don't have a _PyDict_MaybeUntrack hook # d[4] = None # self._not_tracked(d) # self._not_tracked(d.copy()) # dd isn't tracked right now, but it may mutate and therefore d # which contains it must be tracked. d = SparseDict() dd = SparseDict() d[1] = dd self._not_tracked(dd) self._tracked(d) dd[1] = d self._tracked(dd) d = SparseDict.fromkeys([x, y, z]) self._not_tracked(d) dd = SparseDict() dd.update(d) self._not_tracked(dd) d = SparseDict.fromkeys([x, y, z, o]) self._tracked(d) dd = SparseDict() dd.update(d) self._tracked(dd) d = SparseDict(x=x, y=y, z=z) self._not_tracked(d) d = SparseDict(x=x, y=y, z=z, w=w) self._tracked(d) d = SparseDict() d.update(x=x, y=y, z=z) self._not_tracked(d) d.update(w=w) self._tracked(d) d = SparseDict([(x, y), (z, 1)]) self._not_tracked(d) d = SparseDict([(x, y), (z, w)]) self._tracked(d) d = SparseDict() d.update([(x, y), (z, 1)]) self._not_tracked(d) d.update([(x, y), (z, w)]) self._tracked(d)