コード例 #1
0
    def test_get_edges(self):
        graph = Graph()

        # Create test Verticies
        v1,v2,v3 = Vertex("a"), Vertex("b"), Vertex("c")

        # Add verticies
        graph.add_vertex(v1)
        graph.add_vertex(v2)
        graph.add_vertex(v3)

        self.assertEqual(graph.numVertices, 3)
        self.assertEqual(graph.numEdges, 0)

        # Create edges
        edges = [
            ("a", "b", 10),
            ("b", "c", 10),
            ("c", "a", 4)
        ]

        # Iterate through edges
        for edge in edges:
            fromVert, toVert, weight = edge
            graph.add_edge(fromVert, toVert, weight)

        self.assertEqual(graph.numEdges, 3)
コード例 #2
0
class GraphTests(unittest.TestCase):
    def setUp(self):
        self.graph = Graph()

        self.populated_graph = Graph()
        # Add vertices
        self.populated_graph.add_vertex("A")
        self.populated_graph.add_vertex("B")
        self.populated_graph.add_vertex("C")
        self.populated_graph.add_vertex("D")
        self.populated_graph.add_vertex("E")
        self.populated_graph.add_vertex("F")
        self.populated_graph.add_vertex("G")

        # Add connections (non weighted edges for now)
        self.populated_graph.add_edge("A", "B", 4)  # (A -> B)
        self.populated_graph.add_edge("A", "C", 6)  # (A -> C)
        self.populated_graph.add_edge("B", "C", 8)  # (B -> C)
        self.populated_graph.add_edge("C", "D", 9)  # (C -> D)
        self.populated_graph.add_edge("C", "E", 1)  # (C -> E)
        self.populated_graph.add_edge("C", "F", 90)  # (C -> F)
        self.populated_graph.add_edge("A", "F", 12)  # (A -> F)

    def test_init(self):
        assert not self.graph.vertices_dict
        assert self.graph.num_vertices is 0

    def test_add_vertex(self):
        # Add one vertex
        self.graph.add_vertex("B")
        assert self.graph.num_vertices is 1
        assert len(self.graph.vertices_dict.keys()) is 1
        assert "B" in self.graph.vertices_dict

        # Add another vertex
        self.graph.add_vertex("A")
        assert self.graph.num_vertices is 2
        assert len(self.graph.vertices_dict.keys()) is 2
        assert "A" in self.graph.vertices_dict

        # Should avodata adding duplicate
        self.graph.add_vertex("B")
        assert self.graph.num_vertices is 2
        assert len(self.graph.vertices_dict.keys()) is 2

    def test_get_vertex(self):
        # Add vertex
        self.graph.add_vertex("B")

        # Find the newly added vertex
        found_vertex = self.graph.get_vertex("B")
        assert found_vertex.data is "B"

        # Test for non existing vertex
        assert self.graph.get_vertex("C") is None

    def test_add_edge(self):
        self.graph.undirected = True
        # Populate the graph with vertices A, B, C, D, E, F, G
        self.graph.add_vertex("A")
        self.graph.add_vertex("B")
        self.graph.add_vertex("C")
        self.graph.add_vertex("D")
        self.graph.add_vertex("E")
        self.graph.add_vertex("F")
        self.graph.add_vertex("G")

        # Add edge from A to B with the cost of 10
        self.graph.add_edge("A", "B", 10)
        vertex_a = self.graph.get_vertex("A")
        vertex_b = self.graph.get_vertex("B")
        vertex_c = self.graph.get_vertex("C")

        # Vertex A should have an edge to vertex B with the cost of 10
        assert "B" in vertex_a.neighbors
        assert vertex_a.get_edge_weight("B") is 10
        print(vertex_b.neighbors)
        assert "A" in vertex_b.neighbors
        assert vertex_b.get_edge_weight("A") is 10

        self.graph.add_edge("A", "C", 5)
        self.graph.add_edge("B", "C", 10)

        assert "C" in vertex_a.neighbors and "C" in vertex_b.neighbors
        assert vertex_a.get_edge_weight("C") is 5
        assert vertex_b.get_edge_weight("C") is 10
        assert vertex_c.get_edge_weight("A") is 5 and vertex_c.get_edge_weight(
            "B") is 10

        # Test for bad inputs
        assert self.graph.add_edge("O", "B", 12) is None

    def test_get_verticles(self):
        # Populate the graph with vertices A, B, C
        self.graph.add_vertex("B")
        self.graph.add_vertex("A")
        self.graph.add_vertex("C")

        vertices_list = self.graph.get_vertices()
        assert list
        assert len(vertices_list) is 3
        assert "A" in vertices_list
        assert "B" in vertices_list
        assert "C" in vertices_list

    def test_get_edges(self):
        # Populate the graph with vertices A, B, C
        self.graph.add_vertex("B")
        self.graph.add_vertex("A")
        self.graph.add_vertex("C")

        self.graph.add_edge("A", "B", 10)
        self.graph.add_edge("A", "C", 5)
        self.graph.add_edge("B", "C", 10)

        edges_set = self.graph.get_edges()

        assert len(edges_set) is 3
        assert ("A", "B", 10) in edges_set or ("B", "A", 10)
        assert ("A", "C", 5) in edges_set or ("C", "A", 5) in edges_set
        assert ("B", "C", 10) in edges_set or ("C", "B", 10) in edges_set

    def test_reading_file(self):
        filename = 'graph_data.txt'
        self.graph.read_file(filename)

        # D
        # 1, 2, 3, 4, 5
        # (1, 2)
        # (1, 4)
        # (2, 3)
        # (2, 4)
        # (2, 5)
        # (3, 5)
        # (5, 2)

        # Graph should have expected vertices
        expected_vertices = ['1', '2', '3', '4', '5']
        assert len(self.graph.get_vertices()) is 5

        for key in expected_vertices:
            assert key in self.graph.vertices_dict

        # Graph should have expected edges
        expected_edges = [
            ('1', '2', 0),
            ('1', '4', 0),
            ('2', '3', 0),
            ('2', '4', 0),
            ('2', '5', 0),
            ('3', '5', 0),
        ]
        assert len(self.graph.edges_list) is 6

        for edge in expected_edges:
            assert edge in self.graph.edges_list

    def test_depth_first_search(self):
        found, path = self.populated_graph.depth_first_search_iter('A', 'E')

        assert found is True
        assert len(path) is 5

        expected_keys = ['A', 'B', 'C', 'D', 'E']

        for key in expected_keys:
            assert key in expected_keys

        # Test bad input
        found, path = self.populated_graph.depth_first_search_iter('A', 'R')
        assert found is False
        assert len(path) is 0

        # Test edges cases
        # Can't find a path for a disjointed graph
        self.populated_graph.add_vertex('O')

        found, path = self.populated_graph.depth_first_search_iter('A', 'R')
        assert found is False
        assert len(path) is 0