package pipe.historyActions;
import org.junit.Before;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import uk.ac.imperial.pipe.models.petrinet.Transition;
import java.util.Observable;
import java.util.Observer;
import static org.junit.Assert.*;
import static org.mockito.Matchers.any;
import static org.mockito.Mockito.mock;
import static org.mockito.Mockito.verify;
public class AnimationHistoryTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
private AnimationHistoryImpl history;
private Observer observer;
@Before
public void setUp() {
history = new AnimationHistoryImpl();
observer = mock(Observer.class);
}
@Test
public void addingTransitionNotifiesObserver() {
Transition transition = mock(Transition.class);
history.addObserver(observer);
history.addHistoryItem(transition);
verify(observer).update(any(Observable.class), any(Object.class));
}
@Test
public void clearNotifiesObserver() {
history.addObserver(observer);
history.clear();
verify(observer).update(any(Observable.class), any(Object.class));
}
@Test
public void steppingForwardNotifiesObserver() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
history.stepBackwards();
history.addObserver(observer);
history.stepForward();
verify(observer).update(any(Observable.class), any(Object.class));
}
@Test
public void steppingBackwardNotifiesObserver() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
history.addObserver(observer);
history.stepBackwards();
verify(observer).update(any(Observable.class), any(Object.class));
}
@Test
public void returnsLatestTransitionAdded() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
assertEquals(transition, history.getCurrentTransition());
}
@Test
public void incrementsCurrentPositionOnAdd() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
assertEquals(0, history.getCurrentPosition());
history.addHistoryItem(transition);
assertEquals(1, history.getCurrentPosition());
}
@Test
public void whenEmptyNoStepBackAllowed() {
assertFalse(history.isStepBackAllowed());
}
@Test
public void whenEmptyNoStepForwardAllowed() {
assertFalse(history.isStepForwardAllowed());
}
@Test
public void whenContainsOneItemCanStepBack() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
assertTrue(history.isStepBackAllowed());
}
@Test
public void whenAtTailCannotStepBackward() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
history.stepBackwards();
assertFalse(history.isStepBackAllowed());
}
@Test
public void whenAtHeadCannotStepForward() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
assertFalse(history.isStepForwardAllowed());
}
@Test
public void whenNotAtHeadCanStepForward() {
Transition transition = mock(Transition.class);
history.addHistoryItem(transition);
history.stepBackwards();
assertTrue(history.isStepForwardAllowed());
}
/**
* Adds three transitions
* Takes a step back
* Checks that the last transition has been cleared
*/
@Test
public void clearStepsForwardRemovesFutureSteps() {
Transition transition1 = mock(Transition.class);
Transition transition2 = mock(Transition.class);
Transition transition3 = mock(Transition.class);
history.addHistoryItem(transition1);
history.addHistoryItem(transition2);
history.addHistoryItem(transition3);
history.stepBackwards();
history.clearStepsForward();
assertEquals(1, history.getCurrentPosition());
assertEquals(2, history.getFiringSequence().size());
}
@Test
public void getTransitionReturnsCorrectTransition() {
Transition transition1 = mock(Transition.class);
Transition transition2 = mock(Transition.class);
history.addHistoryItem(transition1);
history.addHistoryItem(transition2);
assertEquals(transition1, history.getTransition(0));
assertEquals(transition2, history.getTransition(1));
}
@Test
public void throwsErrorIfNoTransitionsToGet() {
expectedException.expect(RuntimeException.class);
expectedException.expectMessage("No transitions in history");
history.getCurrentTransition();
}
}