def testDAG(self): """ 1 --- 4 2 --- 6 \ / 5 / 3 """ dag = DAG() [dag.add_node(i) for i in range(1, 7)] dag.add_edge(1, 4) dag.add_edge(2, 6) dag.add_edge(2, 5) dag.add_edge(5, 6) dag.add_edge(3, 5) self.assertEqual(set(dag[2]), set([5, 6])) self.assertEqual(list(dag.topological_iter()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.dfs()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.bfs()), [1, 2, 3, 4, 5, 6]) dag.add_edge(6, 1) dag.add_edge(1, 2) self.assertRaises(GraphContainsCycleError, lambda: list(dag.topological_iter()))
def testDAG(self): r""" 1 --- 4 2 --- 6 \ / 5 / 3 """ dag = DAG() [dag.add_node(i) for i in range(1, 7)] dag.add_edge(1, 4) dag.add_edge(2, 6) dag.add_edge(2, 5) dag.add_edge(5, 6) dag.add_edge(3, 5) with self.assertRaises(KeyError): dag.add_edge(1, 10) with self.assertRaises(KeyError): dag.add_edge(10, 1) self.assertEqual(set(dag[2]), {5, 6}) self.assertEqual(list(dag.topological_iter()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.dfs()), [3, 2, 5, 6, 1, 4]) self.assertEqual(list(dag.bfs()), [1, 2, 3, 4, 5, 6]) dag.add_edge(6, 1) dag.add_edge(1, 2) with self.assertRaises(KeyError): for _ in dag.iter_predecessors(-1): pass with self.assertRaises(KeyError): for _ in dag.iter_successors(-1): pass self.assertRaises(GraphContainsCycleError, lambda: list(dag.topological_iter())) dag.remove_edge(2, 5) self.assertFalse(dag.has_successor(2, 5)) with self.assertRaises(KeyError): dag.remove_edge(2, 5) rev_dag = dag.build_reversed() for n in dag: self.assertIn(n, rev_dag) self.assertTrue( all( rev_dag.has_successor(n, pred) for pred in dag.predecessors(n))) undigraph = dag.build_undirected() for n in dag: self.assertIn(n, undigraph) self.assertTrue( all( undigraph.has_predecessor(pred, n) for pred in dag.predecessors(n))) self.assertTrue( all( undigraph.has_successor(n, pred) for pred in dag.predecessors(n))) dag_copy = dag.copy() for n in dag: self.assertIn(n, dag_copy) self.assertTrue( all( dag_copy.has_successor(pred, n) for pred in dag_copy.predecessors(n)))