package org.scotlandyard.tests.engine.player;
import java.util.HashSet;
import java.util.Set;
import junit.framework.Assert;
import org.junit.Test;
import org.scotlandyard.engine.Game;
import org.scotlandyard.engine.GameException;
import org.scotlandyard.engine.Token;
import org.scotlandyard.engine.User;
import org.scotlandyard.engine.boardmap.BoardMap;
import org.scotlandyard.engine.boardmap.Coordinate;
import org.scotlandyard.engine.boardmap.Link;
import org.scotlandyard.engine.constants.TransportationMethod;
import org.scotlandyard.engine.player.Player;
import org.scotlandyard.impl.engine.GameEngine;
import org.scotlandyard.impl.engine.GameImpl;
import org.scotlandyard.impl.engine.UserImpl;
import org.scotlandyard.impl.engine.boardmap.BoardMapImpl;
import org.scotlandyard.impl.engine.boardmap.CoordinateImpl;
import org.scotlandyard.impl.engine.boardmap.LinkImpl;
import org.scotlandyard.impl.engine.player.Detective;
/**
* TODO add description
*
* @author Hussain Al-Mutawa
* @version 1.0
* @since Sept 2011
*
*/
public class DetectiveTest {
private transient final Player detective;
private transient final User creator;
private transient BoardMap boardMap;
private transient Game game;
private transient final static String MAPNAME ="PalmerstonNorth";
//TODO add description here
public DetectiveTest() throws GameException{
GameEngine.instance().getLobby().removeAllGames();
GameEngine.instance().getUsers().clear();
GameEngine.instance().getBoardMaps().clear();
creator = UserImpl.getNewInstance("player1", "player1@game.com");
detective = new Detective(creator);
}
@Test//TODO add description here
public final void testDetective() {
Assert.assertEquals(detective.getPosition(game), null);
Assert.assertTrue(detective.equals(detective));
}
@Test//TODO add description here
public final void testSetPosition() throws GameException {
boardMap = BoardMapImpl.getNewInstance(MAPNAME);
game = GameImpl.getNewInstance("1", creator, boardMap);
final Coordinate coor = new CoordinateImpl(boardMap, 1.1, 2.2);
detective.setPosition(game, coor);
Assert.assertEquals(coor, detective.getPosition(game));
}
@Test//TODO add description here
public final void testGetPosition() throws GameException {
boardMap = BoardMapImpl.getNewInstance(MAPNAME);
game = GameImpl.getNewInstance("2", creator, boardMap);
final Coordinate coor = new CoordinateImpl(boardMap, 3.3, 4.4);
detective.setPosition(game, coor);
Assert.assertEquals(detective.getPosition(game), coor);
}
@Test//TODO add description here
public final void testMoveMade() throws GameException {
boardMap = BoardMapImpl.getNewInstance(MAPNAME);
game = GameImpl.getNewInstance("3", creator, boardMap);
Assert.assertTrue(detective.getTurns().isEmpty());
detective.moveMade(game);
Assert.assertFalse(detective.getTurns().isEmpty());
}
@Test//TODO add description here
public final void testGetTurns() throws GameException {
boardMap = BoardMapImpl.getNewInstance(MAPNAME);
game = GameImpl.getNewInstance("4", creator, boardMap);
Assert.assertTrue(detective.getTurns().isEmpty());
detective.moveMade(game);
Assert.assertFalse(detective.getTurns().isEmpty());
}
@Test//TODO add description here
public final void testMethods() throws GameException {
boardMap = BoardMapImpl.getNewInstance(MAPNAME);
game = GameImpl.getNewInstance("2", creator, boardMap);
final Game game2 = GameImpl.getNewInstance("3", creator, boardMap);
final Coordinate coor = new CoordinateImpl(boardMap, 1.1, 2.2);
final Coordinate coor1 = new CoordinateImpl(boardMap, 1.6, 2.6);
//Token token = new TokenImpl(detective, TransportationMethod.BUS);
final Link route = new LinkImpl(boardMap, TransportationMethod.BUS, coor, coor1);
//token.setNumberOfTickets(10);
detective.setTokens(game, TransportationMethod.BUS, 10);
final Token token = detective.getTokens(game).get(TransportationMethod.BUS);
Assert.assertEquals(detective.getNumberOfTickets(game, TransportationMethod.BUS),10);
detective.setPosition(game, coor);
detective.useTokenToMove(game, token, route);
Assert.assertEquals(detective.getNumberOfTickets(game, TransportationMethod.BUS),9);
Assert.assertEquals(token.getNumberOfTokens(),9);
detective.useTokenToMove(game, token, route);
// aren't these conflicting?
// 2Token token = new TokenImpl(detective, TransportationMethod.BUS);
// token.setNumberOfTickets(10);
// detective.setTokens(game, TransportationMethod.BUS, 10);
Assert.assertEquals(detective.toString(),"player1");
Assert.assertEquals(detective.getNumberOfTickets(game, TransportationMethod.BUS),8);
Assert.assertEquals(token.getNumberOfTokens(),8);
Assert.assertTrue(detective.toString().equals("player1"));
for(int x=8;x>0;x--){
detective.useTokenToMove(game, token, route);
}
try{
detective.useTokenToMove(game, token, route);
Assert.assertTrue(false);
}catch(GameException ex){
Assert.assertTrue(true);
}
Assert.assertEquals(detective.compareTo(detective),0);
game.addDetective((Detective) detective);
game2.addDetective((Detective) detective);
final Set<Game> currentgameslist = new HashSet<Game>();
currentgameslist.add(game);
currentgameslist.add(game2);
Assert.assertEquals(detective.getJoinedGames().size(), currentgameslist.size());
}
}