package games.strategy.triplea.delegate;
import static org.mockito.Mockito.times;
import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
import java.util.Collections;
import java.util.List;
import java.util.function.BiFunction;
import org.junit.Before;
import org.junit.Test;
import org.junit.runner.RunWith;
import org.mockito.Mock;
import org.mockito.junit.MockitoJUnitRunner;
import games.strategy.engine.data.GameData;
import games.strategy.engine.data.PlayerID;
import games.strategy.engine.data.RelationshipTracker;
import games.strategy.engine.data.Route;
import games.strategy.engine.data.Territory;
import games.strategy.engine.data.Unit;
import games.strategy.engine.data.UnitType;
import games.strategy.engine.data.properties.GameProperties;
import games.strategy.engine.delegate.IDelegateBridge;
import games.strategy.triplea.Constants;
import games.strategy.triplea.TripleAUnit;
@RunWith(MockitoJUnitRunner.class)
public class BattleTrackerTest {
@Mock
private IDelegateBridge mockDelegateBridge;
@Mock
private GameData mockGameData;
@Mock
private GameProperties mockGameProperties;
@Mock
private RelationshipTracker mockRelationshipTracker;
@Mock
private BiFunction<Territory, IBattle.BattleType, IBattle> mockGetBattleFunction;
@Mock
private IBattle mockBattle;
private BattleTracker testObj;
@Before
public void setup() {
testObj = new BattleTracker();
}
@Test
public void verifyRaidsWithNoBattles() {
testObj.fightAirRaidsAndStrategicBombing(mockDelegateBridge);
}
@Test
public void verifyRaids() {
Territory territory = new Territory("terrName", mockGameData);
final Route route = new Route(territory);
PlayerID playerId = new PlayerID("name", mockGameData);
// need at least one attacker for there to be considered a battle.
Unit unit = new TripleAUnit(new UnitType("unit", mockGameData), playerId, mockGameData);
final List<Unit> attackers = Collections.singletonList(unit);
when(mockDelegateBridge.getData()).thenReturn(mockGameData);
when(mockGameData.getProperties()).thenReturn(mockGameProperties);
when(mockGameData.getRelationshipTracker()).thenReturn(mockRelationshipTracker);
when(mockGameProperties.get(Constants.RAIDS_MAY_BE_PRECEEDED_BY_AIR_BATTLES, false))
.thenReturn(true);
when(mockGetBattleFunction.apply(territory, IBattle.BattleType.BOMBING_RAID)).thenReturn(mockBattle);
// set up the testObj to have the bombing battle
testObj.addBombingBattle(route, attackers, playerId, mockDelegateBridge, null, null);
testObj.fightAirRaidsAndStrategicBombing(mockDelegateBridge, () -> Collections.singleton(territory),
mockGetBattleFunction);
verify(mockBattle, times(1)).fight(mockDelegateBridge);
}
}