package games.strategy.triplea.delegate; import static org.junit.Assert.assertEquals; import java.util.ArrayList; import java.util.Collection; import java.util.Iterator; import java.util.List; import org.junit.Before; import org.junit.Test; import games.strategy.engine.data.ITestDelegateBridge; import games.strategy.engine.data.PlayerID; import games.strategy.engine.data.Route; import games.strategy.engine.data.Territory; import games.strategy.engine.data.TerritoryEffect; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; import games.strategy.engine.random.ScriptedRandomSource; import games.strategy.triplea.Constants; import games.strategy.triplea.xml.TestMapGameData; import games.strategy.util.IntegerMap; // public class PacificTest extends TestCase public class PacificTest extends DelegateTest { UnitType armor; UnitType artillery; UnitType marine; UnitType sub; UnitType destroyer; UnitType battleship; // Define players PlayerID americans; PlayerID chinese; // Define territories Territory queensland; Territory unitedStates; Territory newBritain; Territory midway; Territory mariana; Territory bonin; // Define Sea Zones Territory sz4; Territory sz5; Territory sz7; Territory sz8; Territory sz10; Territory sz16; Territory sz20; Territory sz24; Territory sz25; Territory sz27; ITestDelegateBridge bridge; MoveDelegate delegate; @Override @Before public void setUp() throws Exception { super.setUp(); gameData = TestMapGameData.PACIFIC_INCOMPLETE.getGameData(); // Define units infantry = GameDataTestUtil.infantry(gameData); armor = GameDataTestUtil.armour(gameData); artillery = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_ARTILLERY); marine = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_MARINE); fighter = GameDataTestUtil.fighter(gameData); bomber = GameDataTestUtil.bomber(gameData); sub = GameDataTestUtil.submarine(gameData); destroyer = GameDataTestUtil.destroyer(gameData); carrier = GameDataTestUtil.carrier(gameData); battleship = GameDataTestUtil.battleship(gameData); transport = GameDataTestUtil.transport(gameData); // Define players americans = GameDataTestUtil.americans(gameData); chinese = GameDataTestUtil.chinese(gameData); british = GameDataTestUtil.british(gameData); japanese = GameDataTestUtil.japanese(gameData); // Define territories queensland = gameData.getMap().getTerritory("Queensland"); japan = gameData.getMap().getTerritory("Japan"); unitedStates = gameData.getMap().getTerritory("United States"); newBritain = gameData.getMap().getTerritory("New Britain"); midway = gameData.getMap().getTerritory("Midway"); mariana = gameData.getMap().getTerritory("Mariana"); bonin = gameData.getMap().getTerritory("Bonin"); // Define Sea Zones sz4 = gameData.getMap().getTerritory("4 Sea Zone"); sz5 = gameData.getMap().getTerritory("5 Sea Zone"); sz7 = gameData.getMap().getTerritory("7 Sea Zone"); sz8 = gameData.getMap().getTerritory("8 Sea Zone"); sz10 = gameData.getMap().getTerritory("10 Sea Zone"); sz16 = gameData.getMap().getTerritory("16 Sea Zone"); sz20 = gameData.getMap().getTerritory("20 Sea Zone"); sz24 = gameData.getMap().getTerritory("24 Sea Zone"); sz25 = gameData.getMap().getTerritory("25 Sea Zone"); sz27 = gameData.getMap().getTerritory("27 Sea Zone"); bridge = getDelegateBridge(americans); bridge.setStepName("japaneseCombatMove"); delegate = new MoveDelegate(); delegate.initialize("MoveDelegate", "MoveDelegate"); delegate.setDelegateBridgeAndPlayer(bridge); delegate.start(); } private Collection<Unit> getUnits(final IntegerMap<UnitType> units, final Territory from) { final Iterator<UnitType> iter = units.keySet().iterator(); final Collection<Unit> rVal = new ArrayList<>(units.totalValues()); while (iter.hasNext()) { final UnitType type = iter.next(); rVal.addAll(from.getUnits().getUnits(type, units.getInt(type))); } return rVal; } @Override protected ITestDelegateBridge getDelegateBridge(final PlayerID player) { return GameDataTestUtil.getDelegateBridge(player, gameData); } @Test public void testNonJapanAttack() { // this will get us to round 2 bridge.setStepName("japaneseEndTurn"); bridge.setStepName("japaneseBattle"); // Defending US infantry hit on a 2 (0 base) final List<Unit> infantryUS = infantry.create(1, americans); final Collection<TerritoryEffect> territoryEffects = TerritoryEffectHelper.getEffects(queensland); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); DiceRoll roll = DiceRoll.rollDice(infantryUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); // Defending US marines hit on a 2 (0 base) final List<Unit> marineUS = marine.create(1, americans); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); roll = DiceRoll.rollDice(marineUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); // Chinese units // Defending Chinese infantry hit on a 2 (0 base) final List<Unit> infantryChina = infantry.create(1, chinese); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); roll = DiceRoll.rollDice(infantryChina, true, chinese, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); } @Test public void testJapanAttackFirstRound() { bridge.setStepName("japaneseBattle"); while (!gameData.getSequence().getStep().getName().equals("japaneseBattle")) { gameData.getSequence().next(); } // >>> After patch normal to-hits will miss <<< // Defending US infantry miss on a 2 (0 base) final List<Unit> infantryUS = infantry.create(1, americans); final Collection<TerritoryEffect> territoryEffects = TerritoryEffectHelper.getEffects(queensland); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); DiceRoll roll = DiceRoll.rollDice(infantryUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(0, roll.getHits()); // Defending US marines miss on a 2 (0 base) final List<Unit> marineUS = marine.create(1, americans); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); roll = DiceRoll.rollDice(marineUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(0, roll.getHits()); // Chinese units // Defending Chinese infantry still hit on a 2 (0 base) final List<Unit> infantryChina = infantry.create(1, chinese); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); roll = DiceRoll.rollDice(infantryChina, true, chinese, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); // Defending US infantry hit on a 1 (0 base) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); roll = DiceRoll.rollDice(infantryUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); // Defending US marines hit on a 1 (0 base) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); roll = DiceRoll.rollDice(marineUS, true, americans, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); // Chinese units // Defending Chinese infantry still hit on a 2 (0 base) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); roll = DiceRoll.rollDice(infantryChina, true, chinese, bridge, new MockBattle(queensland), "", territoryEffects, null); assertEquals(1, roll.getHits()); } @Test public void testCanLand2Airfields() { bridge.setStepName("americanCombatMove"); final Route route = new Route(); route.setStart(unitedStates); route.add(sz5); route.add(sz4); route.add(sz10); route.add(sz16); route.add(sz27); route.add(newBritain); final IntegerMap<UnitType> map = new IntegerMap<>(); map.put(fighter, 1); final String results = delegate.move(getUnits(map, route.getStart()), route); assertValid(results); } @Test public void testCanLand1AirfieldStart() { bridge.setStepName("americanCombatMove"); final Route route = new Route(); route.setStart(unitedStates); route.add(sz5); route.add(sz7); route.add(sz8); route.add(sz20); route.add(midway); final IntegerMap<UnitType> map = new IntegerMap<>(); map.put(fighter, 1); final String results = delegate.move(getUnits(map, route.getStart()), route); assertValid(results); // assertError( results); } @Test public void testCanLand1AirfieldEnd() { bridge.setStepName("americanCombatMove"); final Route route = new Route(); route.setStart(unitedStates); route.add(sz5); route.add(sz7); route.add(sz8); route.add(sz20); route.add(midway); final IntegerMap<UnitType> map = new IntegerMap<>(); map.put(fighter, 1); final String results = delegate.move(getUnits(map, route.getStart()), route); assertValid(results); } @Test public void testCanMoveNavalBase() { bridge.setStepName("americanNonCombatMove"); final Route route = new Route(); route.setStart(sz5); route.add(sz7); route.add(sz8); route.add(sz20); final IntegerMap<UnitType> map = new IntegerMap<>(); map.put(fighter, 1); final String results = delegate.move(getUnits(map, route.getStart()), route); assertValid(results); } @Test public void testJapaneseDestroyerTransport() { bridge = getDelegateBridge(japanese); delegate = new MoveDelegate(); delegate.initialize("MoveDelegate", "MoveDelegate"); delegate.setDelegateBridgeAndPlayer(bridge); bridge.setStepName("japaneseNonCombatMove"); delegate.start(); final IntegerMap<UnitType> map = new IntegerMap<>(); map.put(infantry, 1); final Route route = new Route(); route.setStart(bonin); // movement to force boarding route.add(sz24); // verify unit counts before move assertEquals(2, bonin.getUnits().size()); assertEquals(1, sz24.getUnits().size()); // validate movement final String results = delegate.move(getUnits(map, route.getStart()), route, route.getEnd().getUnits().getUnits()); assertValid(results); // verify unit counts after move assertEquals(1, bonin.getUnits().size()); assertEquals(2, sz24.getUnits().size()); } }