package ge.edu.freeuni.sdp.snake.view.terminal; import ge.edu.freeuni.sdp.snake.presenter.DirectionKey; import ge.edu.freeuni.sdp.snake.presenter.MazePresenter; import org.junit.Before; import org.junit.Test; import org.mockito.Mockito; import com.googlecode.lanterna.input.Key; import com.googlecode.lanterna.input.Key.Kind; import com.googlecode.lanterna.terminal.Terminal; public class TerminalMazeViewTest { private Terminal terminal; private MazePresenter presenter; private TerminalMazeView mazeView; private Key key; /* * General setup for tests some of these stubbed methods will be overridden * in the test methods but generally this return values will work. */ @Before public void setUp() throws Exception { terminal = Mockito.mock(Terminal.class); presenter = Mockito.mock(MazePresenter.class); // mazeView = Mockito.spy(new TerminalMazeView(presenter, terminal)); mazeView = new TerminalMazeView(presenter, terminal); key = Mockito.mock(Key.class); } @Test public void testConvertToDirectionNull() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(null); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.None); } @Test public void testConvertToDirectionDown() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.ArrowDown); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.Down); } @Test public void testConvertToDirectionUp() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.ArrowUp); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.Up); } @Test public void testConvertToDirectionLeft() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.ArrowLeft); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.Left); } @Test public void testConvertToDirectionRight() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.ArrowRight); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.Right); } @Test public void testConvertToDirectionNone() { Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.Enter); mazeView.show(); Mockito.verify(presenter).tick(DirectionKey.None); } @Test public void testRestoreState(){ mazeView.restoreState(); Mockito.verify(presenter).restoreState(); } @Test public void testGameOverTrue(){ Mockito.when(presenter.isGameOver()).thenReturn(true); mazeView.show(); Mockito.verify(terminal, Mockito.times(1)).readInput(); } @Test public void testGameOverFalse(){ Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); mazeView.show(); Mockito.verify(terminal, Mockito.times(2)).readInput(); } @Test public void testIsStopped(){ Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getCharacter()).thenReturn(' '); mazeView.show(); Mockito.verify(presenter, Mockito.times(0)).tick((DirectionKey) Mockito.any()); } @Test public void testResumeAfterStop(){ Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(false).thenReturn(true); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.ArrowDown); Mockito.when(key.getCharacter()).thenReturn(' '); mazeView.show(); Mockito.verify(presenter, Mockito.times(1)).tick(DirectionKey.Down); } @Test public void testIsNotStopped(){ Mockito.when(presenter.isGameOver()).thenReturn(false).thenReturn(true); mazeView.show(); Mockito.verify(presenter, Mockito.times(1)).tick((DirectionKey) Mockito.any()); } @Test public void testQuitStopped(){ Mockito.when(presenter.isGameOver()).thenReturn(false); Mockito.when(terminal.readInput()).thenReturn(key); //send stop character on first iteration and something different on second Mockito.when(key.getCharacter()).thenReturn(' ').thenReturn('\0'); //send something different kind on first iteration and escape key on second Mockito.when(key.getKind()).thenReturn(Kind.Enter).thenReturn(Kind.Escape); mazeView.show(); //check if state is saved Mockito.verify(presenter).saveState(); //check that loop iterated twice Mockito.verify(terminal, Mockito.times(2)).readInput(); } @Test public void testQuitNotStopped(){ Mockito.when(presenter.isGameOver()).thenReturn(false); Mockito.when(terminal.readInput()).thenReturn(key); Mockito.when(key.getKind()).thenReturn(Kind.Escape); mazeView.show(); //check that loop iterated only once Mockito.verify(terminal, Mockito.times(1)).readInput(); } @Test public void testSleep(){ } }