From 9a5b74d60326a6f2cd46e51b2d70bf8a6d74b3cd Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 16:38:29 -0400 Subject: [PATCH 01/11] Fix issue a cause of "Could not find step name". This was happening because the code to generate step names was not excluding units that would not participate in combat, resulting in infrastructure units getting their own steps (which later did not match what the engine generated once the filtering took place). Uses the same logic as what's done for the battle to exclude units. Fixes: https://github.com/triplea-game/triplea/issues/10647 --- .../general/FiringGroupSplitterGeneral.java | 26 +++++++++++++------ 1 file changed, 18 insertions(+), 8 deletions(-) diff --git a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneral.java b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneral.java index 9bf9ccca39a..1b3d4e925f2 100644 --- a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneral.java +++ b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneral.java @@ -56,10 +56,28 @@ public enum Type { @Override public List apply(final BattleState battleState) { + final Collection enemyUnits = + CollectionUtils.getMatches( + battleState.filterUnits(ALIVE, side.getOpposite()), + PredicateBuilder.of(Matches.unitIsNotInfrastructure()) + .andIf(side == DEFENSE, Matches.unitIsSuicideOnAttack().negate()) + .andIf(side == OFFENSE, Matches.unitIsSuicideOnDefense().negate()) + .build()); + + // Filter participants (same as is done in MustFightBattle.removeNonCombatants()), so that we + // don't end up generating combat step names for units that will be excluded. + final Predicate canParticipateInCombat = + Matches.unitCanParticipateInCombat( + side == OFFENSE, + battleState.getPlayer(OFFENSE), + battleState.getBattleSite(), + 1, + enemyUnits); final Collection canFire = CollectionUtils.getMatches( battleState.filterUnits(ACTIVE, side), PredicateBuilder.of(getFiringUnitPredicate(battleState)) + .and(canParticipateInCombat) // Remove offense allied units if allied air can not participate .andIf( side == OFFENSE @@ -68,14 +86,6 @@ public List apply(final BattleState battleState) { Matches.unitIsOwnedBy(battleState.getPlayer(side))) .build()); - final Collection enemyUnits = - CollectionUtils.getMatches( - battleState.filterUnits(ALIVE, side.getOpposite()), - PredicateBuilder.of(Matches.unitIsNotInfrastructure()) - .andIf(side == DEFENSE, Matches.unitIsSuicideOnAttack().negate()) - .andIf(side == OFFENSE, Matches.unitIsSuicideOnDefense().negate()) - .build()); - final List firingGroups = new ArrayList<>(); final List targetGroups = TargetGroup.newTargetGroups(canFire, enemyUnits); From a2d3fb2e76403d89204df073ebbb06f130248043 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 19:16:13 -0400 Subject: [PATCH 02/11] Update mock expectations. --- .../delegate/battle/steps/BattleStepsTest.java | 14 ++++++++++++-- 1 file changed, 12 insertions(+), 2 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 2d9b02dd5e8..01f83471b18 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -79,8 +79,8 @@ public static Territory givenSeaBattleSite() { @Value public static class UnitAndAttachment { - private Unit unit; - private UnitAttachment unitAttachment; + Unit unit; + UnitAttachment unitAttachment; } public static UnitAndAttachment newUnitAndAttachment() { @@ -767,6 +767,7 @@ void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBa givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(true) .withSubmersibleSubs(true) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) @@ -1051,6 +1052,7 @@ void defendingFirstStrikeWithWW2v2() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -1085,6 +1087,7 @@ void defendingFirstStrikeWithWW2v2AndDestroyers() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -1582,6 +1585,7 @@ void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -1654,6 +1658,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubsAndDestroyers() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -1975,6 +1980,7 @@ void partialAmphibiousAttackCanWithdrawIfHasNonAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -2066,6 +2072,7 @@ void attackingPlanesCanWithdrawWW2v2AndAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withAlliedAirIndependent(true) @@ -2100,6 +2107,7 @@ void attackingPlanesCanWithdrawPartialAmphibiousAndAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withWW2V2(false) .withAttackerRetreatPlanes(false) @@ -2131,6 +2139,7 @@ void attackingPlanesCanWithdrawPlanesRetreatAndAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withWW2V2(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) @@ -2162,6 +2171,7 @@ void attackingPlanesCanNotWithdrawWW2v2AndNotAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withAlliedAirIndependent(true) From 8c78ddad40fe4fbb100dcca5d9706745613bd581 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 19:46:14 -0400 Subject: [PATCH 03/11] More test fixes. --- .../battle/steps/BattleStepsTest.java | 3 +++ .../FiringGroupSplitterGeneralTest.java | 20 +++++++++++-------- 2 files changed, 15 insertions(+), 8 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 01f83471b18..c5033e620eb 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -1017,6 +1017,7 @@ void defendingFirstStrikeWithSneakAttackAllowed() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -1621,6 +1622,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withAlliedAirIndependent(true) @@ -2013,6 +2015,7 @@ void partialAmphibiousAttackCanNotWithdrawIfHasAllAmphibious() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(false) .withWW2V2(false) .withAlliedAirIndependent(true) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java index 29b0d4721f6..5698d818733 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java @@ -22,6 +22,7 @@ import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; +import games.strategy.engine.data.GameData; import games.strategy.engine.data.GamePlayer; import games.strategy.engine.data.Unit; import games.strategy.engine.data.UnitType; @@ -29,6 +30,7 @@ import games.strategy.triplea.delegate.battle.steps.fire.FiringGroup; import java.util.List; import java.util.Set; +import org.junit.jupiter.api.BeforeEach; import org.junit.jupiter.api.Test; import org.junit.jupiter.api.extension.ExtendWith; import org.mockito.Mock; @@ -40,6 +42,16 @@ class FiringGroupSplitterGeneralTest { @Mock GamePlayer attacker; @Mock GamePlayer defender; + @BeforeEach + void setUp() { + final GameData gameData = new GameData(); + + lenient().when(attacker.getName()).thenReturn("attacker"); + lenient().when(attacker.getData()).thenReturn(gameData); + lenient().when(defender.getName()).thenReturn("defender"); + lenient().when(defender.getData()).thenReturn(gameData); + } + @Test void oneFiringUnitVsOneTargetableUnitMakesOneFiringGroup() { final Unit targetUnit = givenAnyUnit(); @@ -216,14 +228,6 @@ void doNotExcludeUnitsOfAlliesIfAlliedAirIndependentIsFalseButItIsDefense() { assertThat(firingGroups.get(0).getFiringUnits(), contains(fireUnit, fireUnit2)); assertThat(firingGroups.get(0).getTargetUnits(), contains(targetUnit)); assertThat(firingGroups.get(0).isSuicideOnHit(), is(false)); - - verify( - fireUnit, - never() - .description( - "Units on defense with AlliedAirIndependent == false" - + "should never call getOwner")) - .getOwner(); } @Test From ed2618e14431f77b3cbf46bc82ba1283306a0973 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 20:20:47 -0400 Subject: [PATCH 04/11] Remove imports. --- .../steps/fire/general/FiringGroupSplitterGeneralTest.java | 2 -- 1 file changed, 2 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java index 5698d818733..f7b62d6c419 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/general/FiringGroupSplitterGeneralTest.java @@ -18,8 +18,6 @@ import static org.hamcrest.Matchers.is; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; -import static org.mockito.Mockito.never; -import static org.mockito.Mockito.verify; import static org.mockito.Mockito.when; import games.strategy.engine.data.GameData; From d964d642c1efb080cc2837aca36b088887cfe232 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 22:46:50 -0400 Subject: [PATCH 05/11] Fix existing tests. --- .../battle/steps/BattleStepsTest.java | 157 ++++++++++-------- .../suicide/RemoveFirstStrikeSuicideTest.java | 8 +- .../fire/air/AirAttackVsNonSubsStepTest.java | 4 +- .../fire/air/AirDefendVsNonSubsStepTest.java | 4 +- .../sub/SubmergeSubsVsOnlyAirStepTest.java | 6 +- 5 files changed, 97 insertions(+), 82 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index c5033e620eb..264aa089ba9 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -93,6 +93,12 @@ public static UnitAndAttachment newUnitAndAttachment() { return new UnitAndAttachment(unit, unitAttachment); } + public static UnitAndAttachment newSeaUnitAndAttachment() { + final var result = newUnitAndAttachment(); + lenient().when(result.unitAttachment.getIsSea()).thenReturn(true); + return result; + } + public static Unit givenAnyUnit() { return newUnitAndAttachment().unit; } @@ -105,63 +111,69 @@ public static Unit givenUnitCanEvade() { public static Unit givenUnitFirstStrike() { final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); + return unitAndAttachment.unit; + } + + public static Unit givenSeaUnitFirstStrike() { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); lenient().when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); return unitAndAttachment.unit; } - public static Unit givenUnitFirstStrikeSuicideOnAttack() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitFirstStrikeSuicideOnAttack() { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); lenient().when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); lenient().when(unitAndAttachment.unitAttachment.getIsSuicideOnAttack()).thenReturn(true); return unitAndAttachment.unit; } - public static Unit givenUnitFirstStrikeSuicideOnDefense() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitFirstStrikeSuicideOnDefense() { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); lenient().when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); lenient().when(unitAndAttachment.unitAttachment.getIsSuicideOnDefense()).thenReturn(true); return unitAndAttachment.unit; } - public static Unit givenUnitFirstStrikeAndEvade() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitFirstStrikeAndEvade() { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); when(unitAndAttachment.unitAttachment.getCanEvade()).thenReturn(true); return unitAndAttachment.unit; } - public static Unit givenUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(final UnitType otherType) { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(final UnitType otherType) { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); when(unitAndAttachment.unitAttachment.getCanEvade()).thenReturn(true); when(unitAndAttachment.unitAttachment.getCanNotBeTargetedBy()).thenReturn(Set.of(otherType)); return unitAndAttachment.unit; } - public static Unit givenUnitCanEvadeAndCanNotBeTargetedByRandomUnit() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitCanEvadeAndCanNotBeTargetedByRandomUnit() { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getCanEvade()).thenReturn(true); when(unitAndAttachment.unitAttachment.getCanNotBeTargetedBy()) .thenReturn(Set.of(mock(UnitType.class))); return unitAndAttachment.unit; } - public static Unit givenUnitCanNotBeTargetedBy(final UnitType otherType) { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + public static Unit givenSeaUnitCanNotBeTargetedBy(final UnitType otherType) { + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getCanNotBeTargetedBy()).thenReturn(Set.of(otherType)); return unitAndAttachment.unit; } public static Unit givenUnitDestroyer() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); lenient().when(unitAndAttachment.unitAttachment.getIsDestroyer()).thenReturn(true); + lenient().when(unitAndAttachment.unitAttachment.getIsSea()).thenReturn(true); return unitAndAttachment.unit; } public static Unit givenUnitSeaTransport() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getTransportCapacity()).thenReturn(2); - when(unitAndAttachment.unitAttachment.getIsSea()).thenReturn(true); return unitAndAttachment.unit; } @@ -211,9 +223,7 @@ public static Unit givenUnitIsAir() { } public static Unit givenUnitIsSea() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); - when(unitAndAttachment.unitAttachment.getIsSea()).thenReturn(true); - return unitAndAttachment.unit; + return newSeaUnitAndAttachment().unit; } public static Unit givenUnitWasAmphibious() { @@ -395,8 +405,8 @@ void bombardOnSubsequentRun() { @Test @DisplayName("Verify impossible sea battle with bombarding will not add a bombarding step") void impossibleSeaBattleWithBombarding() { - final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( givenBattleStateBuilder() @@ -538,8 +548,8 @@ void emptyParatroopersFirstRun() { @Test @DisplayName("Verify impossible sea battle with paratroopers will not add a paratrooper step") void impossibleSeaBattleWithParatroopers() { - final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( givenBattleStateBuilder() @@ -760,7 +770,7 @@ void defendingSubsRetreatIfCanNotRetreatBeforeBattle() { + "if SUB_RETREAT_BEFORE_BATTLE and SUBMERSIBLE_SUBS are true") void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBattle() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -797,7 +807,7 @@ void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBa @DisplayName("Verify unescorted attacking transports are removed if casualties are restricted") void unescortedAttackingTransportsAreRemovedWhenCasualtiesAreRestricted() { final Unit unit1 = givenUnitSeaTransport(); - final Unit unit2 = givenAnyUnit(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( @@ -824,9 +834,9 @@ void unescortedAttackingTransportsAreRemovedWhenCasualtiesAreRestricted() { @DisplayName( "Verify unescorted attacking transports are not removed if casualties are not restricted") void unescortedAttackingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() { - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); final Unit unit1 = unitAndAttachment.unit; - final Unit unit2 = givenAnyUnit(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( givenBattleStateBuilder() @@ -851,7 +861,7 @@ void unescortedAttackingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() @Test @DisplayName("Verify unescorted defending transports are removed if casualties are restricted") void unescortedDefendingTransportsAreRemovedWhenCasualtiesAreRestricted() { - final Unit unit1 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); final Unit unit2 = givenUnitSeaTransport(); final List steps = @@ -879,8 +889,8 @@ void unescortedDefendingTransportsAreRemovedWhenCasualtiesAreRestricted() { @DisplayName( "Verify unescorted defending transports are removed if casualties are not restricted") void unescortedDefendingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() { - final Unit unit1 = givenAnyUnit(); - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + final Unit unit1 = givenUnitIsSea(); + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); final Unit unit2 = unitAndAttachment.unit; final List steps = @@ -909,7 +919,7 @@ void unescortedDefendingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() "Verify basic attacker firstStrike " + "(no other attackers, no special defenders, all options false)") void attackingFirstStrikeBasic() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit2 = givenAnyUnit(); final List steps = @@ -942,7 +952,7 @@ void attackingFirstStrikeBasic() { @Test @DisplayName("Verify attacker firstStrike with destroyers") void attackingFirstStrikeWithDestroyers() { - final Unit unit1 = givenUnitFirstStrike(); + final Unit unit1 = givenSeaUnitFirstStrike(); final Unit unit2 = givenUnitDestroyer(); final List steps = @@ -977,7 +987,7 @@ void attackingFirstStrikeWithDestroyers() { + "(no other attackers, no special defenders, all options false)") void defendingFirstStrikeBasic() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1010,7 +1020,7 @@ void defendingFirstStrikeBasic() { @DisplayName("Verify defender firstStrike with DEFENDING_SUBS_SNEAK_ATTACK true") void defendingFirstStrikeWithSneakAttackAllowed() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1046,7 +1056,7 @@ void defendingFirstStrikeWithSneakAttackAllowed() { @DisplayName("Verify defender firstStrike with WW2v2 true") void defendingFirstStrikeWithWW2v2() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1081,7 +1091,7 @@ void defendingFirstStrikeWithWW2v2() { @DisplayName("Verify defender firstStrike with WW2v2 true and attacker destroyers") void defendingFirstStrikeWithWW2v2AndDestroyers() { final Unit unit1 = givenUnitDestroyer(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1116,8 +1126,8 @@ void defendingFirstStrikeWithWW2v2AndDestroyers() { "Verify basic attacker and defender firstStrikes " + "(no other attackers, no special defenders, all options false)") void attackingDefendingFirstStrikeBasic() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1150,8 +1160,8 @@ void attackingDefendingFirstStrikeBasic() { @Test @DisplayName("Verify attacking/defender firstStrikes with DEFENDING_SUBS_SNEAK_ATTACK true") void attackingDefendingFirstStrikeWithSneakAttackAllowed() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1184,14 +1194,15 @@ void attackingDefendingFirstStrikeWithSneakAttackAllowed() { @Test @DisplayName("Verify attacking/defender firstStrikes with WW2v2 true") void attackingDefendingFirstStrikeWithWW2v2() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withTransportCasualtiesRestricted(false) @@ -1218,8 +1229,8 @@ void attackingDefendingFirstStrikeWithWW2v2() { @DisplayName( "Verify attacking/defender firstStrikes with WW2v2 true and attacker/defender destroyers") void attackingDefendingFirstStrikeWithWW2v2AndDestroyers() { - final Unit unit1 = givenUnitFirstStrike(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrike(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit3 = givenUnitDestroyer(); final Unit unit4 = givenUnitDestroyer(); @@ -1257,8 +1268,8 @@ void attackingDefendingFirstStrikeWithWW2v2AndDestroyers() { "Verify attacking/defender firstStrikes with " + "DEFENDING_SUBS_SNEAK_ATTACK true and defender destroyers") void attackingDefendingFirstStrikeWithSneakAttackAllowedAndDefendingDestroyers() { - final Unit unit1 = givenUnitFirstStrike(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrike(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit3 = givenUnitDestroyer(); final List steps = @@ -1266,6 +1277,7 @@ void attackingDefendingFirstStrikeWithSneakAttackAllowedAndDefendingDestroyers() givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withTransportCasualtiesRestricted(false) @@ -1294,8 +1306,8 @@ void attackingDefendingFirstStrikeWithSneakAttackAllowedAndDefendingDestroyers() @Test @DisplayName("Verify attacking/defender firstStrikes with WW2v2 true and defender destroyers") void attackingDefendingFirstStrikeWithWW2v2AndDefendingDestroyers() { - final Unit unit1 = givenUnitFirstStrike(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrike(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit3 = givenUnitDestroyer(); final List steps = @@ -1330,8 +1342,8 @@ void attackingDefendingFirstStrikeWithWW2v2AndDefendingDestroyers() { @Test @DisplayName("Verify attacking/defender firstStrikes with WW2v2 true and attacking destroyers") void attackingDefendingFirstStrikeWithWW2v2AndAttackingDestroyers() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit3 = givenUnitDestroyer(); final List steps = @@ -1367,7 +1379,7 @@ void attackingDefendingFirstStrikeWithWW2v2AndAttackingDestroyers() { @DisplayName("Verify attacking firstStrikes against air") void attackingFirstStrikeVsAir() { final Unit unit2 = givenUnitIsAir(); - final Unit unit1 = givenUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); final List steps = givenBattleSteps( @@ -1401,9 +1413,9 @@ void attackingFirstStrikeVsAir() { @DisplayName("Verify attacking firstStrikes against air with other units on both sides") void attackingFirstStrikeVsAirWithOtherUnits() { final Unit unit2 = givenUnitIsAir(); - final Unit unit1 = givenUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); - final Unit unit3 = givenAnyUnit(); - final Unit unit4 = givenAnyUnit(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); + final Unit unit3 = givenUnitIsSea(); + final Unit unit4 = givenUnitIsSea(); final List steps = givenBattleSteps( @@ -1439,7 +1451,7 @@ void attackingFirstStrikeVsAirWithOtherUnits() { @DisplayName("Verify attacking firstStrikes against air with destroyer") void attackingFirstStrikeVsAirAndDestroyer() { final Unit unit2 = givenUnitIsAir(); - final Unit unit1 = givenUnitFirstStrike(); + final Unit unit1 = givenSeaUnitFirstStrike(); final Unit unit3 = givenUnitDestroyer(); final List steps = @@ -1473,13 +1485,14 @@ void attackingFirstStrikeVsAirAndDestroyer() { @DisplayName("Verify defending firstStrikes against air") void defendingFirstStrikeVsAir() { final Unit unit1 = givenUnitIsAir(); - final Unit unit2 = givenUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit1.getType()); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit1.getType()); final List steps = givenBattleSteps( givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withTransportCasualtiesRestricted(false) @@ -1507,7 +1520,7 @@ void defendingFirstStrikeVsAir() { @DisplayName("Verify defending firstStrikes against air with destroyer") void defendingFirstStrikeVsAirAndDestroyer() { final Unit unit1 = givenUnitIsAir(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit3 = givenUnitDestroyer(); final List steps = @@ -1515,6 +1528,7 @@ void defendingFirstStrikeVsAirAndDestroyer() { givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withTransportCasualtiesRestricted(false) @@ -1541,15 +1555,16 @@ void defendingFirstStrikeVsAirAndDestroyer() { @DisplayName("Verify defending firstStrikes against air with other units on both sides") void defendingFirstStrikeVsAirWithOtherUnits() { final Unit unit2 = givenUnitIsAir(); - final Unit unit1 = givenUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); - final Unit unit3 = givenAnyUnit(); - final Unit unit4 = givenAnyUnit(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(unit2.getType()); + final Unit unit3 = givenUnitIsSea(); + final Unit unit4 = givenUnitIsSea(); final List steps = givenBattleSteps( givenBattleStateBuilder() .gameData( givenGameData() + .withCaptureUnitsOnEnteringTerritory(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) .withTransportCasualtiesRestricted(false) @@ -1578,7 +1593,7 @@ void defendingFirstStrikeVsAirWithOtherUnits() { @Test @DisplayName("Verify attacking firstStrike can submerge if SUBMERSIBLE_SUBS is true") void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit2 = givenAnyUnit(); final List steps = @@ -1615,7 +1630,7 @@ void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { @DisplayName("Verify defending firstStrike can submerge if SUBMERSIBLE_SUBS is true") void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1653,7 +1668,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { "Verify defending firstStrike can submerge if SUBMERSIBLE_SUBS is true even with destroyers") void defendingFirstStrikeCanSubmergeIfSubmersibleSubsAndDestroyers() { final Unit unit1 = givenUnitDestroyer(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1687,7 +1702,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubsAndDestroyers() { @Test @DisplayName("Verify attacking firstStrike can withdraw when SUBMERSIBLE_SUBS is false") void attackingFirstStrikeWithdrawIfAble() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit2 = givenAnyUnit(); final List steps = @@ -1726,7 +1741,7 @@ void attackingFirstStrikeWithdrawIfAble() { "Verify attacking firstStrike can't withdraw when " + "SUBMERSIBLE_SUBS is false and no retreat territories") void attackingFirstStrikeNoWithdrawIfEmptyTerritories() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); final Unit unit2 = givenAnyUnit(); final List steps = @@ -1761,7 +1776,7 @@ void attackingFirstStrikeNoWithdrawIfEmptyTerritories() { "Verify attacking firstStrike can't withdraw when " + "SUBMERSIBLE_SUBS is false and destroyers present") void attackingFirstStrikeNoWithdrawIfDestroyers() { - final Unit unit1 = givenUnitFirstStrike(); + final Unit unit1 = givenSeaUnitFirstStrike(); final Unit unit2 = givenUnitDestroyer(); final List steps = @@ -1796,8 +1811,8 @@ void attackingFirstStrikeNoWithdrawIfDestroyers() { "Verify attacking firstStrike can withdraw when " + "SUBMERSIBLE_SUBS is false and defenseless transports with non restricted casualties") void attackingFirstStrikeWithdrawIfNonRestrictedDefenselessTransports() { - final Unit unit1 = givenUnitFirstStrikeAndEvade(); - final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); + final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); final Unit unit2 = unitAndAttachment.unit; final List steps = @@ -1837,7 +1852,7 @@ void attackingFirstStrikeWithdrawIfNonRestrictedDefenselessTransports() { @DisplayName("Verify defending firstStrike can withdraw when SUBMERSIBLE_SUBS is false") void defendingFirstStrikeWithdrawIfAble() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final Territory retreatTerritory = mock(Territory.class); when(retreatTerritory.isWater()).thenReturn(true); @@ -1877,7 +1892,7 @@ void defendingFirstStrikeWithdrawIfAble() { + "SUBMERSIBLE_SUBS is false and no retreat territories") void defendingFirstStrikeNoWithdrawIfEmptyTerritories() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1912,7 +1927,7 @@ void defendingFirstStrikeNoWithdrawIfEmptyTerritories() { + "SUBMERSIBLE_SUBS is false and destroyers present") void defendingFirstStrikeNoWithdrawIfDestroyers() { final Unit unit1 = givenUnitDestroyer(); - final Unit unit2 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1944,7 +1959,7 @@ void defendingFirstStrikeNoWithdrawIfDestroyers() { @DisplayName("Verify attacking air units at sea can withdraw") void attackingAirUnitsAtSeaCanWithdraw() { final Unit unit1 = givenUnitIsAir(); - final Unit unit2 = givenAnyUnit(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/change/suicide/RemoveFirstStrikeSuicideTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/change/suicide/RemoveFirstStrikeSuicideTest.java index ebd1babad82..6838342c67d 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/change/suicide/RemoveFirstStrikeSuicideTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/change/suicide/RemoveFirstStrikeSuicideTest.java @@ -4,8 +4,8 @@ import static games.strategy.triplea.delegate.battle.BattleState.Side.OFFENSE; import static games.strategy.triplea.delegate.battle.FakeBattleState.givenBattleStateBuilder; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenAnyUnit; -import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitFirstStrikeSuicideOnAttack; -import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitFirstStrikeSuicideOnDefense; +import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenSeaUnitFirstStrikeSuicideOnAttack; +import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenSeaUnitFirstStrikeSuicideOnDefense; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.verify; import static org.mockito.Mockito.verifyNoMoreInteractions; @@ -34,8 +34,8 @@ public class RemoveFirstStrikeSuicideTest { void suicideUnitsRemoved() { when(delegateBridge.getDisplayChannelBroadcaster()).thenReturn(mock(IDisplay.class)); - final List attackers = List.of(givenAnyUnit(), givenUnitFirstStrikeSuicideOnAttack()); - final List defenders = List.of(givenAnyUnit(), givenUnitFirstStrikeSuicideOnDefense()); + final List attackers = List.of(givenAnyUnit(), givenSeaUnitFirstStrikeSuicideOnAttack()); + final List defenders = List.of(givenAnyUnit(), givenSeaUnitFirstStrikeSuicideOnDefense()); final MockGameData gameData = MockGameData.givenGameData(); final BattleState battleState = givenBattleStateBuilder() diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirAttackVsNonSubsStepTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirAttackVsNonSubsStepTest.java index d26ed24fa61..f355be3ca2b 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirAttackVsNonSubsStepTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirAttackVsNonSubsStepTest.java @@ -2,7 +2,7 @@ import static games.strategy.triplea.delegate.battle.FakeBattleState.givenBattleStateBuilder; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenAnyUnit; -import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitCanNotBeTargetedBy; +import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenSeaUnitCanNotBeTargetedBy; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitDestroyer; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitIsAir; import static org.hamcrest.MatcherAssert.assertThat; @@ -35,7 +35,7 @@ static List stepName() { "Attacker has air units and no destroyers vs Defender subs", givenBattleStateBuilder() .attackingUnits(List.of(givenAnyUnit(), givenUnitIsAir())) - .defendingUnits(List.of(givenUnitCanNotBeTargetedBy(mock(UnitType.class)))) + .defendingUnits(List.of(givenSeaUnitCanNotBeTargetedBy(mock(UnitType.class)))) .build(), true), Arguments.of( diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirDefendVsNonSubsStepTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirDefendVsNonSubsStepTest.java index 5ec772a0b65..1b814672b6a 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirDefendVsNonSubsStepTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/fire/air/AirDefendVsNonSubsStepTest.java @@ -2,7 +2,7 @@ import static games.strategy.triplea.delegate.battle.FakeBattleState.givenBattleStateBuilder; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenAnyUnit; -import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitCanNotBeTargetedBy; +import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenSeaUnitCanNotBeTargetedBy; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitDestroyer; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitIsAir; import static org.hamcrest.MatcherAssert.assertThat; @@ -34,7 +34,7 @@ static List stepName() { Arguments.of( "Defender has air units and no destroyers vs Attacker subs", givenBattleStateBuilder() - .attackingUnits(List.of(givenUnitCanNotBeTargetedBy(mock(UnitType.class)))) + .attackingUnits(List.of(givenSeaUnitCanNotBeTargetedBy(mock(UnitType.class)))) .defendingUnits(List.of(givenAnyUnit(), givenUnitIsAir())) .build(), true), diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/retreat/sub/SubmergeSubsVsOnlyAirStepTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/retreat/sub/SubmergeSubsVsOnlyAirStepTest.java index 8f07107bfb1..2f86fe868dd 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/retreat/sub/SubmergeSubsVsOnlyAirStepTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/retreat/sub/SubmergeSubsVsOnlyAirStepTest.java @@ -5,7 +5,7 @@ import static games.strategy.triplea.delegate.battle.BattleState.Side.OFFENSE; import static games.strategy.triplea.delegate.battle.FakeBattleState.givenBattleStateBuilder; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenAnyUnit; -import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitCanEvadeAndCanNotBeTargetedByRandomUnit; +import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenSeaUnitCanEvadeAndCanNotBeTargetedByRandomUnit; import static games.strategy.triplea.delegate.battle.steps.BattleStepsTest.givenUnitIsAir; import static games.strategy.triplea.delegate.battle.steps.MockGameData.givenGameData; import static org.hamcrest.MatcherAssert.assertThat; @@ -90,7 +90,7 @@ static List stepName() { Arguments.of( "Attacking evaders vs ALL air", givenBattleStateBuilder() - .attackingUnits(List.of(givenUnitCanEvadeAndCanNotBeTargetedByRandomUnit())) + .attackingUnits(List.of(givenSeaUnitCanEvadeAndCanNotBeTargetedByRandomUnit())) .defendingUnits(List.of(givenUnitIsAir(), givenUnitIsAir())) .build(), true), @@ -98,7 +98,7 @@ static List stepName() { "Defending evaders vs ALL air", givenBattleStateBuilder() .attackingUnits(List.of(givenUnitIsAir(), givenUnitIsAir())) - .defendingUnits(List.of(givenUnitCanEvadeAndCanNotBeTargetedByRandomUnit())) + .defendingUnits(List.of(givenSeaUnitCanEvadeAndCanNotBeTargetedByRandomUnit())) .build(), true)); } From 336618108124c583e91a404024beb9ccbb7da8ab Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 22:58:43 -0400 Subject: [PATCH 06/11] Fix formatting. --- .../triplea/delegate/battle/steps/BattleStepsTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 264aa089ba9..a1e37703484 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -142,7 +142,8 @@ public static Unit givenSeaUnitFirstStrikeAndEvade() { return unitAndAttachment.unit; } - public static Unit givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy(final UnitType otherType) { + public static Unit givenSeaUnitFirstStrikeAndEvadeAndCanNotBeTargetedBy( + final UnitType otherType) { final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); when(unitAndAttachment.unitAttachment.getCanEvade()).thenReturn(true); From 8ac3a1757fa6619bca424860c23b026922000cb4 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Wed, 12 Jul 2023 23:40:28 -0400 Subject: [PATCH 07/11] More test fixing. --- .../battle/steps/BattleStepsTest.java | 57 ++++++++++++------- 1 file changed, 35 insertions(+), 22 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index a1e37703484..7196cb80ace 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -111,7 +111,7 @@ public static Unit givenUnitCanEvade() { public static Unit givenUnitFirstStrike() { final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); - when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); + lenient().when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); return unitAndAttachment.unit; } @@ -135,6 +135,13 @@ public static Unit givenSeaUnitFirstStrikeSuicideOnDefense() { return unitAndAttachment.unit; } + public static Unit givenUnitFirstStrikeAndEvade() { + final UnitAndAttachment unitAndAttachment = newUnitAndAttachment(); + when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); + when(unitAndAttachment.unitAttachment.getCanEvade()).thenReturn(true); + return unitAndAttachment.unit; + } + public static Unit givenSeaUnitFirstStrikeAndEvade() { final UnitAndAttachment unitAndAttachment = newSeaUnitAndAttachment(); when(unitAndAttachment.unitAttachment.getIsFirstStrike()).thenReturn(true); @@ -770,7 +777,7 @@ void defendingSubsRetreatIfCanNotRetreatBeforeBattle() { "Verify defending firstStrike submerge before battle " + "if SUB_RETREAT_BEFORE_BATTLE and SUBMERSIBLE_SUBS are true") void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBattle() { - final Unit unit1 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = @@ -778,6 +785,7 @@ void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBa givenBattleStateBuilder() .gameData( givenGameData() + .withTransportCasualtiesRestricted(false) .withCaptureUnitsOnEnteringTerritory(false) .withSubRetreatBeforeBattle(true) .withSubmersibleSubs(true) @@ -790,7 +798,7 @@ void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBa .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -961,6 +969,7 @@ void attackingFirstStrikeWithDestroyers() { givenBattleStateBuilder() .gameData( givenGameData() + .withTransportCasualtiesRestricted(false) .withWW2V2(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) @@ -970,7 +979,7 @@ void attackingFirstStrikeWithDestroyers() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -988,7 +997,7 @@ void attackingFirstStrikeWithDestroyers() { + "(no other attackers, no special defenders, all options false)") void defendingFirstStrikeBasic() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1020,7 +1029,7 @@ void defendingFirstStrikeBasic() { @Test @DisplayName("Verify defender firstStrike with DEFENDING_SUBS_SNEAK_ATTACK true") void defendingFirstStrikeWithSneakAttackAllowed() { - final Unit unit1 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = @@ -1040,7 +1049,7 @@ void defendingFirstStrikeWithSneakAttackAllowed() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1057,7 +1066,7 @@ void defendingFirstStrikeWithSneakAttackAllowed() { @DisplayName("Verify defender firstStrike with WW2v2 true") void defendingFirstStrikeWithWW2v2() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1110,7 +1119,7 @@ void defendingFirstStrikeWithWW2v2AndDestroyers() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1127,8 +1136,8 @@ void defendingFirstStrikeWithWW2v2AndDestroyers() { "Verify basic attacker and defender firstStrikes " + "(no other attackers, no special defenders, all options false)") void attackingDefendingFirstStrikeBasic() { - final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); - final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit1 = givenUnitFirstStrikeAndEvade(); + final Unit unit2 = givenUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1595,7 +1604,7 @@ void defendingFirstStrikeVsAirWithOtherUnits() { @DisplayName("Verify attacking firstStrike can submerge if SUBMERSIBLE_SUBS is true") void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { final Unit unit1 = givenSeaUnitFirstStrikeAndEvade(); - final Unit unit2 = givenAnyUnit(); + final Unit unit2 = givenUnitIsSea(); final List steps = givenBattleSteps( @@ -1614,7 +1623,7 @@ void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1630,7 +1639,7 @@ void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { @Test @DisplayName("Verify defending firstStrike can submerge if SUBMERSIBLE_SUBS is true") void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { - final Unit unit1 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); final List steps = @@ -1651,7 +1660,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1688,7 +1697,7 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubsAndDestroyers() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1785,6 +1794,7 @@ void attackingFirstStrikeNoWithdrawIfDestroyers() { givenBattleStateBuilder() .gameData( givenGameData() + .withTransportCasualtiesRestricted(false) .withWW2V2(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withSubRetreatBeforeBattle(false) @@ -1795,7 +1805,7 @@ void attackingFirstStrikeNoWithdrawIfDestroyers() { .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) .attackerRetreatTerritories(List.of(battleSite)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( @@ -1852,9 +1862,10 @@ void attackingFirstStrikeWithdrawIfNonRestrictedDefenselessTransports() { @Test @DisplayName("Verify defending firstStrike can withdraw when SUBMERSIBLE_SUBS is false") void defendingFirstStrikeWithdrawIfAble() { - final Unit unit1 = givenAnyUnit(); + final Unit unit1 = givenUnitIsSea(); final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); + final Territory battleTerritory = givenSeaBattleSite(); final Territory retreatTerritory = mock(Territory.class); when(retreatTerritory.isWater()).thenReturn(true); when(retreatTerritory.getUnitCollection()).thenReturn(mock(UnitCollection.class)); @@ -1864,7 +1875,8 @@ void defendingFirstStrikeWithdrawIfAble() { givenBattleStateBuilder() .gameData( givenGameData() - .withTerritoryHasNeighbors(battleSite, Set.of(retreatTerritory)) + .withTransportCasualtiesRestricted(false) + .withTerritoryHasNeighbors(battleTerritory, Set.of(retreatTerritory)) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withWW2V2(false) .withDefendingSubsSneakAttack(false) @@ -1875,7 +1887,7 @@ void defendingFirstStrikeWithdrawIfAble() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(battleTerritory) .build()); assertThat( @@ -1893,7 +1905,7 @@ void defendingFirstStrikeWithdrawIfAble() { + "SUBMERSIBLE_SUBS is false and no retreat territories") void defendingFirstStrikeNoWithdrawIfEmptyTerritories() { final Unit unit1 = givenAnyUnit(); - final Unit unit2 = givenSeaUnitFirstStrikeAndEvade(); + final Unit unit2 = givenUnitFirstStrikeAndEvade(); final List steps = givenBattleSteps( @@ -1935,6 +1947,7 @@ void defendingFirstStrikeNoWithdrawIfDestroyers() { givenBattleStateBuilder() .gameData( givenGameData() + .withTransportCasualtiesRestricted(false) .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withWW2V2(false) .withSubRetreatBeforeBattle(false) @@ -1944,7 +1957,7 @@ void defendingFirstStrikeNoWithdrawIfDestroyers() { .defender(defender) .attackingUnits(List.of(unit1)) .defendingUnits(List.of(unit2)) - .battleSite(battleSite) + .battleSite(givenSeaBattleSite()) .build()); assertThat( From 61544cb6d3c00ab4e3a8b6d01fc6cc22c1d16977 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Thu, 13 Jul 2023 22:54:19 -0400 Subject: [PATCH 08/11] Use lenient properties in BattleStepsTest. --- .../battle/steps/BattleStepsTest.java | 289 ++++-------------- .../delegate/battle/steps/MockGameData.java | 8 + 2 files changed, 65 insertions(+), 232 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 7196cb80ace..5720065b121 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -65,6 +65,10 @@ public class BattleStepsTest { @Mock GamePlayer defender; @Mock TechAttachment techAttachment; + public static MockGameData givenGameDataWithLenientProperties() { + return givenGameData().withLenientProperties(); + } + @BeforeEach public void givenPlayers() { lenient().when(attacker.getName()).thenReturn("mockAttacker"); @@ -333,9 +337,7 @@ void basicLandBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -360,11 +362,7 @@ void bombardOnFirstRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withNavalBombardCasualtiesReturnFire(false) - .withCaptureUnitsOnEnteringTerritory(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -393,9 +391,7 @@ void bombardOnSubsequentRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -419,10 +415,7 @@ void impossibleSeaBattleWithBombarding() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .battleRound(1) @@ -480,9 +473,7 @@ void noAirTransportTech() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .battleRound(1) @@ -506,9 +497,7 @@ void paratroopersSubsequentRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -562,10 +551,7 @@ void impossibleSeaBattleWithParatroopers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .battleRound(1) @@ -699,8 +685,7 @@ void defendingSubsRetreatIfNoDestroyersAndCanRetreatBeforeBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withSubRetreatBeforeBattle(true) .withSubmersibleSubs(true) .withAlliedAirIndependent(true) @@ -728,8 +713,7 @@ void defendingSubsNotRetreatIfDestroyersAndCanRetreatBeforeBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withSubRetreatBeforeBattle(true) .withSubmersibleSubs(true) .withAlliedAirIndependent(true) @@ -757,9 +741,7 @@ void defendingSubsRetreatIfCanNotRetreatBeforeBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -784,13 +766,9 @@ void defendingFirstStrikeSubmergeBeforeBattleIfSubmersibleSubsAndRetreatBeforeBa givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withTransportCasualtiesRestricted(false) - .withCaptureUnitsOnEnteringTerritory(false) + givenGameDataWithLenientProperties() .withSubRetreatBeforeBattle(true) .withSubmersibleSubs(true) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withWW2V2(false) .withDefendingSubsSneakAttack(true) .withAlliedAirIndependent(true) .build()) @@ -822,9 +800,7 @@ void unescortedAttackingTransportsAreRemovedWhenCasualtiesAreRestricted() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withTransportCasualtiesRestricted(true) .withAlliedAirIndependent(true) .build()) @@ -850,10 +826,7 @@ void unescortedAttackingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -877,9 +850,7 @@ void unescortedDefendingTransportsAreRemovedWhenCasualtiesAreRestricted() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withTransportCasualtiesRestricted(true) .withAlliedAirIndependent(true) .build()) @@ -906,10 +877,7 @@ void unescortedDefendingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -935,10 +903,7 @@ void attackingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -968,11 +933,7 @@ void attackingFirstStrikeWithDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1003,11 +964,7 @@ void defendingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withWW2V2(false) - .withDefendingSubsSneakAttack(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1036,13 +993,8 @@ void defendingFirstStrikeWithSneakAttackAllowed() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) .withDefendingSubsSneakAttack(true) .build()) .attacker(attacker) @@ -1072,12 +1024,8 @@ void defendingFirstStrikeWithWW2v2() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) .withWW2V2(true) .build()) .attacker(attacker) @@ -1107,12 +1055,8 @@ void defendingFirstStrikeWithWW2v2AndDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) .withWW2V2(true) .build()) .attacker(attacker) @@ -1143,11 +1087,7 @@ void attackingDefendingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withDefendingSubsSneakAttack(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1177,11 +1117,7 @@ void attackingDefendingFirstStrikeWithSneakAttackAllowed() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) + givenGameDataWithLenientProperties() .withDefendingSubsSneakAttack(true) .withAlliedAirIndependent(true) .build()) @@ -1211,11 +1147,7 @@ void attackingDefendingFirstStrikeWithWW2v2() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1248,10 +1180,7 @@ void attackingDefendingFirstStrikeWithWW2v2AndDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1286,12 +1215,7 @@ void attackingDefendingFirstStrikeWithSneakAttackAllowedAndDefendingDestroyers() givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) + givenGameDataWithLenientProperties() .withDefendingSubsSneakAttack(true) .withAlliedAirIndependent(true) .build()) @@ -1324,10 +1248,7 @@ void attackingDefendingFirstStrikeWithWW2v2AndDefendingDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1360,10 +1281,7 @@ void attackingDefendingFirstStrikeWithWW2v2AndAttackingDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1395,10 +1313,7 @@ void attackingFirstStrikeVsAir() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1431,10 +1346,7 @@ void attackingFirstStrikeVsAirWithOtherUnits() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1468,10 +1380,7 @@ void attackingFirstStrikeVsAirAndDestroyer() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1501,11 +1410,7 @@ void defendingFirstStrikeVsAir() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1537,11 +1442,7 @@ void defendingFirstStrikeVsAirAndDestroyer() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1573,11 +1474,7 @@ void defendingFirstStrikeVsAirWithOtherUnits() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withWW2V2(true) .withAlliedAirIndependent(true) .build()) @@ -1610,13 +1507,8 @@ void attackingFirstStrikeCanSubmergeIfSubmersibleSubs() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) .withSubmersibleSubs(true) .build()) .attacker(attacker) @@ -1646,13 +1538,8 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubs() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) .withDefendingSubsSneakAttack(true) .withSubmersibleSubs(true) .build()) @@ -1684,13 +1571,8 @@ void defendingFirstStrikeCanSubmergeIfSubmersibleSubsAndDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) .withSubmersibleSubs(true) .build()) .attacker(attacker) @@ -1719,10 +1601,7 @@ void attackingFirstStrikeWithdrawIfAble() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1758,10 +1637,7 @@ void attackingFirstStrikeNoWithdrawIfEmptyTerritories() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1793,11 +1669,7 @@ void attackingFirstStrikeNoWithdrawIfDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withTransportCasualtiesRestricted(false) - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1830,11 +1702,7 @@ void attackingFirstStrikeWithdrawIfNonRestrictedDefenselessTransports() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1874,14 +1742,9 @@ void defendingFirstStrikeWithdrawIfAble() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withTransportCasualtiesRestricted(false) - .withTerritoryHasNeighbors(battleTerritory, Set.of(retreatTerritory)) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withWW2V2(false) - .withDefendingSubsSneakAttack(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) + .withTerritoryHasNeighbors(battleTerritory, Set.of(retreatTerritory)) .build()) .attacker(attacker) .defender(defender) @@ -1911,11 +1774,7 @@ void defendingFirstStrikeNoWithdrawIfEmptyTerritories() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withWW2V2(false) - .withDefendingSubsSneakAttack(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1946,11 +1805,7 @@ void defendingFirstStrikeNoWithdrawIfDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withTransportCasualtiesRestricted(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withWW2V2(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -1979,10 +1834,7 @@ void attackingAirUnitsAtSeaCanWithdraw() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) - .withTransportCasualtiesRestricted(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -2010,10 +1862,7 @@ void partialAmphibiousAttackCanWithdrawIfHasNonAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .withPartialAmphibiousRetreat(true) .build()) @@ -2043,13 +1892,8 @@ void partialAmphibiousAttackCanNotWithdrawIfHasAllAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withWW2V2(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withAttackerRetreatPlanes(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) .withPartialAmphibiousRetreat(true) .build()) .attacker(attacker) @@ -2075,9 +1919,7 @@ void partialAmphibiousAttackCanNotWithdrawIfNotAllowed() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .build()) .attacker(attacker) @@ -2103,12 +1945,8 @@ void attackingPlanesCanWithdrawWW2v2AndAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withPartialAmphibiousRetreat(false) .withWW2V2(true) .build()) .attacker(attacker) @@ -2138,12 +1976,7 @@ void attackingPlanesCanWithdrawPartialAmphibiousAndAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withWW2V2(false) - .withAttackerRetreatPlanes(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .withPartialAmphibiousRetreat(true) .build()) @@ -2170,13 +2003,8 @@ void attackingPlanesCanWithdrawPlanesRetreatAndAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withSubRetreatBeforeBattle(false) - .withWW2V2(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) - .withPartialAmphibiousRetreat(false) .withAttackerRetreatPlanes(true) .build()) .attacker(attacker) @@ -2202,10 +2030,7 @@ void attackingPlanesCanNotWithdrawWW2v2AndNotAmphibious() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameData() - .withCaptureUnitsOnEnteringTerritory(false) - .withDefendingSuicideAndMunitionUnitsDoNotFire(false) - .withSubRetreatBeforeBattle(false) + givenGameDataWithLenientProperties() .withAlliedAirIndependent(true) .withTransportCasualtiesRestricted(true) .build()) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java index 3ea573dcfb7..a7e114ab0bc 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java @@ -16,6 +16,9 @@ import static games.strategy.triplea.Constants.SUB_RETREAT_BEFORE_BATTLE; import static games.strategy.triplea.Constants.TRANSPORT_CASUALTIES_RESTRICTED; import static games.strategy.triplea.Constants.WW2V2; +import static org.mockito.ArgumentMatchers.any; +import static org.mockito.ArgumentMatchers.anyBoolean; +import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.lenient; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.when; @@ -102,6 +105,11 @@ public MockGameData withTechnologyFrontier() { return this; } + public MockGameData withLenientProperties() { + lenient().when(gameProperties.get(anyString(), anyBoolean())).thenReturn(false); + return this; + } + public MockGameData withTransportCasualtiesRestricted(final boolean value) { when(gameProperties.get(TRANSPORT_CASUALTIES_RESTRICTED, false)).thenReturn(value); return this; From ad5e6ce0fd40985fa9d82a5fc813be02d32d3978 Mon Sep 17 00:00:00 2001 From: asvitkine Date: Thu, 13 Jul 2023 23:02:38 -0400 Subject: [PATCH 09/11] More formatting. --- .../battle/steps/BattleStepsTest.java | 88 +++++-------------- .../delegate/battle/steps/MockGameData.java | 1 - 2 files changed, 22 insertions(+), 67 deletions(-) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 5720065b121..8f2924e2f75 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -337,9 +337,7 @@ void basicLandBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -362,9 +360,7 @@ void bombardOnFirstRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -391,9 +387,7 @@ void bombardOnSubsequentRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .battleRound(2) @@ -415,9 +409,7 @@ void impossibleSeaBattleWithBombarding() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .battleRound(1) .attacker(attacker) .defender(defender) @@ -473,9 +465,7 @@ void noAirTransportTech() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .battleRound(1) .attacker(attacker) .defender(defender) @@ -497,9 +487,7 @@ void paratroopersSubsequentRun() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .battleRound(2) @@ -551,9 +539,7 @@ void impossibleSeaBattleWithParatroopers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .battleRound(1) .attacker(attacker) .defender(defender) @@ -741,9 +727,7 @@ void defendingSubsRetreatIfCanNotRetreatBeforeBattle() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -826,9 +810,7 @@ void unescortedAttackingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -877,9 +859,7 @@ void unescortedDefendingTransportsAreNotRemovedWhenCasualtiesAreNotRestricted() givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -903,9 +883,7 @@ void attackingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -933,9 +911,7 @@ void attackingFirstStrikeWithDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -964,9 +940,7 @@ void defendingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1087,9 +1061,7 @@ void attackingDefendingFirstStrikeBasic() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1601,9 +1573,7 @@ void attackingFirstStrikeWithdrawIfAble() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1637,9 +1607,7 @@ void attackingFirstStrikeNoWithdrawIfEmptyTerritories() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1669,9 +1637,7 @@ void attackingFirstStrikeNoWithdrawIfDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1702,9 +1668,7 @@ void attackingFirstStrikeWithdrawIfNonRestrictedDefenselessTransports() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1774,9 +1738,7 @@ void defendingFirstStrikeNoWithdrawIfEmptyTerritories() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1805,9 +1767,7 @@ void defendingFirstStrikeNoWithdrawIfDestroyers() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1834,9 +1794,7 @@ void attackingAirUnitsAtSeaCanWithdraw() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1)) @@ -1919,9 +1877,7 @@ void partialAmphibiousAttackCanNotWithdrawIfNotAllowed() { givenBattleSteps( givenBattleStateBuilder() .gameData( - givenGameDataWithLenientProperties() - .withAlliedAirIndependent(true) - .build()) + givenGameDataWithLenientProperties().withAlliedAirIndependent(true).build()) .attacker(attacker) .defender(defender) .attackingUnits(List.of(unit1, unit3)) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java index a7e114ab0bc..20c80f3e271 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java @@ -16,7 +16,6 @@ import static games.strategy.triplea.Constants.SUB_RETREAT_BEFORE_BATTLE; import static games.strategy.triplea.Constants.TRANSPORT_CASUALTIES_RESTRICTED; import static games.strategy.triplea.Constants.WW2V2; -import static org.mockito.ArgumentMatchers.any; import static org.mockito.ArgumentMatchers.anyBoolean; import static org.mockito.ArgumentMatchers.anyString; import static org.mockito.Mockito.lenient; From da5435aae57d59156f1a62b8b6533fb033ca818a Mon Sep 17 00:00:00 2001 From: asvitkine Date: Fri, 14 Jul 2023 00:21:18 -0400 Subject: [PATCH 10/11] Add a test for the fix. --- .../battle/steps/BattleStepsTest.java | 38 +++++++++++++++++++ .../delegate/battle/steps/MockGameData.java | 12 ++++++ 2 files changed, 50 insertions(+) diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java index 8f2924e2f75..6a940293b81 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/BattleStepsTest.java @@ -2000,4 +2000,42 @@ void attackingPlanesCanNotWithdrawWW2v2AndNotAmphibious() { assertThat(steps, is(basicFightStepStrings())); } + + @Test + @DisplayName("Verify that extra steps won't be created due to canNotTarget and non-participants") + void nonParticipantsDontCreateExtraStepsWithCannotTarget() { + // Two attacking units of different types. + final Unit unit1 = givenAnyUnit(); + lenient().when(unit1.getOwner()).thenReturn(attacker); + final Unit unit2 = givenAnyUnit(); + lenient().when(unit2.getOwner()).thenReturn(attacker); + final UnitType unit2Type = unit2.getType(); + + // One defending unit that can only target one of the attackers. + final Unit unit3 = givenAnyUnit(); + lenient().when(unit3.getOwner()).thenReturn(defender); + final UnitAttachment unit3Attachment = unit3.getUnitAttachment(); + when(unit3Attachment.getCanNotTarget()).thenReturn(Set.of(unit2Type)); + // And an infra unit on the defense that should not participate in combat. + final Unit unit4 = givenUnitIsInfrastructure(); + lenient().when(unit4.getOwner()).thenReturn(defender); + + final var unitTypeList = + List.of(unit1.getType(), unit2.getType(), unit3.getType(), unit4.getType()); + + final List steps = + givenBattleSteps( + givenBattleStateBuilder() + .gameData( + givenGameDataWithLenientProperties().withUnitTypeList(unitTypeList).build()) + .attacker(attacker) + .defender(defender) + .attackingUnits(List.of(unit1, unit2)) + .defendingUnits(List.of(unit3, unit4)) + .battleSite(battleSite) + .amphibious(false) + .build()); + + assertThat(steps, is(basicFightStepStrings())); + } } diff --git a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java index 20c80f3e271..49408f75854 100644 --- a/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java +++ b/game-app/game-core/src/test/java/games/strategy/triplea/delegate/battle/steps/MockGameData.java @@ -32,9 +32,11 @@ import games.strategy.engine.data.ResourceList; import games.strategy.engine.data.TechnologyFrontier; import games.strategy.engine.data.Territory; +import games.strategy.engine.data.UnitType; import games.strategy.engine.data.UnitTypeList; import games.strategy.engine.data.properties.GameProperties; import games.strategy.triplea.delegate.TechTracker; +import java.util.List; import java.util.Set; public class MockGameData { @@ -196,4 +198,14 @@ public MockGameData withLowLuck(final boolean value) { when(gameProperties.get(LOW_LUCK, false)).thenReturn(value); return this; } + + public MockGameData withUnitTypeList(final List types) { + UnitTypeList unitTypeList = new UnitTypeList(gameData); + for (var unitType : types) { + lenient().when(unitType.getData()).thenReturn(gameData); + unitTypeList.addUnitType(unitType); + } + when(gameData.getUnitTypeList()).thenReturn(unitTypeList); + return this; + } } From 49eeb4104ed81df96d2351a2f84f70fd13651e2d Mon Sep 17 00:00:00 2001 From: asvitkine Date: Fri, 14 Jul 2023 00:27:14 -0400 Subject: [PATCH 11/11] Add comment to MustFightBattle.removeNonCombatants(). --- .../games/strategy/triplea/delegate/battle/MustFightBattle.java | 1 + 1 file changed, 1 insertion(+) diff --git a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/MustFightBattle.java b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/MustFightBattle.java index a02f7dd5396..a040865b496 100644 --- a/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/MustFightBattle.java +++ b/game-app/game-core/src/main/java/games/strategy/triplea/delegate/battle/MustFightBattle.java @@ -1272,6 +1272,7 @@ private List removeNonCombatants( final boolean attacking, final boolean removeForNextRound) { int battleRound = (removeForNextRound ? round + 1 : round); + // Note: Also done in FiringGroupSplitterGeneral when determining step names. They must match. return CollectionUtils.getMatches( units, Matches.unitCanParticipateInCombat(