summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-03 12:03:55 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-03 13:38:06 +0100
commit5c03af1a909ddac55700f6bf62aa3277b2e37d27 (patch)
tree3a4dd016a48475f3252869350e77d1a9d7f24a72
parentvalidation: Improve non-existant state error msg (diff)
downloadrtems-central-5c03af1a909ddac55700f6bf62aa3277b2e37d27.tar.bz2
validation: Improve non-existant state error msg
-rw-r--r--rtemsspec/tests/test_validation.py10
-rw-r--r--rtemsspec/validation.py34
2 files changed, 32 insertions, 12 deletions
diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index 40794f07..f68d7158 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 0549705e..a3fe788c 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: