package com.lunivore.noughtsandcrosses.game; import static org.hamcrest.Matchers.equalTo; import static org.hamcrest.MatcherAssert.assertThat; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.times; import static org.mockito.Mockito.verify; import org.junit.Test; public class GameModelBehaviour { @Test public void shouldStartEmptyAndTellObserver() { GameModel game = new GameModel(); GameObserver observer = mock(GameObserver.class); game.addObserver(observer); verify(observer).gameChanged(game); for (int row = 0; row < 3; row++) { for (int column = 0; column < 3; column++) { assertThat(game.playerAt(column, row), equalTo(Player.NONE)); } } } @Test public void shouldPlaceTokenForCurrentPlayerInTheGivenColumnAndRowStartingWithX() { GameModel game = new GameModel(); GameObserver observer = mock(GameObserver.class); game.addObserver(observer); game.playerActsAt(0, 1); game.playerActsAt(0, 2); verify(observer, times(3)).gameChanged(game); assertThat(game.playerAt(0, 0), equalTo(Player.NONE)); assertThat(game.playerAt(0, 1), equalTo(Player.X)); assertThat(game.playerAt(0, 2), equalTo(Player.O)); } @Test public void shouldNotifyObserverWhenTheCurrentPlayerWins() { // Given a game which X is about to win GameModel game = new GameModel(); game.playerActsAt(0, 0); game.playerActsAt(1, 0); game.playerActsAt(0, 1); game.playerActsAt(2, 0); MyGameObserver observer = new MyGameObserver(); game.addObserver(observer); // When X wins the game game.playerActsAt(0, 2); // Then we should see X is the current player and the game is over assertThat(observer.game.currentPlayer(), equalTo(Player.X)); } private static class MyGameObserver implements GameObserver { private Game game; public void gameChanged(Game game) { } public void gameWon(Game game) { this.game = game; } } }