From da90aab1e4fb9a75b73d4189a9ae2e79caba69bb Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Sat, 22 Mar 2025 15:26:22 -0500 Subject: [PATCH] Unit tests for Above the Battlement --- .../logic/decisions/AwaitingDecision.java | 10 +- ...aysPhaseActionsUntilPassesGameProcess.java | 2 +- .../lotro/cards/GenericCardTestHelper.java | 2 + .../official/set07/Card_07_262_Tests.java | 133 ++++++++++++++++-- 4 files changed, 126 insertions(+), 21 deletions(-) diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/AwaitingDecision.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/AwaitingDecision.java index 519087a03..8df7a46b9 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/AwaitingDecision.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/decisions/AwaitingDecision.java @@ -3,13 +3,13 @@ package com.gempukku.lotro.logic.decisions; import java.util.Map; public interface AwaitingDecision { - public int getAwaitingDecisionId(); + int getAwaitingDecisionId(); - public String getText(); + String getText(); - public AwaitingDecisionType getDecisionType(); + AwaitingDecisionType getDecisionType(); - public Map getDecisionParameters(); + Map getDecisionParameters(); - public void decisionMade(String result) throws DecisionResultInvalidException; + void decisionMade(String result) throws DecisionResultInvalidException; } diff --git a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java index 1b634b1be..095357f9c 100644 --- a/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java +++ b/gemp-lotr/gemp-lotr-logic/src/main/java/com/gempukku/lotro/logic/timing/processes/turn/general/PlayerPlaysPhaseActionsUntilPassesGameProcess.java @@ -23,7 +23,7 @@ public class PlayerPlaysPhaseActionsUntilPassesGameProcess implements GameProces public void process(final LotroGame game) { final List playableActions = game.getActionsEnvironment().getPhaseActions(_playerId); - if (playableActions.size() == 0 && game.shouldAutoPass(_playerId, game.getGameState().getCurrentPhase())) { + if (playableActions.isEmpty() && game.shouldAutoPass(_playerId, game.getGameState().getCurrentPhase())) { playerPassed(); } else { game.getUserFeedback().sendAwaitingDecision(_playerId, diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java index 00815aaca..b8280c150 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/GenericCardTestHelper.java @@ -334,6 +334,8 @@ public class GenericCardTestHelper extends AbstractAtTest { public List ShadowGetBPChoices() { return GetADParamAsList(P2, "blueprintId"); } public List FreepsGetMultipleChoices() { return GetADParamAsList(P1, "results"); } public List ShadowGetMultipleChoices() { return GetADParamAsList(P2, "results"); } + public int FreepsGetChoiceCount() { return GetADParamAsList(P1, "results").size(); } + public int ShadowGetChoiceCount() { return GetADParamAsList(P2, "results").size(); } public List FreepsGetFreepsAssignmentTargets() { return GetADParamAsList(P1, "freeCharacters"); } public List FreepsGetShadowAssignmentTargets() { return GetADParamAsList(P1, "minions"); } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set07/Card_07_262_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set07/Card_07_262_Tests.java index 895942b7e..feeff6f8b 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set07/Card_07_262_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set07/Card_07_262_Tests.java @@ -1,10 +1,8 @@ package com.gempukku.lotro.cards.official.set07; +import com.gempukku.lotro.at.AbstractAtTest; import com.gempukku.lotro.cards.GenericCardTestHelper; -import com.gempukku.lotro.common.CardType; -import com.gempukku.lotro.common.Culture; -import com.gempukku.lotro.common.Side; -import com.gempukku.lotro.common.Timeword; +import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -20,8 +18,9 @@ public class Card_07_262_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "7_262"); - // put other cards in here as needed for the test case + put("battlements", "7_262"); + put("pillager", "7_275"); + put("assassin", "1_262"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -41,12 +40,13 @@ public class Card_07_262_Tests * Twilight Cost: 0 * Type: Event * Subtype: Shadow - * Game Text: Play a besieger stacked on a site you control or remove a burden to play a [sauron] Orc from your discard pile. + * Game Text: Play a besieger stacked on a site you control or remove a burden + * to play a [sauron] Orc from your discard pile. */ var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("battlements"); assertEquals("Above the Battlement", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -58,18 +58,121 @@ public class Card_07_262_Tests assertEquals(0, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void AbovetheBattlementTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void AbovetheBattlementCanRemoveABurdenToPlaySauronOrcFromDiscard() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var site1 = scn.GetFreepsSite(1); + + var pillager = scn.GetShadowCard("pillager"); + var assassin = scn.GetShadowCard("assassin"); + var battlements = scn.GetShadowCard("battlements"); + scn.ShadowMoveCardToDiscard(assassin); + scn.ShadowMoveCardToHand(battlements); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + scn.SkipToSite(2); + scn.FreepsPassCurrentPhaseAction(); + + scn.ShadowTakeControlOfSite(); + assertTrue(scn.IsSiteControlled(site1)); + scn.StackCardsOn(site1, pillager); + + scn.SkipToSite(4); + scn.SetTwilight(20); + scn.FreepsPassCurrentPhaseAction(); + + assertTrue(scn.IsSiteControlled(site1)); + assertEquals(AbstractAtTest.P2, site1.getCardController()); + assertEquals(Zone.STACKED, pillager.getZone()); + assertEquals(Zone.DISCARD, assassin.getZone()); + assertEquals(1, scn.GetBurdens()); + assertTrue(scn.ShadowPlayAvailable(battlements)); + + scn.ShadowPlayCard(battlements); + assertEquals(2, scn.ShadowGetChoiceCount()); + + scn.ShadowChooseMultipleChoiceOption("burden"); + assertEquals(Zone.STACKED, pillager.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, assassin.getZone()); + assertEquals(0, scn.GetBurdens()); + } + + @Test + public void AbovetheBattlementCanRemoveABurdenToPlaySauronOrcFromDiscardWhenNoStackedOption() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var site1 = scn.GetFreepsSite(1); + + var pillager = scn.GetShadowCard("pillager"); + var assassin = scn.GetShadowCard("assassin"); + var battlements = scn.GetShadowCard("battlements"); + scn.ShadowMoveCardToDiscard(assassin); + scn.ShadowMoveCardToHand(battlements, pillager); + + scn.StartGame(); + + scn.SkipToSite(2); + scn.FreepsPassCurrentPhaseAction(); + + scn.SkipToSite(4); + scn.SetTwilight(20); + scn.FreepsPassCurrentPhaseAction(); + + assertEquals(Zone.HAND, pillager.getZone()); + assertEquals(Zone.DISCARD, assassin.getZone()); + assertEquals(1, scn.GetBurdens()); + assertTrue(scn.ShadowPlayAvailable(battlements)); + + scn.ShadowPlayCard(battlements); + + assertEquals(Zone.HAND, pillager.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, assassin.getZone()); + assertEquals(0, scn.GetBurdens()); + } + + @Test + public void AbovetheBattlementCanPlayStackedBesiegerToPlaySauronOrcFromDiscard() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var site1 = scn.GetFreepsSite(1); + + var pillager = scn.GetShadowCard("pillager"); + var assassin = scn.GetShadowCard("assassin"); + var battlements = scn.GetShadowCard("battlements"); + scn.ShadowMoveCardToDiscard(assassin); + scn.ShadowMoveCardToHand(battlements); + + scn.StartGame(); + + scn.SkipToSite(2); + scn.FreepsPassCurrentPhaseAction(); + + scn.ShadowTakeControlOfSite(); + assertTrue(scn.IsSiteControlled(site1)); + scn.StackCardsOn(site1, pillager); + + scn.SkipToSite(4); + scn.SetTwilight(20); + scn.FreepsPassCurrentPhaseAction(); + + assertTrue(scn.IsSiteControlled(site1)); + assertEquals(AbstractAtTest.P2, site1.getCardController()); + assertEquals(Zone.STACKED, pillager.getZone()); + assertEquals(Zone.DISCARD, assassin.getZone()); + assertEquals(1, scn.GetBurdens()); + assertTrue(scn.ShadowPlayAvailable(battlements)); + + scn.ShadowPlayCard(battlements); + assertEquals(2, scn.ShadowGetChoiceCount()); + + scn.ShadowChooseMultipleChoiceOption("play"); + assertEquals(Zone.SHADOW_CHARACTERS, pillager.getZone()); + assertEquals(Zone.SHADOW_CHARACTERS, assassin.getZone()); + assertEquals(1, scn.GetBurdens()); } }