class TestGraphRemoveEdges(UnittestPythonCompatibility): """ Test removal of edges in directed and undirected way """ def setUp(self): """ Build Graph with nodes and edges """ self.graph = Graph() self.graph.add_edges([(1, 2), (2, 3), (3, 4), (3, 5), (4, 5)], node_from_edge=True) self.assertTrue(len(self.graph) == 5) self.assertTrue(len(self.graph.nodes) == 5) self.assertTrue(len(self.graph.edges) == 10) self.assertTrue(len(self.graph.adjacency) == 5) def tearDown(self): """ Test state after edge removal """ if self.edges: # If undirected, add reversed edges if not self.graph.directed: self.edges.extend([e[::-1] for e in self.edges if e[::-1] not in self.edges]) for edge in self.edges: # Edge should be removed self.assertTrue(edge not in self.graph.edges) # Nodes connected should still be there self.assertTrue(all([node in self.graph.nodes for node in edge])) # Adjacency should be corrected self.assertTrue(edge[1] not in self.graph.adjacency[edge[0]]) # If directional, reverse edge still in graph if self.graph.directed: rev_edge = edge[::-1] if rev_edge not in self.edges: self.assertTrue(rev_edge in self.graph.edges) # filled after addition self.assertTrue(len(self.graph) == 5) self.assertTrue(len(self.graph.nodes) == 5) self.assertTrue(len(self.graph.edges) == 10 - len(self.edges)) self.assertTrue(len(self.graph.adjacency) == 5) def test_remove_edge_single_undirected(self): """ Test removal of single undirected edge """ self.edges = [(1, 2)] self.graph.remove_edge(*self.edges[0]) def test_remove_edge_single_directed(self): """ Test removal of single directed edge """ self.graph.directed = True self.edges = [(1, 2)] self.graph.remove_edge(*self.edges[0]) def test_remove_edge_multiple_undirected(self): """ Test removal of multiple undirected edges """ self.edges = [(1, 2), (2, 3), (4, 5)] self.graph.remove_edges(self.edges) def test_remove_edge_multiple_directed(self): """ Test removal of multiple directed edges """ self.graph.directed = True self.edges = [(1, 2), (2, 3), (4, 5)] self.graph.remove_edges(self.edges) def test_remove_edge_single_mixed(self): """ Test removal of a single directed edge in a global undirected graph using local override of directionality """ self.edges = [(1, 2)] self.graph.remove_edge(*self.edges[0], directed=True) self.graph.directed = True def test_remove_edge_multiple_mixed(self): """ Test removal of multiple directed edges in a global undirected graph using local override of directionality """ self.edges = [(1, 2), (2, 3), (4, 5)] self.graph.remove_edges(self.edges, directed=True) self.graph.directed = True def test_graph_clear(self): """ Test clear method to removal all nodes and edges """ self.edges = [] self.graph.clear() self.assertTrue(len(self.graph) == 0) self.assertTrue(len(self.graph.nodes) == 0) self.assertTrue(len(self.graph.edges) == 0) self.assertTrue(len(self.graph.adjacency) == 0)
class TestGraphRemoveNodes(UnittestPythonCompatibility): """ Test removal of single or multiple nodes """ def setUp(self): """ Build default graph with few nodes and edges """ self.graph = Graph() self.graph.add_nodes('graph', isnode=True) self.graph.add_edges([(1, 2), (2, 3), (3, 4), (3, 5), (4, 5)], isedge=True) def tearDown(self): """ Test state after node remove """ for node in self.to_remove: self.assertTrue(node not in self.graph.nodes) # node not in edges self.assertTrue(all([node not in e for e in self.graph.edges])) # node not in adjacency self.assertTrue(node not in self.graph.adjacency) self.assertTrue( all([node not in a for a in self.graph.adjacency.values()])) # Nodes not in removed should still be there for node in {1, 2, 3, 4, 5}.difference(set(self.to_remove)): self.assertTrue(node in self.graph.nodes) self.assertTrue(node in self.graph.adjacency) def test_remove_node(self): """ Test removal of single node """ self.to_remove = [3] self.graph.remove_node(self.to_remove[0]) def test_remove_nodes(self): """ Test removal of multiple nodes """ self.to_remove = [1, 3, 4] self.graph.remove_nodes(self.to_remove) def test_graph_clear(self): """ Test clear method to removal all nodes and edges """ self.to_remove = [1, 2, 3, 4, 5] self.graph.clear() self.assertTrue(len(self.graph) == 0) self.assertTrue(len(self.graph.nodes) == 0) self.assertTrue(len(self.graph.edges) == 0) self.assertTrue(len(self.graph.adjacency) == 0)