def test_topological_order_successful(self): """Tests calling RecipeDefinition.get_topological_order() successfully""" input_interface = Interface() definition = RecipeDefinition(input_interface) definition.add_job_node('A', 'job_type_1', '1.0', 1) definition.add_job_node('B', 'job_type_2', '1.0', 1) definition.add_recipe_node('C', 'recipe_type_1', 1) definition.add_recipe_node('D', 'recipe_type_2', 1) definition.add_job_node('E', 'job_type_3', '1.0', 1) definition.add_job_node('F', 'job_type_4', '1.0', 1) definition.add_dependency('A', 'B') definition.add_dependency('A', 'C') definition.add_dependency('A', 'E') definition.add_dependency('B', 'C') definition.add_dependency('B', 'D') definition.add_dependency('C', 'D') definition.add_dependency('D', 'E') definition.add_dependency('E', 'F') order = definition.get_topological_order() expected_order = [ 'A', 'B', 'C', 'D', 'E', 'F' ] # This is the only valid topological order for this graph self.assertListEqual(order, expected_order)
def test_topological_order_circular(self): """Tests calling RecipeDefinition.get_topological_order() with a circular dependency""" input_interface = Interface() definition = RecipeDefinition(input_interface) definition.add_job_node('A', 'job_type_1', '1.0', 1) definition.add_job_node('B', 'job_type_2', '1.0', 1) definition.add_recipe_node('C', 'recipe_type_1', 1) definition.add_recipe_node('D', 'recipe_type_2', 1) definition.add_dependency('A', 'B') definition.add_dependency('B', 'C') definition.add_dependency('C', 'D') definition.add_dependency('D', 'B') with self.assertRaises(InvalidDefinition) as context: definition.get_topological_order() self.assertEqual(context.exception.error.name, 'CIRCULAR_DEPENDENCY')