From fc067ce2814f30d68fe088f782d41aa4fc0d30b4 Mon Sep 17 00:00:00 2001 From: Christian 'ketura' McCarty Date: Thu, 26 Sep 2024 00:20:41 -0500 Subject: [PATCH] Adding unit tests for The Ruling Ring and Isildur's Bane --- .../official/set01/Card_01_001_Tests.java | 156 +++++++++++-- .../official/set01/Card_01_002_Tests.java | 213 ++++++++++++++++-- 2 files changed, 343 insertions(+), 26 deletions(-) diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_001_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_001_Tests.java index 4987d6618..076b06276 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_001_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_001_Tests.java @@ -2,12 +2,19 @@ package com.gempukku.lotro.cards.official.set01; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.AbstractActionProxy; import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.effects.PutOnTheOneRingEffect; +import com.gempukku.lotro.logic.timing.Action; import org.junit.Test; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import static org.junit.Assert.*; @@ -18,17 +25,26 @@ public class Card_01_001_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "1_1"); - // put other cards in here as needed for the test case + put("sword", "1_299"); + //Shadow wounding + put("snuffler", "13_52"); + //Maneuver wounding + put("picket", "6_101"); + //Archery wounding + put("marksman", "1_176"); + //Skirmish wounding + put("soldier", "1_271"); + //Regroup wounding + put("gollum", "9_28"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, - GenericCardTestHelper.RulingRing + "1_1" ); } @Test - public void TheOneRingStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + public void IsildursBaneStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { /** * Set: 1 @@ -47,8 +63,7 @@ public class Card_01_001_Tests var scn = GetScenario(); //Use this once you have set the deck up properly - //var card = scn.GetFreepsRing(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsRing(); assertEquals("The One Ring", card.getBlueprint().getTitle()); assertEquals("Isildur's Bane", card.getBlueprint().getSubtitle()); @@ -58,18 +73,133 @@ public class Card_01_001_Tests assertEquals(1, card.getBlueprint().getVitality()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void TheOneRingTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void IsildursBaneConvertsWoundsTo2BurdensDuringAnyPhaseWhenRingIsWorn() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + scn.FreepsAttachCardsTo(frodo, "sword"); + + var marksman = scn.GetShadowCard("marksman"); + var soldier = scn.GetShadowCard("soldier"); + var picket = scn.GetShadowCard("picket"); + var snuffler = scn.GetShadowCard("snuffler"); + var gollum = scn.GetShadowCard("gollum"); + scn.ShadowMoveCharToTable(marksman, soldier, picket, gollum); + scn.ShadowMoveCardToHand(snuffler); + + //Cheat and add an ability to Frodo which puts on the One Ring + scn.ApplyAdHocAction(new AbstractActionProxy() { + @Override + public List getPhaseActions(String playerId, LotroGame game) { + ActivateCardAction action = new ActivateCardAction(frodo); + action.appendEffect(new PutOnTheOneRingEffect()); + return Collections.singletonList(action); + } + }); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + scn.FreepsUseCardAction(frodo); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.FreepsPassCurrentPhaseAction(); + + //Shadow wounds can convert to burdens + assertTrue(scn.RBWearingOneRing()); + assertTrue(scn.ShadowPlayAvailable(snuffler)); + scn.ShadowPlayCard(snuffler); + assertEquals(3, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.ShadowPassCurrentPhaseAction(); + + //Maneuver wounds can convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(picket); + scn.FreepsDeclineOptionalTrigger(); + assertEquals(5, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Archery wounds can convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.PassCurrentPhaseActions(); + + assertEquals(7, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + //Assignment phase + scn.PassCurrentPhaseActions(); + scn.FreepsDeclineAssignments(); + scn.ShadowAssignToMinions(frodo, soldier); + + scn.FreepsResolveSkirmish(frodo); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(soldier); + + //We are now in a skirmish phase, so the burden should have gotten converted + assertTrue(scn.RBWearingOneRing()); + assertEquals(9, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + //Have to cheat because we're out of resistance haha + scn.RemoveBurdens(9); + + scn.PassCurrentPhaseActions(); + + //Regular skirmish wound converted to burden + assertEquals(2, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + //Got taken off at the start of the regroup phase + assertFalse(scn.RBWearingOneRing()); + scn.FreepsUseCardAction(frodo); + assertTrue(scn.RBWearingOneRing()); + + //Regroup wounds cannot convert to burdens + scn.ShadowChooseAction("wound"); //We want DaD's wounding action, not his 3 twilight action + assertEquals(4, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + } + + @Test + public void IsildursBaneRespondsToAnyWoundToWearRingUntilRegroup() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + var picket = scn.GetShadowCard("picket"); + scn.ShadowMoveCharToTable(picket); + + scn.StartGame(); + + scn.SkipToPhase(Phase.MANEUVER); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertFalse(scn.RBWearingOneRing()); + + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(picket); + scn.FreepsDeclineOptionalTrigger(); //Declining the Picket's culture selection. + + //One Ring response + assertTrue(scn.FreepsHasOptionalTriggerAvailable()); + + scn.FreepsAcceptOptionalTrigger(); + assertEquals(3, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + assertTrue(scn.RBWearingOneRing()); } } diff --git a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_002_Tests.java b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_002_Tests.java index 50bd89f38..b2943b446 100644 --- a/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_002_Tests.java +++ b/gemp-lotr/gemp-lotr-server/src/test/java/com/gempukku/lotro/cards/official/set01/Card_01_002_Tests.java @@ -2,12 +2,19 @@ package com.gempukku.lotro.cards.official.set01; import com.gempukku.lotro.cards.GenericCardTestHelper; import com.gempukku.lotro.common.*; +import com.gempukku.lotro.game.AbstractActionProxy; import com.gempukku.lotro.game.CardNotFoundException; import com.gempukku.lotro.game.PhysicalCardImpl; +import com.gempukku.lotro.game.state.LotroGame; +import com.gempukku.lotro.logic.actions.ActivateCardAction; import com.gempukku.lotro.logic.decisions.DecisionResultInvalidException; +import com.gempukku.lotro.logic.effects.PutOnTheOneRingEffect; +import com.gempukku.lotro.logic.timing.Action; import org.junit.Test; +import java.util.Collections; import java.util.HashMap; +import java.util.List; import static org.junit.Assert.*; @@ -18,8 +25,17 @@ public class Card_01_002_Tests return new GenericCardTestHelper( new HashMap<>() {{ - put("card", "1_2"); - // put other cards in here as needed for the test case + put("sword", "1_299"); + //Shadow wounding + put("snuffler", "13_52"); + //Maneuver wounding + put("picket", "6_101"); + //Archery wounding + put("marksman", "1_176"); + //Skirmish wounding + put("soldier", "1_271"); + //Regroup wounding + put("gollum", "9_28"); }}, GenericCardTestHelper.FellowshipSites, GenericCardTestHelper.FOTRFrodo, @@ -28,7 +44,7 @@ public class Card_01_002_Tests } @Test - public void TheOneRingStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { + public void RulingRingStatsAndKeywordsAreCorrect() throws DecisionResultInvalidException, CardNotFoundException { /** * Set: 1 @@ -37,7 +53,7 @@ public class Card_01_002_Tests * Side: * Culture: * Twilight Cost: - * Type: Onering + * Type: One Ring * Subtype: * Strength: 1 * Game Text: Response: If bearer is about to take a wound in a skirmish, he wears The One Ring until the regroup phase.
While wearing The One Ring, each time the Ring-bearer is about to take a wound during a skirmish, add a burden instead. @@ -46,8 +62,7 @@ public class Card_01_002_Tests var scn = GetScenario(); //Use this once you have set the deck up properly - //var card = scn.GetFreepsRing(); - var card = scn.GetFreepsCard("card"); + var card = scn.GetFreepsRing(); assertEquals("The One Ring", card.getBlueprint().getTitle()); assertEquals("The Ruling Ring", card.getBlueprint().getSubtitle()); @@ -56,18 +71,190 @@ public class Card_01_002_Tests assertEquals(1, card.getBlueprint().getStrength()); } - // Uncomment any @Test markers below once this is ready to be used - //@Test - public void TheOneRingTest1() throws DecisionResultInvalidException, CardNotFoundException { + @Test + public void RulingRingConvertsWoundsOnlyDuringSkirmishPhaseWhenRingIsWorn() throws DecisionResultInvalidException, CardNotFoundException { //Pre-game setup var scn = GetScenario(); - var card = scn.GetFreepsCard("card"); - scn.FreepsMoveCardToHand(card); + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + var marksman = scn.GetShadowCard("marksman"); + var soldier = scn.GetShadowCard("soldier"); + var picket = scn.GetShadowCard("picket"); + var snuffler = scn.GetShadowCard("snuffler"); + var gollum = scn.GetShadowCard("gollum"); + scn.ShadowMoveCharToTable(marksman, soldier, picket, gollum); + scn.ShadowMoveCardToHand(snuffler); + + //Cheat and add an ability to Frodo which puts on the One Ring + scn.ApplyAdHocAction(new AbstractActionProxy() { + @Override + public List getPhaseActions(String playerId, LotroGame game) { + ActivateCardAction action = new ActivateCardAction(frodo); + action.appendEffect(new PutOnTheOneRingEffect()); + return Collections.singletonList(action); + } + }); scn.StartGame(); - scn.FreepsPlayCard(card); - assertEquals(0, scn.GetTwilight()); + scn.FreepsUseCardAction(frodo); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.FreepsPassCurrentPhaseAction(); + + //Shadow wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + assertTrue(scn.ShadowPlayAvailable(snuffler)); + scn.ShadowPlayCard(snuffler); + assertEquals(1, scn.GetBurdens()); + assertEquals(1, scn.GetWoundsOn(frodo)); + + scn.ShadowPassCurrentPhaseAction(); + + //Maneuver wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(picket); + scn.FreepsDeclineOptionalTrigger(); + assertEquals(1, scn.GetBurdens()); + assertEquals(2, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Archery wounds cannot convert to burdens + assertTrue(scn.RBWearingOneRing()); + scn.PassCurrentPhaseActions(); + + assertEquals(1, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + //Assignment phase + scn.PassCurrentPhaseActions(); + scn.FreepsDeclineAssignments(); + scn.ShadowAssignToMinions(frodo, soldier); + + scn.FreepsResolveSkirmish(frodo); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(soldier); + + //We are now in a skirmish phase, so the burden should have gotten converted + assertTrue(scn.RBWearingOneRing()); + assertEquals(2, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Regular skirmish wound converted to burden + assertEquals(3, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + //Got taken off at the start of the regroup phase + assertFalse(scn.RBWearingOneRing()); + scn.FreepsUseCardAction(frodo); + assertTrue(scn.RBWearingOneRing()); + + //We cheat because there's too many wounds + scn.RemoveWoundsFromChar(frodo, 4); + + //Regroup wounds cannot convert to burdens + scn.ShadowChooseAction("wound"); //We want DaD's wounding action, not his 3 twilight action + assertEquals(3, scn.GetBurdens()); + assertEquals(1, scn.GetWoundsOn(frodo)); + } + + @Test + public void RulingRingRespondsOnlyDuringSkirmishPhase() throws DecisionResultInvalidException, CardNotFoundException { + //Pre-game setup + var scn = GetScenario(); + + var frodo = scn.GetRingBearer(); + var ring = scn.GetFreepsRing(); + + var marksman = scn.GetShadowCard("marksman"); + var soldier = scn.GetShadowCard("soldier"); + var picket = scn.GetShadowCard("picket"); + var snuffler = scn.GetShadowCard("snuffler"); + var gollum = scn.GetShadowCard("gollum"); + scn.ShadowMoveCharToTable(marksman, soldier, picket, gollum); + scn.ShadowMoveCardToHand(snuffler); + + scn.StartGame(); + + assertEquals(1, scn.GetBurdens()); + assertEquals(0, scn.GetWoundsOn(frodo)); + + scn.FreepsPassCurrentPhaseAction(); + + //Shadow wounds cannot convert to burdens + assertFalse(scn.RBWearingOneRing()); + assertTrue(scn.ShadowPlayAvailable(snuffler)); + scn.ShadowPlayCard(snuffler); + + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); + assertEquals(1, scn.GetBurdens()); + assertEquals(1, scn.GetWoundsOn(frodo)); + + scn.ShadowPassCurrentPhaseAction(); + + //Maneuver wounds cannot convert to burdens + assertFalse(scn.RBWearingOneRing()); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(picket); + scn.FreepsDeclineOptionalTrigger(); //Picket's text + + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); + assertEquals(1, scn.GetBurdens()); + assertEquals(2, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Archery wounds cannot convert to burdens + assertFalse(scn.RBWearingOneRing()); + scn.PassCurrentPhaseActions(); + + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); + assertEquals(1, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + //Assignment phase + scn.PassCurrentPhaseActions(); + scn.FreepsDeclineAssignments(); + scn.ShadowAssignToMinions(frodo, soldier); + + scn.FreepsResolveSkirmish(frodo); + scn.FreepsPassCurrentPhaseAction(); + scn.ShadowUseCardAction(soldier); + + //We are now in a skirmish phase, so the response should now be active + assertTrue(scn.FreepsHasOptionalTriggerAvailable()); + scn.FreepsAcceptOptionalTrigger(); + assertTrue(scn.RBWearingOneRing()); + assertEquals(2, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + scn.PassCurrentPhaseActions(); + + //Regular skirmish wound converted to burden + assertEquals(3, scn.GetBurdens()); + assertEquals(3, scn.GetWoundsOn(frodo)); + + assertEquals(Phase.REGROUP, scn.GetCurrentPhase()); + //Got taken off at the start of the regroup phase + assertFalse(scn.RBWearingOneRing()); + scn.FreepsPassCurrentPhaseAction(); + + //We cheat because there's too many wounds + scn.RemoveWoundsFromChar(frodo, 4); + + //Regroup wounds cannot convert to burdens + scn.ShadowChooseAction("wound"); //We want DaD's wounding action, not his 3 twilight action + assertFalse(scn.FreepsHasOptionalTriggerAvailable()); + assertEquals(3, scn.GetBurdens()); + assertEquals(1, scn.GetWoundsOn(frodo)); } }