/** * Copyright (C) 2002-2012 The FreeCol Team * * This file is part of FreeCol. * * FreeCol is free software: you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation, either version 2 of the License, or * (at your option) any later version. * * FreeCol is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with FreeCol. If not, see <http://www.gnu.org/licenses/>. */ package net.sf.freecol.common.model; import java.util.ArrayList; import java.util.List; import java.util.Map; import java.util.Set; import net.sf.freecol.common.model.Map.Direction; import net.sf.freecol.common.model.UnitLocation.NoAddReason; import net.sf.freecol.server.model.ServerUnit; import net.sf.freecol.util.test.FreeColTestCase; /** * Test cases for individual Founding Fathers. TODO: add a test case * for each Founding Father. */ public class IndividualFatherTest extends FreeColTestCase { private static final BuildableType customHouseType = spec().getBuildingType("model.building.customHouse"); private static final BuildingType townHallType = spec().getBuildingType("model.building.townHall"); private static final EquipmentType bibleType = spec().getEquipmentType("model.equipment.missionary"); private static final GoodsType bellsType = spec().getGoodsType("model.goods.bells"); private static final GoodsType musketsType = spec().getGoodsType("model.goods.muskets"); private static final UnitType servantType = spec().getUnitType("model.unit.indenturedServant"); private static final UnitType colonistType = spec().getUnitType("model.unit.freeColonist"); private static final UnitType statesmanType = spec().getUnitType("model.unit.elderStatesman"); public void testPeterStuyvesant() { Game game = getGame(); game.setMap(getTestMap(true)); Colony colony = getStandardColony(4); Player player = colony.getOwner(); // The custom house is not buildable initially assertFalse(colony.canBuild(customHouseType)); // But it should become available after Peter Stuyvesant has // joined continental congress FoundingFather father = spec().getFoundingFather("model.foundingFather.peterStuyvesant"); player.addFather(father); assertTrue(colony.canBuild(customHouseType)); } public void testHernanCortes() { Game game = getGame(); game.setMap(getTestMap(true)); Colony colony = getStandardColony(4); Player player = colony.getOwner(); Unit unit = colony.getUnitList().get(0); NationType inca = spec().getNationType("model.nationType.inca"); SettlementType incaCity = inca.getSettlementType("model.settlement.inca"); RandomRange range = incaCity.getPlunderRange(unit); assertEquals(2100, range.getFactor()); FoundingFather father = spec().getFoundingFather("model.foundingFather.hernanCortes"); player.addFather(father); range = incaCity.getPlunderRange(unit); assertEquals(3100, range.getFactor()); } public void testMinuit() { Game game = getGame(); game.setMap(getTestMap(true)); Colony colony = getStandardColony(); Unit unit = colony.getUnitList().get(0); Player player = colony.getOwner(); Player iroquois = getGame().getPlayer("model.nation.iroquois"); Tile colonyCenterTile = colony.getTile(); Tile disputedTile = colonyCenterTile.getNeighbourOrNull(Direction.N); Tile settlementTile = disputedTile.getNeighbourOrNull(Direction.N); assertNull(settlementTile.getOwner()); FreeColTestCase.IndianSettlementBuilder builder = new FreeColTestCase.IndianSettlementBuilder(getGame()); IndianSettlement indianSettlement = builder.player(iroquois).settlementTile(settlementTile) .skillToTeach(null).build(); // Set up disputed tile ColonyTile colonyTile = colony.getColonyTile(disputedTile); for (Unit u : colonyTile.getUnitList()) { u.setLocation(colony.getTile()); } disputedTile.changeOwnership(iroquois, indianSettlement); assertNotNull(settlementTile.getSettlement()); assertTrue(player.getLandPrice(disputedTile) > 0); assertFalse(colony.getColonyTile(disputedTile).canAdd(unit)); FoundingFather minuit = spec().getFoundingFather("model.foundingFather.peterMinuit"); player.addFather(minuit); assertEquals("Tile should be zero cost", 0, player.getLandPrice(disputedTile)); assertEquals("Should still have to claim the tile", NoAddReason.CLAIM_REQUIRED, colonyTile.getNoAddReason(unit)); } public void testPaine() { Game game = getGame(); game.setMap(getTestMap(true)); Colony colony = getStandardColony(4); Player player = colony.getOwner(); List<AbstractGoods> empty = new ArrayList<AbstractGoods>(); Building townHall = colony.getBuilding(townHallType); Unit statesman1 = colony.getUnitList().get(0); Unit statesman2 = colony.getUnitList().get(1); Unit statesman3 = colony.getUnitList().get(2); statesman1.setType(statesmanType); statesman1.setLocation(townHall); assertEquals(6 + 1, townHall.getTotalProductionOf(bellsType)); statesman2.setType(statesmanType); statesman2.setLocation(townHall); assertEquals(2 * 6 + 1, townHall.getTotalProductionOf(bellsType)); statesman3.setType(statesmanType); statesman3.setLocation(townHall); assertEquals(3 * 6 + 1, townHall.getTotalProductionOf(bellsType)); player.setTax(20); assertEquals(3 * 6 + 1, townHall.getTotalProductionOf(bellsType)); FoundingFather paine = spec().getFoundingFather("model.foundingFather.thomasPaine"); player.addFather(paine); player.recalculateBellsBonus(); assertTrue(player.hasAbility("model.ability.addTaxToBells")); Set<Modifier> modifierSet = player.getModifierSet("model.goods.bells"); assertEquals(1, modifierSet.size()); Modifier paineModifier = modifierSet.iterator().next(); assertEquals(paine, paineModifier.getSource()); assertEquals(player.getTax(), (int) paineModifier.getValue()); int expected = (int) (3 * 6 * 1.2f + 1); assertEquals(expected, townHall.getTotalProductionOf(bellsType)); player.setTax(30); player.recalculateBellsBonus(); expected = (int) (3 * 6 * 1.3f + 1); assertEquals(expected, townHall.getTotalProductionOf(bellsType)); } public void testRevere() { Game game = getGame(); game.setMap(getTestMap()); Colony colony = getStandardColony(); Player player = colony.getOwner(); Unit colonist = colony.getUnitList().get(0); assertNull("Unit should not be able to automatically arm, Revere not in congress yet", colonist.getAutomaticEquipment()); // adding Revere to congress FoundingFather father = spec().getFoundingFather("model.foundingFather.paulRevere"); player.addFather(father); assertNull("Unit should not be able to automatically arm, no muskets available", colonist.getAutomaticEquipment()); colony.addGoods(musketsType, 100); assertNotNull("Unit be able to automatically arm, has muskets and Paul Revere", colonist.getAutomaticEquipment()); } public void testDeWitt() { Game game = getGame(); Player dutch = game.getPlayer("model.nation.dutch"); Player french = game.getPlayer("model.nation.french"); dutch.getMarket().setArrears(musketsType, 1); assertFalse(dutch.canTrade(musketsType, Market.Access.EUROPE)); assertFalse(dutch.canTrade(musketsType, Market.Access.CUSTOM_HOUSE)); FoundingFather father = spec().getFoundingFather("model.foundingFather.janDeWitt"); dutch.addFather(father); assertFalse(dutch.canTrade(musketsType, Market.Access.EUROPE)); assertFalse(dutch.canTrade(musketsType, Market.Access.CUSTOM_HOUSE)); dutch.setStance(french, Player.Stance.WAR); assertFalse(dutch.canTrade(musketsType, Market.Access.EUROPE)); assertFalse(dutch.canTrade(musketsType, Market.Access.CUSTOM_HOUSE)); dutch.setStance(french, Player.Stance.PEACE); assertFalse(dutch.canTrade(musketsType, Market.Access.EUROPE)); assertTrue(dutch.canTrade(musketsType, Market.Access.CUSTOM_HOUSE)); } public void testBrebeuf() { Game game = getGame(); Player dutch = game.getPlayer("model.nation.dutch"); FoundingFather brebeuf = spec().getFoundingFather("model.foundingFather.fatherJeanDeBrebeuf"); String ability = "model.ability.expertMissionary"; assertTrue(brebeuf.hasAbility(ability)); assertFalse(dutch.hasAbility(ability)); game.setMap(getTestMap()); FreeColTestCase.IndianSettlementBuilder builder = new FreeColTestCase.IndianSettlementBuilder(game); IndianSettlement camp = builder.build(); Unit missionary = new ServerUnit(game, null, dutch, colonistType, bibleType); camp.setMissionary(missionary); assertTrue(bibleType.hasAbility("model.ability.missionary")); assertTrue(missionary.hasAbility("model.ability.missionary")); dutch.addFather(brebeuf); assertTrue(dutch.hasAbility(ability)); assertTrue(missionary.hasAbility(ability)); } public void testBrewster() { Game game = getGame(); Player dutch = game.getPlayer("model.nation.dutch"); String ability = "model.ability.canRecruitUnit"; assertTrue(dutch.hasAbility(ability)); for (UnitType unitType : spec().getUnitTypeList()) { if (unitType.isRecruitable()) { assertTrue("Unable to recruit " + unitType.toString(), dutch.hasAbility(ability, unitType)); } } dutch.addFather(spec().getFoundingFather("model.foundingFather.williamBrewster")); // ability is no longer general, but limited to certain unit types assertFalse(dutch.hasAbility(ability)); for (UnitType unitType : spec().getUnitTypeList()) { if (unitType.isRecruitable()) { if (unitType.getSkill() < 0) { assertFalse("Able to recruit " + unitType.toString(), dutch.hasAbility(ability, unitType)); } else { assertTrue("Unable to recruit " + unitType.toString(), dutch.hasAbility(ability, unitType)); } } } } public void testJefferson() { Game game = getGame(); game.setMap(getTestMap(true)); FoundingFather jefferson = spec().getFoundingFather("model.foundingFather.thomasJefferson"); assertEquals(1, jefferson.getModifierSet("model.goods.bells").size()); Modifier modifier = jefferson.getModifierSet("model.goods.bells").iterator().next(); assertTrue(modifier.appliesTo(townHallType)); Colony colony = getStandardColony(4); Player player = colony.getOwner(); Building townHall = colony.getBuilding(townHallType); townHall.add(colony.getUnitList().get(0)); assertEquals(0, player.getModifierSet("model.goods.bells").size()); assertEquals(1, colony.getModifierSet("model.goods.bells").size()); assertEquals(4, townHall.getTotalProductionOf(bellsType)); player.addFather(jefferson); assertEquals(1, player.getModifierSet("model.goods.bells").size()); assertEquals(1, colony.getModifierSet("model.goods.bells").size()); assertEquals(2, townHall.getProductionModifiers(bellsType, null).size()); assertEquals(5, townHall.getTotalProductionOf(bellsType)); } public void lasCasas() { Game game = getGame(); game.setMap(getTestMap(true)); FoundingFather lasCasas = spec().getFoundingFather("model.foundingFather.bartolomeDeLasCasas"); Map<UnitType, UnitType> upgrades = lasCasas.getUpgrades(); assertFalse(upgrades.isEmpty()); for (Map.Entry<UnitType, UnitType> entry : upgrades.entrySet()) { assertEquals(entry.getKey(), spec().getUnitType(entry.getKey().getId())); assertEquals(entry.getValue(), spec().getUnitType(entry.getValue().getId())); } Colony colony = getStandardColony(4); Player player = colony.getOwner(); Unit unit = colony.getUnitList().get(0); Map.Entry<UnitType, UnitType> entry = upgrades.entrySet().iterator().next(); unit.setType(entry.getKey()); player.addFather(lasCasas); assertEquals(unit.getType(), entry.getValue()); } }