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 RedoActionTest {
RedoAction redoAction;
@Mock
PipeApplicationController mockController;
@Mock
PetriNetController mockPetriNetController;
@Mock
UndoAction undoAction;
@Mock
UndoManager mockUndoManager;
@Before
public void setUp() {
redoAction = new RedoAction(mockController, undoAction);
}
@Test
public void actionPerformed() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
redoAction.actionPerformed(null);
verify(mockUndoManager).redo();
}
@Test
public void setShortDescription() {
Object shortDescription = redoAction.getValue(Action.SHORT_DESCRIPTION);
assertEquals("Redo (Ctrl-Y)", shortDescription);
}
@Test
public void setKeyboardShortcut() {
Object acceleratorKey = redoAction.getValue(Action.ACCELERATOR_KEY);
KeyStroke stroke = KeyStroke.getKeyStroke(KeyEvent.VK_Y, Toolkit.getDefaultToolkit().getMenuShortcutKeyMask());
assertEquals(stroke, acceleratorKey);
}
@Test
public void enablesUndoRedo() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
when(mockUndoManager.canUndo()).thenReturn(true);
when(mockUndoManager.canRedo()).thenReturn(true);
redoAction.actionPerformed(null);
verify(undoAction).setEnabled(true);
assertTrue(redoAction.isEnabled());
}
@Test
public void disablesUndoRedo() {
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getUndoManager()).thenReturn(mockUndoManager);
when(mockUndoManager.canUndo()).thenReturn(false);
when(mockUndoManager.canRedo()).thenReturn(false);
redoAction.actionPerformed(null);
verify(undoAction).setEnabled(false);
assertFalse(redoAction.isEnabled());
}
}