package dev.kske.undoredo.core; import static org.junit.jupiter.api.Assertions.*; import org.junit.jupiter.api.*; /** * @author Kai S. K. Engelbart * @since 0.0.1 */ class ChangeManagerTest { ChangeManager manager; IntWrapper wrapper; IntChange change; @BeforeEach void prepareChangeManager() { manager = new UnlimitedChangeManager<>(); wrapper = new IntWrapper(); change = new IntChange(wrapper, 1); } /** * Tests adding a change. * * @since 0.0.1 */ @Test @Order(10) void testAddChange() { assertSame(0, wrapper.value); assertTrue(manager.addChange(change)); assertSame(1, wrapper.value); } /** * Tests whether identity changes are ignored when adding them to the change manager. * * @since 0.0.1 */ @Test @Order(15) void testDiscardIdentity() { manager.addChange(change); assertFalse(manager.addChange(new IntChange(wrapper, 0))); assertSame(1, wrapper.value); } /** * Tests retrieving the last change. * * @since 0.0.1 */ @Test @Order(20) void testLastChange() { assertTrue(manager.getLastChange().isEmpty()); manager.addChange(change); assertEquals(change, manager.getLastChange().get()); } /** * Tests the consistency of the change list. * * @since 0.0.1 */ @Test @Order(30) void testGetChanges() { assertTrue(manager.getChanges().isEmpty()); manager.addChange(change); assertSame(1, manager.getChanges().size()); assertEquals(change, manager.getChanges().get(0)); } /** * Test undoing a change. * * @since 0.0.1 */ @Test @Order(40) void testUndo() { assertFalse(manager.isUndoAvailable()); assertFalse(manager.undo()); manager.addChange(change); assertTrue(manager.isUndoAvailable()); assertTrue(manager.undo()); assertFalse(manager.isUndoAvailable()); assertFalse(manager.undo()); assertTrue(manager.getLastChange().isEmpty()); } /** * Tests redoing a change. * * @since 0.0.1 */ @Test @Order(50) void testRedo() { assertFalse(manager.isRedoAvailable()); assertFalse(manager.redo()); manager.addChange(change); assertFalse(manager.isRedoAvailable()); assertFalse(manager.redo()); manager.undo(); assertTrue(manager.isRedoAvailable()); assertTrue(manager.redo()); assertFalse(manager.isRedoAvailable()); assertFalse(manager.redo()); assertEquals(change, manager.getLastChange().get()); } /** * Tests whether the changes after the current index are discarded when adding a change. * * @since 0.0.1 */ @Test @Order(55) void testDiscardDivergentHistory() { manager.addChange(change); manager.undo(); assertTrue(manager.addChange(new IntChange(wrapper, 2))); assertFalse(manager.isRedoAvailable()); assertSame(2, wrapper.value); } /** * Tests marking a change. * * @since 0.0.1 */ @Test @Order(60) void testMark() { assertTrue(manager.isAtMarkedIndex()); manager.addChange(change); assertFalse(manager.isAtMarkedIndex()); manager.mark(); assertTrue(manager.isAtMarkedIndex()); manager.undo(); assertFalse(manager.isAtMarkedIndex()); } }