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.MultipleEdit;
import pipe.historyActions.component.ChangePetriNetComponentName;
import pipe.historyActions.place.ChangePlaceTokens;
import pipe.historyActions.place.PlaceCapacity;
import pipe.utilities.transformers.Contains;
import uk.ac.imperial.pipe.models.petrinet.Place;
import javax.swing.event.UndoableEditListener;
import javax.swing.undo.UndoableEdit;
import java.util.Arrays;
import java.util.HashMap;
import java.util.Map;
import static org.mockito.Matchers.argThat;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
@RunWith(MockitoJUnitRunner.class)
public class PlaceControllerTest {
@Mock
Place place;
@Mock
UndoableEditListener listener;
PlaceController placeController;
private final static String DEFAULT_TOKEN_ID = "Default";
@Before
public void setUp() {
placeController = new PlaceController(place, listener);
}
@Test
public void setCapacityCreatesNewHistoryItem() {
int oldCapacity = 5;
int newCapacity = 10;
when(place.getCapacity()).thenReturn(oldCapacity);
placeController.setCapacity(newCapacity);
UndoableEdit capacityItem = new PlaceCapacity(place, oldCapacity, newCapacity);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(capacityItem)));
}
@Test
public void setCapacityModifiesPlaceCapacity() {
int oldCapacity = 5;
int newCapacity = 10;
when(place.getCapacity()).thenReturn(oldCapacity);
placeController.setCapacity(newCapacity);
verify(place).setCapacity(newCapacity);
}
@Test
public void setTokenCountModifiesPlace() {
Map<String, Integer> tokenCounts = new HashMap<>();
int oldCount = 7;
int newCount = 5;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(oldCount);
tokenCounts.put(DEFAULT_TOKEN_ID, newCount);
placeController.setTokenCounts(tokenCounts);
verify(place).setTokenCount(DEFAULT_TOKEN_ID, newCount);
}
@Test
public void setTokenCountCreatesUndoItem() {
Map<String, Integer> tokenCounts = new HashMap<>();
int oldCount = 7;
int newCount = 5;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(oldCount);
tokenCounts.put(DEFAULT_TOKEN_ID, newCount);
placeController.setTokenCounts(tokenCounts);
UndoableEdit changed = new ChangePlaceTokens(place, DEFAULT_TOKEN_ID, oldCount, newCount);
MultipleEdit edit = new MultipleEdit(Arrays.asList(changed));
verify(listener).undoableEditHappened(argThat(Contains.thisAction(edit)));
}
@Test
public void incrementsPlaceCounter() {
int count = 1;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(count);
placeController.addTokenToPlace(DEFAULT_TOKEN_ID);
verify(place).setTokenCount(DEFAULT_TOKEN_ID, count + 1);
}
@Test
public void incrementPlaceCounterCreatesHistoryItem() {
int oldCount = 7;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(oldCount);
placeController.addTokenToPlace(DEFAULT_TOKEN_ID);
UndoableEdit changed = new ChangePlaceTokens(place, DEFAULT_TOKEN_ID, oldCount, oldCount + 1);
MultipleEdit edit = new MultipleEdit(Arrays.asList(changed));
verify(listener).undoableEditHappened(argThat(Contains.thisAction(edit)));
}
@Test
public void decrementsPlaceCounter() {
int count = 1;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(count);
placeController.deleteTokenInPlace(DEFAULT_TOKEN_ID);
verify(place).setTokenCount(DEFAULT_TOKEN_ID, count - 1);
}
@Test
public void decrementPlaceCounterCreatesHistoryItem() {
int oldCount = 7;
when(place.getTokenCount(DEFAULT_TOKEN_ID)).thenReturn(oldCount);
placeController.deleteTokenInPlace(DEFAULT_TOKEN_ID);
UndoableEdit changed = new ChangePlaceTokens(place, DEFAULT_TOKEN_ID, oldCount, oldCount - 1);
MultipleEdit edit = new MultipleEdit(Arrays.asList(changed));
verify(listener).undoableEditHappened(argThat(Contains.thisAction(edit)));
}
@Test
public void setIdChangesId() {
String newName = "newName";
when(place.getId()).thenReturn("oldId");
placeController.setId(newName);
verify(place).setId(newName);
}
@Test
public void setNameCreatesUndoItem() {
String oldName = "oldName";
String newName = "newName";
when(place.getId()).thenReturn(oldName);
placeController.setId(newName);
UndoableEdit nameEdit = new ChangePetriNetComponentName(place, oldName, newName);
verify(listener).undoableEditHappened(argThat(Contains.thisAction(nameEdit)));
}
}