def test_remove(self): s = ElementTransformSet(transform=lambda x: x*x) with self.assertRaises(KeyError) as cm: s.remove(3) # Make sure that the KeyError carries the original value, # not the transformed value. self.assertEqual(cm.exception.args, (3,))
def test_discard(self): s = ElementTransformSet(transform=lambda x: x*x) s.add(13) s.add(-14) # Discarding something in the set. s.discard(-13) self.assertIn(14, s) self.assertNotIn(13, s) # Discarding something not in the set. s.discard(17)
def test_len(self): s = ElementTransformSet(transform=lambda x: x*x + 1) self.assertEqual(len(s), 0) s.add(4) self.assertEqual(len(s), 1) s.add(5) self.assertEqual(len(s), 2) s.remove(-4) self.assertEqual(len(s), 1) s.remove(-5) self.assertEqual(len(s), 0)
def _from_objects(cls, objects): """ Private constructor: create graph from the given Python objects. The constructor examines the referents of each given object to build up a graph showing the objects and their links. """ vertices = ElementTransformSet(transform=id) out_edges = KeyTransformDict(transform=id) in_edges = KeyTransformDict(transform=id) for obj in objects: vertices.add(obj) out_edges[obj] = [] in_edges[obj] = [] # Edges are identified by simple integers, so # we can use plain dictionaries for mapping # edges to their heads and tails. edge_label = itertools.count() edges = set() head = {} tail = {} for referrer in vertices: for referent in gc.get_referents(referrer): if referent not in vertices: continue edge = next(edge_label) edges.add(edge) tail[edge] = referrer head[edge] = referent out_edges[referrer].append(edge) in_edges[referent].append(edge) return cls._raw( vertices=vertices, edges=edges, out_edges=out_edges, in_edges=in_edges, head=head, tail=tail, )
def full_subgraph(self, objects): """ Return the subgraph of this graph whose vertices are the given ones and whose edges are the edges of the original graph between those vertices. """ vertices = ElementTransformSet(transform=id) out_edges = KeyTransformDict(transform=id) in_edges = KeyTransformDict(transform=id) for obj in objects: vertices.add(obj) out_edges[obj] = [] in_edges[obj] = [] edges = set() head = {} tail = {} for referrer in vertices: for edge in self._out_edges[referrer]: referent = self._head[edge] if referent not in vertices: continue edges.add(edge) tail[edge] = referrer head[edge] = referent out_edges[referrer].append(edge) in_edges[referent].append(edge) return ObjectGraph._raw( vertices=vertices, edges=edges, out_edges=out_edges, in_edges=in_edges, head=head, tail=tail, )
def test_bool(self): s = ElementTransformSet(transform=abs) self.assertFalse(s) s.add(23) self.assertTrue(s)
def test_update(self): s = ElementTransformSet(transform=lambda x: x*x + 1) s.update([5, 6, 7]) self.assertEqual(sorted(s), [5, 6, 7]) s.update([1, 2, 3]) self.assertEqual(sorted(s), [1, 2, 3, 5, 6, 7])
def test_iter(self): s = ElementTransformSet(transform=lambda x: x*x + 1) s.add(4) s.add(5) self.assertEqual(sorted(iter(s)), [4, 5])
def test_first_addition_takes_precedence(self): # Like a normal set. s = ElementTransformSet(transform=abs) s.add(23) s.add(-23) self.assertEqual(list(s), [23])
def test_add_and_in(self): s = ElementTransformSet(transform=lambda x: x*x) s.add(13) self.assertIn(13, s)
def test_add_and_len(self): s = ElementTransformSet(transform=abs) self.assertEqual(len(s), 0) s.add(2) self.assertEqual(len(s), 1)