package ge.edu.freeuni.sdp.snake.model;
import static org.junit.Assert.*;
import static org.mockito.Mockito.*;
import org.junit.Before;
import org.junit.Test;
public class CommonGameFacadeTest {
private CommonGameFacade facade;
private Configuration configuration;
private Size size;
private Universe universe;
private Snake snake;
private Populator populator;
@Before
public void setUp() {
configuration = mock(Configuration.class);
size = mock(Size.class);
when(configuration.getSize()).thenReturn(size);
when(size.getWidth()).thenReturn(20);
when(size.getHeight()).thenReturn(20);
}
@Test
public void get_lives() {
// using stub snake
universe = mock(Universe.class);
snake = mock(Snake.class);
when(snake.getLives()).thenReturn(4);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(4, facade.getLives());
verify(snake, times(1)).getLives();
// using real snake object
snake = new Snake(new Point(1, 1), 8, configuration);
snake = spy(snake);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(8, facade.getLives());
snake.kill();
snake.kill();
assertEquals(6, facade.getLives());
verify(snake, times(2)).getLives();
}
@Test
public void get_being_kind() {
// returning no kind
universe = mock(Universe.class);
snake = new Snake(new Point(1, 1), 8, configuration);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(BeingKind.None, facade.getBeingKindAt(mock(Point.class)));
// returning actual kind
Point point = mock(Point.class);
Snake sn = mock(Snake.class);
when(sn.getKind()).thenReturn(BeingKind.Snake);
when(universe.getBeingAt(point)).thenReturn(sn);
assertEquals(BeingKind.Snake, facade.getBeingKindAt(point));
verify(sn).getKind();
verify(universe, times(2)).getBeingAt((Point) any());
}
@Test
public void make_move_with_direction() {
// checking invocations
universe = mock(Universe.class);
snake = new Snake(new Point(1, 1), 8, configuration);
snake = spy(snake);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
Direction dir = mock(Direction.class);
facade.makeMove(dir);
verify(snake).setDirection(dir);
verify(universe).move();
verify(universe).interact();
verify(universe).removeZombies();
verify(populator).populate(universe);
assertEquals(dir, snake.getDirection());
}
@Test
public void is_game_over() {
universe = mock(Universe.class);
snake = new Snake(new Point(1, 1), 3, configuration);
snake = spy(snake);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertFalse(facade.isGameOver());
assertTrue(snake.isAlive());
snake.kill();
snake.kill();
snake.kill();
assertTrue(facade.isGameOver());
assertFalse(snake.isAlive());
}
@Test
public void get_score() {
universe = mock(Universe.class);
snake = new Snake(new Point(1, 1), 3, configuration);
snake = spy(snake);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(3, facade.getScore());
verify(snake).getLength();
}
@Test
public void get_snake_head() {
universe = mock(Universe.class);
snake = mock(Snake.class);
Point point = new Point(1, 2);
when(snake.getHead()).thenReturn(point);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(point, facade.getSnakeHead());
verify(snake).getHead();
}
@Test
public void state_save_restore() {
universe = mock(Universe.class);
snake = new Snake(new Point(1, 1), 8, configuration);
snake = spy(snake);
snake.setDirection(Direction.DOWN);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
facade.saveState();
verify(snake).saveToMemento();
int len = snake.getLength();
facade.restoreState();
verify(snake).restoreFromMemento((Memento) any());
assertEquals(len, snake.getLength());
}
@Test
public void get_size_from_configuration() {
//
universe = mock(Universe.class);
snake = mock(Snake.class);
populator = mock(Populator.class);
facade = new CommonGameFacade(universe, snake, populator, configuration);
assertEquals(size, facade.getSize());
}
@Test
public void default_constructor() {
//
}
}