예제 #1
0
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)