def teste_kruskal_mst_algorithm(self): '''Kruskal's algorithm uses Disjoint Set under the hook''' edges = [ ('a', 'b', 4), ('a', 'h', 8), ('h', 'b', 11), ('h', 'i', 7), ('h', 'g', 1), ('i', 'g', 6), ('i', 'c', 2), ('b', 'c', 8), ('c', 'f', 4), ('g', 'f', 2), ('d', 'f', 14), ('c', 'd', 7), ('d', 'e', 9), ('e', 'f', 10), ] graph = Graph() for v, u, w in edges: graph.add_edge(v, u, weight=w) tree = kruskal(graph) nro_edges = gg_edges_number(tree) cost = gg_total_weight(tree) self.assertEqual(nro_edges, 8) self.assertEqual(cost, 37) self.assertFalse(has_cycle(tree))
def test_ErrorHandle(self): graph = Graph() graph.add_edge(49, 57, weight=50) graph.add_edge(78, 57, weight=41) graph.add_edge(49, 8, weight=97) graph.add_edge(49, 26, weight=42) self.assertEqual(graph[49][26], 42) self.assertEqual(graph.weight(49,26), 42) self.assertEqual(graph[49][26], graph.edges[49][26]) self.assertEqual(graph.get(78),{57 : 41}) self.assertEqual(graph.get(34), dict()) self.assertEqual(graph[34], dict()) self.assertNotIn(34, graph) with self.assertRaises(KeyError) : graph[49][90] graph.add_edge(49, 57, weight=78) self.assertEqual(graph[49][57],78) self.assertEqual(graph.weight(49,57),78, msg="Deveria deixar atualizar?") graph.add_edge(49, 49, weight=96) self.assertEqual(graph.weight(49,49),0) with self.assertRaises(KeyError) : graph[49][49]
def test_TheSameVerticesInsertion(self): graph = Graph() self.assertEqual(len(graph.vertices),0) self.assertEqual(len(graph.edges),0) graph.add_edge(5,5, weight=1) self.assertEqual(len(graph.vertices),0) self.assertEqual(len(graph.edges),0) self.assertFalse(graph.has_node(5)) self.assertFalse(graph.has_edge(5,5))
class TestBreadthFirstSearch(unittest.TestCase): def setUp(self): self.graph = Graph() def tearDown(self): del self.graph def add_component(self, vertices): for v in vertices: qtdAdj = random.randint(1, 10) adjacents = random.sample(vertices, qtdAdj) for a in adjacents: if a != v: self.graph.add_edge(v, a, weight=random.randint(0, 15)) def test_findOneComponent(self): self.add_component(range(1, 51)) components = find_connected_components(self.graph) qtd_components = len(components) self.assertEqual(qtd_components, 1) def test_findTwoComponent(self): self.add_component(range(1, 51)) self.add_component(range(100, 151)) components = find_connected_components(self.graph) qtd_components = len(components) self.assertEqual(qtd_components, 2) def test_bsf(self): vertices = random.sample(range(1, 500), 50) start = random.sample(vertices, 1) self.add_component(vertices) visited = bfs(self.graph, start=start[0]) visited = list(visited) self.assertEqual(len(vertices), len(visited)) self.assertEqual(sorted(vertices), sorted(visited))
def test_Adjacents(self): graph = Graph() graph.add_edge(49, 57, weight=50) graph.add_edge(78, 57, weight=41) graph.add_edge(49, 8, weight=97) graph.add_edge(49, 26, weight=42) adj = [ v for v in graph.adjacent_to(49)] self.assertEqual(sorted(adj),[8, 26, 57]) self.assertIn(49, graph.adjacent_to(adj[1])) self.assertEqual(set(graph.adjacent_to(49)), set(graph.edges[49].keys())) self.assertIn(26, graph.edges[49].keys()) self.assertIn(26, graph.adjacent_to(49)) self.assertNotIn(56,graph.adjacent_to(49)) from _collections_abc import dict_keys self.assertIsInstance(graph.adjacent_to(49, lazy=False), set) self.assertNotIsInstance(graph.adjacent_to(49),list) self.assertNotIsInstance(graph.adjacent_to(49),dict) self.assertNotIsInstance(graph.adjacent_to(49),set) self.assertIsInstance(graph.adjacent_to(49, lazy=False),set) self.assertEqual(graph.degree(49), 3) self.assertEqual(graph.degree(8), 1) self.assertEqual(graph.degree(10), 0)
def test_AcessErrors(self): ''' Note that graph[49][90] throw an exception. ''' graph = Graph() graph.add_edge(49, 57, weight=50) graph.add_edge(78, 57, weight=41) graph.add_edge(49, 8, weight=97) graph.add_edge(49, 26, weight=42)
def test_verticesAndEdgeInsertion(self): graph = Graph() self.assertEqual(len(graph.vertices),0) self.assertEqual(len(graph.edges),0) graph.add_node(4) self.assertIn(4, graph.vertices) # self.assertNotIn(4,graph.edges) graph.add_edge(4,5,weight=30) self.assertTrue(graph.has_edge(5,4)) self.assertTrue(graph.has_node(4)) self.assertTrue(graph.has_node(5)) self.assertFalse(graph.has_node(100)) self.assertIn(5,graph.vertices) self.assertIn(4, graph.vertices) self.assertIn(4,graph.edges) self.assertIn(5,graph.edges) self.assertNotIn(100, graph.vertices) self.assertNotIn(100,graph.edges) self.assertEqual(graph[4][5], 30) self.assertEqual(graph[4][5],graph[5][4]) # self.assertEqual(graph.vertices.count(4), 1) self.assertEqual(graph.size(),2) self.assertIsInstance(graph[5],dict) self.assertIsInstance(graph[4],dict) graph.add_edge(6,4,weight=29) self.assertTrue(graph.has_edge(4,6)) self.assertTrue(graph.has_node(6)) self.assertIn(6,graph.vertices) self.assertIn(6,graph.edges) self.assertEqual(graph[4][6], 29) self.assertEqual(graph[4][6],graph[6][4]) # self.assertEqual(graph.vertices.count(4), 1) graph.add_node(6) # inserting again # self.assertEqual(graph.vertices.count(6), 1) self.assertFalse(graph.has_edge(4,7)) self.assertEqual(graph.weight(4,7),float("inf")) self.assertEqual(graph.weight(4,4),0) self.assertEqual(graph.degree(4),2) self.assertEqual(graph.degree(5),1) self.assertEqual(graph.degree(6),1) graph.add_edge(150, 134, weight=9) self.assertEqual(graph[150][134], 9) self.assertEqual(graph.weight(134,150), 9)
class TestDijkstraImplementation(unittest.TestCase): def setUp(self): self.graph = Graph() self.graph.add_edge('a', 'b', weight=15) self.graph.add_edge('a', 'c', weight=25) self.graph.add_edge('c', 'd', weight=10) self.graph.add_edge('c', 'e', weight=20) self.graph.add_edge('e', 'f', weight=10) self.graph.add_edge('e', 'g', weight=5) self.graph.add_edge('e', 'b', weight=10) self.graph.add_edge('b', 'h', weight=5) self.graph.add_edge('b', 'i', weight=25) self.graph.add_edge('h', 'i', weight=15) def test_small_graph(self): graph = self.graph distances, _ = dijkstra(graph, 'a') self.assertEqual(distances['a'], 0) self.assertEqual(distances['b'], 15) self.assertEqual(distances['c'], 25) self.assertEqual(distances['d'], 35) self.assertEqual(distances['e'], 25) self.assertEqual(distances['f'], 35) self.assertEqual(distances['g'], 30) self.assertEqual(distances['h'], 20) self.assertEqual(distances['i'], 35) def test_desconnected_graph(self): graph = self.graph # desconnected edge graph.add_edge('z', 'w', weight=40) distances, _ = dijkstra(graph, 'a') self.assertNotEqual(distances['z'], 40) self.assertEqual(distances['z'], float("inf")) #mas R nem é um vértice do grafo self.assertEqual(distances['R'], float("inf")) def test_previous_tree(self): graph = self.graph _, previous_tree = dijkstra(graph, 'a') self.assertEqual(previous_tree['i'], 'h') self.assertEqual(previous_tree['b'], 'a') self.assertEqual(previous_tree['a'], None)
def tree_example(self): tree = Graph() tree.add_edge('a', 'b', weight=1) tree.add_edge('a', 'c', weight=1) tree.add_edge('a', 'd', weight=1) tree.add_edge('b', 'e', weight=1) tree.add_edge('b', 'f', weight=1) tree.add_edge('c', 'g', weight=1) tree.add_edge('d', 'h', weight=1) tree.add_edge('d', 'i', weight=1) tree.add_edge('d', 'j', weight=1) tree.add_edge('j', 'k', weight=1) tree.add_edge('j', 'l', weight=1) return tree