def test_uml_associations(self): from gaphor.core.modeling.event import AssociationUpdated from gaphor.core.modeling.properties import association, derivedunion from gaphor.UML import Element event_manager = EventManager() undo_manager = UndoManager(event_manager) element_factory = ElementFactory(event_manager) class A(Element): is_unlinked = False def unlink(self): self.is_unlinked = True Element.unlink(self) A.a1 = association("a1", A, upper=1) A.a2 = association("a2", A, upper=1) A.b1 = association("b1", A, upper="*") A.b2 = association("b2", A, upper="*") A.b3 = association("b3", A, upper=1) A.derived_a = derivedunion("derived_a", A, 0, 1, A.a1, A.a2) A.derived_b = derivedunion("derived_b", A, 0, "*", A.b1, A.b2, A.b3) events = [] @event_handler(AssociationUpdated) def handler(event, events=events): events.append(event) event_manager.subscribe(handler) try: a = element_factory.create(A) undo_manager.begin_transaction() a.a1 = element_factory.create(A) undo_manager.commit_transaction() assert ( len(events) == 2 ), events # both AssociationSet and DerivedSet events assert events[0].property is A.a1 assert undo_manager.can_undo() undo_manager.undo_transaction() assert not undo_manager.can_undo() assert undo_manager.can_redo() assert len(events) == 4, events assert events[2].property is A.a1 finally: event_manager.unsubscribe(handler) undo_manager.shutdown()
def test_derivedunion(): class A(Element): a: relation_many[A] b: relation_one[A] u: relation_many[A] A.a = association("a", A) A.b = association("b", A, 0, 1) A.u = derivedunion("u", object, 0, "*", A.a, A.b) a = A() assert len(a.a) == 0, f"a.a = {a.a}" assert len(a.u) == 0, f"a.u = {a.u}" a.a = b = A() a.a = c = A() assert len(a.a) == 2, f"a.a = {a.a}" assert b in a.a assert c in a.a assert len(a.u) == 2, f"a.u = {a.u}" assert b in a.u assert c in a.u a.b = d = A() assert len(a.a) == 2, f"a.a = {a.a}" assert b in a.a assert c in a.a assert d == a.b assert len(a.u) == 3, f"a.u = {a.u}" assert b in a.u assert c in a.u assert d in a.u
def test_uml_associations(event_manager, element_factory, undo_manager): class A(Element): is_unlinked = False def unlink(self): self.is_unlinked = True Element.unlink(self) A.a1 = association("a1", A, upper=1) A.a2 = association("a2", A, upper=1) A.b1 = association("b1", A, upper="*") A.b2 = association("b2", A, upper="*") A.b3 = association("b3", A, upper=1) A.derived_a = derivedunion("derived_a", A, 0, 1, A.a1, A.a2) A.derived_b = derivedunion("derived_b", A, 0, "*", A.b1, A.b2, A.b3) events = [] @event_handler(AssociationUpdated) def handler(event, events=events): events.append(event) event_manager.subscribe(handler) undo_manager.begin_transaction() a = element_factory.create(A) a.a1 = element_factory.create(A) undo_manager.commit_transaction() assert len( events) == 2, events # both AssociationSet and DerivedSet events assert events[0].property is A.a1 assert undo_manager.can_undo() undo_manager.undo_transaction() assert not undo_manager.can_undo() assert undo_manager.can_redo() assert len(events) == 4, events assert events[2].property is A.a1
def test_set_derived_union_outside_transaction(undo_manager, element_factory, event_manager): class A(Element): pass A.a = association("a", A, upper=1, opposite="b") A.b = association("b", A, opposite="a") A.derived_a = derivedunion("derived_a", A, 0, 1, A.a) A.derived_b = derivedunion("derived_b", A, 0, "*", A.b) with Transaction(event_manager): a = element_factory.create(A) with pytest.raises(NotInTransactionException): a.a = a with pytest.raises(NotInTransactionException): a.b = a assert not a.b assert not a.a assert not a.derived_a assert not a.derived_b
def test_derivedunion_notify_for_single_derived_property(): class A(Element): pass class E(Element): notified = False a: relation_many[A] u: relation_many[A] def handle(self, event): if event.property is E.u: self.notified = True E.a = association("a", A) E.u = derivedunion("u", A, 0, "*", E.a) e = E() e.a = A() assert e.notified is True
def test_derivedunion_listmixins(): class A(Element): a: relation_many[A] b: relation_many[A] u: relation_many[A] name: attribute[str] A.a = association("a", A) A.b = association("b", A) A.u = derivedunion("u", A, 0, "*", A.a, A.b) A.name = attribute("name", str, "default") a = A() a.a = A() a.a = A() a.b = A() a.a[0].name = "foo" a.a[1].name = "bar" a.b[0].name = "baz" assert list(a.a[:].name) == ["foo", "bar"] assert sorted(list(a.u[:].name)) == ["bar", "baz", "foo"]
composite=True, opposite="specific") Heritage.specific = association("specific", Classifier, lower=1, upper=1, opposite="heritage") Classifier.general = derived("general", Classifier, 0, "*", lambda self: [g.general for g in self.heritage]) DirectedRelationship.target = derivedunion( "target", Element, 1, "*", PackageImport.importedPackage, PackageMerge.mergedPackage, Heritage.general, Include.addition, Extend.extendedCase, Realization.realizingClassifier, ElementImport.importedElement, Substitution.contract, ) DirectedRelationship.source = derivedunion( "source", Element, 1, "*", Extend.extension, Realization.abstraction, Substitution.substitutingClassifier, Include.includingCase,