Define ElementDispatcher as a service again

Since we do not want to pass dependencies along through ElementFactory.

Cleaned up unit tests
This commit is contained in:
Arjan Molenaar 2020-04-14 22:17:34 +02:00
parent bdade85d69
commit 41e0cc6258
15 changed files with 104 additions and 233 deletions

@ -4,22 +4,14 @@ from gi.repository import Gtk
from gaphor import UML
from gaphor.core.eventmanager import EventManager
from gaphor.core.modeling import ElementFactory
from gaphor.core.modeling.elementdispatcher import ElementDispatcher
from gaphor.services.properties import Properties
from gaphor.tests.testcase import TestCase
from gaphor.ui.diagrampage import DiagramPage
from gaphor.UML.modelprovider import UMLModelProvider
from gaphor.UML.toolbox import uml_toolbox_actions
@pytest.fixture
def event_manager():
return EventManager()
@pytest.fixture
def element_factory(event_manager):
return ElementFactory(event_manager)
@pytest.fixture
def properties():
return {}

@ -5,15 +5,9 @@ from gaphor.core.eventmanager import EventManager
from gaphor.core.modeling import ElementFactory
@pytest.fixture
def factory():
event_manager = EventManager()
return ElementFactory(event_manager)
def test_stereotype_name(factory):
def test_stereotype_name(element_factory):
"""Test stereotype name."""
stereotype = factory.create(UML.Stereotype)
stereotype = element_factory.create(UML.Stereotype)
stereotype.name = "Test"
assert "test" == UML.model.stereotype_name(stereotype)
@ -30,16 +24,16 @@ def test_stereotype_name(factory):
assert "" == UML.model.stereotype_name(stereotype)
def test_stereotypes_conversion(factory):
def test_stereotypes_conversion(element_factory):
"""Test stereotypes conversion."""
s1 = factory.create(UML.Stereotype)
s2 = factory.create(UML.Stereotype)
s3 = factory.create(UML.Stereotype)
s1 = element_factory.create(UML.Stereotype)
s2 = element_factory.create(UML.Stereotype)
s3 = element_factory.create(UML.Stereotype)
s1.name = "s1"
s2.name = "s2"
s3.name = "s3"
cls = factory.create(UML.Class)
cls = element_factory.create(UML.Class)
UML.model.apply_stereotype(cls, s1)
UML.model.apply_stereotype(cls, s2)
UML.model.apply_stereotype(cls, s3)
@ -47,22 +41,22 @@ def test_stereotypes_conversion(factory):
assert ("«s1, s2, s3»") == UML.model.stereotypes_str(cls)
def test_no_stereotypes(factory):
def test_no_stereotypes(element_factory):
"""Test stereotypes conversion without applied stereotypes."""
cls = factory.create(UML.Class)
cls = element_factory.create(UML.Class)
assert "" == UML.model.stereotypes_str(cls)
def test_additional_stereotypes(factory):
def test_additional_stereotypes(element_factory):
"""Test additional stereotypes conversion."""
s1 = factory.create(UML.Stereotype)
s2 = factory.create(UML.Stereotype)
s3 = factory.create(UML.Stereotype)
s1 = element_factory.create(UML.Stereotype)
s2 = element_factory.create(UML.Stereotype)
s3 = element_factory.create(UML.Stereotype)
s1.name = "s1"
s2.name = "s2"
s3.name = "s3"
cls = factory.create(UML.Class)
cls = element_factory.create(UML.Class)
UML.model.apply_stereotype(cls, s1)
UML.model.apply_stereotype(cls, s2)
UML.model.apply_stereotype(cls, s3)
@ -71,41 +65,41 @@ def test_additional_stereotypes(factory):
assert ("«test, s1, s2, s3»") == result
def test_just_additional_stereotypes(factory):
def test_just_additional_stereotypes(element_factory):
"""Test additional stereotypes conversion without applied stereotypes."""
cls = factory.create(UML.Class)
cls = element_factory.create(UML.Class)
result = UML.model.stereotypes_str(cls, ("test",))
assert ("«test»") == result
def test_getting_stereotypes(factory):
def test_getting_stereotypes(element_factory):
"""Test getting possible stereotypes."""
cls = factory.create(UML.Class)
cls = element_factory.create(UML.Class)
cls.name = "Class"
st1 = factory.create(UML.Stereotype)
st1 = element_factory.create(UML.Stereotype)
st1.name = "st1"
st2 = factory.create(UML.Stereotype)
st2 = element_factory.create(UML.Stereotype)
st2.name = "st2"
# first extend with st2, to check sorting
UML.model.create_extension(cls, st2)
UML.model.create_extension(cls, st1)
c1 = factory.create(UML.Class)
c1 = element_factory.create(UML.Class)
result = tuple(st.name for st in UML.model.get_stereotypes(c1))
assert ("st1", "st2") == result
def test_getting_stereotypes_unique(factory):
def test_getting_stereotypes_unique(element_factory):
"""Test if possible stereotypes are unique."""
cls1 = factory.create(UML.Class)
cls1 = element_factory.create(UML.Class)
cls1.name = "Class"
cls2 = factory.create(UML.Class)
cls2 = element_factory.create(UML.Class)
cls2.name = "Component"
st1 = factory.create(UML.Stereotype)
st1 = element_factory.create(UML.Stereotype)
st1.name = "st1"
st2 = factory.create(UML.Stereotype)
st2 = element_factory.create(UML.Stereotype)
st2.name = "st2"
# first extend with st2, to check sorting
@ -115,20 +109,20 @@ def test_getting_stereotypes_unique(factory):
UML.model.create_extension(cls2, st1)
UML.model.create_extension(cls2, st2)
c1 = factory.create(UML.Component)
c1 = element_factory.create(UML.Component)
result = tuple(st.name for st in UML.model.get_stereotypes(c1))
assert ("st1", "st2") == result
def test_finding_stereotype_instances(factory):
def test_finding_stereotype_instances(element_factory):
"""Test finding stereotype instances."""
s1 = factory.create(UML.Stereotype)
s2 = factory.create(UML.Stereotype)
s1 = element_factory.create(UML.Stereotype)
s2 = element_factory.create(UML.Stereotype)
s1.name = "s1"
s2.name = "s2"
c1 = factory.create(UML.Class)
c2 = factory.create(UML.Class)
c1 = element_factory.create(UML.Class)
c2 = element_factory.create(UML.Class)
UML.model.apply_stereotype(c1, s1)
UML.model.apply_stereotype(c1, s2)
UML.model.apply_stereotype(c2, s1)
@ -142,17 +136,17 @@ def test_finding_stereotype_instances(factory):
# Association tests
def test_creation(factory):
def test_creation(element_factory):
"""Test association creation."""
c1 = factory.create(UML.Class)
c2 = factory.create(UML.Class)
c1 = element_factory.create(UML.Class)
c2 = element_factory.create(UML.Class)
assoc = UML.model.create_association(c1, c2)
types = [p.type for p in assoc.memberEnd]
assert c1 in types, assoc.memberEnd
assert c2 in types, assoc.memberEnd
c1 = factory.create(UML.Interface)
c2 = factory.create(UML.Interface)
c1 = element_factory.create(UML.Interface)
c2 = element_factory.create(UML.Interface)
assoc = UML.model.create_association(c1, c2)
types = [p.type for p in assoc.memberEnd]
assert c1 in types, assoc.memberEnd
@ -162,10 +156,10 @@ def test_creation(factory):
# Association navigability changes tests.
def test_attribute_navigability(factory):
def test_attribute_navigability(element_factory):
"""Test navigable attribute of a class or an interface."""
c1 = factory.create(UML.Class)
c2 = factory.create(UML.Class)
c1 = element_factory.create(UML.Class)
c2 = element_factory.create(UML.Class)
assoc = UML.model.create_association(c1, c2)
end = assoc.memberEnd[0]
@ -213,10 +207,10 @@ def test_attribute_navigability(factory):
assert end.navigability is True
def test_relationship_navigability(factory):
def test_relationship_navigability(element_factory):
"""Test navigable relationship of a classifier."""
n1 = factory.create(UML.Node)
n2 = factory.create(UML.Node)
n1 = element_factory.create(UML.Node)
n2 = element_factory.create(UML.Node)
assoc = UML.model.create_association(n1, n2)
end = assoc.memberEnd[0]
@ -257,28 +251,28 @@ def test_relationship_navigability(factory):
# Tests for automatic dependency discovery
def test_usage(factory):
def test_usage(element_factory):
"""Test automatic dependency: usage."""
cls = factory.create(UML.Class)
iface = factory.create(UML.Interface)
cls = element_factory.create(UML.Class)
iface = element_factory.create(UML.Interface)
dt = UML.model.dependency_type(cls, iface)
assert UML.Usage == dt
def test_usage_by_component(factory):
def test_usage_by_component(element_factory):
"""Test automatic dependency: usage (by component)."""
c = factory.create(UML.Component)
iface = factory.create(UML.Interface)
c = element_factory.create(UML.Component)
iface = element_factory.create(UML.Interface)
dt = UML.model.dependency_type(c, iface)
# it should be usage not realization (interface is classifier as
# well)
assert UML.Usage == dt
def test_realization(factory):
def test_realization(element_factory):
"""Test automatic dependency: realization."""
c = factory.create(UML.Component)
cls = factory.create(UML.Class)
c = element_factory.create(UML.Component)
cls = element_factory.create(UML.Class)
dt = UML.model.dependency_type(c, cls)
assert UML.Realization == dt
@ -286,13 +280,13 @@ def test_realization(factory):
# Tests for interaction messages.
def test_interaction_messages_cloning(factory):
def test_interaction_messages_cloning(element_factory):
"""Test message creation."""
m = factory.create(UML.Message)
send = factory.create(UML.MessageOccurrenceSpecification)
receive = factory.create(UML.MessageOccurrenceSpecification)
sl = factory.create(UML.Lifeline)
rl = factory.create(UML.Lifeline)
m = element_factory.create(UML.Message)
send = element_factory.create(UML.MessageOccurrenceSpecification)
receive = element_factory.create(UML.MessageOccurrenceSpecification)
sl = element_factory.create(UML.Lifeline)
rl = element_factory.create(UML.Lifeline)
send.covered = sl
receive.covered = rl

@ -6,6 +6,7 @@ from __future__ import annotations
from logging import getLogger
from typing import Callable, Dict, List, Optional, Set, Tuple
from gaphor.abc import Service
from gaphor.core import event_handler
from gaphor.core.modeling.element import Element, Handler
from gaphor.core.modeling.event import (
@ -68,7 +69,7 @@ class EventWatcher:
dispatcher.unsubscribe(handler)
class ElementDispatcher:
class ElementDispatcher(Service):
"""
The Element based Dispatcher allows handlers to receive only events
related to certain elements. Those elements should be registered too.

@ -47,15 +47,13 @@ class ElementFactory(Service):
flushed: all element are removed from the factory (element is None)
"""
def __init__(self, event_manager: Optional[EventManager] = None):
def __init__(
self,
event_manager: Optional[EventManager] = None,
element_dispatcher: Optional[ElementDispatcher] = None,
):
self.event_manager = event_manager
from gaphor.UML.modelprovider import UMLModelProvider
self.element_dispatcher = (
ElementDispatcher(event_manager, UMLModelProvider())
if event_manager
else None
)
self.element_dispatcher = element_dispatcher
self._elements: Dict[str, Element] = OrderedDict()
self._block_events = 0

@ -5,11 +5,6 @@ from gaphor.core.modeling import Comment, ElementFactory
from gaphor.diagram.general.generalpropertypages import CommentItemPropertyPage
@pytest.fixture
def element_factory():
return ElementFactory(EventManager())
def test_property_page_construction(element_factory):
comment = element_factory.create(Comment)
prop_page = CommentItemPropertyPage(comment)

@ -6,6 +6,7 @@ from gaphas.aspect import Connector as ConnectorAspect
from gaphor.core.eventmanager import EventManager
from gaphor.core.modeling import Diagram, ElementFactory
from gaphor.core.modeling.elementdispatcher import ElementDispatcher
from gaphor.diagram.connectors import Connector
from gaphor.storage import storage
from gaphor.storage.xmlwriter import XMLWriter
@ -19,7 +20,9 @@ def event_manager():
@pytest.fixture
def element_factory(event_manager):
return ElementFactory(event_manager)
return ElementFactory(
event_manager, ElementDispatcher(event_manager, UMLModelProvider())
)
@pytest.fixture
@ -29,7 +32,9 @@ def model_provider():
@pytest.fixture
def diagram(element_factory):
return element_factory.create(Diagram)
diagram = element_factory.create(Diagram)
yield diagram
diagram.unlink()
@pytest.fixture

@ -2,27 +2,16 @@ from io import StringIO
import pytest
from gaphor.core.eventmanager import EventManager
from gaphor.core.modeling import Diagram, ElementFactory
from gaphor.diagram.tests.fixtures import diagram, element_factory, event_manager
from gaphor.storage import storage
from gaphor.UML.modelprovider import UMLModelProvider
@pytest.fixture
def element_factory():
return ElementFactory(EventManager())
@pytest.fixture
def model_provider():
return UMLModelProvider()
@pytest.fixture
def diagram(element_factory):
return element_factory.create(Diagram)
@pytest.fixture
def loader(element_factory, model_provider):
def load(data):

@ -7,30 +7,6 @@ from gaphor.storage.parser import parse
from gaphor.storage.storage import load_elements
@pytest.fixture
def session():
session = Session(
services=[
"event_manager",
"component_registry",
"element_factory",
"model_provider",
]
)
yield session
session.shutdown()
@pytest.fixture
def element_factory(session):
return session.get_service("element_factory")
@pytest.fixture
def model_factory(session):
return session.get_service("model_provider")
def test_message_item_upgrade(element_factory, model_provider):
"""
"""

@ -8,16 +8,6 @@ from gaphor.storage.storage import load_elements
from gaphor.UML.modelprovider import UMLModelProvider
@pytest.fixture
def element_factory():
return ElementFactory(EventManager())
@pytest.fixture
def model_provider():
return UMLModelProvider()
@pytest.fixture
def loader(element_factory, model_provider):
def _loader(*parsed_items):

@ -32,6 +32,7 @@ class TestCase(unittest.TestCase):
"event_manager",
"component_registry",
"element_factory",
"element_dispatcher",
"model_provider",
"sanitizer",
]

@ -82,6 +82,7 @@ def main(argv=sys.argv[1:]):
"event_manager",
"component_registry",
"element_factory",
"element_dispatcher",
"model_provider",
]
)

@ -0,0 +1,8 @@
import pytest
from gaphor.diagram.tests.fixtures import diagram, element_factory, event_manager
@pytest.fixture
def properties():
return {}

@ -1,59 +1,14 @@
import pytest
from gaphas.examples import Box
from gaphor.application import Session
from gaphor.core.modeling import Comment, Diagram
from gaphor.diagram.general.comment import CommentItem
from gaphor.ui.mainwindow import DiagramPage
@pytest.fixture
def session():
session = Session(
services=[
"event_manager",
"component_registry",
"element_factory",
"main_window",
"properties",
"namespace",
"diagrams",
"toolbox",
"elementeditor",
"export_menu",
"tools_menu",
]
)
yield session
session.shutdown()
@pytest.fixture
def main_window(session):
main_window = session.get_service("main_window")
main_window.open()
@pytest.fixture
def element_factory(session):
return session.get_service("element_factory")
@pytest.fixture
def diagram(element_factory):
diagram = element_factory.create(Diagram)
yield diagram
diagram.unlink()
@pytest.fixture
def page(session, diagram, element_factory):
page = DiagramPage(
diagram,
session.get_service("event_manager"),
element_factory,
session.get_service("properties"),
)
def page(diagram, event_manager, element_factory, properties):
page = DiagramPage(diagram, event_manager, element_factory, properties,)
page.construct()
assert page.diagram == diagram
assert page.view.canvas == diagram.canvas

@ -8,59 +8,25 @@ from gaphas.aspect import Connector as ConnectorAspect
from gi.repository import Gdk, Gtk
from gaphor import UML
from gaphor.application import Session
from gaphor.diagram.connectors import Connector
from gaphor.diagram.diagramtools import ConnectHandleTool, DiagramItemConnector
from gaphor.diagram.general.comment import CommentItem
from gaphor.diagram.general.commentline import CommentLineItem
from gaphor.services.componentregistry import ComponentRegistry
from gaphor.ui.abc import UIComponent
from gaphor.ui.event import DiagramOpened
from gaphor.ui.mainwindow import Diagrams
from gaphor.UML.usecases.actor import ActorItem
@pytest.fixture
def session():
session = Session(
services=[
"event_manager",
"component_registry",
"element_factory",
"main_window",
"properties_manager",
"properties",
"namespace",
"diagrams",
"toolbox",
"elementeditor",
"export_menu",
"tools_menu",
]
)
main_window = session.get_service("main_window")
main_window.open()
yield session
session.shutdown()
@pytest.fixture
def element_factory(session):
return session.get_service("element_factory")
@pytest.fixture
def event_manager(session):
return session.get_service("event_manager")
@pytest.fixture
def main_window(session):
main_window = session.get_service("main_window")
yield main_window
@pytest.fixture
def diagram(element_factory):
return element_factory.create(UML.Diagram)
def diagrams(event_manager, element_factory, properties):
window = Gtk.Window.new(Gtk.WindowType.TOPLEVEL)
diagrams = Diagrams(event_manager, element_factory, properties)
window.add(diagrams.open())
window.show()
yield diagrams
diagrams.close()
@pytest.fixture
@ -100,12 +66,11 @@ def test_connect(diagram, comment, commentline):
assert cinfo, cinfo
def current_diagram_view(session):
def current_diagram_view(diagrams):
"""
Get a view for the current diagram.
"""
component_registry = session.get_service("component_registry")
view = component_registry.get(UIComponent, "diagrams").get_current_view()
view = diagrams.get_current_view()
# realize view, forces bounding box recalculation
while Gtk.events_pending():
@ -114,7 +79,7 @@ def current_diagram_view(session):
return view
def test_iconnect(session, event_manager, element_factory):
def test_iconnect(event_manager, element_factory, diagrams):
"""
Test basic glue functionality using CommentItem and CommentLine
items.
@ -129,7 +94,7 @@ def test_iconnect(session, event_manager, element_factory):
line = diagram.create(CommentLineItem)
view = current_diagram_view(session)
view = current_diagram_view(diagrams)
assert view, "View should be available here"
comment_bb = view.get_item_bounding_box(comment)
@ -154,7 +119,7 @@ def test_iconnect(session, event_manager, element_factory):
assert cinfo is None
def test_connect_comment_and_actor(session, event_manager, element_factory):
def test_connect_comment_and_actor(event_manager, element_factory, diagrams):
"""Test connect/disconnect on comment and actor using comment-line.
"""
diagram = element_factory.create(UML.Diagram)
@ -163,7 +128,7 @@ def test_connect_comment_and_actor(session, event_manager, element_factory):
line = diagram.create(CommentLineItem)
view = current_diagram_view(session)
view = current_diagram_view(diagrams)
assert view, "View should be available here"
tool = ConnectHandleTool(view)

@ -71,6 +71,7 @@ gaphorconvert = 'gaphor.tools.gaphorconvert:main'
"properties" = "gaphor.services.properties:Properties"
"undo_manager" = "gaphor.services.undomanager:UndoManager"
"element_factory" = "gaphor.core.modeling:ElementFactory"
"element_dispatcher" = "gaphor.core.modeling.elementdispatcher:ElementDispatcher"
"model_provider" = "gaphor.services.modelprovider:ModelProviderService"
"file_manager" = "gaphor.ui.filemanager:FileManager"
"recent_files" = "gaphor.ui.recentfiles:RecentFiles"