package eu.lestard.snakefx.core; import eu.lestard.snakefx.viewmodel.CentralViewModel; import javafx.animation.Animation.Status; import javafx.animation.Timeline; import org.junit.Before; import org.junit.Test; import org.mockito.internal.util.reflection.Whitebox; import static org.assertj.core.api.Assertions.*; public class GameLoopTest { private GameLoop gameLoop; private CentralViewModel viewModel; @Before public void setup() { viewModel = new CentralViewModel(); viewModel.speed.set(SpeedLevel.SLOW); gameLoop = new GameLoop(viewModel); } @Test public void testStoppedTimelineStaysStoppedAfterSpeedChange() { assertThat(getTimeline().getStatus()).isEqualTo(Status.STOPPED); viewModel.speed.set(SpeedLevel.FAST); assertThat(getTimeline().getStatus()).isEqualTo(Status.STOPPED); } @Test public void testPlayingTimelineStaysPlayingAfterSpeedChange() { getTimeline().play(); assertThat(getTimeline().getStatus()).isEqualTo(Status.RUNNING); viewModel.speed.set(SpeedLevel.FAST); assertThat(getTimeline().getStatus()).isEqualTo(Status.RUNNING); } @Test public void testTimelineIsPlayingAfterChangeInViewModel() { assertThat(viewModel.gameloopStatus.get()).isEqualTo(Status.STOPPED); assertThat(getTimeline().getStatus()).isEqualTo(Status.STOPPED); viewModel.gameloopStatus.set(Status.RUNNING); assertThat(getTimeline().getStatus()).isEqualTo(Status.RUNNING); } @Test public void testPlayingTimelineIsStoppedAfterChangeInViewModel() { assertThat(viewModel.gameloopStatus.get()).isEqualTo(Status.STOPPED); getTimeline().play(); assertThat(getTimeline().getStatus()).isEqualTo(Status.RUNNING); assertThat(viewModel.gameloopStatus.get()).isEqualTo(Status.RUNNING); viewModel.gameloopStatus.set(Status.PAUSED); assertThat(getTimeline().getStatus()).isEqualTo(Status.PAUSED); } /** * Helper method to get the internal {@link Timeline} instance of the * gameloop. */ private Timeline getTimeline() { return (Timeline) Whitebox.getInternalState(gameLoop, "timeline"); } }