Esempio n. 1
0
    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()
Esempio n. 2
0
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
Esempio n. 3
0
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
Esempio n. 4
0
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
Esempio n. 5
0
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
Esempio n. 6
0
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"]
Esempio n. 7
0
                                  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,