summaryrefslogtreecommitdiffstats
path: root/rtemsspec
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2021-03-17 20:26:06 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2021-03-17 20:41:52 +0100
commit83bc022d4e72e6612cae6037e5a5b0be2ae1ed73 (patch)
tree9492ac5be27eefa5bb6e60048a6395b1cd4ace2e /rtemsspec
parentspecview: Add option to show action req tables (diff)
downloadrtems-central-83bc022d4e72e6612cae6037e5a5b0be2ae1ed73.tar.bz2
validation: Avoid duplicated variants
Diffstat (limited to 'rtemsspec')
-rw-r--r--rtemsspec/tests/spec-validation/action2.yml11
-rw-r--r--rtemsspec/tests/test_validation.py6
-rw-r--r--rtemsspec/validation.py24
3 files changed, 33 insertions, 8 deletions
diff --git a/rtemsspec/tests/spec-validation/action2.yml b/rtemsspec/tests/spec-validation/action2.yml
index 4875bad8..822a4701 100644
--- a/rtemsspec/tests/spec-validation/action2.yml
+++ b/rtemsspec/tests/spec-validation/action2.yml
@@ -261,4 +261,15 @@ transition-map:
- else: A0
B: B0
pre-conditions: default
+- enabled-by: FOOBAR
+ post-conditions:
+ A: A1
+ B: B0
+ pre-conditions:
+ A:
+ - A0
+ B:
+ - B0
+ C:
+ - C0
type: requirement
diff --git a/rtemsspec/tests/test_validation.py b/rtemsspec/tests/test_validation.py
index 032b531f..35ae8475 100644
--- a/rtemsspec/tests/test_validation.py
+++ b/rtemsspec/tests/test_validation.py
@@ -2401,6 +2401,12 @@ def test_validation_invalid_actions():
"for pre-condition set {A=A2}")
with pytest.raises(ValueError, match=match):
generate(validation_config, item_cache)
+ action_data["transition-map"][0]["enabled-by"] = False
+ match = ("transition map descriptor 0 of spec:/a is the first "
+ "variant for {A=A0} and it is not enabled by default")
+ with pytest.raises(ValueError, match=match):
+ generate(validation_config, item_cache)
+ action_data["transition-map"][0]["enabled-by"] = True
action_data["transition-map"][-1]["post-conditions"]["X"] = []
match = ("cannot determine state for post-condition 'X' of transition map "
"descriptor 1 of spec:/a for pre-condition set {A=A1}")
diff --git a/rtemsspec/validation.py b/rtemsspec/validation.py
index a36aa19b..c3034f85 100644
--- a/rtemsspec/validation.py
+++ b/rtemsspec/validation.py
@@ -759,18 +759,26 @@ class TransitionMap:
pre_cond_na + (0, ))
else:
enabled_by = desc["enabled-by"]
- if transition_map[map_idx] and isinstance(enabled_by,
- bool) and enabled_by:
+ post_cond = self._make_post_cond(desc_idx, map_idx, skip_post_cond)
+ if transition_map[map_idx]:
+ if isinstance(enabled_by, bool) and enabled_by:
+ raise ValueError(
+ f"transition map descriptor {desc_idx} of "
+ f"{self._item.spec} duplicates pre-condition set "
+ f"{{{self._map_index_to_pre_conditions(map_idx)}}} "
+ "defined by transition map descriptor "
+ f"{transition_map[map_idx][0].desc_idx}")
+ if transition_map[map_idx][0].post_cond == post_cond:
+ return
+ elif not isinstance(enabled_by, bool) or not enabled_by:
raise ValueError(
f"transition map descriptor {desc_idx} of "
- f"{self._item.spec} duplicates pre-condition set "
+ f"{self._item.spec} is the first variant for "
f"{{{self._map_index_to_pre_conditions(map_idx)}}} "
- "defined by transition map descriptor "
- f"{transition_map[map_idx][0].desc_idx}")
+ "and it is not enabled by default")
transition_map[map_idx].append(
- Transition(
- desc_idx, enabled_by, skip_post_cond[0], pre_cond_na,
- self._make_post_cond(desc_idx, map_idx, skip_post_cond)))
+ Transition(desc_idx, enabled_by, skip_post_cond[0],
+ pre_cond_na, post_cond))
def _add_default(self, transition_map: _TransitionMap, desc: Dict[str,
Any],