[rtems-central commit] validation: Improve duplicate error msg

Sebastian Huber sebh at rtems.org
Wed Feb 3 12:38:18 UTC 2021


Module:    rtems-central
Branch:    master
Commit:    105a4b05c64ae058d5ef93750efaa830c05f41d9
Changeset: http://git.rtems.org/rtems-central/commit/?id=105a4b05c64ae058d5ef93750efaa830c05f41d9

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Feb  3 13:15:37 2021 +0100

validation: Improve duplicate error msg

---

 rtemsspec/tests/test_validation.py | 14 ++++++++++++++
 rtemsspec/validation.py            | 22 ++++++++++++++++++++--
 2 files changed, 34 insertions(+), 2 deletions(-)

diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index f68d715..71490a1 100644
--- a/rtemsspec/tests/test_validation.py
+++ b/rtemsspec/tests/test_validation.py
@@ -2108,3 +2108,17 @@ def test_validation_invalid_actions():
              "state 'a' of pre-condition 'A'")
     with pytest.raises(ValueError, match=match):
         generate(validation_config, item_cache)
+    action_data["transition-map"][0]["pre-conditions"]["A"] = ["A0"]
+    action_data["transition-map"].append({
+        "enabled-by": True,
+        "post-conditions": {
+            "X": "X0",
+        },
+        "pre-conditions": {
+            "A": "all"
+        },
+    })
+    match = ("transition map entry 1 of spec:/a duplicates pre-condition "
+             "set {A=A0} defined by transition map entry 0")
+    with pytest.raises(ValueError, match=match):
+        generate(validation_config, item_cache)
diff --git a/rtemsspec/validation.py b/rtemsspec/validation.py
index a3fe788..a1db873 100644
--- a/rtemsspec/validation.py
+++ b/rtemsspec/validation.py
@@ -396,6 +396,7 @@ class _Transition(NamedTuple):
     enabled_by: str
     post_conditions: Tuple[int, ...]
     info: str
+    map_entry_index: int
 
 
 _ConditionIndexToEnum = Tuple[Tuple[str, ...], ...]
@@ -493,6 +494,16 @@ class _ActionRequirementTestItem(_TestItem):
                     [f"{self.ident}_PreDesc", "buf", "n", "ctx->pcs"])
             content.add("return 0;")
 
+    def _map_index_to_pre_conditions(self, map_index: int) -> str:
+        conditions = []
+        for condition in reversed(self.item["pre-conditions"]):
+            states = condition["states"]
+            count = len(states)
+            index = int(map_index % count)
+            conditions.append(f"{condition['name']}={states[index]['name']}")
+            map_index //= count
+        return ", ".join(reversed(conditions))
+
     def _add_transitions(self, trans_index: int, condition_index: int,
                          map_index: int, transition: Dict[str, Any],
                          transition_map: _TransitionMap,
@@ -532,10 +543,17 @@ class _ActionRequirementTestItem(_TestItem):
         else:
             enabled_by = enabled_by_to_exp(transition["enabled-by"],
                                            ExpressionMapper())
-            assert enabled_by != "1" or not transition_map[map_index]
+            if enabled_by == "1" and transition_map[map_index]:
+                raise ValueError(
+                    f"transition map entry {trans_index} of "
+                    f"{self.item.spec} duplicates pre-condition set "
+                    f"{{{self._map_index_to_pre_conditions(map_index)}}} "
+                    "defined by transition map entry "
+                    f"{transition_map[map_index][0].map_entry_index}")
             transition_map[map_index].append(
                 _Transition(enabled_by, post_cond,
-                            "    " + ", ".join(pre_cond_not_applicables)))
+                            "    " + ", ".join(pre_cond_not_applicables),
+                            trans_index))
 
     def _get_transition_map(self) -> _TransitionMap:
         transition_count = 1



More information about the vc mailing list