package games.strategy.triplea.delegate;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
import static org.junit.Assert.assertTrue;
import org.junit.Before;
import org.junit.Test;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.ITestDelegateBridge;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.ProductionRule;
import games.strategy.engine.data.Resource;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.UnitType;
import games.strategy.engine.data.changefactory.ChangeFactory;
import games.strategy.triplea.Constants;
import games.strategy.triplea.xml.TestMapGameData;
import games.strategy.util.IntegerMap;
/**
* "Victory" map is just a branch/mod of Pact of Steel 2.
* POS2 is an actual game with good gameplay that we don't want to mess with, so
* "Victory" is more of an xml purely for testing purposes, and probably should never be played.
*/
public class VictoryTest {
private GameData gameData;
private PlayerID italians;
private ITestDelegateBridge testBridge;
private IntegerMap<Resource> italianResources;
private PurchaseDelegate purchaseDelegate;
private Territory britishCongo;
private Territory kenya;
private UnitType motorized;
private UnitType armour;
private Territory frenchEastAfrica;
private Territory frenchWestAfrica;
private Territory angloEgypt;
private Territory libya;
private MoveDelegate moveDelegate;
@Before
public void setUp() throws Exception {
gameData = TestMapGameData.VICTORY_TEST.getGameData();
italians = GameDataTestUtil.italians(gameData);
testBridge = GameDataTestUtil.getDelegateBridge(italians, gameData);
// we need to initialize the original owner
final InitializationDelegate initDel =
(InitializationDelegate) gameData.getDelegateList().getDelegate("initDelegate");
initDel.setDelegateBridgeAndPlayer(testBridge);
initDel.start();
initDel.end();
italianResources = italians.getResources().getResourcesCopy();
purchaseDelegate = (PurchaseDelegate) gameData.getDelegateList().getDelegate("purchase");
moveDelegate = (MoveDelegate) gameData.getDelegateList().getDelegate("move");
britishCongo = gameData.getMap().getTerritory("Belgian Congo");
kenya = gameData.getMap().getTerritory("Kenya");
motorized = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_MOTORIZED);
armour = GameDataTestUtil.armour(gameData);
frenchEastAfrica = gameData.getMap().getTerritory("French Equatorial Africa");
frenchWestAfrica = gameData.getMap().getTerritory("French West Africa");
angloEgypt = gameData.getMap().getTerritory("Anglo Egypt");
libya = gameData.getMap().getTerritory("Libya");
}
@Test
public void testNoBlitzThroughMountain() {
gameData.performChange(ChangeFactory.addUnits(libya, armour.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
final String error =
moveDelegate.move(libya.getUnits().getUnits(), gameData.getMap().getRoute(libya, britishCongo));
moveDelegate.end();
assertTrue(error.equals(MoveValidator.NOT_ALL_UNITS_CAN_BLITZ));
}
@Test
public void testBlitzNormal() {
gameData.performChange(ChangeFactory.addUnits(frenchWestAfrica, armour.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
final String error =
moveDelegate.move(frenchWestAfrica.getUnits().getUnits(),
gameData.getMap().getRoute(frenchWestAfrica, britishCongo));
moveDelegate.end();
assertEquals(error, null);
}
@Test
public void testNoBlitzWithStopThroughMountain() {
gameData.performChange(ChangeFactory.addUnits(libya, armour.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
String error = moveDelegate.move(libya.getUnits().getUnits(), gameData.getMap().getRoute(libya, angloEgypt));
// first step is legal
assertEquals(error, null);
// second step isn't legal because we lost blitz even though we took the mountain
error = moveDelegate.move(angloEgypt.getUnits().getUnits(), gameData.getMap().getRoute(angloEgypt, britishCongo));
moveDelegate.end();
assertTrue(error.equals(MoveValidator.NOT_ALL_UNITS_CAN_BLITZ));
}
@Test
public void testBlitzWithStop() {
gameData.performChange(ChangeFactory.addUnits(frenchWestAfrica, armour.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
String error = moveDelegate.move(frenchWestAfrica.getUnits().getUnits(),
gameData.getMap().getRoute(frenchWestAfrica, frenchEastAfrica));
assertEquals(error, null);
error = moveDelegate.move(frenchEastAfrica.getUnits().getUnits(),
gameData.getMap().getRoute(frenchEastAfrica, britishCongo));
moveDelegate.end();
assertEquals(error, null);
}
@Test
public void testMotorizedThroughMountain() {
gameData.performChange(ChangeFactory.addUnits(libya, motorized.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
final String error =
moveDelegate.move(libya.getUnits().getUnits(), gameData.getMap().getRoute(libya, britishCongo));
moveDelegate.end();
assertTrue(error.equals(MoveValidator.NOT_ALL_UNITS_CAN_BLITZ));
}
@Test
public void testMotorizedNoBlitzBlitzedTerritory() {
gameData.performChange(ChangeFactory.changeOwner(frenchEastAfrica, italians));
gameData.performChange(ChangeFactory.addUnits(frenchEastAfrica, armour.create(1, italians)));
gameData.performChange(ChangeFactory.changeOwner(kenya, italians));
gameData.performChange(ChangeFactory.addUnits(kenya, motorized.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
String error = moveDelegate.move(frenchEastAfrica.getUnits().getUnits(),
gameData.getMap().getRoute(frenchEastAfrica, britishCongo));
assertEquals(null, error);
error = moveDelegate.move(kenya.getUnits().getUnits(), gameData.getMap().getRoute(kenya, britishCongo));
assertEquals(null, error);
error = moveDelegate.move(britishCongo.getUnits().getUnits(),
gameData.getMap().getRoute(britishCongo, frenchEastAfrica));
assertEquals(MoveValidator.NOT_ALL_UNITS_CAN_BLITZ, error);
moveDelegate.end();
}
@Test
public void testFuelUseMotorized() {
gameData.performChange(ChangeFactory.changeOwner(kenya, italians));
gameData.performChange(ChangeFactory.addUnits(kenya, motorized.create(1, italians)));
testBridge.setStepName("CombatMove");
moveDelegate.setDelegateBridgeAndPlayer(testBridge);
moveDelegate.start();
final int fuelAmount = italians.getResources().getQuantity("Fuel");
final int puAmount = italians.getResources().getQuantity("PUs");
moveDelegate.move(kenya.getUnits().getUnits(), gameData.getMap().getRoute(kenya, britishCongo));
assertEquals(fuelAmount - 1, italians.getResources().getQuantity("Fuel"));
assertEquals(puAmount - 1, italians.getResources().getQuantity("PUs"));
gameData.performChange(ChangeFactory.addUnits(kenya, armour.create(1, italians)));
moveDelegate.move(kenya.getUnits().getUnits(), gameData.getMap().getRoute(kenya, britishCongo));
assertEquals(fuelAmount - 1, italians.getResources().getQuantity("Fuel"));
assertEquals(puAmount - 1, italians.getResources().getQuantity("PUs"));
gameData.performChange(ChangeFactory.addUnits(kenya, motorized.create(5, italians)));
moveDelegate.move(kenya.getUnits().getUnits(), gameData.getMap().getRoute(kenya, britishCongo));
assertEquals(fuelAmount - 6, italians.getResources().getQuantity("Fuel"));
assertEquals(puAmount - 6, italians.getResources().getQuantity("PUs"));
gameData.performChange(ChangeFactory.addUnits(kenya, motorized.create(50, italians)));
final String error =
moveDelegate.move(kenya.getUnits().getUnits(), gameData.getMap().getRoute(kenya, britishCongo));
assertTrue(error.startsWith("Not enough resources to perform this move"));
moveDelegate.end();
}
@Test
public void testMultipleResourcesToPurchase() {
testBridge.setStepName("italianPurchase");
purchaseDelegate.setDelegateBridgeAndPlayer(testBridge);
purchaseDelegate.start();
final IntegerMap<ProductionRule> purchaseList = new IntegerMap<>();
final ProductionRule armourtest = gameData.getProductionRuleList().getProductionRule("buyArmourtest");
assertNotNull(armourtest);
italianResources.subtract(armourtest.getCosts());
purchaseList.add(armourtest, 1);
final String error = purchaseDelegate.purchase(purchaseList);
assertEquals(null, error);
assertEquals(italianResources, italians.getResources().getResourcesCopy());
}
@Test
public void testNotEnoughMultipleResourcesToPurchase() {
testBridge.setStepName("italianPurchase");
purchaseDelegate.setDelegateBridgeAndPlayer(testBridge);
purchaseDelegate.start();
final IntegerMap<ProductionRule> purchaseList = new IntegerMap<>();
final ProductionRule armourtest = gameData.getProductionRuleList().getProductionRule("buyArmourtest2");
assertNotNull(armourtest);
italianResources.subtract(armourtest.getCosts());
purchaseList.add(armourtest, 1);
final String error = purchaseDelegate.purchase(purchaseList);
assertEquals(PurchaseDelegate.NOT_ENOUGH_RESOURCES, error);
}
@Test
public void testPUOnlyResourcesToPurchase() {
testBridge.setStepName("italianPurchase");
purchaseDelegate.setDelegateBridgeAndPlayer(testBridge);
purchaseDelegate.start();
final IntegerMap<ProductionRule> purchaseList = new IntegerMap<>();
final ProductionRule buyArmour = gameData.getProductionRuleList().getProductionRule("buyArmour");
assertNotNull(buyArmour);
italianResources.subtract(buyArmour.getCosts());
purchaseList.add(buyArmour, 1);
final String error = purchaseDelegate.purchase(purchaseList);
assertEquals(null, error);
assertEquals(italianResources, italians.getResources().getResourcesCopy());
}
@Test
public void testNoPUResourcesToPurchase() {
testBridge.setStepName("italianPurchase");
purchaseDelegate.setDelegateBridgeAndPlayer(testBridge);
purchaseDelegate.start();
final IntegerMap<ProductionRule> purchaseList = new IntegerMap<>();
final ProductionRule buyArmour = gameData.getProductionRuleList().getProductionRule("buyArmourtest3");
assertNotNull(buyArmour);
italianResources.subtract(buyArmour.getCosts());
purchaseList.add(buyArmour, 1);
final String error = purchaseDelegate.purchase(purchaseList);
assertEquals(null, error);
assertEquals(italianResources, italians.getResources().getResourcesCopy());
}
}