[rtems-central commit] validation: Improve non-existant state error msg

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


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

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Wed Feb  3 12:03:55 2021 +0100

validation: Improve non-existant state error msg

---

 rtemsspec/tests/test_validation.py | 10 ++++++++++
 rtemsspec/validation.py            | 34 ++++++++++++++++++++++------------
 2 files changed, 32 insertions(+), 12 deletions(-)

diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index 40794f0..f68d715 100644
--- a/rtemsspec/tests/test_validation.py
+++ b/rtemsspec/tests/test_validation.py
@@ -2098,3 +2098,13 @@ def test_validation_invalid_actions():
              "post-condition state 'X0'")
     with pytest.raises(ValueError, match=match):
         generate(validation_config, item_cache)
+    action_data["post-conditions"][0]["states"] = [{
+        "name": "X0",
+        "test-code": None,
+        "text": None
+    }]
+    action_data["transition-map"][0]["pre-conditions"]["A"] = ["a"]
+    match = ("transition map entry 0 of spec:/a refers to non-existent "
+             "state 'a' of pre-condition 'A'")
+    with pytest.raises(ValueError, match=match):
+        generate(validation_config, item_cache)
diff --git a/rtemsspec/validation.py b/rtemsspec/validation.py
index 0549705..a3fe788 100644
--- a/rtemsspec/validation.py
+++ b/rtemsspec/validation.py
@@ -493,12 +493,13 @@ class _ActionRequirementTestItem(_TestItem):
                     [f"{self.ident}_PreDesc", "buf", "n", "ctx->pcs"])
             content.add("return 0;")
 
-    def _add_transitions(self, condition_index: int, map_index: int,
-                         transition: Dict[str,
-                                          Any], transition_map: _TransitionMap,
+    def _add_transitions(self, trans_index: int, condition_index: int,
+                         map_index: int, transition: Dict[str, Any],
+                         transition_map: _TransitionMap,
                          pre_cond_not_applicables: List[str],
                          post_cond: Tuple[int, ...]) -> None:
         # pylint: disable=too-many-arguments
+        # pylint: disable=too-many-locals
         if condition_index < self._pre_condition_count:
             condition = self._pre_index_to_condition[condition_index]
             state_count = len(condition["states"])
@@ -508,17 +509,26 @@ class _ActionRequirementTestItem(_TestItem):
                 assert states in ["all", "N/A"]
                 for index in range(state_count):
                     self._add_transitions(
-                        condition_index + 1, map_index + index, transition,
-                        transition_map,
+                        trans_index, condition_index + 1, map_index + index,
+                        transition, transition_map,
                         pre_cond_not_applicables + [str(int(states == "N/A"))],
                         post_cond)
             else:
                 for state in states:
-                    self._add_transitions(
-                        condition_index + 1, map_index +
-                        self._pre_state_to_index[condition_index][state],
-                        transition, transition_map,
-                        pre_cond_not_applicables + ["0"], post_cond)
+                    try:
+                        index = self._pre_state_to_index[condition_index][
+                            state]
+                    except KeyError as err:
+                        msg = (f"transition map entry {trans_index} of "
+                               f"{self.item.spec} refers to non-existent "
+                               f"state {err} of pre-condition "
+                               f"'{condition['name']}'")
+                        raise ValueError(msg) from err
+                    self._add_transitions(trans_index, condition_index + 1,
+                                          map_index + index, transition,
+                                          transition_map,
+                                          pre_cond_not_applicables + ["0"],
+                                          post_cond)
         else:
             enabled_by = enabled_by_to_exp(transition["enabled-by"],
                                            ExpressionMapper())
@@ -556,8 +566,8 @@ class _ActionRequirementTestItem(_TestItem):
                 post_cond = tuple(
                     len(self._post_state_to_index[index])
                     for index in range(self._post_condition_count))
-            self._add_transitions(0, 0, transition, transition_map, info,
-                                  post_cond)
+            self._add_transitions(trans_index, 0, 0, transition,
+                                  transition_map, info, post_cond)
         return transition_map
 
     def _post_condition_enumerators(self, conditions: Any) -> str:



More information about the vc mailing list