gaphor/tests/test_elements_have_owner.py
2020-09-11 22:14:01 +02:00

66 lines
1.8 KiB
Python

"""For all relevant model elements, check if there is at least one "owner"
("owner" is a derived union).
This is needed to display all elements in the tree view.
NOTE: Comment does not have an owner. In the model it does, though.
"""
import itertools
import pytest
import gaphor.SysML.diagramitems
import gaphor.UML.diagramitems
from gaphor import UML
from gaphor.core.modeling import Element
from gaphor.core.modeling.properties import derived
from gaphor.diagram.support import get_model_element
def all_subset_properties(prop):
for sub in prop.subsets:
if isinstance(sub, derived):
yield from all_subset_properties(sub)
else:
yield sub
def all_presented_elements(module):
return (
get_model_element(getattr(module, name))
for name in dir(module)
if not name.startswith("_")
and get_model_element(getattr(module, name) not in (None, UML.Comment))
)
def all_presented_uml_and_sysml_elements():
return itertools.chain(
all_presented_elements(gaphor.UML.diagramitems),
all_presented_elements(gaphor.SysML.diagramitems),
[
UML.ExecutionOccurrenceSpecification,
UML.ExtensionEnd,
UML.MessageOccurrenceSpecification,
],
)
def concrete_owner_property(class_):
return (
p for p in class_.umlproperties() if p in all_subset_properties(Element.owner)
)
def test_all_presented_uml_and_sysml_elements():
elements = all_presented_uml_and_sysml_elements()
assert all(issubclass(c, Element) for c in elements)
@pytest.mark.parametrize("class_", all_presented_uml_and_sysml_elements())
def test_element_has_concrete_ownable_property(class_):
owners = list(concrete_owner_property(class_))
print(f"{class_}: {list(map(str, owners))}")
assert any(owners)