From d4e83e8ea35658e69d29cbfb709928c21f966d50 Mon Sep 17 00:00:00 2001
From: Stefano Borini <sborini@enthought.com>
Date: Thu, 7 Jun 2018 11:47:54 +0100
Subject: [PATCH] Fixed tests

---
 force_bdss/core/data_value.py                 |  2 +-
 force_bdss/core/kpi_specification.py          |  3 +-
 force_bdss/core/output_slot_info.py           |  2 +-
 .../tests/test_base_data_source_model.py      |  2 -
 force_bdss/io/tests/test_workflow_reader.py   |  5 +-
 force_bdss/io/workflow_reader.py              |  7 ++
 force_bdss/io/workflow_writer.py              | 33 +++++---
 force_bdss/mco/base_mco_model.py              |  4 +-
 force_bdss/tests/fixtures/test_csv.json       | 77 -------------------
 force_bdss/tests/fixtures/test_dummy.json     |  9 ++-
 force_bdss/tests/fixtures/test_empty.json     |  2 -
 force_bdss/tests/fixtures/test_null.json      |  2 +
 force_bdss/tests/fixtures/test_probe.json     |  9 ++-
 .../tests/test_core_evaluation_driver.py      | 11 ++-
 14 files changed, 66 insertions(+), 102 deletions(-)
 delete mode 100644 force_bdss/tests/fixtures/test_csv.json

diff --git a/force_bdss/core/data_value.py b/force_bdss/core/data_value.py
index 51226d9..c03f1da 100644
--- a/force_bdss/core/data_value.py
+++ b/force_bdss/core/data_value.py
@@ -1,4 +1,4 @@
-from traits.api import HasStrictTraits, Any, String, Enum, Bool
+from traits.api import HasStrictTraits, Any, String, Enum
 
 
 class DataValue(HasStrictTraits):
diff --git a/force_bdss/core/kpi_specification.py b/force_bdss/core/kpi_specification.py
index 672a9cf..f675939 100644
--- a/force_bdss/core/kpi_specification.py
+++ b/force_bdss/core/kpi_specification.py
@@ -7,4 +7,5 @@ class KPISpecification(HasStrictTraits):
     #: The user defined name of the variable containing the kpi value.
     name = Identifier()
 
-    target = Enum("MINIMISE")
+    #: The expected outcome of the procedure relative to this KPI.
+    objective = Enum("MINIMISE")
diff --git a/force_bdss/core/output_slot_info.py b/force_bdss/core/output_slot_info.py
index 6fd360d..b2307d4 100644
--- a/force_bdss/core/output_slot_info.py
+++ b/force_bdss/core/output_slot_info.py
@@ -1,4 +1,4 @@
-from traits.api import HasStrictTraits, Bool
+from traits.api import HasStrictTraits
 
 from ..local_traits import Identifier
 
diff --git a/force_bdss/data_sources/tests/test_base_data_source_model.py b/force_bdss/data_sources/tests/test_base_data_source_model.py
index 7bdcc3c..a9be54b 100644
--- a/force_bdss/data_sources/tests/test_base_data_source_model.py
+++ b/force_bdss/data_sources/tests/test_base_data_source_model.py
@@ -57,12 +57,10 @@ class TestBaseDataSourceModel(unittest.TestCase):
                     {
                         "__traits_version__": "4.6.0",
                         "name": "baz",
-                        "is_kpi": False
                     },
                     {
                         "__traits_version__": "4.6.0",
                         "name": "quux",
-                        "is_kpi": False
                     }
                 ]
             })
diff --git a/force_bdss/io/tests/test_workflow_reader.py b/force_bdss/io/tests/test_workflow_reader.py
index 84bd572..c3e81cb 100644
--- a/force_bdss/io/tests/test_workflow_reader.py
+++ b/force_bdss/io/tests/test_workflow_reader.py
@@ -34,7 +34,8 @@ class TestWorkflowReader(unittest.TestCase):
                                       ".dummy_mco_parameter",
                                 "model_data": {}
                             }
-                        ]
+                        ],
+                        "kpis": []
                     },
                 },
                 "execution_layers": [
@@ -146,6 +147,8 @@ class TestModelCreationFailure(unittest.TestCase):
                                       ".probe_mco_parameter",
                                 "model_data": {}
                             }
+                        ],
+                        "kpis": [
                         ]
                     },
                 },
diff --git a/force_bdss/io/workflow_reader.py b/force_bdss/io/workflow_reader.py
index dd9687e..f2b3829 100644
--- a/force_bdss/io/workflow_reader.py
+++ b/force_bdss/io/workflow_reader.py
@@ -5,6 +5,7 @@ from traits.api import HasStrictTraits, Instance
 
 from force_bdss.core.execution_layer import ExecutionLayer
 from force_bdss.core.input_slot_info import InputSlotInfo
+from force_bdss.core.kpi_specification import KPISpecification
 from force_bdss.core.output_slot_info import OutputSlotInfo
 from force_bdss.core.workflow import Workflow
 from ..factory_registry_plugin import IFactoryRegistryPlugin
@@ -165,6 +166,9 @@ class WorkflowReader(HasStrictTraits):
         model_data["parameters"] = self._extract_mco_parameters(
             mco_id,
             model_data["parameters"])
+        model_data["kpis"] = self._extract_kpi_specifications(
+            model_data["kpis"]
+        )
 
         try:
             model = mco_factory.create_model(model_data)
@@ -281,6 +285,9 @@ class WorkflowReader(HasStrictTraits):
 
         return parameters
 
+    def _extract_kpi_specifications(self, info):
+        return [KPISpecification(**d) for d in info]
+
     def _extract_input_slot_info(self, info):
         return [InputSlotInfo(**d) for d in info]
 
diff --git a/force_bdss/io/workflow_writer.py b/force_bdss/io/workflow_writer.py
index 9a0db68..aadd19d 100644
--- a/force_bdss/io/workflow_writer.py
+++ b/force_bdss/io/workflow_writer.py
@@ -46,11 +46,7 @@ class WorkflowWriter(HasStrictTraits):
 
         parameters_data = []
         for param in data["model_data"]["parameters"]:
-            state = param.__getstate__()
-            try:
-                state.pop("__traits_version__")
-            except KeyError:
-                pass
+            state = traits_to_dict(param)
 
             parameters_data.append(
                 {
@@ -60,6 +56,15 @@ class WorkflowWriter(HasStrictTraits):
             )
 
         data["model_data"]["parameters"] = parameters_data
+
+        kpis_data = []
+        for kpi in data["model_data"]["kpis"]:
+            kpis_data.append(
+                traits_to_dict(kpi)
+            )
+
+        data["model_data"]["kpis"] = kpis_data
+
         return data
 
     def _execution_layer_data(self, layer):
@@ -75,13 +80,21 @@ class WorkflowWriter(HasStrictTraits):
         """
         Extracts the data from an external model and returns its dictionary
         """
-        state = model.__getstate__()
-        try:
-            state.pop("__traits_version__")
-        except KeyError:
-            pass
+        state = traits_to_dict(model)
 
         return {
             "id": model.factory.id,
             "model_data": state
         }
+
+
+def traits_to_dict(traits_obj):
+    """Converts a traits class into a dict, removing the pesky
+    traits version."""
+    state = traits_obj.__getstate__()
+    try:
+        state.pop("__traits_version__")
+    except KeyError:
+        pass
+
+    return state
diff --git a/force_bdss/mco/base_mco_model.py b/force_bdss/mco/base_mco_model.py
index af89084..b39f88e 100644
--- a/force_bdss/mco/base_mco_model.py
+++ b/force_bdss/mco/base_mco_model.py
@@ -18,10 +18,10 @@ class BaseMCOModel(ABCHasStrictTraits):
                        visible=False,
                        transient=True)
 
-    # A list of the parameters for the MCO
+    #: A list of the parameters for the MCO
     parameters = List(BaseMCOParameter, visible=False)
 
-    # A list of KPI specification objects and their objective.
+    #: A list of KPI specification objects and their objective.
     kpis = List(KPISpecification, visible=False)
 
     def __init__(self, factory, *args, **kwargs):
diff --git a/force_bdss/tests/fixtures/test_csv.json b/force_bdss/tests/fixtures/test_csv.json
deleted file mode 100644
index 692ff79..0000000
--- a/force_bdss/tests/fixtures/test_csv.json
+++ /dev/null
@@ -1,77 +0,0 @@
-{
-  "version": "1",
-  "workflow": {
-    "mco": {
-      "id": "force.bdss.enthought.factory.dummy_dakota",
-      "model_data": {
-        "parameters" : [
-          {
-            "id": "force.bdss.enthought.factory.dummy_dakota.parameter.ranged",
-            "model_data": {
-                "initial_value": 3,
-                "lower_bound": 0,
-                "upper_bound": 10,
-                "name": "p0",
-                "type": "PRESSURE"
-            }
-          }
-        ]
-      }
-    },
-    "data_sources": [
-      {
-        "id": "force.bdss.enthought.factory.csv_extractor",
-        "model_data": {
-          "filename": "foo.csv",
-          "row": 3,
-          "column": 5,
-          "cuba_type": "PRESSURE",
-          "input_slot_maps": [
-          ],
-          "output_slot_names": [
-            "p1"
-          ]
-        }
-      },
-      {
-        "id": "force.bdss.enthought.factory.csv_extractor",
-        "model_data": {
-          "filename": "foo.csv",
-          "row": 3,
-          "column": 5,
-          "cuba_type": "PRESSURE",
-          "input_slot_maps": [
-          ],
-          "output_slot_names": [
-            "p2"
-          ]
-        }
-      }
-    ],
-    "kpi_calculators": [
-      {
-        "id": "force.bdss.enthought.factory.kpi_adder",
-        "model_data": {
-          "cuba_type_in": "PRESSURE",
-          "cuba_type_out": "TOTAL_PRESSURE",
-          "input_slot_maps": [
-            {
-              "name": "p0"
-            },
-            {
-              "name": "p1"
-            },
-            {
-              "name": "p2"
-            }
-          ],
-          "output_slot_names": [
-            "ptot"
-          ]
-        }
-      }
-    ],
-    "notification_listeners": [
-    ]
-  }
-}
diff --git a/force_bdss/tests/fixtures/test_dummy.json b/force_bdss/tests/fixtures/test_dummy.json
index 36ec5c0..f11bc06 100644
--- a/force_bdss/tests/fixtures/test_dummy.json
+++ b/force_bdss/tests/fixtures/test_dummy.json
@@ -12,6 +12,12 @@
                             "type": "PRESSURE"
                         }
                     }
+                ],
+                "kpis": [
+                  {
+                    "name": "bar",
+                    "objective": "MINIMISE"
+                  }
                 ]
             }
         },
@@ -31,8 +37,7 @@
                         ],
                         "output_slot_info": [
                             {
-                                "name": "bar",
-                                "is_kpi": true
+                                "name": "bar"
                             }
                         ]
                     }
diff --git a/force_bdss/tests/fixtures/test_empty.json b/force_bdss/tests/fixtures/test_empty.json
index 00c6b2f..c739dfe 100644
--- a/force_bdss/tests/fixtures/test_empty.json
+++ b/force_bdss/tests/fixtures/test_empty.json
@@ -4,8 +4,6 @@
     "mco": null,
     "execution_layers": [
     ],
-    "kpi_calculators": [
-    ],
     "notification_listeners": [
     ]
   }
diff --git a/force_bdss/tests/fixtures/test_null.json b/force_bdss/tests/fixtures/test_null.json
index b5c9ab9..8103e91 100644
--- a/force_bdss/tests/fixtures/test_null.json
+++ b/force_bdss/tests/fixtures/test_null.json
@@ -5,6 +5,8 @@
       "id": "force.bdss.enthought.plugin.test.v0.factory.probe_mco",
       "model_data": {
         "parameters" : [
+        ],
+        "kpis": [
         ]
       }
     },
diff --git a/force_bdss/tests/fixtures/test_probe.json b/force_bdss/tests/fixtures/test_probe.json
index 2eba16d..c0c1bde 100644
--- a/force_bdss/tests/fixtures/test_probe.json
+++ b/force_bdss/tests/fixtures/test_probe.json
@@ -12,6 +12,12 @@
                             "type": "PRESSURE"
                         }
                     }
+                ],
+                "kpis": [
+                    {
+                        "name": "bar",
+                        "objective": "MINIMISE"
+                    }
                 ]
             }
         },
@@ -28,8 +34,7 @@
                         ],
                         "output_slot_info": [
                             {
-                                "name": "bar",
-                                "is_kpi": true
+                                "name": "bar"
                             }
                         ]
                     }
diff --git a/force_bdss/tests/test_core_evaluation_driver.py b/force_bdss/tests/test_core_evaluation_driver.py
index 5d206ec..172ceaa 100644
--- a/force_bdss/tests/test_core_evaluation_driver.py
+++ b/force_bdss/tests/test_core_evaluation_driver.py
@@ -4,6 +4,7 @@ import testfixtures
 import six
 
 from force_bdss.core.execution_layer import ExecutionLayer
+from force_bdss.core.kpi_specification import KPISpecification
 from force_bdss.core.output_slot_info import OutputSlotInfo
 from force_bdss.core.workflow import Workflow
 from force_bdss.tests.probe_classes.factory_registry_plugin import \
@@ -14,6 +15,7 @@ from force_bdss.core.input_slot_info import InputSlotInfo
 from force_bdss.core.data_value import DataValue
 from force_bdss.core.slot import Slot
 from force_bdss.tests import fixtures
+from force_bdss.tests.probe_classes.mco import ProbeMCOFactory
 
 try:
     import mock
@@ -223,7 +225,14 @@ class TestCoreEvaluationDriver(unittest.TestCase):
             output_slots_size=1,
             run_function=multiplier)
 
+        mco_factory = ProbeMCOFactory(self.plugin)
+        mco_model = mco_factory.create_model()
+        mco_model.kpis = [
+            KPISpecification(name="out1")
+        ]
+
         wf = Workflow(
+            mco=mco_model,
             execution_layers=[
                 ExecutionLayer(),
                 ExecutionLayer(),
@@ -281,7 +290,7 @@ class TestCoreEvaluationDriver(unittest.TestCase):
             InputSlotInfo(name="res2")
         ]
         model.output_slot_info = [
-            OutputSlotInfo(name="out1", is_kpi=True)
+            OutputSlotInfo(name="out1")
         ]
         wf.execution_layers[3].data_sources.append(model)
 
-- 
GitLab