def fully_connected_graph(nodes): g = SimpleGraph() for node in nodes: g.add_node(node) for other_node in nodes: if other_node is not node: g.add_edge(node, other_node) return g
def test_has_node(): """edge added, new node added""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') assert g.has_node('b')
def test_del_error(): """error raised when non-existant value deleted""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') with pytest.raises(KeyError): g.del_node('p')
def test_del_edge(): """other edges preserved when one deleted""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') g.del_edge('a', 'c') assert g.neighbors('a') == {'b': 0}
def test_edges(): """edges prints correct edges as tuples""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') assert ('a', 'c') in g.edges() assert ('a', 'b') in g.edges()
def test_adjacent_error(): """error raised when nodes non-existant""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') with pytest.raises(KeyError): g.adjacent('l', 'm')
def test_edge_error(): """delete non-existant edge""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') with pytest.raises(KeyError): g.del_edge('a', 'z')
def test_del_nodes(): """nodes are deleted""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') g.del_node('a') assert 'a' not in g.nodes() assert g.has_node('a') is False
def test_adjacent(): """adjacent correctly identify edges, new edge add node""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'd') g.add_edge('a', 'f') assert 'f' in g.nodes() assert g.adjacent('a', 'd') assert not g.adjacent('a', 'b')
def test_add_edge(): """edge added, new node added""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') g.add_edge('q', 'a') assert g.has_node('q') assert g.neighbors('q') == {'a': 0}
def test_add_nodes(): """nodes are added""" g = SimpleGraph() g.add_node('a') g.add_node('b') g.add_node('c') g.add_edge('a', 'c') g.add_edge('a', 'b') assert 'a' in g.nodes() assert 'b' in g.nodes() assert 'c' in g.nodes()
def test_depth(): g = SimpleGraph() g.add_edge('a', 'b') g.add_edge('a', 'c') g.add_edge('b', 'd') g.add_edge('b', 'e') g.add_edge('e', 'f') g.add_edge('f', 'g') assert g.depth_first_traversal('a') == ['a', 'c', 'b', 'e', 'f', 'g', 'd']
def test_weighted_edges(): g = SimpleGraph() g.add_edge('a', 'b', 5) g.add_edge('a', 'c', 2) g.add_edge('b', 'c', 1) assert g.dict_graph['a'] == {'b': 5, 'c': 2}
def test_weighted_edges_with_node_delete(): g = SimpleGraph() g.add_edge('a', 'b', 5) g.add_edge('a', 'c', 2) g.del_node('c') assert g.dict_graph['a'] == {'b': 5}
def test_one_loop_depth(): g = SimpleGraph() g.add_edge('a', 'a') assert g.depth_first_traversal('a') == ['a']
class DijkstrasAlgorithmTests(unittest.TestCase): def setUp(self): self.dg = SimpleGraph() self.one = Vertex('one') self.two = Vertex('two') self.three = Vertex('three') self.four = Vertex('four') self.five = Vertex('five') self.six = Vertex('six') self.disconnected = Vertex('disconnected') self.dg.add_vertex(self.one) self.dg.add_vertex(self.two) self.dg.add_vertex(self.three) self.dg.add_vertex(self.four) self.dg.add_vertex(self.five) self.dg.add_vertex(self.six) self.dg.add_vertex(self.disconnected) self.dg.add_edge(self.one, self.two, 7.0) self.dg.add_edge(self.two, self.one, 7.0) self.dg.add_edge(self.one, self.six, 14.0) self.dg.add_edge(self.six, self.one, 14.0) self.dg.add_edge(self.one, self.three, 9.0) self.dg.add_edge(self.three, self.one, 9.0) self.dg.add_edge(self.two, self.three, 10.0) self.dg.add_edge(self.three, self.two, 10.0) self.dg.add_edge(self.two, self.four, 15.0) self.dg.add_edge(self.four, self.two, 15.0) self.dg.add_edge(self.three, self.four, 11.0) self.dg.add_edge(self.four, self.three, 11.0) self.dg.add_edge(self.three, self.six, 2.0) self.dg.add_edge(self.six, self.three, 2.0) self.dg.add_edge(self.four, self.five, 6.0) self.dg.add_edge(self.five, self.four, 6.0) self.dg.add_edge(self.five, self.six, 9.0) self.dg.add_edge(self.six, self.five, 9.0) def test_dijkstras_algo(self): self.assertTrue( self.dg.dijkstras_algorithm(self.one, self.five) == (20.0, [self.one, self.three, self.six, self.five])) def test_dijkstras_unconnected(self): self.assertTrue( self.dg.dijkstras_algorithm(self.one, self.disconnected) == (math.inf, []))
class SimpleGraphTests(unittest.TestCase): def setUp(self): self.g = SimpleGraph() self.a = Vertex('a') self.b = Vertex('b') self.c = Vertex('c') self.d = Vertex('d') self.e = Vertex('e') self.f = Vertex('f') self.g.add_vertex(self.a) self.g.add_vertex(self.b) self.g.add_vertex(self.c) self.g.add_vertex(self.d) self.g.add_vertex(self.e) self.g.add_edge(self.a, self.b) self.g.add_edge(self.b, self.c) self.g.add_edge(self.c, self.b) self.g.add_edge(self.c, self.d) def test_is_empty(self): self.assertFalse(self.g.is_empty()) self.g.remove_edge(self.a, self.b) self.g.remove_edge(self.b, self.c) self.g.remove_edge(self.c, self.b) self.g.remove_edge(self.c, self.d) self.g.remove_vertex(self.a) self.g.remove_vertex(self.b) self.g.remove_vertex(self.c) self.g.remove_vertex(self.d) self.g.remove_vertex(self.e) self.assertTrue(self.g.is_empty()) def test_contains_vertex(self): self.assertTrue(self.g.contains_vertex(self.a)) self.assertFalse(self.g.contains_vertex(self.f)) def test_size(self): self.assertTrue(self.g.size() == (5, 4)) self.g.add_edge(self.a, self.e) self.assertTrue(self.g.size() == (5, 5)) self.g.remove_edge(self.a, self.e) self.assertTrue(self.g.size() == (5, 4)) self.g.add_edge(self.a, self.b) self.assertTrue(self.g.size() == (5, 4)) def test_get_neighbors(self): b_neighbors = self.g.get_neighbors(self.b) self.assertTrue(len(b_neighbors) == 2) self.assertTrue(self.a in b_neighbors) self.assertTrue(self.c in b_neighbors) self.assertTrue(self.g.is_neighbor(self.a, self.b)) self.assertFalse(self.g.is_neighbor(self.a, self.d)) self.assertTrue(all([not self.g.is_neighbor(self.e, v) for v in self.g.verts])) self.g.add_vertex(self.f) self.assertTrue(len(self.g.get_neighbors(self.f)) == 0) def test_is_reachable(self): self.assertTrue(self.g.is_reachable(self.a, self.d)) self.assertTrue(self.g.is_reachable(self.a, self.d)) self.assertFalse(self.g.is_reachable(self.d, self.a)) self.assertFalse(self.g.is_reachable(self.a, self.e)) self.g.remove_vertex(self.b) self.assertTrue(self.g.size() == (4, 1)) self.assertFalse(self.g.is_reachable(self.a, self.d))