From 56be6ab2faa8c0c198bf869cf3406f5219aae8ca Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Thu, 22 Jun 2023 00:02:19 -0500 Subject: [PATCH] Adding unit tests for Namarie errata. Fixing Namarie errata always self-discarding for the cost. --- .../pc/errata/set01/set01-Shire-errata.hjson | 2 +- .../pc/errata/set17/set17-elven-errata.hjson | 43 ++-- .../errata/set17/Card_17_010_ErrataTests.java | 197 ++++++++++++++++++ 3 files changed, 229 insertions(+), 13 deletions(-) create mode 100644 gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_010_ErrataTests.java diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson index becba8087..b2ba94cbb 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set01/set01-Shire-errata.hjson @@ -281,7 +281,7 @@ //Versioning differentiates releases within a particular alt path, such as PC errata // version 1 vs version 2. PC version 2 will not conflict with, say, Decipher version 2. //Top-level cards should always be version 0. - version: 1? + version: 1 collInfo: 1U316 rarity: U setNum: "1" diff --git a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set17/set17-elven-errata.hjson b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set17/set17-elven-errata.hjson index e44276964..fe79a9baa 100644 --- a/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set17/set17-elven-errata.hjson +++ b/gemp-lotr/gemp-lotr-cards/src/main/resources/cards/unofficial/pc/errata/set17/set17-elven-errata.hjson @@ -54,21 +54,40 @@ phase: maneuver cost: [ { - type: conditional - requires: { - type: canSpot - count: 1 - filter: HasAnyTokens,self - } - effect: [ + type: Choice + texts: [ + "1" + "2" + ] + effects: [ { - type: removeTokens - culture: elven - filter: self + type: conditional + requires: { + type: cantSpot + count: 1 + filter: HasAnyTokens,self + } + effect: [ + { + type: discard + filter: self + } + ] } { - type: discard - filter: self + type: conditional + requires: { + type: canSpot + count: 1 + filter: HasAnyTokens,self + } + effect: [ + { + type: removeTokens + count: 1 + filter: self + } + ] } ] } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_010_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_010_ErrataTests.java new file mode 100644 index 000000000..b95da79cd --- /dev/null +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set17/Card_17_010_ErrataTests.java @@ -0,0 +1,197 @@ +package com.gempukku.lotro.cards.unofficial.pc.errata.set17; + +import com.gempukku.lotro.cards.GenericCardTestHelper; +import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.CardNotFoundException; +import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import org.junit.Test; + +import java.util.HashMap; + +import static org.junit.Assert.assertEquals; +import static org.junit.Assert.assertTrue; + +public class Card_17_010_ErrataTests +{ + + protected GenericCardTestHelper GetScenario() throws CardNotFoundException, DecisionResultInvalidException { + return new GenericCardTestHelper( + new HashMap<>() + {{ + put("namarie", "67_10"); + put("legolas", "15_19"); + put("gimli", "18_1"); + put("aragorn", "15_55"); + + put("mauhur", "15_164"); + put("bladetip", "1_209"); + }}, + GenericCardTestHelper.FellowshipSites, + GenericCardTestHelper.FOTRFrodo, + GenericCardTestHelper.FOTRRing + ); + } + + @Test + public void NamarieStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + + /** + * Set: 17 + * Title: Namarie + * Unique: True + * Side: FREE_PEOPLE + * Culture: Elven + * Twilight Cost: 2 + * Type: condition + * Subtype: Support Area + * Game Text: When you play this, add an [elven] token here for each hunter you can spot (limit 3). + * Maneuver: Discard this condition (or remove a token from here) and discard a card from hand to discard a condition. + */ + + //Pre-game setup + var scn = GetScenario(); + + var namarie = scn.GetFreepsCard("namarie"); + + assertTrue(namarie.getBlueprint().isUnique()); + assertEquals(Side.FREE_PEOPLE, namarie.getBlueprint().getSide()); + assertEquals(Culture.ELVEN, namarie.getBlueprint().getCulture()); + assertEquals(CardType.CONDITION, namarie.getBlueprint().getCardType()); + assertTrue(scn.HasKeyword(namarie, Keyword.SUPPORT_AREA)); + assertEquals(2, namarie.getBlueprint().getTwilightCost()); + } + + @Test + public void NamarieLimitedTo3TokensOnPlay() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var namarie = scn.GetFreepsCard("namarie"); + scn.FreepsMoveCardToHand(namarie); + scn.FreepsMoveCharToTable("legolas", "gimli", "aragorn"); + + scn.ShadowMoveCharToTable("mauhur"); + + scn.StartGame(); + + assertTrue(scn.FreepsPlayAvailable(namarie)); + scn.FreepsPlayCard(namarie); + + //Capped at 3 + assertEquals(3, scn.GetCultureTokensOn(namarie)); + } + + @Test + public void NamarieSpotsShadowHunter() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var namarie = scn.GetFreepsCard("namarie"); + scn.FreepsMoveCardToHand(namarie); + scn.FreepsMoveCharToTable("legolas"); + + scn.ShadowMoveCharToTable("mauhur"); + + scn.StartGame(); + + assertTrue(scn.FreepsPlayAvailable(namarie)); + scn.FreepsPlayCard(namarie); + + //Capped at 3 + assertEquals(2, scn.GetCultureTokensOn(namarie)); + } + + @Test + public void ManeuverActionRemovesTokenIfAvailableToDiscardCondition() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var namarie = scn.GetFreepsCard("namarie"); + var gimli = scn.GetFreepsCard("gimli"); + var legolas = scn.GetFreepsCard("legolas"); + scn.FreepsMoveCardToHand(namarie, gimli, legolas); + + var bladetip = scn.GetShadowCard("bladetip"); + scn.ShadowMoveCardToSupportArea(bladetip); + scn.ShadowMoveCharToTable("mauhur"); + + scn.StartGame(); + + assertTrue(scn.FreepsPlayAvailable(namarie)); + scn.FreepsPlayCard(namarie); + + assertEquals(1, scn.GetCultureTokensOn(namarie)); + assertEquals(Zone.SUPPORT, namarie.getZone()); + assertEquals(Zone.SUPPORT, bladetip.getZone()); + assertEquals(Zone.HAND, gimli.getZone()); + assertEquals(Zone.HAND, legolas.getZone()); + assertEquals(2, scn.GetFreepsHandCount()); + assertEquals(0, scn.GetFreepsDiscardCount()); + + scn.SkipToPhase(Phase.MANEUVER); + + assertTrue(scn.FreepsActionAvailable(namarie)); + scn.FreepsUseCardAction(namarie); + + //Card to discard from hand + assertEquals(2, scn.GetFreepsCardChoiceCount()); + scn.FreepsChooseCard(gimli); + assertEquals(Zone.DISCARD, gimli.getZone()); + assertEquals(Zone.HAND, legolas.getZone()); + assertEquals(Zone.SUPPORT, namarie.getZone()); + assertEquals(1, scn.GetFreepsHandCount()); + assertEquals(1, scn.GetFreepsDiscardCount()); + + //Condition to discard from play + assertEquals(2, scn.GetFreepsCardChoiceCount()); + scn.FreepsChooseCard(bladetip); + assertEquals(Zone.SUPPORT, namarie.getZone()); + assertEquals(Zone.DISCARD, bladetip.getZone()); + + } + + @Test + public void ManeuverActionSelfDiscardsIfNoTokensAvailableToDiscardCondition() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var namarie = scn.GetFreepsCard("namarie"); + var gimli = scn.GetFreepsCard("gimli"); + var legolas = scn.GetFreepsCard("legolas"); + scn.FreepsMoveCardToHand(gimli, legolas); + scn.FreepsMoveCardToSupportArea(namarie); + + var bladetip = scn.GetShadowCard("bladetip"); + scn.ShadowMoveCardToSupportArea(bladetip); + scn.ShadowMoveCharToTable("mauhur"); + + scn.StartGame(); + + assertEquals(0, scn.GetCultureTokensOn(namarie)); + assertEquals(Zone.SUPPORT, namarie.getZone()); + assertEquals(Zone.SUPPORT, bladetip.getZone()); + assertEquals(Zone.HAND, gimli.getZone()); + assertEquals(Zone.HAND, legolas.getZone()); + assertEquals(2, scn.GetFreepsHandCount()); + assertEquals(0, scn.GetFreepsDiscardCount()); + + scn.SkipToPhase(Phase.MANEUVER); + + assertTrue(scn.FreepsActionAvailable(namarie)); + scn.FreepsUseCardAction(namarie); + + //Card to discard from hand + assertEquals(2, scn.GetFreepsCardChoiceCount()); + scn.FreepsChooseCard(gimli); + assertEquals(Zone.DISCARD, gimli.getZone()); + assertEquals(Zone.HAND, legolas.getZone()); + assertEquals(Zone.DISCARD, namarie.getZone()); + assertEquals(1, scn.GetFreepsHandCount()); + assertEquals(2, scn.GetFreepsDiscardCount()); + + //Condition to discard from play; only blade tip remains + assertEquals(Zone.DISCARD, namarie.getZone()); + assertEquals(Zone.DISCARD, bladetip.getZone()); + + } +}