package pipe.controllers;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.runners.MockitoJUnitRunner;
import pipe.historyActions.component.ChangePetriNetComponentName;
import pipe.historyActions.transition.*;
import pipe.utilities.transformers.Contains;
import uk.ac.imperial.pipe.models.petrinet.FunctionalRateParameter;
import uk.ac.imperial.pipe.models.petrinet.NormalRate;
import uk.ac.imperial.pipe.models.petrinet.Rate;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoableEdit;
import static org.mockito.Mockito.*;
@RunWith(MockitoJUnitRunner.class)
public class TransitionControllerTest {
@Mock
Transition transition;
@Mock
UndoableEditListener listener;
TransitionController controller;
@Before
public void setUp() {
controller = new TransitionController(transition, listener);
}
@Test
public void setInfiniteServerCreatesHistoryItem() {
boolean isInfinite = true;
controller.setInfiniteServer(isInfinite);
UndoableEdit transitionInfiniteServer = new TransitionInfiniteServer(transition, isInfinite);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(transitionInfiniteServer)));
}
@Test
public void setInfiniteServerModifiesTransition() {
boolean isInfinite = true;
controller.setInfiniteServer(isInfinite);
verify(transition).setInfiniteServer(isInfinite);
}
@Test
public void setTimedCreatesHistoryItem() {
boolean isTimed = true;
controller.setTimed(isTimed);
UndoableEdit transitionTimed = new TransitionTiming(transition, isTimed);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(transitionTimed)));
}
@Test
public void setTimedModifiesTransition() {
boolean isTimed = true;
controller.setTimed(isTimed);
verify(transition).setTimed(isTimed);
}
@Test
public void setAngleCreatesHistoryItem() {
int oldAngle = 45;
int newAngle = 180;
when(transition.getAngle()).thenReturn(oldAngle);
controller.setAngle(newAngle);
UndoableEdit angleItem = new TransitionRotation(transition, oldAngle, newAngle);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(angleItem)));
}
@Test
public void setAngleModifiesTransition() {
int oldAngle = 45;
int newAngle = 180;
when(transition.getAngle()).thenReturn(oldAngle);
controller.setAngle(newAngle);
verify(transition).setAngle(newAngle);
}
@Test
public void setPriorityCreatesHistoryItem() {
int oldPriority = 1;
int newPriority = 4;
when(transition.getPriority()).thenReturn(oldPriority);
controller.setPriority(newPriority);
UndoableEdit priorityItem = new TransitionPriority(transition, oldPriority, newPriority);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(priorityItem)));
}
@Test
public void setPriorityModifiesTransition() {
int oldPriority = 1;
int newPriority = 4;
when(transition.getPriority()).thenReturn(oldPriority);
controller.setPriority(newPriority);
verify(transition).setPriority(newPriority);
}
@Test
public void setIdChangesId() {
String newName = "newName";
when(transition.getId()).thenReturn("oldId");
controller.setId(newName);
verify(transition).setId(newName);
}
@Test
public void setNameCreatesUndoItem() {
String oldName = "oldName";
String newName = "newName";
when(transition.getId()).thenReturn(oldName);
controller.setId(newName);
UndoableEdit nameEdit = new ChangePetriNetComponentName(transition, oldName, newName);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(nameEdit)));
}
@Test
public void setRateChangesNormalRate() {
Rate rate = new NormalRate("2");
controller.setRate(rate);
verify(transition).setRate(rate);
}
@Test
public void setRateCreatesRateUndoItemForNormalRate() {
Rate oldRate = new NormalRate("1");
when(transition.getRate()).thenReturn(oldRate);
Rate rate = new NormalRate("2");
controller.setRate(rate);
UndoableEdit rateEdit = new SetRateParameter(transition, oldRate, rate);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(rateEdit)));
}
@Test
public void setRateCreatesRateUndoItemForRateParameter() {
Rate oldRate = new NormalRate("1");
when(transition.getRate()).thenReturn(oldRate);
Rate rate = new FunctionalRateParameter("2", "foo", "foo");
controller.setRate(rate);
UndoableEdit rateEdit = new SetRateParameter(transition, oldRate, rate);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(rateEdit)));
}
@Test
public void setRateChangesRateParameter() {
Rate rate = new FunctionalRateParameter("2", "foo", "foo");
controller.setRate(rate);
verify(transition).setRate(rate);
}
}