package pipe.actions.edit;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import pipe.actions.gui.RedoAction;
import pipe.actions.gui.UndoAction;
import pipe.controllers.PetriNetController;
import pipe.controllers.application.PipeApplicationController;
import javax.swing.*;
import javax.swing.undo.UndoManager;
import java.awt.Toolkit;
import java.awt.event.KeyEvent;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class UndoActionTest {
UndoAction undoAction;
@Mock
PipeApplicationController mockController;
@Mock
PetriNetController mockPetriNetController;
@Mock
UndoManager mockUndoManager;
@Mock
RedoAction redoAction;
@Before
public void setUp() {
undoAction = new UndoAction(mockController);
}
@Test
public void actionPerformed() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
undoAction.actionPerformed(null);
verify(mockUndoManager).undo();
}
@Test
public void setShortDescription() {
Object shortDescription = undoAction.getValue(Action.SHORT_DESCRIPTION);
assertEquals("Undo (Ctrl-Z)", shortDescription);
}
@Test
public void enablesUndoRedo() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
when(mockUndoManager.canRedo()).thenReturn(false);
when(mockUndoManager.canUndo()).thenReturn(true);
undoAction.registerRedoAction(redoAction);
undoAction.actionPerformed(null);
verify(redoAction).setEnabled(false);
verify(mockUndoManager).canRedo();
assertTrue(undoAction.isEnabled());
}
@Test
public void disablesUndoRedo() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
when(mockUndoManager.canRedo()).thenReturn(true);
when(mockUndoManager.canUndo()).thenReturn(false);
undoAction.registerRedoAction(redoAction);
undoAction.actionPerformed(null);
verify(redoAction).setEnabled(true);
verify(mockUndoManager).canRedo();
assertFalse(undoAction.isEnabled());
}
@Test
public void setKeyboardShortcut() {
Object acceleratorKey = undoAction.getValue(Action.ACCELERATOR_KEY);
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_Z, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
assertEquals(stroke, acceleratorKey);
}
}