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:
@@ -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
|
||||
|
||||
@@ -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); }
|
||||
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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());
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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();
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
|
||||
|
||||
@@ -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]);
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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));
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
@@ -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);
|
||||
}
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user