package games.strategy.engine.data;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertFalse;
import static org.junit.Assert.assertTrue;
import java.io.ByteArrayInputStream;
import java.io.ByteArrayOutputStream;
import java.io.InputStream;
import java.io.ObjectInputStream;
import java.io.ObjectOutputStream;
import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import org.junit.Before;
import org.junit.Test;
import games.strategy.engine.data.changefactory.ChangeFactory;
import games.strategy.triplea.Constants;
import games.strategy.triplea.xml.TestMapGameData;
public class ChangeTest {
private GameData gameData;
@Before
public void setUp() throws Exception {
gameData = TestMapGameData.TEST.getGameData();
}
private Change serialize(final Change change) throws Exception {
final ByteArrayOutputStream sink = new ByteArrayOutputStream();
final ObjectOutputStream output = new GameObjectOutputStream(sink);
output.writeObject(change);
output.flush();
// System.out.println("bytes:" + sink.toByteArray().length);
final InputStream source = new ByteArrayInputStream(sink.toByteArray());
final ObjectInputStream input =
new GameObjectInputStream(new games.strategy.engine.framework.GameObjectStreamFactory(gameData), source);
final Change newChange = (Change) input.readObject();
input.close();
output.close();
return newChange;
}
@Test
public void testUnitsAddTerritory() {
// make sure we know where we are starting
final Territory can = gameData.getMap().getTerritory("canada");
assertEquals(5, can.getUnits().getUnitCount());
// add some units
final Change change =
ChangeFactory.addUnits(can, gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF).create(10, null));
gameData.performChange(change);
assertEquals(15, can.getUnits().getUnitCount());
// invert the change
gameData.performChange(change.invert());
assertEquals(5, can.getUnits().getUnitCount());
}
@Test
public void testUnitsRemoveTerritory() {
// make sure we now where we are starting
final Territory can = gameData.getMap().getTerritory("canada");
assertEquals(5, can.getUnits().getUnitCount());
// remove some units
final Collection<Unit> units =
can.getUnits().getUnits(gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF), 3);
final Change change = ChangeFactory.removeUnits(can, units);
gameData.performChange(change);
assertEquals(2, can.getUnits().getUnitCount());
gameData.performChange(change.invert());
assertEquals("last change inverted, should have gained units.", 5,
can.getUnits().getUnitCount());
}
@Test
public void testSerializeUnitsRemoteTerritory() throws Exception {
// make sure we now where we are starting
final Territory can = gameData.getMap().getTerritory("canada");
assertEquals(5, can.getUnits().getUnitCount());
// remove some units
final Collection<Unit> units =
can.getUnits().getUnits(gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF), 3);
Change change = ChangeFactory.removeUnits(can, units);
change = serialize(change);
gameData.performChange(change);
assertEquals(2, can.getUnits().getUnitCount());
// invert the change
gameData.performChange(change.invert());
assertEquals(5, can.getUnits().getUnitCount());
}
@Test
public void testUnitsAddPlayer() {
// make sure we know where we are starting
final PlayerID chretian = gameData.getPlayerList().getPlayerID("chretian");
assertEquals(10, chretian.getUnits().getUnitCount());
// add some units
final Change change =
ChangeFactory.addUnits(chretian,
gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF).create(10, null));
gameData.performChange(change);
assertEquals(20, chretian.getUnits().getUnitCount());
// invert the change
gameData.performChange(change.invert());
assertEquals(10, chretian.getUnits().getUnitCount());
}
@Test
public void testUnitsRemovePlayer() {
// make sure we know where we are starting
final PlayerID chretian = gameData.getPlayerList().getPlayerID("chretian");
assertEquals(10, chretian.getUnits().getUnitCount());
// remove some units
final Collection<Unit> units =
chretian.getUnits().getUnits(gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF), 3);
final Change change = ChangeFactory.removeUnits(chretian, units);
gameData.performChange(change);
assertEquals(chretian.getUnits().getUnitCount(), 7);
// invert the change
gameData.performChange(change.invert());
assertEquals(chretian.getUnits().getUnitCount(), 10);
}
@Test
public void testUnitsMove() {
final Territory canada = gameData.getMap().getTerritory("canada");
final Territory greenland = gameData.getMap().getTerritory("greenland");
assertEquals(canada.getUnits().getUnitCount(), 5);
assertEquals(greenland.getUnits().getUnitCount(), 0);
final Collection<Unit> units =
canada.getUnits().getUnits(gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF), 3);
final Change change = ChangeFactory.moveUnits(canada, greenland, units);
gameData.performChange(change);
assertEquals(canada.getUnits().getUnitCount(), 2);
assertEquals(greenland.getUnits().getUnitCount(), 3);
gameData.performChange(change.invert());
assertEquals(canada.getUnits().getUnitCount(), 5);
assertEquals(greenland.getUnits().getUnitCount(), 0);
}
@Test
public void testUnitsMoveSerialization() throws Exception {
final Territory canada = gameData.getMap().getTerritory("canada");
final Territory greenland = gameData.getMap().getTerritory("greenland");
assertEquals(canada.getUnits().getUnitCount(), 5);
assertEquals(greenland.getUnits().getUnitCount(), 0);
final Collection<Unit> units =
canada.getUnits().getUnits(gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF), 3);
Change change = ChangeFactory.moveUnits(canada, greenland, units);
change = serialize(change);
gameData.performChange(change);
assertEquals(canada.getUnits().getUnitCount(), 2);
assertEquals(greenland.getUnits().getUnitCount(), 3);
gameData.performChange(change.invert());
assertEquals(canada.getUnits().getUnitCount(), 5);
assertEquals(greenland.getUnits().getUnitCount(), 0);
}
@Test
public void testProductionFrontierChange() {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final ProductionFrontier uspf = gameData.getProductionFrontierList().getProductionFrontier("usProd");
final ProductionFrontier canpf = gameData.getProductionFrontierList().getProductionFrontier("canProd");
assertEquals(can.getProductionFrontier(), canpf);
final Change change = ChangeFactory.changeProductionFrontier(can, uspf);
gameData.performChange(change);
assertEquals(can.getProductionFrontier(), uspf);
gameData.performChange(change.invert());
assertEquals(can.getProductionFrontier(), canpf);
}
@Test
public void testChangeResourcesChange() {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final Resource gold = gameData.getResourceList().getResource("gold");
final Change change = ChangeFactory.changeResourcesChange(can, gold, 50);
assertEquals(can.getResources().getQuantity(gold), 100);
gameData.performChange(change);
assertEquals(can.getResources().getQuantity(gold), 150);
gameData.performChange(change.invert());
assertEquals(can.getResources().getQuantity(gold), 100);
}
@Test
public void testSerializeResourceChange() throws Exception {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final Resource gold = gameData.getResourceList().getResource("gold");
Change change = ChangeFactory.changeResourcesChange(can, gold, 50);
change = serialize(change);
assertEquals(can.getResources().getQuantity(gold), 100);
gameData.performChange(change);
assertEquals(can.getResources().getQuantity(gold), 150);
}
@Test
public void testChangeOwner() {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final PlayerID us = gameData.getPlayerList().getPlayerID("bush");
final Territory greenland = gameData.getMap().getTerritory("greenland");
final Change change = ChangeFactory.changeOwner(greenland, us);
assertEquals(greenland.getOwner(), can);
gameData.performChange(change);
assertEquals(greenland.getOwner(), us);
gameData.performChange(change.invert());
assertEquals(greenland.getOwner(), can);
}
@Test
public void testChangeOwnerSerialize() throws Exception {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final PlayerID us = gameData.getPlayerList().getPlayerID("bush");
final Territory greenland = gameData.getMap().getTerritory("greenland");
Change change = ChangeFactory.changeOwner(greenland, us);
change = serialize(change);
assertEquals(greenland.getOwner(), can);
gameData.performChange(change);
assertEquals(greenland.getOwner(), us);
change = change.invert();
change = serialize(change);
gameData.performChange(change);
assertEquals(greenland.getOwner(), can);
}
@Test
public void testPlayerOwnerChange() throws Exception {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final PlayerID us = gameData.getPlayerList().getPlayerID("bush");
final UnitType infantry = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF);
final Unit inf1 = infantry.create(1, can).iterator().next();
final Unit inf2 = infantry.create(1, us).iterator().next();
final Collection<Unit> units = new ArrayList<>();
units.add(inf1);
units.add(inf2);
assertEquals(can, inf1.getOwner());
assertEquals(us, inf2.getOwner());
Change change = ChangeFactory.changeOwner(units, can, gameData.getMap().getTerritory("greenland"));
gameData.performChange(change);
assertEquals(can, inf1.getOwner());
assertEquals(can, inf2.getOwner());
change = change.invert();
gameData.performChange(change);
assertEquals(can, inf1.getOwner());
assertEquals(us, inf2.getOwner());
}
@Test
public void testPlayerOwnerChangeSerialize() throws Exception {
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
final PlayerID us = gameData.getPlayerList().getPlayerID("bush");
final UnitType infantry = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_INF);
final Unit inf1 = infantry.create(1, can).iterator().next();
final Unit inf2 = infantry.create(1, us).iterator().next();
final Collection<Unit> units = new ArrayList<>();
units.add(inf1);
units.add(inf2);
assertEquals(can, inf1.getOwner());
assertEquals(us, inf2.getOwner());
Change change = ChangeFactory.changeOwner(units, can, gameData.getMap().getTerritory("greenland"));
change = serialize(change);
gameData.performChange(change);
assertEquals(can, inf1.getOwner());
assertEquals(can, inf2.getOwner());
change = change.invert();
change = serialize(change);
gameData.performChange(change);
assertEquals(can, inf1.getOwner());
assertEquals(us, inf2.getOwner());
}
@Test
public void testChangeProductionFrontier() throws Exception {
final ProductionFrontier usProd = gameData.getProductionFrontierList().getProductionFrontier("usProd");
final ProductionFrontier canProd = gameData.getProductionFrontierList().getProductionFrontier("canProd");
final PlayerID can = gameData.getPlayerList().getPlayerID("chretian");
assertEquals(can.getProductionFrontier(), canProd);
Change prodChange = ChangeFactory.changeProductionFrontier(can, usProd);
gameData.performChange(prodChange);
assertEquals(can.getProductionFrontier(), usProd);
prodChange = prodChange.invert();
gameData.performChange(prodChange);
assertEquals(can.getProductionFrontier(), canProd);
prodChange = serialize(prodChange.invert());
gameData.performChange(prodChange);
assertEquals(can.getProductionFrontier(), usProd);
prodChange = serialize(prodChange.invert());
gameData.performChange(prodChange);
assertEquals(can.getProductionFrontier(), canProd);
}
@Test
public void testBlank() {
final CompositeChange compositeChange = new CompositeChange();
assertTrue(compositeChange.isEmpty());
compositeChange.add(new CompositeChange());
assertTrue(compositeChange.isEmpty());
final Territory can = gameData.getMap().getTerritory("canada");
final Collection<Unit> units = Collections.emptyList();
compositeChange.add(ChangeFactory.removeUnits(can, units));
assertFalse(compositeChange.isEmpty());
}
}