package jrummikub.control; import static jrummikub.model.StoneColor.*; import static org.junit.Assert.*; import java.awt.Color; import jrummikub.model.GameSettings; import jrummikub.model.IHand; import jrummikub.model.PlayerSettings; import jrummikub.model.Position; import jrummikub.model.Stone; import jrummikub.util.IListener; import jrummikub.util.Pair; import jrummikub.view.IView.BottomPanelType; import jrummikub.view.MockView; import org.junit.Before; import org.junit.Test; /** * Tests for the game control */ public class GameControlTest { private GameControl gameControl; private GameSettings gameSettings; private MockView view; protected boolean gameEnded; /** */ @Before public void setUp() { view = new MockView(); gameSettings = new GameSettings(); gameSettings.getPlayerList().add( new PlayerSettings("Foo", new Color(1.0f, 0, 0))); gameSettings.getPlayerList().add( new PlayerSettings("Bar", new Color(0, 1.0f, 0))); gameControl = new GameControl(gameSettings, new SaveControl(view), view); } /** */ @Test public void testStartFirstRound() { gameControl.startGame(); assertSame(BottomPanelType.START_TURN_PANEL, view.bottomPanelType); } /** */ @Test public void testEndOfRound() { gameControl.startGame(); // Manipulate first player's hand, to allow player1 to win IHand playerHand = gameControl.roundControl.roundState.getActivePlayer().getHand(); for (Pair entry : playerHand.clone()) { playerHand.pickUp(entry.getFirst()); } Stone stone1 = new Stone(9, RED); Stone stone2 = new Stone(10, RED); Stone stone3 = new Stone(11, RED); playerHand.drop(stone1, new Position(0, 0)); playerHand.drop(stone2, new Position(0, 0)); playerHand.drop(stone3, new Position(0, 0)); // Done setting up first players hand view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.handPanel.stoneClickEvent.emit(stone1, false); view.handPanel.stoneClickEvent.emit(stone2, true); view.handPanel.stoneClickEvent.emit(stone3, true); view.tablePanel.clickEvent.emit(new Position(0, 0)); view.playerPanel.endTurnEvent.emit(); assertSame(BottomPanelType.WIN_PANEL, view.bottomPanelType); view.newRoundEvent.emit(); assertSame(BottomPanelType.START_TURN_PANEL, view.bottomPanelType); } @Test public void testNewGame() { gameControl.getEndOfGameEvent().add(new IListener() { @Override public void handle() { gameEnded = true; } }); gameEnded = false; gameControl.startGame(); // Manipulate first player's hand, to allow player1 to win IHand playerHand = gameControl.roundControl.roundState.getActivePlayer().getHand(); for (Pair entry : playerHand.clone()) { playerHand.pickUp(entry.getFirst()); } Stone stone1 = new Stone(9, RED); Stone stone2 = new Stone(10, RED); Stone stone3 = new Stone(11, RED); playerHand.drop(stone1, new Position(0, 0)); playerHand.drop(stone2, new Position(0, 0)); playerHand.drop(stone3, new Position(0, 0)); // Done setting up first players hand view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.handPanel.stoneClickEvent.emit(stone1, false); view.handPanel.stoneClickEvent.emit(stone2, true); view.handPanel.stoneClickEvent.emit(stone3, true); view.tablePanel.clickEvent.emit(new Position(0, 0)); view.playerPanel.endTurnEvent.emit(); assertSame(BottomPanelType.WIN_PANEL, view.bottomPanelType); assertFalse(gameEnded); view.newGameEvent.emit(); assertTrue(gameEnded); } @Test public void testAborting() { gameControl.startGame(); // Manipulate first player's hand, to allow player1 to win IHand playerHand = gameControl.roundControl.roundState.getActivePlayer().getHand(); for (Pair entry : playerHand.clone()) { playerHand.pickUp(entry.getFirst()); } Stone stone1 = new Stone(9, RED); Stone stone2 = new Stone(10, RED); Stone stone3 = new Stone(11, RED); playerHand.drop(stone1, new Position(0, 0)); playerHand.drop(stone2, new Position(0, 0)); playerHand.drop(stone3, new Position(0, 0)); // Done setting up first players hand view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.handPanel.stoneClickEvent.emit(stone1, false); view.handPanel.stoneClickEvent.emit(stone2, true); gameControl.abortGame(); assertTrue(view.handPanel.stoneClickEvent.listeners.isEmpty()); assertTrue(view.playerPanel.endTurnEvent.listeners.isEmpty()); } /** */ @Test public void testRedealing() { gameControl.startGame(); view.startTurnEvent.emit(); PlayerSettings firstPlayer = gameControl.roundControl.roundState .getActivePlayer().getPlayerSettings(); view.playerPanel.endTurnEvent.emit(); view.startTurnEvent.emit(); view.playerPanel.redealEvent.emit(); assertSame(BottomPanelType.START_REDEAL_TURN_PANEL, view.bottomPanelType); view.startTurnEvent.emit(); assertSame(firstPlayer, gameControl.roundControl.roundState .getActivePlayer().getPlayerSettings()); } }