diff --git a/force_bdss/core/kpi_specification.py b/force_bdss/core/kpi_specification.py index f6759396d7af882a1a201257d449576b3164144b..003229bf06e97deb229d9d35b0d68a65aae41f2c 100644 --- a/force_bdss/core/kpi_specification.py +++ b/force_bdss/core/kpi_specification.py @@ -8,4 +8,4 @@ class KPISpecification(HasStrictTraits): name = Identifier() #: The expected outcome of the procedure relative to this KPI. - objective = Enum("MINIMISE") + objective = Enum("", "MINIMISE") diff --git a/force_bdss/core/tests/test_verifier.py b/force_bdss/core/tests/test_verifier.py index 6c5ea3569d928820a4469f4f2154a18040aa92b2..7d6e2348b686357ee54e69123f495f667b5b41fe 100644 --- a/force_bdss/core/tests/test_verifier.py +++ b/force_bdss/core/tests/test_verifier.py @@ -5,6 +5,7 @@ from force_bdss.core.input_slot_info import InputSlotInfo from force_bdss.core.output_slot_info import OutputSlotInfo from force_bdss.core.verifier import verify_workflow from force_bdss.core.workflow import Workflow +from force_bdss.core.kpi_specification import KPISpecification from force_bdss.tests.dummy_classes.extension_plugin import \ DummyExtensionPlugin @@ -33,7 +34,7 @@ class TestVerifier(unittest.TestCase): self.assertEqual(errors[0].subject, wf.mco) self.assertIn("no defined parameters", errors[0].error) - def test_parameters_empty_names(self): + def test_empty_parameter_options(self): wf = self.workflow mco_factory = self.plugin.mco_factories[0] wf.mco = mco_factory.create_model() @@ -43,9 +44,39 @@ class TestVerifier(unittest.TestCase): errors = verify_workflow(wf) self.assertEqual(len(errors), 3) self.assertEqual(errors[0].subject, wf.mco.parameters[0]) - self.assertIn("empty name", errors[0].error) + self.assertIn("Empty Name", errors[0].error) self.assertEqual(errors[1].subject, wf.mco.parameters[0]) - self.assertIn("empty type", errors[1].error) + self.assertIn("Empty Type", errors[1].error) + + def test_empty_kpi_options(self): + wf = self.workflow + mco_factory = self.plugin.mco_factories[0] + wf.mco = mco_factory.create_model() + kpi = KPISpecification(name='', objective='') + wf.mco.kpis.append(kpi) + + errors = verify_workflow(wf) + + self.assertEqual(len(errors), 4) + self.assertEqual(errors[1].subject, wf.mco.kpis[0]) + self.assertIn("Empty Name", errors[1].error) + self.assertIn("Empty Objective", errors[2].error) + + def test_empty_execution_layer(self): + wf = self.workflow + mco_factory = self.plugin.mco_factories[0] + wf.mco = mco_factory.create_model() + parameter_factory = mco_factory.parameter_factories()[0] + wf.mco.parameters.append(parameter_factory.create_model()) + wf.mco.parameters[0].name = "name" + wf.mco.parameters[0].type = "type" + + layer = ExecutionLayer() + wf.execution_layers.append(layer) + errors = verify_workflow(wf) + self.assertEqual(len(errors), 1) + self.assertEqual(errors[0].subject, wf.execution_layers[0]) + self.assertIn("Layer 0 has no data sources", errors[0].error) def test_data_sources(self): wf = self.workflow diff --git a/force_bdss/core/verifier.py b/force_bdss/core/verifier.py index 3361f35fc143a2b0b9bac09e1ca594cc548e57e3..2526c4ebef08ba30946db12d86f97c6811f1795c 100644 --- a/force_bdss/core/verifier.py +++ b/force_bdss/core/verifier.py @@ -15,10 +15,8 @@ def verify_workflow(workflow): """ result = [] - result.extend(_check_mco(workflow)) result.extend(_check_execution_layers(workflow)) - return result @@ -38,13 +36,30 @@ def _check_mco(workflow): errors.append(VerifierError(subject=mco, error="MCO has no defined parameters")) - for param in mco.parameters: - if len(param.name.strip()) == 0: + for idx, param in enumerate(mco.parameters): + factory_name = param.factory.name + if param.name == '': errors.append(VerifierError(subject=param, - error="Parameter has empty name")) + error="Empty Name - Parameter {} " + "({})".format(idx, + factory_name))) + if len(param.type.strip()) == 0: errors.append(VerifierError(subject=param, - error="Parameter has empty type")) + error="Empty Type - Parameter {} " + "({})".format(idx, + factory_name))) + + for idx, kpi in enumerate(mco.kpis): + if kpi.name == '': + errors.append(VerifierError(subject=kpi, + error="Empty Name - KPI {}".format( + idx))) + if kpi.objective == '': + errors.append(VerifierError(subject=kpi, + error="Empty Objective - " + "KPI {}".format(idx))) + return errors @@ -62,18 +77,19 @@ def _check_execution_layers(workflow): return errors - for layer in layers: + for idx, layer in enumerate(layers): if len(layer.data_sources) == 0: errors.append(VerifierError(subject=layer, - error="Layer has no data sources")) + error="Layer {} has no " + "data sources".format(idx))) for ds in layer.data_sources: - errors.extend(_check_data_source(ds)) + errors.extend(_check_data_source(ds, idx)) return errors -def _check_data_source(data_source_model): +def _check_data_source(data_source_model, layer_number): errors = [] factory = data_source_model.factory @@ -100,23 +116,31 @@ def _check_data_source(data_source_model): if len(input_slots) != len(data_source_model.input_slot_info): errors.append(VerifierError( subject=data_source_model, - error="Missing input slot name assignment")) + error="Missing input slot name assignment " + "in layer {}".format(layer_number))) for idx, info in enumerate(data_source_model.input_slot_info): - if len(info.name.strip()) == 0: + if info.name == '': errors.append(VerifierError( subject=data_source_model, - error="Undefined name for input parameter {}".format(idx))) + error="Undefined name for input " + "parameter {} from {} in layer {}".format(idx, + factory.name, + layer_number))) if len(output_slots) != len(data_source_model.output_slot_info): errors.append(VerifierError( subject=data_source_model, - error="Missing output slot name assignment")) + error="Missing output slot name assignment " + "in layer {}".format(layer_number))) for idx, info in enumerate(data_source_model.output_slot_info): - if len(info.name.strip()) == 0: + if info.name == '': errors.append(VerifierError( subject=data_source_model, - error="Undefined name for output parameter {}".format(idx))) + error="Undefined name for output " + "parameter {} from {} in layer {}".format(idx, + factory.name, + layer_number))) return errors diff --git a/force_bdss/tests/test_core_mco_driver.py b/force_bdss/tests/test_core_mco_driver.py index d137b2122c554233e3d8cf29273cf544a8a03500..421d5de7a572efabdcb9dd685da3077c0570df74 100644 --- a/force_bdss/tests/test_core_mco_driver.py +++ b/force_bdss/tests/test_core_mco_driver.py @@ -233,6 +233,6 @@ class TestCoreMCODriver(unittest.TestCase): ('force_bdss.core_mco_driver', 'ERROR', 'MCO has no defined parameters'), ('force_bdss.core_mco_driver', 'ERROR', - 'Missing input slot name assignment'), + 'Missing input slot name assignment in layer 0'), ('force_bdss.core_mco_driver', 'ERROR', - 'Missing output slot name assignment')) + 'Missing output slot name assignment in layer 0'))