package jrummikub.control.turn; import static jrummikub.model.StoneColor.RED; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertFalse; import static org.junit.Assert.assertTrue; import java.awt.Color; import java.util.Arrays; import jrummikub.control.RoundControl; import jrummikub.model.GameSettings; import jrummikub.model.GameState; import jrummikub.model.IHand; import jrummikub.model.IRoundState; import jrummikub.model.PlayerSettings; import jrummikub.model.PlayerSettings.Type; import jrummikub.model.Position; import jrummikub.model.RoundState; import jrummikub.model.Stone; import jrummikub.model.StoneColor; import jrummikub.model.StoneSet; import jrummikub.util.IListener; import jrummikub.util.IListener2; import jrummikub.view.MockView; import org.junit.Before; import org.junit.Test; /** */ public class AIControlTest { ITurnControl aiControl; IRoundState roundState; GameSettings gameSettings; PlayerSettings playerSettings; MockView view; boolean turnEnded; boolean redealt; /** */ @Before public void setUp() { aiControl = TurnControlFactory.getFactory(Type.COMPUTER).create(); AIControl.useBackgroundThread = false; gameSettings = new GameSettings(); playerSettings = new PlayerSettings("ROBOT_01", Color.GRAY); gameSettings.getPlayerList().add(playerSettings); roundState = new RoundState(gameSettings, new GameState()); view = new MockView(); turnEnded = false; redealt = false; aiControl.getEndOfTurnEvent().add( new IListener2() { @Override public void handle(IRoundState state, RoundControl.InvalidTurnInfo value2) { turnEnded = true; roundState = state; } }); aiControl.getRedealEvent().add(new IListener() { @Override public void handle() { redealt = true; } }); roundState.nextTurn(); roundState.nextTurn(); IHand hand = roundState.getActivePlayer().getHand(); hand.drop(new Stone(11, StoneColor.RED), new Position(0, 0)); hand.drop(new Stone(12, StoneColor.RED), new Position(0, 0)); hand.drop(new Stone(13, StoneColor.RED), new Position(0, 0)); } /** * @throws InterruptedException * if timeout */ @Test(timeout = 10000) public void testTurnZeroNoRedealing() throws InterruptedException { aiControl.setup(new ITurnControl.TurnInfo(roundState, TurnMode.MAY_REDEAL, false), gameSettings, view); aiControl.startTurn(); assertTrue(turnEnded); assertFalse(redealt); assertEquals(0, roundState.getTable().getSize()); } /** * @throws InterruptedException * if timeout */ @Test(timeout = 10000) public void testTurnZeroNotMelding() throws InterruptedException { aiControl.setup(new ITurnControl.TurnInfo(roundState, TurnMode.INSPECT_ONLY, false), gameSettings, view); aiControl.startTurn(); assertTrue(turnEnded); assertFalse(redealt); assertEquals(0, roundState.getTable().getSize()); } /** * @throws InterruptedException * if timeout */ @Test public void testNormalTurnMelding() throws InterruptedException { aiControl.setup(new ITurnControl.TurnInfo(roundState, TurnMode.NORMAL_TURN, false), gameSettings, view); aiControl.startTurn(); assertTrue(turnEnded); assertFalse(redealt); assertEquals(1, roundState.getTable().getSize()); assertEquals(0, roundState.getActivePlayer().getHand().getSize()); } @Test public void testWithStonesOnTable() { roundState.getActivePlayer().setLaidOut(true); roundState.getTable().drop(new StoneSet(Arrays.asList(new Stone(1, RED), new Stone(2, RED), new Stone(3, RED))), new Position(0,0)); IHand hand = roundState.getActivePlayer().getHand(); hand.drop(new Stone(4, RED), new Position(0,0)); hand.drop(new Stone(7, RED), new Position(0,0)); aiControl.setup(new ITurnControl.TurnInfo(roundState, TurnMode.NORMAL_TURN, false), gameSettings, view); aiControl.startTurn(); assertTrue(turnEnded); assertFalse(redealt); assertEquals(2, roundState.getTable().getSize()); assertEquals(1, roundState.getActivePlayer().getHand().getSize()); } }