package games.strategy.triplea.delegate; import static games.strategy.triplea.delegate.GameDataTestUtil.bomber; import static games.strategy.triplea.delegate.GameDataTestUtil.british; import static org.hamcrest.Matchers.is; import static org.junit.Assert.assertThat; import java.util.Collection; import java.util.Collections; 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.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.TripleAUnit; import games.strategy.triplea.attachments.TechAttachment; import games.strategy.triplea.attachments.UnitAttachment; import games.strategy.triplea.delegate.Die.DieType; import games.strategy.triplea.xml.TestMapGameData; import games.strategy.util.Match; public class DiceRollTest { private GameData gameData; @Before public void setUp() throws Exception { gameData = TestMapGameData.LHTR.getGameData(); } private ITestDelegateBridge getDelegateBridge(final PlayerID player) { return GameDataTestUtil.getDelegateBridge(player, gameData); } @Test public void testSimple() { final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final MockBattle battle = new MockBattle(westRussia); final PlayerID russians = GameDataTestUtil.russians(gameData); final ITestDelegateBridge bridge = getDelegateBridge(russians); final UnitType infantryType = GameDataTestUtil.infantry(gameData); final List<Unit> infantry = infantryType.create(1, russians); final Collection<TerritoryEffect> territoryEffects = TerritoryEffectHelper.getEffects(westRussia); // infantry defends and hits at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll roll = DiceRoll.rollDice(infantry, true, russians, bridge, battle, "", territoryEffects, null); assertThat(roll.getHits(), is(1)); // infantry does not hit at 2 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {2})); final DiceRoll roll2 = DiceRoll.rollDice(infantry, true, russians, bridge, battle, "", territoryEffects, null); assertThat(roll2.getHits(), is(0)); // infantry attacks and hits at 0 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); final DiceRoll roll3 = DiceRoll.rollDice(infantry, false, russians, bridge, battle, "", territoryEffects, null); assertThat(roll3.getHits(), is(1)); // infantry attack does not hit at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll roll4 = DiceRoll.rollDice(infantry, false, russians, bridge, battle, "", territoryEffects, null); assertThat(roll4.getHits(), is(0)); } @Test public void testSimpleLowLuck() { GameDataTestUtil.makeGameLowLuck(gameData); final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final MockBattle battle = new MockBattle(westRussia); final PlayerID russians = GameDataTestUtil.russians(gameData); final ITestDelegateBridge bridge = getDelegateBridge(russians); final UnitType infantryType = GameDataTestUtil.infantry(gameData); final List<Unit> infantry = infantryType.create(1, russians); final Collection<TerritoryEffect> territoryEffects = TerritoryEffectHelper.getEffects(westRussia); // infantry defends and hits at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll roll = DiceRoll.rollDice(infantry, true, russians, bridge, battle, "", territoryEffects, null); assertThat(roll.getHits(), is(1)); // infantry does not hit at 2 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {2})); final DiceRoll roll2 = DiceRoll.rollDice(infantry, true, russians, bridge, battle, "", territoryEffects, null); assertThat(roll2.getHits(), is(0)); // infantry attacks and hits at 0 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); final DiceRoll roll3 = DiceRoll.rollDice(infantry, false, russians, bridge, battle, "", territoryEffects, null); assertThat(roll3.getHits(), is(1)); // infantry attack does not hit at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll roll4 = DiceRoll.rollDice(infantry, false, russians, bridge, battle, "", territoryEffects, null); assertThat(roll4.getHits(), is(0)); } @Test public void testArtillerySupport() { final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final MockBattle battle = new MockBattle(westRussia); final PlayerID russians = GameDataTestUtil.russians(gameData); final ITestDelegateBridge bridge = getDelegateBridge(russians); final UnitType infantryType = GameDataTestUtil.infantry(gameData); final List<Unit> units = infantryType.create(1, russians); final UnitType artillery = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_ARTILLERY); units.addAll(artillery.create(1, russians)); // artillery supported infantry and art attack at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1, 1})); final DiceRoll roll = DiceRoll.rollDice(units, false, russians, bridge, battle, "", TerritoryEffectHelper.getEffects(westRussia), null); assertThat(roll.getHits(), is(2)); } @Test public void testVariableArtillerySupport() { final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final MockBattle battle = new MockBattle(westRussia); final PlayerID russians = GameDataTestUtil.russians(gameData); final ITestDelegateBridge bridge = getDelegateBridge(russians); // Add 1 artillery final UnitType artillery = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_ARTILLERY); final List<Unit> units = artillery.create(1, russians); // Set the supported unit count for (final Unit unit : units) { final UnitAttachment ua = UnitAttachment.get(unit.getType()); ua.setUnitSupportCount("2"); } // Now add the infantry final UnitType infantryType = GameDataTestUtil.infantry(gameData); units.addAll(infantryType.create(2, russians)); // artillery supported infantry and art attack at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1, 1, 1})); final DiceRoll roll = DiceRoll.rollDice(units, false, russians, bridge, battle, "", TerritoryEffectHelper.getEffects(westRussia), null); assertThat(roll.getHits(), is(3)); } @Test public void testLowLuck() { GameDataTestUtil.makeGameLowLuck(gameData); final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final MockBattle battle = new MockBattle(westRussia); final PlayerID russians = GameDataTestUtil.russians(gameData); final ITestDelegateBridge bridge = getDelegateBridge(russians); final UnitType infantryType = GameDataTestUtil.infantry(gameData); final List<Unit> units = infantryType.create(3, russians); // 3 infantry on defense should produce exactly one hit, without rolling the dice bridge.setRandomSource(new ScriptedRandomSource(new int[] {ScriptedRandomSource.ERROR})); final DiceRoll roll = DiceRoll.rollDice(units, true, russians, bridge, battle, "", TerritoryEffectHelper.getEffects(westRussia), null); assertThat(roll.getHits(), is(1)); } @Test public void testSerialize() throws Exception { for (int i = 0; i < 254; i++) { for (int j = 0; j < 254; j++) { final Die hit = new Die(i, j, DieType.MISS); assertThat(hit, is(Die.getFromWriteValue(hit.getCompressedValue()))); final Die notHit = new Die(i, j, DieType.HIT); assertThat(notHit, is(Die.getFromWriteValue(notHit.getCompressedValue()))); final Die ignored = new Die(i, j, DieType.IGNORED); assertThat(ignored, is(Die.getFromWriteValue(ignored.getCompressedValue()))); } } } @Test public void testMarineAttackPlus1() throws Exception { gameData = TestMapGameData.IRON_BLITZ.getGameData(); final Territory algeria = gameData.getMap().getTerritory("Algeria"); final PlayerID americans = GameDataTestUtil.americans(gameData); final UnitType marine = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_MARINE); final List<Unit> attackers = marine.create(1, americans); final ITestDelegateBridge bridge = getDelegateBridge(americans); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final MockBattle battle = new MockBattle(algeria); battle.setAmphibiousLandAttackers(attackers); battle.setIsAmphibious(true); final DiceRoll roll = DiceRoll.rollDice(attackers, false, americans, bridge, battle, "", TerritoryEffectHelper.getEffects(algeria), null); assertThat(roll.getHits(), is(1)); } @Test public void testMarineAttackPlus1LowLuck() throws Exception { gameData = TestMapGameData.IRON_BLITZ.getGameData(); GameDataTestUtil.makeGameLowLuck(gameData); final Territory algeria = gameData.getMap().getTerritory("Algeria"); final PlayerID americans = GameDataTestUtil.americans(gameData); final UnitType marine = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_MARINE); final List<Unit> attackers = marine.create(3, americans); final ITestDelegateBridge bridge = getDelegateBridge(americans); bridge.setRandomSource(new ScriptedRandomSource(new int[] {ScriptedRandomSource.ERROR})); final MockBattle battle = new MockBattle(algeria); battle.setAmphibiousLandAttackers(attackers); battle.setIsAmphibious(true); final DiceRoll roll = DiceRoll.rollDice(attackers, false, americans, bridge, battle, "", TerritoryEffectHelper.getEffects(algeria), null); assertThat(roll.getHits(), is(1)); } @Test public void testMarineAttacNormalIfNotAmphibious() throws Exception { gameData = TestMapGameData.IRON_BLITZ.getGameData(); final Territory algeria = gameData.getMap().getTerritory("Algeria"); final PlayerID americans = GameDataTestUtil.americans(gameData); final UnitType marine = gameData.getUnitTypeList().getUnitType(Constants.UNIT_TYPE_MARINE); final List<Unit> attackers = marine.create(1, americans); final ITestDelegateBridge bridge = getDelegateBridge(americans); bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final MockBattle battle = new MockBattle(algeria); battle.setAmphibiousLandAttackers(Collections.<Unit>emptyList()); battle.setIsAmphibious(true); final DiceRoll roll = DiceRoll.rollDice(attackers, false, americans, bridge, battle, "", TerritoryEffectHelper.getEffects(algeria), null); assertThat(roll.getHits(), is(0)); } @Test public void testAA() { final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final PlayerID russians = GameDataTestUtil.russians(gameData); final PlayerID germans = GameDataTestUtil.germans(gameData); final UnitType aaGunType = GameDataTestUtil.aaGun(gameData); final List<Unit> aaGunList = aaGunType.create(1, germans); GameDataTestUtil.addTo(westRussia, aaGunList); final ITestDelegateBridge bridge = getDelegateBridge(russians); final List<Unit> bombers = bomber(gameData).create(1, british(gameData)); // aa hits at 0 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); final DiceRoll hit = DiceRoll.rollAA(bomber(gameData).create(1, british(gameData)), aaGunList, bridge, westRussia, true); assertThat(hit.getHits(), is(1)); // aa missses at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll miss = DiceRoll.rollAA(bombers, aaGunList, bridge, westRussia, true); assertThat(miss.getHits(), is(0)); } @Test public void testAALowLuck() { GameDataTestUtil.makeGameLowLuck(gameData); final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final PlayerID russians = GameDataTestUtil.russians(gameData); final PlayerID germans = GameDataTestUtil.germans(gameData); final UnitType aaGunType = GameDataTestUtil.aaGun(gameData); final List<Unit> aaGunList = aaGunType.create(1, germans); GameDataTestUtil.addTo(westRussia, aaGunList); final UnitType fighterType = GameDataTestUtil.fighter(gameData); List<Unit> fighterList = fighterType.create(1, russians); final ITestDelegateBridge bridge = getDelegateBridge(russians); // aa hits at 0 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {0})); final DiceRoll hit = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, westRussia, true); assertThat(hit.getHits(), is(1)); // aa missses at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll miss = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, westRussia, true); assertThat(miss.getHits(), is(0)); // 6 bombers, 1 should hit, and nothing should be rolled bridge.setRandomSource(new ScriptedRandomSource(new int[] {ScriptedRandomSource.ERROR})); fighterList = fighterType.create(6, russians); final DiceRoll hitNoRoll = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, westRussia, true); assertThat(hitNoRoll.getHits(), is(1)); } @Test public void testAALowLuckDifferentMovement() { GameDataTestUtil.makeGameLowLuck(gameData); final Territory westRussia = gameData.getMap().getTerritory("West Russia"); final PlayerID russians = GameDataTestUtil.russians(gameData); final PlayerID germans = GameDataTestUtil.germans(gameData); final UnitType aaGunType = GameDataTestUtil.aaGun(gameData); final List<Unit> aaGunList = aaGunType.create(1, germans); GameDataTestUtil.addTo(westRussia, aaGunList); final UnitType fighterType = GameDataTestUtil.fighter(gameData); final List<Unit> fighterList = fighterType.create(6, russians); TripleAUnit.get(fighterList.get(0)).setAlreadyMoved(1); final ITestDelegateBridge bridge = getDelegateBridge(russians); // aa hits at 0 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {ScriptedRandomSource.ERROR})); final DiceRoll hit = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, westRussia, true); assertThat(hit.getHits(), is(1)); } @Test public void testAALowLuckWithRadar() throws Exception { gameData = TestMapGameData.WW2V3_1941.getGameData(); GameDataTestUtil.makeGameLowLuck(gameData); final Territory finnland = gameData.getMap().getTerritory("Finland"); final PlayerID russians = GameDataTestUtil.russians(gameData); final PlayerID germans = GameDataTestUtil.germans(gameData); final UnitType aaGunType = GameDataTestUtil.aaGun(gameData); final List<Unit> aaGunList = aaGunType.create(1, germans); GameDataTestUtil.addTo(finnland, aaGunList); final UnitType fighterType = GameDataTestUtil.fighter(gameData); List<Unit> fighterList = fighterType.create(1, russians); TechAttachment.get(germans).setAARadar("true"); final ITestDelegateBridge bridge = getDelegateBridge(russians); // aa radar hits at 1 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {1})); final DiceRoll hit = DiceRoll .rollAA( Match.getMatches(fighterList, Matches.unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, finnland, true); assertThat(hit.getHits(), is(1)); // aa missses at 2 (0 based) bridge.setRandomSource(new ScriptedRandomSource(new int[] {2})); final DiceRoll miss = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, finnland, true); assertThat(miss.getHits(), is(0)); // 6 bombers, 2 should hit, and nothing should be rolled bridge.setRandomSource(new ScriptedRandomSource(new int[] {ScriptedRandomSource.ERROR})); fighterList = fighterType.create(6, russians); final DiceRoll hitNoRoll = DiceRoll .rollAA( Match.getMatches(fighterList, Matches .unitIsOfTypes( UnitAttachment.get(aaGunList.iterator().next().getType()).getTargetsAA(gameData))), aaGunList, bridge, finnland, true); assertThat(hitNoRoll.getHits(), is(2)); } @Test public void testHeavyBombers() throws Exception { gameData = TestMapGameData.IRON_BLITZ.getGameData(); final PlayerID british = GameDataTestUtil.british(gameData); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {2, 3})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, false, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(4).get(0).getType(), is(Die.DieType.HIT)); assertThat(dice.getRolls(4).get(1).getType(), is(Die.DieType.HIT)); } @Test public void testHeavyBombersDefend() throws Exception { gameData = TestMapGameData.IRON_BLITZ.getGameData(); final PlayerID british = GameDataTestUtil.british(gameData); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {0, 1})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, true, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(1).size(), is(1)); assertThat(dice.getRolls(1).get(0).getType(), is(Die.DieType.HIT)); } @Test public void testLHTRBomberDefend() { final PlayerID british = GameDataTestUtil.british(gameData); gameData.getProperties().set(Constants.LHTR_HEAVY_BOMBERS, true); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {0, 1})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, true, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(1).size(), is(1)); assertThat(dice.getRolls(1).get(0).getType(), is(Die.DieType.HIT)); } @Test public void testHeavyBombersLHTR() { gameData.getProperties().set(Constants.LHTR_HEAVY_BOMBERS, Boolean.TRUE); final PlayerID british = GameDataTestUtil.british(gameData); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {2, 3})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, false, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(4).get(0).getType(), is(Die.DieType.HIT)); assertThat(dice.getRolls(4).get(1).getType(), is(Die.DieType.IGNORED)); assertThat(dice.getHits(), is(1)); } @Test public void testHeavyBombersLHTR2() { gameData.getProperties().set(Constants.LHTR_HEAVY_BOMBERS, Boolean.TRUE); final PlayerID british = GameDataTestUtil.british(gameData); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {3, 2})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, false, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(4).get(0).getType(), is(Die.DieType.HIT)); assertThat(dice.getRolls(4).get(1).getType(), is(Die.DieType.IGNORED)); assertThat(dice.getHits(), is(1)); } @Test public void testHeavyBombersDefendLHTR() { gameData.getProperties().set(Constants.LHTR_HEAVY_BOMBERS, Boolean.TRUE); final PlayerID british = GameDataTestUtil.british(gameData); final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); final List<Unit> bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber); testDelegateBridge.setRandomSource(new ScriptedRandomSource(new int[] {0, 1})); final Territory germany = gameData.getMap().getTerritory("Germany"); final DiceRoll dice = DiceRoll.rollDice(bombers, true, british, testDelegateBridge, new MockBattle(germany), "", TerritoryEffectHelper.getEffects(germany), null); assertThat(dice.getRolls(1).size(), is(2)); assertThat(dice.getHits(), is(1)); assertThat(dice.getRolls(1).get(0).getType(), is(Die.DieType.HIT)); assertThat(dice.getRolls(1).get(1).getType(), is(Die.DieType.IGNORED)); } @Test public void testDiceRollCount() { final PlayerID british = GameDataTestUtil.british(gameData); final Territory location = gameData.getMap().getTerritory("United Kingdom"); final Unit bombers = gameData.getMap().getTerritory("United Kingdom").getUnits().getMatches(Matches.UnitIsStrategicBomber).get(0); final Collection<TerritoryEffect> territoryEffects = TerritoryEffectHelper.getEffects(location); // default 1 roll assertThat(BattleCalculator.getRolls(bombers, british, false, true, territoryEffects), is(1)); assertThat(BattleCalculator.getRolls(bombers, british, true, true, territoryEffects), is(1)); // hb, for revised 2 on attack, 1 on defence final ITestDelegateBridge testDelegateBridge = getDelegateBridge(british); TechTracker.addAdvance(british, testDelegateBridge, TechAdvance.findAdvance(TechAdvance.TECH_PROPERTY_HEAVY_BOMBER, gameData, british)); // lhtr hb, 2 for both gameData.getProperties().set(Constants.LHTR_HEAVY_BOMBERS, Boolean.TRUE); assertThat(BattleCalculator.getRolls(bombers, british, false, true, territoryEffects), is(2)); assertThat(BattleCalculator.getRolls(bombers, british, true, true, territoryEffects), is(2)); } }