package pipe.actions.file;
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.SaveAction;
import pipe.controllers.PetriNetController;
import pipe.controllers.application.PipeApplicationController;
import pipe.views.PipeApplicationView;
import uk.ac.imperial.pipe.models.petrinet.PetriNet;
import uk.ac.imperial.pipe.models.petrinet.name.NormalPetriNetName;
import uk.ac.imperial.pipe.models.petrinet.name.PetriNetFileName;
import uk.ac.imperial.pipe.models.petrinet.name.PetriNetName;
import javax.swing.*;
import javax.xml.parsers.ParserConfigurationException;
import javax.xml.transform.TransformerException;
import java.awt.FileDialog;
import java.io.File;
import java.lang.reflect.InvocationTargetException;
import static org.junit.Assert.assertEquals;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class SaveActionTest {
SaveAction saveAction;
@Mock
PipeApplicationView mockView;
@Mock
PipeApplicationController mockController;
@Mock
PetriNetController mockPetriNetController;
@Mock
PetriNet mockPetriNet;
@Mock
FileDialog mockFileChooser;
@Before
public void setUp() {
saveAction = new SaveAction(mockController, mockFileChooser);
when(mockController.getActivePetriNetController()).thenReturn(mockPetriNetController);
when(mockPetriNetController.getPetriNet()).thenReturn(mockPetriNet);
}
@Test
public void performsSaveAsWhenPetriNetHasNoFile()
throws InvocationTargetException, ParserConfigurationException, NoSuchMethodException,
IllegalAccessException, TransformerException {
PetriNetName normalName = new NormalPetriNetName("");
when(mockPetriNet.getName()).thenReturn(normalName);
File file = new File("test.xml");
when(mockFileChooser.getFiles()).thenReturn(new File[]{file});
saveAction.actionPerformed(null);
verify(mockController).saveAsCurrentPetriNet(file);
}
@Test
public void performsSaveWhenPetriNetHasFile()
throws InvocationTargetException, ParserConfigurationException, NoSuchMethodException,
IllegalAccessException, TransformerException {
File file = mock(File.class);
when(file.getAbsolutePath()).thenReturn("");
PetriNetName fileName = new PetriNetFileName(file);
when(mockPetriNet.getName()).thenReturn(fileName);
saveAction.actionPerformed(null);
verify(mockController).saveAsCurrentPetriNet(file);
verify(mockFileChooser, never()).setVisible(true);
}
@Test
public void setShortDescription() {
Object shortDescription = saveAction.getValue(Action.SHORT_DESCRIPTION);
assertEquals("Save", shortDescription);
}
@Test
public void setKeyboardShortcut() {
Object acceleratorKey = saveAction.getValue(Action.ACCELERATOR_KEY);
KeyStroke stroke = KeyStroke.getKeyStroke("meta S");
assertEquals(stroke, acceleratorKey);
}
}