V2 test cases + upgrades to the test case rig

- Finally added support to some of the simpler test functions like FreepsChooseCard and FreepsChooseAny, so that the tester doesn't have to remember the nuances between things like choosing active cards and choosing BP ids from hidden zones.
This commit is contained in:
Christian 'ketura' McCarty
2025-04-12 23:08:38 -05:00
parent 467994709c
commit 5be83cfb4d
13 changed files with 505 additions and 80 deletions

View File

@@ -34,14 +34,14 @@
requires: [
{
type: HasCardStacked
filter: playable, unique, culture(moria), minion
filter: playable, unique, minion
on: self
}
]
effect: [
{
type: ChooseCardsFromSingleStack
select: choose(playable, unique, culture(moria), minion)
select: choose(playable, unique, minion)
count: 1
on: self
memorize: chosenMinion

View File

@@ -332,10 +332,18 @@ public class GenericCardTestHelper extends AbstractAtTest {
}
public List<String> FreepsGetBPChoices() { return GetADParamAsList(P1, "blueprintId"); }
public List<String> ShadowGetBPChoices() { return GetADParamAsList(P2, "blueprintId"); }
public List<String> FreepsGetActionChoices() { return GetADParamAsList(P1, "actionId"); }
public List<String> ShadowGetActionChoices() { return GetADParamAsList(P2, "actionId"); }
public List<String> FreepsGetMultipleChoices() { return GetADParamAsList(P1, "results"); }
public List<String> ShadowGetMultipleChoices() { return GetADParamAsList(P2, "results"); }
public int FreepsGetChoiceCount() { return GetADParamAsList(P1, "results").size(); }
public int ShadowGetChoiceCount() { return GetADParamAsList(P2, "results").size(); }
public int FreepsGetChoiceCount() { return GetChoiceCount(FreepsGetMultipleChoices()); }
public int ShadowGetChoiceCount() { return GetChoiceCount(ShadowGetMultipleChoices()); }
public int GetChoiceCount(List<String> list) {
if(list == null)
return 0;
return list.size();
}
public List<String> FreepsGetFreepsAssignmentTargets() { return GetADParamAsList(P1, "freeCharacters"); }
public List<String> FreepsGetShadowAssignmentTargets() { return GetADParamAsList(P1, "minions"); }
@@ -344,7 +352,13 @@ public class GenericCardTestHelper extends AbstractAtTest {
public List<String> ShadowGetShadowAssignmentTargets() { return GetADParamAsList(P2, "minions"); }
public List<String> FreepsGetADParamAsList(String paramName) { return GetADParamAsList(P1, paramName); }
public List<String> ShadowGetADParamAsList(String paramName) { return GetADParamAsList(P2, paramName); }
public List<String> GetADParamAsList(String playerID, String paramName) { return Arrays.asList(GetAwaitingDecisionParam(playerID, paramName)); }
public List<String> GetADParamAsList(String playerID, String paramName) {
var paramList = GetAwaitingDecisionParam(playerID, paramName);
if(paramList == null)
return null;
return Arrays.asList(paramList);
}
public int GetADParamEqualsCount(String playerID, String paramName, String value) {
return (int) Arrays.stream(GetAwaitingDecisionParam(playerID, paramName)).filter(s -> s.equals(value)).count();
@@ -753,6 +767,21 @@ public class GenericCardTestHelper extends AbstractAtTest {
PassCurrentPhaseActions();
}
public void SkipPassedAllAssignments() throws DecisionResultInvalidException {
SkipToAssignments();
if(FreepsDecisionAvailable("Assign minions to companions or allies at home")) {
FreepsDeclineAssignments();
}
if(ShadowDecisionAvailable("Assign minions to companions or allies at home")) {
ShadowDeclineAssignments();
}
if(FreepsDecisionAvailable("Assignment action")) {
PassFierceAssignmentActions();
FreepsDeclineAssignments();
ShadowDeclineAssignments();
}
}
public void SkipToArcheryWounds() throws DecisionResultInvalidException {
SkipToPhase(Phase.ARCHERY);
PassCurrentPhaseActions();
@@ -833,6 +862,14 @@ public class GenericCardTestHelper extends AbstractAtTest {
}
}
public void PassManeuverActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassArcheryActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassAssignmentActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassFierceAssignmentActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassSkirmishActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassFierceSkirmishActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassRegroupActions() throws DecisionResultInvalidException { PassCurrentPhaseActions(); }
public void PassCurrentPhaseActions() throws DecisionResultInvalidException {
FreepsPassCurrentPhaseAction();
ShadowPassCurrentPhaseAction();
@@ -860,6 +897,16 @@ public class GenericCardTestHelper extends AbstractAtTest {
public void FreepsDeclineAssignments() throws DecisionResultInvalidException { FreepsPassCurrentPhaseAction(); }
public void ShadowDeclineAssignments() throws DecisionResultInvalidException { ShadowPassCurrentPhaseAction(); }
public void FreepsAssignAndResolve(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException {
AssignToMinions(P1, comp, minions);
if(ShadowDecisionAvailable("Assign minions to companions or allies at home")) {
ShadowDeclineAssignments();
}
FreepsResolveSkirmish(comp);
}
public void FreepsAssignToMinions(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { AssignToMinions(P1, comp, minions); }
public void ShadowAssignToMinions(PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException { AssignToMinions(P2, comp, minions); }
public void AssignToMinions(String player, PhysicalCardImpl comp, PhysicalCardImpl...minions) throws DecisionResultInvalidException {
@@ -913,8 +960,22 @@ public class GenericCardTestHelper extends AbstractAtTest {
public void FreepsChooseAnyCard() throws DecisionResultInvalidException { FreepsChoose(FreepsGetCardChoices().getFirst()); }
public void ShadowChooseAnyCard() throws DecisionResultInvalidException { ShadowChoose(ShadowGetCardChoices().getFirst()); }
public void FreepsChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCards(P1, cards); }
public void ShadowChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException { ChooseCards(P2, cards); }
public void FreepsChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
if(GetChoiceCount(FreepsGetBPChoices()) > 0) {
ChooseCardBPFromSelection(P1, cards);
}
else {
ChooseCards(P1, cards);
}
}
public void ShadowChooseCards(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
if(GetChoiceCount(ShadowGetBPChoices()) > 0) {
ChooseCardBPFromSelection(P2, cards);
}
else {
ChooseCards(P2, cards);
}
}
public void ChooseCards(String player, PhysicalCardImpl...cards) throws DecisionResultInvalidException {
String[] ids = new String[cards.length];
@@ -957,7 +1018,32 @@ public class GenericCardTestHelper extends AbstractAtTest {
if(found.contains(card))
continue;
if(card.getBlueprintId() == choices[i])
if(card.getBlueprintId().equals(choices[i]))
{
// I have no idea why the spacing is required, but the BP parser skips to the fourth position
bps.add(" " + i);
found.add(card);
break;
}
}
}
playerDecided(player, String.join(",", bps));
//ChooseCardBPFromSelection(player, Arrays.stream(cards).distinct().map(PhysicalCardImpl::getBlueprintId).toArray(String[]::new));
}
public void ChooseCardBPFromSelection(String player, String...bpids) throws DecisionResultInvalidException {
String[] choices = GetAwaitingDecisionParam(player,"blueprintId");
ArrayList<String> bps = new ArrayList<>();
ArrayList<String> found = new ArrayList<>();
for(int i = 0; i < choices.length; i++)
{
for(String card : bpids)
{
if(found.contains(card))
continue;
if(card.equals(choices[i]))
{
// I have no idea why the spacing is required, but the BP parser skips to the fourth position
bps.add(" " + i);
@@ -973,6 +1059,39 @@ public class GenericCardTestHelper extends AbstractAtTest {
public boolean FreepsHasCardChoiceAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return HasCardChoiceAvailable(P1, card);}
public boolean ShadowHasCardChoiceAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return HasCardChoiceAvailable(P2, card);}
public boolean FreepsHasCardChoicesAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
for(var card : cards) {
if(!HasCardChoiceAvailable(P1, card))
return false;
}
return true;
}
public boolean ShadowHasCardChoicesAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
for(var card : cards) {
if(!HasCardChoiceAvailable(P2, card))
return false;
}
return true;
}
public boolean FreepsHasCardChoiceNotAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return !HasCardChoiceAvailable(P1, card);}
public boolean ShadowHasCardChoicenotAvailable(PhysicalCardImpl card) throws DecisionResultInvalidException { return !HasCardChoiceAvailable(P2, card);}
public boolean FreepsHasCardChoicesNotAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
for(var card : cards) {
if(HasCardChoiceAvailable(P1, card))
return false;
}
return true;
}
public boolean ShadowHasCardChoicesNotAvailable(PhysicalCardImpl...cards) throws DecisionResultInvalidException {
for(var card : cards) {
if(HasCardChoiceAvailable(P2, card))
return false;
}
return true;
}
public boolean HasCardChoiceAvailable(String player, PhysicalCardImpl card) throws DecisionResultInvalidException {
String[] choices = GetAwaitingDecisionParam(player,"blueprintId");
if(choices != null) {
@@ -1156,9 +1275,23 @@ public class GenericCardTestHelper extends AbstractAtTest {
assertTrue(effect.wasCarriedOut());
}
public void FreepsChoose(String choice) throws DecisionResultInvalidException { playerDecided(P1, choice); }
public void FreepsChoose(String choice) throws DecisionResultInvalidException {
if(FreepsGetChoiceCount() > 0) {
FreepsChooseMultipleChoiceOption(choice);
}
else {
playerDecided(P1, choice);
}
}
public void FreepsChoose(String...choices) throws DecisionResultInvalidException { playerDecided(P1, String.join(",", choices)); }
public void ShadowChoose(String choice) throws DecisionResultInvalidException { playerDecided(P2, choice); }
public void ShadowChoose(String choice) throws DecisionResultInvalidException {
if(ShadowGetChoiceCount() > 0) {
ShadowChooseMultipleChoiceOption(choice);
}
else {
playerDecided(P2, choice);
}
}
public void ShadowChoose(String...choices) throws DecisionResultInvalidException { playerDecided(P2, String.join(",", choices)); }
@@ -1208,6 +1341,18 @@ public class GenericCardTestHelper extends AbstractAtTest {
return _game.isFinished();
}
public void FreepsChooseAny() throws DecisionResultInvalidException {
if (GetChoiceCount(FreepsGetActionChoices()) > 0){
ChooseAction(P1, "actionId", FreepsGetActionChoices().getFirst());
}
else if(FreepsGetBPChoices().size() > 1) {
ChooseCardBPFromSelection(P1, FreepsGetBPChoices().getFirst());
}
else {
FreepsResolveRuleFirst();
}
}
public void FreepsResolveRuleFirst() throws DecisionResultInvalidException { FreepsResolveActionOrder(GetADParamAsList(P1, "actionText").getFirst()); }
public void FreepsResolveActionOrder(String option) throws DecisionResultInvalidException { ChooseAction(P1, "actionText", option); }

View File

@@ -179,7 +179,7 @@ public class Card_01_031_Tests
assertEquals(Zone.ATTACHED, asfaloth.getZone());
scn.FreepsPassCurrentPhaseAction();
scn.FreepsChoose("0"); // timing tie between Asfaloth and Site
scn.FreepsChooseAny(); // timing tie between Asfaloth and Site
assertEquals(Zone.DISCARD, asfaloth.getZone());
}

View File

@@ -23,12 +23,12 @@ public class Card_01_055_Tests
put("allyHome6_1", "1_56");
put("runner", "1_178");
put("card1", "1_178");
put("card2", "1_178");
put("card3", "1_178");
put("card4", "1_178");
put("card5", "1_178");
put("card6", "1_178");
put("card1", "1_179");
put("card2", "1_180");
put("card3", "1_181");
put("card4", "1_182");
put("card5", "1_183");
put("card6", "1_184");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -50,7 +50,8 @@ public class Card_01_055_Tests
* Subtype: Support Area
* Game Text: Plays to your support area.
* Each Elf ally whose home is site 6 is strength +1.
* Fellowship: Exert Galadriel to look at 2 of cards at random from an opponent's hand. Discard one and replace the other.
* Maneuver: If an opponent has at least 7 cards in hand, exert Galadriel to look at
* 2 of those cards at random. Discard one and replace the other.
*/
var scn = GetScenario();
@@ -136,8 +137,7 @@ public class Card_01_055_Tests
scn.FreepsDismissRevealedCards();
scn.ShadowDismissRevealedCards();
var card = scn.FreepsGetCardChoices().get(0);
scn.FreepsChoose(card);
scn.FreepsChooseAny();
assertEquals(1, scn.GetWoundsOn(galadriel));
assertEquals(6, scn.GetShadowHandCount());
assertEquals(1, scn.GetShadowDiscardCount());

View File

@@ -137,7 +137,7 @@ public class Card_02_044_Tests
assertFalse(scn.ShadowAnyDecisionsAvailable());
assertEquals(2, scn.FreepsGetCardChoiceCount());
scn.FreepsDismissRevealedCards();
scn.FreepsChooseAnyCard();
scn.FreepsChooseAny();
scn.ShadowMoveCardToSupportArea(business); //slide in No Business between actions
scn.ShadowPassCurrentPhaseAction();

View File

@@ -152,7 +152,7 @@ public class Card_02_044_ErrataTests
assertFalse(scn.ShadowAnyDecisionsAvailable());
assertEquals(2, scn.FreepsGetCardChoiceCount());
scn.FreepsDismissRevealedCards();
scn.FreepsChooseAnyCard();
scn.FreepsChooseAny();
scn.ShadowMoveCardToSupportArea(business); //slide in No Business between actions
scn.ShadowPassCurrentPhaseAction();

View File

@@ -106,7 +106,7 @@ public class Card_V1_022_Tests
assertEquals(Zone.DEAD, aragorn.getZone());
//There is a tie between evaluating a rule (threat rule?) and Gilraen's automatic trigger. Freeps chooses
// to evaluate the rule first (it shouldn't matter for our purposes).
scn.FreepsChoose("0");
scn.FreepsResolveRuleFirst();
assertEquals(Zone.DISCARD, memorial.getZone());
}

View File

@@ -115,7 +115,7 @@ public class Card_V1_024_Tests
scn.PassCurrentPhaseActions();
//Freeps tiebreaker between resolving the skirmish or processing the required trigger for You Have My Sword.
scn.FreepsChoose("0");
scn.FreepsResolveRuleFirst();
assertTrue(scn.FreepsDecisionAvailable("Choose action to perform"));
String[] choices = scn.FreepsGetMultipleChoices().toArray(new String[0]);
@@ -137,7 +137,7 @@ public class Card_V1_024_Tests
scn.PassCurrentPhaseActions();
//Freeps tiebreaker between resolving the skirmish or processing the required trigger for You Have My Sword.
scn.FreepsChoose("0");
scn.FreepsResolveRuleFirst();
assertTrue(scn.FreepsDecisionAvailable("Choose action to perform"));
choices = scn.FreepsGetMultipleChoices().toArray(new String[0]);

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
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,11 @@ public class Card_V2_037_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_37");
// put other cards in here as needed for the test case
put("evil", "102_37");
put("runner", "1_178");
put("balrog", "102_38");
put("sam", "1_311");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -45,7 +47,7 @@ public class Card_V2_037_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("evil");
assertEquals("Ancient Evil", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -57,18 +59,71 @@ public class Card_V2_037_Tests
assertEquals(1, card.getBlueprint().getTwilightCost());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void AncientEvilTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void AncientEvilStacksWinningMoriaCards() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var evil = scn.GetShadowCard("evil");
var runner = scn.GetShadowCard("runner");
var balrog = scn.GetShadowCard("balrog");
scn.ShadowMoveCardToSupportArea(evil);
scn.ShadowMoveCharToTable(runner, balrog);
var sam = scn.GetFreepsCard("sam");
scn.FreepsMoveCharToTable(sam);
scn.StartGame();
scn.FreepsPlayCard(card);
scn.SkipToAssignments();
scn.FreepsAssignAndResolve(sam, runner);
assertEquals(1, scn.GetTwilight());
assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone());
assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone());
scn.PassSkirmishActions();
assertTrue(scn.ShadowHasOptionalTriggerAvailable());
scn.ShadowAcceptOptionalTrigger();
assertEquals(Zone.STACKED, runner.getZone());
assertEquals(evil, runner.getStackedOn());
assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone());
scn.PassFierceAssignmentActions();
scn.FreepsAssignAndResolve(sam, balrog);
scn.PassFierceSkirmishActions();
assertTrue(scn.ShadowHasOptionalTriggerAvailable());
scn.ShadowAcceptOptionalTrigger();
assertEquals(Zone.STACKED, balrog.getZone());
assertEquals(evil, balrog.getStackedOn());
}
@Test
public void AncientEvilPlaysStackedUniqueMoriaMinionsWithDiscountThenSelfDiscards() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var evil = scn.GetShadowCard("evil");
var runner = scn.GetShadowCard("runner");
var balrog = scn.GetShadowCard("balrog");
scn.ShadowMoveCardToSupportArea(evil);
scn.StackCardsOn(evil, runner, balrog);
scn.StartGame();
scn.SetTwilight(17);
scn.FreepsPassCurrentPhaseAction();
assertEquals(Zone.STACKED, runner.getZone());
assertEquals(evil, runner.getStackedOn());
assertEquals(Zone.STACKED, balrog.getZone());
assertEquals(evil, balrog.getStackedOn());
assertEquals(20, scn.GetTwilight());
assertTrue(scn.ShadowActionAvailable(evil));
scn.ShadowUseCardAction(evil);
assertEquals(Zone.SHADOW_CHARACTERS, balrog.getZone());
assertEquals(Zone.DISCARD, evil.getZone());
assertEquals(Zone.DISCARD, runner.getZone());
//20 to start, -14 for balrog, -2 for roaming, +1 for discount of 1 stacked card besides balrog
assertEquals(5, scn.GetTwilight());
}
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
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,11 @@ public class Card_V2_040_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_40");
// put other cards in here as needed for the test case
put("fire", "102_40");
put("runner", "1_178");
put("troll", "1_165");
put("aragorn", "1_89");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -44,7 +46,7 @@ public class Card_V2_040_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("fire");
assertEquals("Through Fire and Water", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -56,18 +58,73 @@ public class Card_V2_040_Tests
assertEquals(0, card.getBlueprint().getTwilightCost());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void ThroughFireandWaterTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void ThroughFireAndWaterRemovesThreatToExertCompanionWhenUniqueMoriaMinionWins() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var fire = scn.GetShadowCard("fire");
var runner = scn.GetShadowCard("runner");
var troll = scn.GetShadowCard("troll");
scn.ShadowMoveCardToSupportArea(fire);
scn.ShadowMoveCharToTable(runner, troll);
var frodo = scn.GetRingBearer();
var aragorn = scn.GetFreepsCard("aragorn");
scn.FreepsMoveCharToTable(aragorn);
scn.StartGame();
scn.FreepsPlayCard(card);
scn.AddThreats(2);
scn.AddWoundsToChar(aragorn, 1);
scn.SkipToAssignments();
scn.FreepsAssignAndResolve(aragorn, runner);
scn.PassSkirmishActions();
assertEquals(0, scn.GetTwilight());
//Runner isn't unique
assertFalse(scn.ShadowHasOptionalTriggerAvailable());
scn.PassFierceAssignmentActions();
scn.FreepsAssignAndResolve(aragorn, troll);
scn.PassFierceSkirmishActions();
assertEquals(2, scn.GetThreats());
assertEquals(0, scn.GetWoundsOn(frodo));
assertTrue(scn.ShadowHasOptionalTriggerAvailable());
scn.ShadowAcceptOptionalTrigger();
assertEquals(1, scn.GetThreats());
assertEquals(1, scn.GetWoundsOn(frodo));
}
@Test
public void ThroughFireAndWaterNeedsAThreat() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var fire = scn.GetShadowCard("fire");
var runner = scn.GetShadowCard("runner");
var troll = scn.GetShadowCard("troll");
scn.ShadowMoveCardToSupportArea(fire);
scn.ShadowMoveCharToTable(runner, troll);
var frodo = scn.GetRingBearer();
var aragorn = scn.GetFreepsCard("aragorn");
scn.FreepsMoveCharToTable(aragorn);
scn.StartGame();
scn.SkipToAssignments();
scn.FreepsAssignAndResolve(aragorn, runner);
scn.PassSkirmishActions();
//Runner isn't unique
assertFalse(scn.ShadowHasOptionalTriggerAvailable());
scn.PassFierceAssignmentActions();
scn.FreepsAssignAndResolve(aragorn, troll);
scn.PassFierceSkirmishActions();
//No threats
assertFalse(scn.ShadowHasOptionalTriggerAvailable());
assertEquals(0, scn.GetWoundsOn(frodo));
}
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
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,11 @@ public class Card_V2_041_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_41");
// put other cards in here as needed for the test case
put("peak", "102_41");
put("runner", "1_178");
put("troll", "1_165");
put("aragorn", "1_89");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -44,7 +46,7 @@ public class Card_V2_041_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("peak");
assertEquals("To Highest Peak", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -56,18 +58,85 @@ public class Card_V2_041_Tests
assertEquals(1, card.getBlueprint().getTwilightCost());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void ToHighestPeakTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void ToHighestPeakDiscardsMinionsToAddThreats() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var peak = scn.GetShadowCard("peak");
var runner = scn.GetShadowCard("runner");
var troll = scn.GetShadowCard("troll");
scn.ShadowMoveCardToHand(peak);
scn.ShadowMoveCharToTable(runner, troll);
var frodo = scn.GetRingBearer();
var aragorn = scn.GetFreepsCard("aragorn");
scn.FreepsMoveCharToTable(aragorn);
scn.StartGame();
scn.FreepsPlayCard(card);
scn.SkipPassedAllAssignments();
assertEquals(Phase.REGROUP, scn.GetCurrentPhase());
scn.FreepsPassCurrentPhaseAction();
assertEquals(0, scn.GetThreats());
assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone());
assertEquals(Zone.SHADOW_CHARACTERS, troll.getZone());
assertTrue(scn.ShadowPlayAvailable(peak));
scn.ShadowPlayCard(peak);
assertEquals(2, scn.ShadowGetCardChoiceCount());
scn.ShadowChooseCards(runner, troll);
assertTrue(scn.FreepsDecisionAvailable("Would you like to exert"));
scn.FreepsChooseNo();
assertEquals(2, scn.GetThreats());
assertEquals(Zone.DISCARD, runner.getZone());
assertEquals(Zone.DISCARD, troll.getZone());
}
@Test
public void ToHighestPeakCanBePreventedByExertingXCompanions() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var peak = scn.GetShadowCard("peak");
var runner = scn.GetShadowCard("runner");
var troll = scn.GetShadowCard("troll");
scn.ShadowMoveCardToHand(peak);
scn.ShadowMoveCharToTable(runner, troll);
var frodo = scn.GetRingBearer();
var aragorn = scn.GetFreepsCard("aragorn");
scn.FreepsMoveCharToTable(aragorn);
scn.StartGame();
scn.SkipPassedAllAssignments();
assertEquals(Phase.REGROUP, scn.GetCurrentPhase());
scn.FreepsPassCurrentPhaseAction();
assertEquals(0, scn.GetThreats());
assertEquals(Zone.SHADOW_CHARACTERS, runner.getZone());
assertEquals(Zone.SHADOW_CHARACTERS, troll.getZone());
assertEquals(0, scn.GetWoundsOn(frodo));
assertEquals(0, scn.GetWoundsOn(aragorn));
assertTrue(scn.ShadowPlayAvailable(peak));
scn.ShadowPlayCard(peak);
assertEquals(2, scn.ShadowGetCardChoiceCount());
scn.ShadowChooseCards(runner, troll);
assertTrue(scn.FreepsDecisionAvailable("Would you like to exert"));
scn.FreepsChooseYes();
assertEquals(0, scn.GetThreats());
assertEquals(Zone.DISCARD, runner.getZone());
assertEquals(Zone.DISCARD, troll.getZone());
assertEquals(1, scn.GetWoundsOn(frodo));
assertEquals(1, scn.GetWoundsOn(aragorn));
assertEquals(1, scn.GetTwilight());
}
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
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,8 @@ public class Card_V2_045_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_45");
// put other cards in here as needed for the test case
put("hope", "102_45");
put("eomer", "4_267");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -47,7 +46,7 @@ public class Card_V2_045_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("hope");
assertEquals("Do Not Trust to Hope", card.getBlueprint().getTitle());
assertNull(card.getBlueprint().getSubtitle());
@@ -59,18 +58,57 @@ public class Card_V2_045_Tests
assertEquals(2, card.getBlueprint().getStrength());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void DoNotTrusttoHopeTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void DoNotTrusttoHopeMakesBearerValiant() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var hope = scn.GetFreepsCard("hope");
var eomer = scn.GetFreepsCard("eomer");
scn.FreepsMoveCardToHand(hope);
scn.FreepsMoveCharToTable(eomer);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(1, scn.GetTwilight());
assertFalse(scn.hasKeyword(eomer, Keyword.VALIANT));
assertTrue(scn.FreepsPlayAvailable(hope));
scn.FreepsPlayCard(hope);
assertEquals(eomer, hope.getAttachedTo());
assertTrue(scn.hasKeyword(eomer, Keyword.VALIANT));
}
@Test
public void DoNotTrusttoHopeWoundsAtStartOfRegroupUnlessDiscarded() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var hope = scn.GetFreepsCard("hope");
var eomer = scn.GetFreepsCard("eomer");
scn.FreepsMoveCharToTable(eomer);
scn.AttachCardsTo(eomer, hope);
scn.StartGame();
scn.SkipToPhase(Phase.REGROUP);
assertTrue(scn.FreepsDecisionAvailable(""));
assertEquals(0, scn.GetWoundsOn(eomer));
assertEquals(Zone.ATTACHED, hope.getZone());
scn.FreepsChoose("Wound");
assertEquals(1, scn.GetWoundsOn(eomer));
assertEquals(Zone.ATTACHED, hope.getZone());
scn.SkipToMovementDecision();
scn.FreepsChooseToMove();
scn.SkipToPhase(Phase.REGROUP);
assertTrue(scn.FreepsDecisionAvailable(""));
assertEquals(1, scn.GetWoundsOn(eomer));
assertEquals(Zone.ATTACHED, hope.getZone());
scn.FreepsChoose("Discard");
assertEquals(1, scn.GetWoundsOn(eomer));
assertEquals(Zone.DISCARD, hope.getZone());
}
}

View File

@@ -3,7 +3,6 @@ package com.gempukku.lotro.cards.unofficial.pc.vsets.set_v02;
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,13 @@ public class Card_V2_047_Tests
return new GenericCardTestHelper(
new HashMap<>()
{{
put("card", "102_47");
// put other cards in here as needed for the test case
put("erkenbrand", "102_47");
put("eowyn", "5_122");
put("elite", "4_265");
put("rider", "4_286");
put("guard", "5_83");
put("veteran", "7_246");
put("dwarfguard", "1_7");
}},
GenericCardTestHelper.FellowshipSites,
GenericCardTestHelper.FOTRFrodo,
@@ -49,7 +53,7 @@ public class Card_V2_047_Tests
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
var card = scn.GetFreepsCard("erkenbrand");
assertEquals("Erkenbrand", card.getBlueprint().getTitle());
assertEquals("Kinsman of the House of Eorl", card.getBlueprint().getSubtitle());
@@ -65,18 +69,75 @@ public class Card_V2_047_Tests
assertEquals(Signet.GANDALF, card.getBlueprint().getSignet());
}
// Uncomment any @Test markers below once this is ready to be used
//@Test
public void ErkenbrandTest1() throws DecisionResultInvalidException, CardNotFoundException {
@Test
public void ErkenbrandBanishes3NonUniqueRohanCompanionsFromDeadPile() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var card = scn.GetFreepsCard("card");
scn.FreepsMoveCardToHand(card);
var frodo = scn.GetRingBearer();
var erkenbrand = scn.GetFreepsCard("erkenbrand");
var eowyn = scn.GetFreepsCard("eowyn");
var elite = scn.GetFreepsCard("elite");
var rider = scn.GetFreepsCard("rider");
var guard = scn.GetFreepsCard("guard");
var veteran = scn.GetFreepsCard("veteran");
var dwarfguard = scn.GetFreepsCard("dwarfguard");
scn.FreepsMoveCardToDeadPile(eowyn, elite, rider, guard, veteran, dwarfguard);
scn.FreepsMoveCardToHand(erkenbrand);
scn.StartGame();
scn.FreepsPlayCard(card);
assertEquals(5, scn.GetTwilight());
assertEquals(Zone.DEAD, eowyn.getZone());
assertEquals(Zone.DEAD, elite.getZone());
assertEquals(Zone.DEAD, rider.getZone());
assertEquals(Zone.DEAD, guard.getZone());
assertEquals(Zone.DEAD, veteran.getZone());
assertEquals(Zone.DEAD, dwarfguard.getZone());
scn.FreepsPlayCard(erkenbrand);
assertEquals(4, scn.FreepsGetCardChoiceCount());
assertTrue(scn.FreepsHasCardChoicesAvailable(elite, rider, guard, veteran));
assertTrue(scn.FreepsHasCardChoicesNotAvailable(eowyn, dwarfguard));
scn.FreepsChooseCards(elite, rider, guard);
assertEquals(Zone.DEAD, eowyn.getZone());
assertEquals(Zone.REMOVED, elite.getZone());
assertEquals(Zone.REMOVED, rider.getZone());
assertEquals(Zone.REMOVED, guard.getZone());
assertEquals(Zone.DEAD, veteran.getZone());
assertEquals(Zone.DEAD, dwarfguard.getZone());
}
@Test
public void ErkenbrandMakesExhaustedCompanionsValiant() throws DecisionResultInvalidException, CardNotFoundException {
//Pre-game setup
var scn = GetScenario();
var frodo = scn.GetRingBearer();
var erkenbrand = scn.GetFreepsCard("erkenbrand");
var elite = scn.GetFreepsCard("elite");
var rider = scn.GetFreepsCard("rider");
var guard = scn.GetFreepsCard("guard");
var veteran = scn.GetFreepsCard("veteran");
var dwarfguard = scn.GetFreepsCard("dwarfguard");
scn.FreepsMoveCharToTable(elite, rider, guard, dwarfguard);
scn.FreepsMoveCardToHand(erkenbrand);
scn.StartGame();
scn.AddWoundsToChar(frodo, 3);
scn.AddWoundsToChar(elite, 2);
scn.AddWoundsToChar(rider, 1);
assertEquals(1, scn.GetVitality(frodo));
assertFalse(scn.hasKeyword(frodo, Keyword.VALIANT));
assertEquals(1, scn.GetVitality(elite));
assertFalse(scn.hasKeyword(elite, Keyword.VALIANT));
assertEquals(2, scn.GetVitality(rider));
assertFalse(scn.hasKeyword(rider, Keyword.VALIANT));
assertEquals(2, scn.GetVitality(dwarfguard));
assertFalse(scn.hasKeyword(dwarfguard, Keyword.VALIANT));
scn.FreepsPlayCard(erkenbrand);
}
}