/**
* 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.io.ByteArrayInputStream;
import java.io.FileInputStream;
import java.util.Hashtable;
import java.util.List;
import java.util.Map;
import java.util.Map.Entry;
import net.sf.freecol.common.io.FreeColTcFile;
import net.sf.freecol.util.test.FreeColTestCase;
public final class SpecificationTest extends FreeColTestCase {
/**
* Make sure that a specification object can be created without an exception
* being thrown.
*
*/
public void testLoad() {
Specification spec = null;
try {
spec = new FreeColTcFile("freecol").getSpecification();
} catch(Exception e) {
e.printStackTrace();
fail();
}
assertNotNull(spec);
}
/**
* Test for some typical abilities.
*/
public void testUnitAbilities() {
Specification spec = spec();
UnitType colonist = spec.getUnitType("model.unit.freeColonist");
assertTrue(colonist.hasAbility("model.ability.foundColony"));
assertFalse(colonist.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT));
assertTrue(colonist.isRecruitable());
assertFalse(colonist.hasAbility(Ability.NAVAL_UNIT));
assertFalse(colonist.hasAbility(Ability.CARRY_GOODS));
assertFalse(colonist.hasAbility(Ability.CARRY_UNITS));
assertFalse(colonist.hasAbility(Ability.CAPTURE_GOODS));
UnitType wagon = spec.getUnitType("model.unit.wagonTrain");
assertFalse(wagon.hasAbility("model.ability.foundColony"));
assertFalse(wagon.isRecruitable());
assertFalse(wagon.hasAbility(Ability.NAVAL_UNIT));
assertTrue(wagon.hasAbility(Ability.CARRY_GOODS));
assertFalse(wagon.hasAbility(Ability.CARRY_UNITS));
assertFalse(wagon.hasAbility(Ability.CAPTURE_GOODS));
UnitType brave = spec.getUnitType("model.unit.brave");
//assertFalse(brave.hasAbility("model.ability.foundColony"));
assertTrue(brave.hasAbility(Ability.BORN_IN_INDIAN_SETTLEMENT));
assertFalse(brave.isRecruitable());
assertFalse(brave.hasAbility(Ability.NAVAL_UNIT));
assertTrue(brave.hasAbility(Ability.CARRY_GOODS));
assertFalse(brave.hasAbility(Ability.CARRY_UNITS));
assertFalse(brave.hasAbility(Ability.CAPTURE_GOODS));
UnitType caravel = spec.getUnitType("model.unit.caravel");
assertFalse(caravel.hasAbility("model.ability.foundColony"));
assertFalse(caravel.isRecruitable());
assertTrue(caravel.hasAbility(Ability.NAVAL_UNIT));
assertTrue(caravel.hasAbility(Ability.CARRY_GOODS));
assertTrue(caravel.hasAbility(Ability.CARRY_UNITS));
assertFalse(caravel.hasAbility(Ability.CAPTURE_GOODS));
UnitType privateer = spec.getUnitType("model.unit.privateer");
assertFalse(privateer.hasAbility("model.ability.foundColony"));
assertFalse(privateer.isRecruitable());
assertTrue(privateer.hasAbility(Ability.NAVAL_UNIT));
assertTrue(privateer.hasAbility(Ability.CARRY_GOODS));
assertTrue(privateer.hasAbility(Ability.CARRY_UNITS));
assertTrue(privateer.hasAbility(Ability.CAPTURE_GOODS));
}
public void testFoundingFathers() {
Specification spec = spec();
FoundingFather smith = spec.getFoundingFather("model.foundingFather.adamSmith");
assertFalse(smith == null);
assertTrue(smith.getType() == FoundingFather.FoundingFatherType.TRADE);
// weight is some value in [0, 10]
assertTrue(smith.getWeight(1) >= 0);
assertTrue(smith.getWeight(2) >= 0);
assertTrue(smith.getWeight(3) >= 0);
assertTrue(smith.getWeight(1) <= 10);
assertTrue(smith.getWeight(2) <= 10);
assertTrue(smith.getWeight(3) <= 10);
// weight 3 is the default
assertTrue(smith.getWeight(3) == smith.getWeight(0));
assertTrue(smith.getWeight(3) == smith.getWeight(34));
// check for ability
assertTrue(smith.hasAbility("model.ability.buildFactory"));
}
public void testModifiers() {
Specification spec = spec();
// Percentage Modifier
BuildingType ironWorks = spec.getBuildingType("model.building.ironWorks");
Modifier modifier = ironWorks.getModifierSet("model.goods.tools").iterator().next();
assertEquals(Modifier.Type.PERCENTAGE, modifier.getType());
assertEquals(50f, modifier.getValue());
// Additive Modifier
BuildingType depot = spec.getBuildingType("model.building.depot");
modifier = depot.getModifierSet("model.modifier.warehouseStorage").iterator().next();
assertEquals(Modifier.Type.ADDITIVE, modifier.getType());
assertEquals(100f, modifier.getValue());
// Multiplicative Modifier
UnitType blackSmith = spec.getUnitType("model.unit.masterBlacksmith");
modifier = blackSmith.getModifierSet("model.goods.tools").iterator().next();
assertEquals(Modifier.Type.MULTIPLICATIVE, modifier.getType());
assertEquals(2f, modifier.getValue());
}
public void testNations() {
Specification spec = spec();
List<Nation> europeanNations = spec.getEuropeanNations();
assertEquals(8, europeanNations.size());
List<Nation> indianNations = spec.getIndianNations();
assertEquals(8, indianNations.size());
List<Nation> REFNations = spec.getREFNations();
assertEquals(REFNations.size(), europeanNations.size());
}
public void testNationTypes() {
Specification spec = spec();
List<IndianNationType> indianNationTypes = spec.getIndianNationTypes();
assertEquals(8, indianNationTypes.size());
List<EuropeanNationType> REFNationTypes = spec.getREFNationTypes();
assertEquals(1, REFNationTypes.size());
}
public void testReqAbilitiesForEquipmentTypes() {
String equipmentTypeStr;
Map<String,Boolean> abilitiesReq, expectAbilities;
Specification spec = spec();
Map<String,Map<String,Boolean>> eqTypesAbilities = new Hashtable<String,Map<String,Boolean>>();
// Abilities
equipmentTypeStr = "model.equipment.horses";
expectAbilities = new Hashtable<String,Boolean>();
expectAbilities.put("model.ability.canBeEquipped", true);
expectAbilities.put(Ability.BORN_IN_INDIAN_SETTLEMENT, false);
eqTypesAbilities.put(equipmentTypeStr, expectAbilities);
equipmentTypeStr = "model.equipment.muskets";
expectAbilities = new Hashtable<String,Boolean>();
expectAbilities.put("model.ability.canBeEquipped", true);
expectAbilities.put(Ability.BORN_IN_INDIAN_SETTLEMENT, false);
eqTypesAbilities.put(equipmentTypeStr, expectAbilities);
equipmentTypeStr = "model.equipment.indian.horses";
expectAbilities = new Hashtable<String,Boolean>();
expectAbilities.put("model.ability.canBeEquipped", true);
expectAbilities.put(Ability.BORN_IN_INDIAN_SETTLEMENT, true);
eqTypesAbilities.put(equipmentTypeStr, expectAbilities);
equipmentTypeStr = "model.equipment.indian.muskets";
expectAbilities = new Hashtable<String,Boolean>();
expectAbilities.put("model.ability.canBeEquipped", true);
expectAbilities.put(Ability.BORN_IN_INDIAN_SETTLEMENT, true);
eqTypesAbilities.put(equipmentTypeStr, expectAbilities);
// Verify
for (Entry<String, Map<String, Boolean>> entry : eqTypesAbilities.entrySet()){
equipmentTypeStr = entry.getKey();
expectAbilities = entry.getValue();
EquipmentType equipmentType = spec.getEquipmentType(equipmentTypeStr);
abilitiesReq = equipmentType.getAbilitiesRequired();
for (Entry<String, Boolean> ability : expectAbilities.entrySet()) {
String key = ability.getKey();
boolean hasAbility = abilitiesReq.containsKey(key);
assertTrue(equipmentTypeStr + " missing req. ability " + key,hasAbility);
assertEquals(equipmentTypeStr + " has wrong value for req. ability " + key,abilitiesReq.get(key),ability.getValue());
}
}
}
public void testGoodsTypes() {
GoodsType food = spec().getPrimaryFoodType();
assertTrue(food.isFarmed());
assertTrue(spec().getFarmedGoodsTypeList().contains(food));
assertTrue(food.isFoodType());
assertTrue(spec().getFoodGoodsTypeList().contains(food));
GoodsType fish = spec().getGoodsType("model.goods.fish");
assertTrue(fish.isFarmed());
assertTrue(spec().getFarmedGoodsTypeList().contains(fish));
assertTrue(fish.isFoodType());
assertTrue(spec().getFoodGoodsTypeList().contains(fish));
}
public void testExtends() {
String specification = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<freecol-specification id=\"test\" extends=\"freecol\">"
+ "<unit-types>"
+ "<unit-type id=\"model.unit.milkmaid\" extends=\"colonist\" "
+ "expert-production=\"model.goods.food\" />"
+ "</unit-types>"
+ "</freecol-specification>";
Specification spec = new Specification(new ByteArrayInputStream(specification.getBytes()));
assertNotNull(spec.getUnitType("model.unit.milkmaid"));
assertNotNull(spec.getUnitType("model.unit.caravel"));
// restore original values
try {
spec = new Specification(new FreeColTcFile("freecol").getSpecificationInputStream());
} catch(Exception e) {
System.out.println(e);
}
}
public void testExtendsDelete() {
String specification = "<?xml version=\"1.0\" encoding=\"UTF-8\"?>"
+ "<freecol-specification id=\"test\" extends=\"freecol\">"
+ "<unit-types>"
+ "<delete id=\"model.unit.caravel\" />"
+ "</unit-types>"
+ "</freecol-specification>";
Specification spec = new Specification(new ByteArrayInputStream(specification.getBytes()));
try {
spec.getUnitType("model.unit.caravel");
fail("Caravel is defined.");
} catch(IllegalArgumentException e) {
}
for (UnitType unitType : spec.getUnitTypeList()) {
assertFalse("model.unit.caravel".equals(unitType.getId()));
}
// restore original values
try {
spec = new Specification(new FreeColTcFile("freecol").getSpecificationInputStream());
} catch(Exception e) {
System.out.println(e);
}
}
public void testLoadFragment() {
try {
Specification specification = new Specification(new FreeColTcFile("freecol").getSpecificationInputStream());
int numberOfUnitTypes = specification.numberOfUnitTypes();
specification.loadFragment(new FileInputStream("data/mods/example/specification.xml"));
UnitType milkmaid = specification.getUnitType("model.unit.milkmaid");
assertEquals(numberOfUnitTypes + 1, specification.numberOfUnitTypes());
} catch(Exception e) {
fail(e.getMessage());
}
}
}