summaryrefslogtreecommitdiffstats
path: root/rtemsspec
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-03 13:15:37 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-02-03 13:38:06 +0100
commit105a4b05c64ae058d5ef93750efaa830c05f41d9 (patch)
treefc2d39ec3dc56bb60487a91a7de5ef8e812336a1 /rtemsspec
parentvalidation: Improve non-existant state error msg (diff)
downloadrtems-central-105a4b05c64ae058d5ef93750efaa830c05f41d9.tar.bz2
validation: Improve duplicate error msg
Diffstat (limited to 'rtemsspec')
-rw-r--r--rtemsspec/tests/test_validation.py14
-rw-r--r--rtemsspec/validation.py22
2 files changed, 34 insertions, 2 deletions
diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index f68d7158..71490a14 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 a3fe788c..a1db8736 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