From e3d3ce684326a9d6d92de62ca1a85ecd5ee509bc Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Sun, 23 Mar 2025 18:39:34 -0500 Subject: [PATCH] Helpless errata, Pale Blade, Band of Wild Men unit tests --- .../official/set01/Card_01_221_Tests.java | 65 +++++++++-- .../official/set04/Card_04_004_Tests.java | 80 ++++++++++++-- .../errata/set02/Card_02_076_ErrataTests.java | 101 ++++++++++++++++-- 3 files changed, 213 insertions(+), 33 deletions(-) diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_221_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_221_Tests.java index 3757ade43..4bed139d0 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_221_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_221_Tests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.official.set01; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -18,8 +17,14 @@ public class Card_01_221_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "1_221"); - // put other cards in here as needed for the test case + put("paleblade", "1_221"); + put("twk", "1_237"); + + put("gimli", "1_13"); + put("condition1", "1_16"); + put("condition2", "1_21"); + put("condition3", "2_1"); + put("condition4", "2_9"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -45,7 +50,7 @@ public class Card_01_221_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("paleblade"); assertEquals("The Pale Blade", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -58,18 +63,56 @@ public class Card_01_221_Tests assertEquals(3, card.getBlueprint().getStrength()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void ThePaleBladeTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void ThePaleBladeCanBeTriggeredMultipleTimesFromSameVictory() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var twk = scn.GetShadowCard("twk"); + var paleblade = scn.GetShadowCard("paleblade"); + scn.ShadowMoveCharToTable(twk); + scn.AttachCardsTo(twk, paleblade); + + var gimli = scn.GetFreepsCard("gimli"); + var condition1 = scn.GetFreepsCard("condition1"); + var condition2 = scn.GetFreepsCard("condition2"); + var condition3 = scn.GetFreepsCard("condition3"); + var condition4 = scn.GetFreepsCard("condition4"); + scn.FreepsMoveCharToTable(gimli); + scn.FreepsMoveCardToSupportArea(condition1, condition2, condition3, condition4); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(gimli, twk); + scn.FreepsResolveSkirmish(gimli); + assertEquals(Zone.SUPPORT, condition1.getZone()); + assertEquals(Zone.SUPPORT, condition2.getZone()); + assertEquals(Zone.SUPPORT, condition3.getZone()); + assertEquals(Zone.SUPPORT, condition4.getZone()); + assertEquals(0, scn.GetWoundsOn(twk)); + + scn.PassCurrentPhaseActions(); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(1, scn.GetWoundsOn(twk)); + scn.ShadowChooseCard(condition1); + assertEquals(Zone.DISCARD, condition1.getZone()); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(2, scn.GetWoundsOn(twk)); + scn.ShadowChooseCard(condition2); + assertEquals(Zone.DISCARD, condition2.getZone()); + + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertEquals(3, scn.GetWoundsOn(twk)); + scn.ShadowChooseCard(condition3); + assertEquals(Zone.DISCARD, condition3.getZone()); + + assertFalse(scn.ShadowHasOptionalTriggerAvailable()); + assertEquals(Phase.ASSIGNMENT, scn.GetCurrentPhase()); - assertEquals(2, scn.GetTwilight()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_004_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_004_Tests.java index f9c2b8fe9..6b22b7c05 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_004_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set04/Card_04_004_Tests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.official.set04; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -18,8 +17,10 @@ public class Card_04_004_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "4_4"); - // put other cards in here as needed for the test case + put("band", "4_4"); + + put("sam", "1_311"); + put("gimli", "1_13"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -47,7 +48,7 @@ public class Card_04_004_Tests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("band"); assertEquals("Band of Wild Men", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -62,18 +63,75 @@ public class Card_04_004_Tests assertEquals(3, card.getBlueprint().getSiteNumber()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void BandofWildMenTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void BandofWildMenBecomesFierceIfWinningSkirmishNormally() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var band = scn.GetShadowCard("band"); + scn.ShadowMoveCharToTable(band); + + var gimli = scn.GetFreepsCard("gimli"); + scn.FreepsMoveCharToTable(gimli); scn.StartGame(); - scn.FreepsPlayCard(card); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(gimli, band); + scn.FreepsResolveSkirmish(gimli); + scn.PassCurrentPhaseActions(); - assertEquals(5, scn.GetTwilight()); + assertFalse(scn.hasKeyword(band, Keyword.FIERCE)); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertTrue(scn.hasKeyword(band, Keyword.FIERCE)); + } + + @Test + public void BandofWildMenBecomesFierceIfWinningSkirmishWithOverwhelm() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var band = scn.GetShadowCard("band"); + scn.ShadowMoveCharToTable(band); + + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); + + scn.StartGame(); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(sam, band); + scn.FreepsResolveSkirmish(sam); + scn.PassCurrentPhaseActions(); + + assertFalse(scn.hasKeyword(band, Keyword.FIERCE)); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertTrue(scn.hasKeyword(band, Keyword.FIERCE)); + } + + @Test + public void BandofWildMenBecomesFierceIfWinningSkirmishKillsOpponentWithWound() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var band = scn.GetShadowCard("band"); + scn.ShadowMoveCharToTable(band); + + var gimli = scn.GetFreepsCard("gimli"); + scn.FreepsMoveCharToTable(gimli); + + scn.StartGame(); + + scn.AddWoundsToChar(gimli, 2); + + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(gimli, band); + scn.FreepsResolveSkirmish(gimli); + scn.PassCurrentPhaseActions(); + + assertFalse(scn.hasKeyword(band, Keyword.FIERCE)); + assertTrue(scn.ShadowHasOptionalTriggerAvailable()); + scn.ShadowAcceptOptionalTrigger(); + assertTrue(scn.hasKeyword(band, Keyword.FIERCE)); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_076_ErrataTests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_076_ErrataTests.java index dcd23b8e8..afcc6e598 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_076_ErrataTests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/unofficial/pc/errata/set02/Card_02_076_ErrataTests.java @@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.errata.set02; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; import com.gempukku.lotro.game.CardNotFoundException; -import com.gempukku.lotro.game.PhysicalCardImpl; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; import org.junit.Test; @@ -18,8 +17,10 @@ public class Card_02_076_ErrataTests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "52_76"); - // put other cards in here as needed for the test case + put("sam", "1_311"); + put("helpless", "52_76"); + put("toto", "10_68"); + put("nelya","1_233"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -45,7 +46,7 @@ public class Card_02_076_ErrataTests var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsCard("helpless"); assertEquals("Helpless", card.getBlueprint().getTitle()); assertNull(card.getBlueprint().getSubtitle()); @@ -57,18 +58,96 @@ public class Card_02_076_ErrataTests assertEquals(1, card.getBlueprint().getTwilightCost()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void HelplessTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void HelplessBlocksSpecialAbilities() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); + + var helpless = scn.GetShadowCard("helpless"); + var nelya = scn.GetShadowCard("nelya"); + scn.ShadowAttachCardsTo(sam, helpless); + scn.ShadowMoveCharToTable(nelya); scn.StartGame(); - scn.FreepsPlayCard(card); + //The Fellowship burden-removing special ability should be blocked + assertFalse(scn.FreepsActionAvailable(sam)); - assertEquals(1, scn.GetTwilight()); + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(frodo, nelya); + scn.FreepsResolveSkirmish(frodo); + scn.PassCurrentPhaseActions(); + + //The Response ring-bearer special ability should also be blocked + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); } + + @Test + public void HelplessDoesNotBlockAbilitiesWhileInSupportArea() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); + + var helpless = scn.GetShadowCard("helpless"); + var nelya = scn.GetShadowCard("nelya"); + scn.ShadowMoveCardToSupportArea(helpless); + scn.ShadowMoveCharToTable(nelya); + + scn.StartGame(); + //The Fellowship burden-removing special ability should NOT be blocked + assertTrue(scn.FreepsActionAvailable(sam)); + + scn.SkipToAssignments(); + scn.FreepsAssignToMinions(frodo, nelya); + scn.FreepsResolveSkirmish(frodo); + scn.PassCurrentPhaseActions(); + + //The Response ring-bearer special ability should also NOT be blocked + assertTrue(scn.FreepsHasOptionalTriggerAvailable()); + } + + @Test + public void HelplessManeuverActionTransfersToRingBoundCompanion() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var sam = scn.GetFreepsCard("sam"); + scn.FreepsMoveCharToTable(sam); + + var helpless = scn.GetShadowCard("helpless"); + var toto = scn.GetShadowCard("toto"); + var nelya = scn.GetShadowCard("nelya"); + scn.ShadowMoveCardToSupportArea(helpless); + scn.ShadowMoveCharToTable(toto, nelya); + + scn.StartGame(); + + scn.SkipToPhase(Phase.MANEUVER); + scn.FreepsPassCurrentPhaseAction(); + + assertTrue(scn.ShadowActionAvailable(helpless)); + assertEquals(0, scn.GetWoundsOn(toto)); + assertEquals(0, scn.GetWoundsOn(nelya)); + assertEquals(Zone.SUPPORT, helpless.getZone()); + + scn.ShadowUseCardAction(helpless); + assertEquals(2, scn.ShadowGetCardChoiceCount()); + scn.ShadowChooseCard(toto); + assertEquals(1, scn.GetWoundsOn(toto)); + assertEquals(0, scn.GetWoundsOn(nelya)); + + //Can go on either Sam or Frodo + assertEquals(2, scn.ShadowGetCardChoiceCount()); + scn.ShadowChooseCard(frodo); + assertEquals(Zone.ATTACHED, helpless.getZone()); + assertEquals(frodo, helpless.getAttachedTo()); + } + }