示例#1
0
 def test_remove_non_existent_neighbor(self):
     vertice = Vertice("one")
     try:
         vertice.remove_neighbor(Vertice("non existent"))
         self.fail("Should not be able to remove a non existent vertice")
     except ValueError as e:
         self.assertEqual("Neighbor does not exist to remove", str(e))
示例#2
0
 def test_vertice_given_bad_neighbor(self):
     try:
         v = Vertice("some node")
         v.add_neighbor(None)
         self.fail("Should fail if the given neighbor is empty")
     except ValueError as e:
         self.assertEqual("Given invalid neighbor", str(e))
示例#3
0
    def test_edge_to_vertice(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)

        self.assertEqual(vertice2, edge.to_vertice())
示例#4
0
    def test_vertice_given_self_neighbor(self):
        """We define giving oneself as a neighbor as a potential cycle and
        remove it, enforcing a simple graph in our maze instead."""

        try:
            v = Vertice("self referential")
            v.add_neighbor(v)
            self.fail("Should not allow self referential neighboring")
        except ValueError as e:
            self.assertEqual("Vertice cannot become it's own neighbor", str(e))
示例#5
0
    def test_edge_disconnect_idempotency(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)
        edge.connect_vertices()

        self.assertTrue(edge.connected())
        edge.disconnect_vertices()
        self.assertFalse(edge.connected())
        edge.disconnect_vertices()
        self.assertFalse(edge.connected())
示例#6
0
    def test_push_same_edge(self):
        v1 = Vertice("one")
        v2 = Vertice("two")

        edge = Edge(v1, v2)
        p = PriorityQueue()

        p.push(edge)
        p.push(edge)
        p.push(edge)
        self.assertFalse(p.is_empty())
        self.assertEqual(3, len(p))
示例#7
0
    def test_is_neighbor(self):
        """Testing directional behavior of vertices."""

        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))

        vertice1.add_neighbor(vertice2)
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
示例#8
0
    def test_single_direction_connection_to_both_connected(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        vertice1.add_neighbor(vertice2)
        edge = Edge(vertice1, vertice2)
        self.assertTrue(edge.connected())

        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
        edge.connect_vertices()
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice2.is_neighbor(vertice1))
示例#9
0
    def test_single_direction_connection_both_connected_other_way(self):
        """This should be equivalent as the previous test"""
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        vertice2.add_neighbor(vertice1)
        edge = Edge(vertice1, vertice2)
        self.assertTrue(edge.connected())

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice2.is_neighbor(vertice1))
        edge.connect_vertices()
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice2.is_neighbor(vertice1))
示例#10
0
    def test_neighbor_linked_connect(self):
        """Single directional connections should return true for the
        edge connected() function"""
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")
        edge = Edge(vertice1, vertice2)

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
        self.assertFalse(edge.connected())

        vertice1.add_neighbor(vertice2)
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
        self.assertTrue(edge.connected())
示例#11
0
    def test_push_edges(self):
        v1 = Vertice("one")
        v2 = Vertice("two")

        edge1 = Edge(v1, v2)
        edge2 = Edge(v2, v1)

        p = PriorityQueue()
        self.assertTrue(p.is_empty())
        self.assertEqual(0, len(p))

        p.push(edge1)
        self.assertFalse(p.is_empty())
        self.assertEqual(1, len(p))

        p.push(edge2)
        self.assertEqual(2, len(p))
示例#12
0
    def test_simple_extraction(self):
        """Extracting the min from two edges should result in the minimum
        of the two edges being extracted"""
        v1 = Vertice("one")
        v2 = Vertice("two")

        edge1 = Edge(v1, v2, 0)
        edge2 = Edge(v1, v2, 1)

        p = PriorityQueue()
        p.push(edge1)
        p.push(edge2)

        self.assertEqual(2, len(p))
        self.assertEqual(edge1, p.extract_min())
        self.assertEqual(1, len(p))

        self.assertEqual(edge2, p.extract_min())
        self.assertTrue(p.is_empty())
示例#13
0
    def test_remove_vertice_with_same_name_as_neighbor(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        vertice1.add_neighbor(vertice2)
        try:
            vertice1.remove_neighbor(Vertice("two"))
            self.fail("A vertice with the same name does not "
                      "count as the same neighbor")
        except ValueError as e:
            self.assertEqual("Given vertice "
                             "is not the actual vertice neighbor", str(e))
示例#14
0
    def add_vertice(self, vertice_name):
        """Adds a given vertice into the graph. The vertice must be a new
        object and should also have a unique name identifying the vertice.

        Args:
            vertice_name(str): the name of the new vertice to add
        Raises:
            ValueError: if another vertice exists in the graph with the same
                name as the given vertice"""
        if self.contains_vertice(vertice_name):
            raise ValueError("Vertice already in the graph")
        self.__vertices[vertice_name] = Vertice(vertice_name)
示例#15
0
    def test_symbolic_edge_linking(self):
        """When an edge is created, it should not physically link the two edges
        within initialization"""

        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))

        Edge(vertice1, vertice2)

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
示例#16
0
    def test_vertice_given_duplicate(self):
        """Duplicate neighbors are considered illegal behavior"""
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        vertice1.add_neighbor(vertice2)
        try:
            vertice1.add_neighbor(vertice2)
            self.fail("Should not be able to add a duplicate neighbor")
        except ValueError as e:
            self.assertEqual("Attempting to add duplicate neighbor", str(e))
示例#17
0
    def test_edge_disconnection_single_connection(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)
        vertice1.add_neighbor(vertice2)

        self.assertTrue(edge.connected())
        self.assertTrue(vertice1.is_neighbor(vertice2))
        edge.disconnect_vertices()
        self.assertFalse(vertice1.is_neighbor(vertice2))
示例#18
0
    def test_simple_connect(self):
        """Ensure that the connection function works with simple connections"""

        vertice1 = Vertice("one")
        vertice2 = Vertice("two")
        edge = Edge(vertice1, vertice2)

        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
        self.assertFalse(edge.connected())

        edge.connect_vertices()
        self.assertTrue(edge.connected())
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice2.is_neighbor(vertice1))
示例#19
0
    def test_edge_disconnection_single_connection_other_way(self):
        """Should be equivalent to previous test"""
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)
        vertice2.add_neighbor(vertice1)

        self.assertTrue(edge.connected())
        self.assertTrue(vertice2.is_neighbor(vertice1))
        edge.disconnect_vertices()
        self.assertFalse(vertice2.is_neighbor(vertice1))
示例#20
0
    def test_multi_extraction(self):
        v1 = Vertice("one")
        v2 = Vertice("two")

        edge1 = Edge(v1, v2, 0)
        edge2 = Edge(v1, v2, 0)
        edge3 = Edge(v1, v2, 1)
        edge4 = Edge(v1, v2, 1)

        p = PriorityQueue()
        p.push(edge1)
        p.push(edge2)
        p.push(edge3)
        p.push(edge4)

        # we are less interested in the exact edges themselves
        # but rather the weight to justify the priority queue
        self.assertEqual(0, p.extract_min().weight())
        self.assertEqual(0, p.extract_min().weight())
        self.assertEqual(1, p.extract_min().weight())
        self.assertEqual(1, p.extract_min().weight())

        self.assertTrue(p.is_empty())
示例#21
0
    def test_edge_linking_idempotency(self):
        """Multiple connections should be simply idempotent."""

        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)

        self.assertFalse(edge.connected())
        edge.connect_vertices()
        self.assertTrue(edge.connected())
        edge.connect_vertices()
        self.assertTrue(edge.connected())
        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice2.is_neighbor(vertice1))
示例#22
0
    def test_remove_single_neighbor_one_direction(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        vertice1.add_neighbor(vertice2)

        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))

        vertice1.remove_neighbor(vertice2)
        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertFalse(vertice2.is_neighbor(vertice1))
示例#23
0
    def test_custom_edge_weight(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2, 5)
        self.assertEqual(5, edge.weight())
示例#24
0
    def test_default_edge_weight(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        edge = Edge(vertice1, vertice2)
        self.assertEqual(0, edge.weight())
示例#25
0
    def test_adding_neighbors_to_vertice(self):
        """Adding neighbors should be directional, only."""

        vertice1 = Vertice("one")
        vertice2 = Vertice("two")
        vertice3 = Vertice("three")

        self.assertEqual([], vertice1.neighbors())
        self.assertEqual([], vertice2.neighbors())
        self.assertEqual([], vertice3.neighbors())

        # should be directional
        vertice1.add_neighbor(vertice2)
        self.assertEqual([vertice2], vertice1.neighbors())
        self.assertEqual([], vertice2.neighbors())

        # other vertices should also not experience side effects
        vertice1.add_neighbor(vertice3)
        self.assertEqual(2, len(vertice1.neighbors()))
        self.assertTrue(vertice2 in vertice1.neighbors())
        self.assertTrue(vertice3 in vertice1.neighbors())
        self.assertEqual([], vertice2.neighbors())
        self.assertEqual([], vertice3.neighbors())

        vertice2.add_neighbor(vertice1)
        self.assertEqual(2, len(vertice1.neighbors()))
        self.assertTrue(vertice2 in vertice1.neighbors())
        self.assertTrue(vertice3 in vertice1.neighbors())
        self.assertEqual(1, len(vertice2.neighbors()))
        self.assertTrue(vertice1 in vertice2.neighbors())
        self.assertEqual([], vertice3.neighbors())
示例#26
0
    def test_name(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")

        self.assertEqual("one", vertice1.name())
        self.assertEqual("two", vertice2.name())
示例#27
0
    def test_remove_single_neighbor_multiple_neighbors(self):
        vertice1 = Vertice("one")
        vertice2 = Vertice("two")
        vertice3 = Vertice("three")

        vertice1.add_neighbor(vertice2)
        vertice1.add_neighbor(vertice3)

        self.assertTrue(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice1.is_neighbor(vertice3))
        vertice1.remove_neighbor(vertice2)
        self.assertFalse(vertice1.is_neighbor(vertice2))
        self.assertTrue(vertice1.is_neighbor(vertice3))
示例#28
0
 def test_vertice_with_null_name(self):
     try:
         Vertice("")
         self.fail("Vertice constructor should fail with null string")
     except ValueError as e:
         self.assertEqual("Given null name in vertice", str(e))