gaphor/tests/test_undo.py

118 lines
3.1 KiB
Python
Raw Normal View History

import pytest
from gaphor import UML
from gaphor.application import Application
from gaphor.core import Transaction
from gaphor.diagram.tests.fixtures import connect
from gaphor.UML.classes import AssociationItem, ClassItem
@pytest.fixture
def application():
app = Application()
yield app
app.shutdown()
@pytest.fixture
def session(application):
return application.new_session()
@pytest.fixture
def event_manager(session):
return session.get_service("event_manager")
@pytest.fixture
def element_factory(session):
return session.get_service("element_factory")
@pytest.fixture
def undo_manager(session):
return session.get_service("undo_manager")
def test_class_association_undo_redo(event_manager, element_factory, undo_manager):
diagram = element_factory.create(UML.Diagram)
assert 0 == len(diagram.connections.solver.constraints)
ci1 = diagram.create(ClassItem, subject=element_factory.create(UML.Class))
assert 6 == len(diagram.connections.solver.constraints)
2018-11-24 00:44:52 +03:00
ci2 = diagram.create(ClassItem, subject=element_factory.create(UML.Class))
assert 12 == len(diagram.connections.solver.constraints)
a = diagram.create(AssociationItem)
2018-11-23 01:14:07 +03:00
connect(a, a.head, ci1)
connect(a, a.tail, ci2)
# Diagram, Association, 2x Class, Property, LiteralSpecification
assert 6 == len(element_factory.lselect())
assert 14 == len(diagram.connections.solver.constraints)
undo_manager.clear_undo_stack()
assert not undo_manager.can_undo()
with Transaction(event_manager):
ci2.unlink()
assert undo_manager.can_undo()
def get_connected(handle):
"""Get item connected to line via handle."""
cinfo = diagram.connections.get_connection(handle)
if cinfo:
return cinfo.connected
return None
assert ci1 == get_connected(a.head)
assert None is get_connected(a.tail)
for i in range(3):
assert 7 == len(diagram.connections.solver.constraints)
undo_manager.undo_transaction()
assert 14 == len(diagram.connections.solver.constraints)
assert ci1 == get_connected(a.head)
assert ci2 == get_connected(a.tail)
undo_manager.redo_transaction()
def test_diagram_item_should_not_end_up_in_element_factory(
event_manager, element_factory, undo_manager
):
diagram = element_factory.create(UML.Diagram)
with Transaction(event_manager):
cls = diagram.create(ClassItem, subject=element_factory.create(UML.Class))
undo_manager.undo_transaction()
undo_manager.redo_transaction()
assert cls not in element_factory.lselect(), element_factory.lselect()
def test_deleted_diagram_item_should_not_end_up_in_element_factory(
event_manager, element_factory, undo_manager
):
diagram = element_factory.create(UML.Diagram)
cls = diagram.create(ClassItem, subject=element_factory.create(UML.Class))
with Transaction(event_manager):
cls.unlink()
undo_manager.undo_transaction()
assert cls not in element_factory.lselect(), element_factory.lselect()
undo_manager.redo_transaction()
assert cls not in element_factory.lselect(), element_factory.lselect()