package games.strategy.triplea.delegate; import static games.strategy.triplea.delegate.GameDataTestUtil.addTo; import static games.strategy.triplea.delegate.GameDataTestUtil.battleDelegate; import static games.strategy.triplea.delegate.GameDataTestUtil.battleship; import static games.strategy.triplea.delegate.GameDataTestUtil.carrier; import static games.strategy.triplea.delegate.GameDataTestUtil.fighter; import static games.strategy.triplea.delegate.GameDataTestUtil.germans; import static games.strategy.triplea.delegate.GameDataTestUtil.italians; import static games.strategy.triplea.delegate.GameDataTestUtil.move; import static games.strategy.triplea.delegate.GameDataTestUtil.moveDelegate; import static games.strategy.triplea.delegate.GameDataTestUtil.removeFrom; import static games.strategy.triplea.delegate.GameDataTestUtil.russians; import static games.strategy.triplea.delegate.GameDataTestUtil.territory; import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertNotNull; import static org.mockito.ArgumentMatchers.any; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; import java.util.List; 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.Route; import games.strategy.engine.data.Territory; import games.strategy.engine.data.Unit; import games.strategy.triplea.player.ITripleAPlayer; import games.strategy.triplea.xml.TestMapGameData; public class WW2V3_42_Test { private GameData gameData; @Before public void setUp() throws Exception { gameData = TestMapGameData.WW2V3_1942.getGameData(); } private ITestDelegateBridge getDelegateBridge(final PlayerID player) { return GameDataTestUtil.getDelegateBridge(player, gameData); } @Test public void testTransportAttack() { final Territory sz13 = gameData.getMap().getTerritory("13 Sea Zone"); final Territory sz12 = gameData.getMap().getTerritory("12 Sea Zone"); final PlayerID germans = germans(gameData); final MoveDelegate moveDelegate = (MoveDelegate) gameData.getDelegateList().getDelegate("move"); final ITestDelegateBridge bridge = getDelegateBridge(germans); bridge.setStepName("CombatMove"); moveDelegate(gameData).setDelegateBridgeAndPlayer(bridge); moveDelegate(gameData).start(); final Route sz13To12 = new Route(); sz13To12.setStart(sz13); sz13To12.add(sz12); final List<Unit> transports = sz13.getUnits().getMatches(Matches.UnitIsTransport); assertEquals(1, transports.size()); final String error = moveDelegate.move(transports, sz13To12); assertEquals(error, null); } @Test public void testBombAndAttackEmptyTerritory() { final Territory karrelia = territory("Karelia S.S.R.", gameData); final Territory baltic = territory("Baltic States", gameData); final Territory sz5 = territory("5 Sea Zone", gameData); final Territory germany = territory("Germany", gameData); final PlayerID germans = germans(gameData); final MoveDelegate moveDelegate = (MoveDelegate) gameData.getDelegateList().getDelegate("move"); final ITestDelegateBridge bridge = getDelegateBridge(germans); bridge.setStepName("CombatMove"); moveDelegate.setDelegateBridgeAndPlayer(bridge); moveDelegate.start(); final ITripleAPlayer dummyPlayer = mock(ITripleAPlayer.class); when(dummyPlayer.shouldBomberBomb(any())).thenReturn(true); bridge.setRemote(dummyPlayer); // remove the russian units removeFrom(karrelia, karrelia.getUnits().getMatches(Matches.UnitCanBeDamaged.invert())); // move the bomber to attack move(germany.getUnits().getMatches(Matches.UnitIsStrategicBomber), new Route(germany, sz5, karrelia)); // move an infantry to invade move(baltic.getUnits().getMatches(Matches.UnitIsInfantry), new Route(baltic, karrelia)); final BattleTracker battleTracker = MoveDelegate.getBattleTracker(gameData); // we should have a pending land battle, and a pending bombing raid assertNotNull(battleTracker.getPendingBattle(karrelia, false, null)); assertNotNull(battleTracker.getPendingBattle(karrelia, true, null)); // the territory should not be conquered assertEquals(karrelia.getOwner(), russians(gameData)); } @Test public void testLingeringSeaUnitsJoinBattle() throws Exception { final Territory sz5 = territory("5 Sea Zone", gameData); final Territory sz6 = territory("6 Sea Zone", gameData); final Territory sz7 = territory("7 Sea Zone", gameData); // add a russian battlship addTo(sz5, battleship(gameData).create(1, russians(gameData))); final ITestDelegateBridge bridge = getDelegateBridge(germans(gameData)); bridge.setStepName("CombatMove"); moveDelegate(gameData).setDelegateBridgeAndPlayer(bridge); moveDelegate(gameData).start(); // attack with a german sub move(sz7.getUnits().getUnits(), new Route(sz7, sz6, sz5)); moveDelegate(gameData).end(); // adding of lingering units was moved from end of combat-move phase, to start of battle phase battleDelegate(gameData).setDelegateBridgeAndPlayer(bridge); BattleDelegate.doInitialize(battleDelegate(gameData).getBattleTracker(), bridge); // all units in sz5 should be involved in the battle final MustFightBattle mfb = (MustFightBattle) MoveDelegate.getBattleTracker(gameData).getPendingBattle(sz5, false, null); assertEquals(5, mfb.getAttackingUnits().size()); } @Test public void testLingeringFightersAndALliedUnitsJoinBattle() throws Exception { final Territory sz5 = territory("5 Sea Zone", gameData); final Territory sz6 = territory("6 Sea Zone", gameData); final Territory sz7 = territory("7 Sea Zone", gameData); // add a russian battlship addTo(sz5, battleship(gameData).create(1, russians(gameData))); // add an allied carrier and a fighter addTo(sz5, carrier(gameData).create(1, italians(gameData))); addTo(sz5, fighter(gameData).create(1, germans(gameData))); final ITestDelegateBridge bridge = getDelegateBridge(germans(gameData)); bridge.setStepName("CombatMove"); moveDelegate(gameData).setDelegateBridgeAndPlayer(bridge); moveDelegate(gameData).start(); // attack with a german sub move(sz7.getUnits().getUnits(), new Route(sz7, sz6, sz5)); moveDelegate(gameData).end(); // adding of lingering units was moved from end of combat-move phase, to start of battle phase battleDelegate(gameData).setDelegateBridgeAndPlayer(bridge); BattleDelegate.doInitialize(battleDelegate(gameData).getBattleTracker(), bridge); // all units in sz5 should be involved in the battle // except the italian carrier final MustFightBattle mfb = (MustFightBattle) MoveDelegate.getBattleTracker(gameData).getPendingBattle(sz5, false, null); assertEquals(6, mfb.getAttackingUnits().size()); } @Test public void testLingeringSeaUnitsCanMoveAwayFromBattle() throws Exception { final Territory sz5 = territory("5 Sea Zone", gameData); final Territory sz6 = territory("6 Sea Zone", gameData); final Territory sz7 = territory("7 Sea Zone", gameData); // add a russian battlship addTo(sz5, battleship(gameData).create(1, russians(gameData))); final ITestDelegateBridge bridge = getDelegateBridge(germans(gameData)); bridge.setStepName("CombatMove"); moveDelegate(gameData).setDelegateBridgeAndPlayer(bridge); moveDelegate(gameData).start(); // attack with a german sub move(sz7.getUnits().getUnits(), new Route(sz7, sz6, sz5)); // move the transport away move(sz5.getUnits().getMatches(Matches.UnitIsTransport), new Route(sz5, sz6)); moveDelegate(gameData).end(); // adding of lingering units was moved from end of combat-move phase, to start of battle phase battleDelegate(gameData).setDelegateBridgeAndPlayer(bridge); BattleDelegate.doInitialize(battleDelegate(gameData).getBattleTracker(), bridge); // all units in sz5 should be involved in the battle final MustFightBattle mfb = (MustFightBattle) MoveDelegate.getBattleTracker(gameData).getPendingBattle(sz5, false, null); assertEquals(4, mfb.getAttackingUnits().size()); } }