package net.sf.freecol.util.test;
import java.util.HashMap;
import java.util.Iterator;
import net.sf.freecol.common.model.Colony;
import net.sf.freecol.common.model.Game;
import net.sf.freecol.common.model.Player;
import net.sf.freecol.common.model.Tile;
import net.sf.freecol.common.model.Unit;
import net.sf.freecol.common.model.UnitType;
import net.sf.freecol.server.model.ServerColony;
import net.sf.freecol.server.model.ServerUnit;
public class FreeColTestUtils {
private static ColonyBuilder colonyBuilder = null;
public static ColonyBuilder getColonyBuilder(){
Game game = FreeColTestCase.getGame();
if(game == null){
throw new NullPointerException("Game not set");
}
if(colonyBuilder == null){
colonyBuilder = new ColonyBuilder(game);
}
else{
colonyBuilder = colonyBuilder.reset().setGame(game);
}
return colonyBuilder;
}
public static class ColonyBuilder{
// Required parameter
static final UnitType colonistType
= FreeColTestCase.spec().getDefaultUnitType();
private Game game;
private HashMap<UnitType,Integer> colonists = new HashMap<UnitType,Integer>();
private Player player;
private String name;
private int initialColonists;
private final String defaultPlayer = "model.nation.dutch";
private String defaultName = "New Amsterdam";
private int initialDefaultColonists = 1;
private Tile colonyTile;
private ColonyBuilder(Game game){
this.game = game;
setStartingParams();
}
private void setStartingParams(){
// Some params can only be set in build(), because the default values
//may not be valid for the game set
// However, the tester himself may set them to valid values later,
//so they are set to null for now
player = null;
colonyTile = null;
name = defaultName;
initialColonists = initialDefaultColonists;
colonists.clear();
}
public ColonyBuilder player(Player player){
this.player = player;
if(player == null || !game.getPlayers().contains(player)){
throw new IllegalArgumentException("Player not in game");
}
return this;
}
public ColonyBuilder initialColonists(int colonists){
if(colonists <= 0){
throw new IllegalArgumentException("Number of colonists must be positive");
}
this.initialColonists = colonists;
return this;
}
public ColonyBuilder colonyTile(Tile tile){
Tile tileOnMap = this.game.getMap().getTile(tile.getPosition());
if(tile != tileOnMap){
throw new IllegalArgumentException("Given tile not on map");
}
this.colonyTile = tile;
return this;
}
public ColonyBuilder colonyName(String name){
if(name == null){
throw new IllegalArgumentException("Name cannot be null");
}
this.name = name;
return this;
}
public ColonyBuilder addColonist(UnitType type){
if(!colonists.containsKey(type)){
colonists.put(type, 0);
}
Integer nCol = colonists.get(type);
colonists.put(type, nCol + 1);
return this;
}
public Colony build(){
// player not set, get default
if(player == null){
player = game.getPlayer(defaultPlayer);
if(player == null){
throw new IllegalArgumentException("Default Player " + defaultPlayer + " not in game");
}
}
// settlement tile no set, get default
if(colonyTile == null){
colonyTile = game.getMap().getTile(5, 8);
if(colonyTile == null){
throw new IllegalArgumentException("Default tile not in game");
}
}
/*
if(this.name != null){
for(Colony colony : player.getColonies()){
if(colony.getName().equals(this.name)){
throw new IllegalArgumentException("Another colony already has the given name");
}
}
}
*/
Colony colony = new ServerColony(game, player, name, colonyTile);
player.addSettlement(colony);
colony.placeSettlement(true);
// Add colonists
int nCol = 0;
Iterator<UnitType> iter = colonists.keySet().iterator();
while (iter.hasNext()) {
UnitType type = iter.next();
Integer n = colonists.get(type);
for (int i = 0; i < n; i++) {
Unit colonist = new ServerUnit(game, colonyTile, player, type);
colonist.setLocation(colony);
nCol++;
}
}
// add rest of colonists as simple free colonists
for (int i = nCol; i < initialColonists; i++) {
Unit colonist = new ServerUnit(game, colonyTile, player, colonistType);
colonist.setLocation(colony);
}
return colony;
}
public ColonyBuilder setGame(Game game){
this.game = game;
return reset();
}
public ColonyBuilder reset() {
setStartingParams();
return this;
}
}
}