Fix many tests with wrong commands

This commit is contained in:
Alex Vasile 2022-08-25 00:06:22 -04:00
parent 6fa5fdc3c1
commit 37f4f40a2c
225 changed files with 816 additions and 627 deletions

View file

@ -18,6 +18,7 @@ public final class Battlegrowth extends CardImpl {
public Battlegrowth(UUID ownerId, CardSetInfo setInfo) {
super(ownerId,setInfo,new CardType[]{CardType.INSTANT},"{G}");
// Put a +1/+1 counter on target creature.
this.getSpellAbility().addEffect(new AddCountersTargetEffect(CounterType.P1P1.createInstance()));
this.getSpellAbility().addTarget(new TargetCreaturePermanent());
}

View file

@ -67,6 +67,7 @@ public class LevelUpAbilityTest extends CardTestPlayerBase {
for (int i = 0; i < 6; i++) {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
}
setStopAt(2, PhaseStep.END_TURN);
@ -93,6 +94,7 @@ public class LevelUpAbilityTest extends CardTestPlayerBase {
for (int i = 0; i < 12; i++) {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
}
setStopAt(2, PhaseStep.END_TURN);
@ -117,6 +119,7 @@ public class LevelUpAbilityTest extends CardTestPlayerBase {
for (int i = 0; i < 15; i++) {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
}
setStopAt(2, PhaseStep.END_TURN);

View file

@ -36,6 +36,7 @@ public class BanisherPriestTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Rockslide Elemental");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Banisher Priest");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1); // Let Banisher Priest enter the battlefield, but don't let its ETB ability resolve
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Incinerate", "Banisher Priest");

View file

@ -32,7 +32,7 @@ public class GreenbeltRampagerTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Greenbelt Rampager");
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
@ -48,8 +48,8 @@ public class GreenbeltRampagerTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Greenbelt Rampager");
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Greenbelt Rampager");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
@ -74,7 +74,7 @@ public class GreenbeltRampagerTest extends CardTestPlayerBase {
skipInitShuffling();
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gonti, Lord of Luxury");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gonti, Lord of Luxury", true);
// addTarget(playerA, playerB); playerB is autochosen since only option
setChoice(playerA, "Greenbelt Rampager");

View file

@ -27,6 +27,7 @@ public class GolemSkinGauntletsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {4}", "Elite Vanguard");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Elite Vanguard");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -24,6 +24,7 @@ public class HeavyArbalestTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {4}", "Elite Vanguard");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {this} deals 2 damage", playerB);
setStopAt(3, PhaseStep.BEGIN_COMBAT);
@ -48,7 +49,9 @@ public class HeavyArbalestTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Llanowar Elves");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {4}", "Elite Vanguard");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: {this} deals 2 damage", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {4}", "Llanowar Elves");
setStopAt(5, PhaseStep.BEGIN_COMBAT);

View file

@ -96,9 +96,7 @@ public class BlitzTest extends CardTestPlayerBase {
} catch (AssertionError e) {
Assert.assertEquals(
"Shouldn't be able to cast normally from graveyard",
"Missing CAST/ACTIVATE def for turn 1, step PRECOMBAT_MAIN, PlayerA\n" +
"Can't find available command - activate:Cast Tenacious Underdog " +
"(use checkPlayableAbility for \"non available\" checks)", e.getMessage()
"Can't find ability to activate command: Cast Tenacious Underdog", e.getMessage()
);
}

View file

@ -48,7 +48,8 @@ public class BloodthirstTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bloodlord of Vaasgoth");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bloodlord of Vaasgoth", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Barony Vampire");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -147,7 +147,8 @@ public class CascadeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Unsummon"); // Instant {U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enlisted Wurm");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Unsummon", "Enlisted Wurm");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Unsummon", "Enlisted Wurm", true);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Enlisted Wurm");
setStopAt(1, PhaseStep.END_TURN);
@ -156,7 +157,6 @@ public class CascadeTest extends CardTestPlayerBase {
assertGraveyardCount(playerB, "Unsummon", 1);
assertPermanentCount(playerA, "Silvercoat Lion", 2);
assertPermanentCount(playerA, "Enlisted Wurm", 1);
}
/**

View file

@ -196,7 +196,7 @@ public class ConspireTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Sakashima the Impostor");
addCard(Zone.HAND, playerA, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wort, the Raidmother"); // {4}{R/G}{R/G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wort, the Raidmother", true); // {4}{R/G}{R/G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sakashima the Impostor"); // {2}{U}{U}
setChoice(playerA, "Wort, the Raidmother");
@ -223,7 +223,7 @@ public class ConspireTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Sakashima the Impostor");
addCard(Zone.HAND, playerA, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wort, the Raidmother"); // {4}{R/G}{R/G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wort, the Raidmother", true); // {4}{R/G}{R/G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sakashima the Impostor"); // {2}{U}{U}
setChoice(playerA, "Wort, the Raidmother");

View file

@ -207,6 +207,7 @@ public class ConstellationTest extends CardTestPlayerBase {
// give dax a new type (on next turn) -- effects dependacy
if (castVampireDifferentWay) {
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Archetype of Courage"); // make dax to creature
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Mephidross Vampire"); // give vampire to creatures
} else {
// Make sure not white mana is used here to cast the vampire
@ -219,6 +220,7 @@ public class ConstellationTest extends CardTestPlayerBase {
activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {B}");
checkManaPool("after B mana", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "B", 6);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Mephidross Vampire"); // give vampire to creatures
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Archetype of Courage"); // make dax to creature
}

View file

@ -102,7 +102,7 @@ public class DeathtouchTest extends CardTestPlayerBase {
// Creatures your opponents control get -2/-2.
addCard(Zone.BATTLEFIELD, playerB, "Elesh Norn, Grand Cenobite");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Marath, Will of the Wild");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Marath, Will of the Wild", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {2}", "Marath, Will of the Wild");

View file

@ -103,6 +103,7 @@ public class DeliriumTest extends CardTestPlayerBaseWithAIHelps {
addCard(Zone.BATTLEFIELD, playerA, "Balduvian Bears", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spirit Mantle", "Balduvian Bears");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Descend upon the Sinful");
setStrictChooseMode(true);

View file

@ -89,7 +89,7 @@ public class DiscardTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Island", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Liliana's Caress");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Liliana's Caress", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Coercion", playerB);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -103,7 +103,6 @@ public class DiscardTest extends CardTestPlayerBase {
assertLife(playerA, 20);
assertLife(playerB, 18);
}
@Test

View file

@ -7,6 +7,11 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* 702.128. Embalm
* 702.128a Embalm is an activated ability that functions while the card with embalm is in a graveyard.
* Embalm [cost] means
* [Cost], Exile this card from your graveyard: Create a token thats a copy of this card, except its white, it has no mana cost, and its a Zombie in addition to its other types. Activate only as a sorcery.
* 702.128b A token is embalmed if its created by a resolving embalm ability.
*
* @author noxx
*/
@ -44,7 +49,6 @@ public class EmbalmTest extends CardTestPlayerBase {
assertPermanentCount(playerA, aSanctions, 1);
assertPermanentCount(playerB, yOx, 0);
assertPermanentCount(playerB, wKnight, 1);
}
/*
@ -92,11 +96,10 @@ public class EmbalmTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, aSanctions, 0);
}
/*
/**
* Reported bug: https://github.com/magefree/mage/issues/3144
* Tests that not only creature targeted by original creature is returned.
* After using Embalm creature will exile another creature and should return it back when leaves battlefield.
*
* Bug: #3144
*/
@Test
public void testCreatureExiledByEmbalmCreatureReturns() {
@ -123,13 +126,13 @@ public class EmbalmTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, aSanctions);
addTarget(playerA, yOx);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, dBlade);
// Angel of Sanction is auto-chosen since only option
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN);
castSpell(1, PhaseStep.BEGIN_COMBAT, playerB, dBlade, aSanctions);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Embalm");
addTarget(playerA, wKnight);
castSpell(1, PhaseStep.END_TURN, playerB, dBlade);
addTarget(playerB, aSanctions);
castSpell(1, PhaseStep.END_TURN, playerB, dBlade, aSanctions);
setStopAt(1, PhaseStep.CLEANUP);
execute();
@ -138,7 +141,6 @@ public class EmbalmTest extends CardTestPlayerBase {
assertPermanentCount(playerA, aSanctions, 0);
assertPermanentCount(playerB, yOx, 1);
// second creature should also return after embalm token leaves battlefield
// Bug: #3144
assertPermanentCount(playerB, wKnight, 1);
assertGraveyardCount(playerA, aSanctions, 0);
assertGraveyardCount(playerB, dBlade, 2);

View file

@ -216,12 +216,12 @@ public class EvolveTest extends CardTestPlayerBase {
// Evolve
addCard(Zone.HAND, playerA, "Adaptive Snapjaw", 1); // {4}{G} - Creature 6/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ivy Lane Denizen");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ivy Lane Denizen", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Renegade Krasis");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Renegade Krasis", true);
addTarget(playerA, "Ivy Lane Denizen"); // Ivy target
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ivy Lane Denizen"); // Renegade Krasis evolves
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ivy Lane Denizen", true); // Renegade Krasis evolves
addTarget(playerA, "Renegade Krasis"); // Ivy target
setChoice(playerA, "Whenever another green creature"); // So +1/+1 counter from Renegade is first put onto Ivy

View file

@ -64,10 +64,12 @@ public class ExploitTest extends CardTestPlayerBase {
setStrictChooseMode(true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silumgar Butcher");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silumgar Butcher");
setChoice(playerA, true);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1);
setChoice(playerA, true); // Choose to exploit
addTarget(playerA, "Silvercoat Lion"); // sacrifice to Exploit
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silumgar Butcher");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();

View file

@ -293,7 +293,8 @@ public class FlashbackTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback");
addTarget(playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Runic Repetition");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Runic Repetition", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silent Departure", "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -567,19 +568,20 @@ public class FlashbackTest extends CardTestPlayerBase {
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
if (!e.getMessage().contains("Flashback$spellOnStack=Lightning Bolt")) {
Assert.fail("Should have thrown error about not being able to play Force of Will, but got:\n" + e.getMessage());
}
}
assertPermanentCount(playerA, "Snapcaster Mage", 0);
assertGraveyardCount(playerA, "Snapcaster Mage", 1);
assertGraveyardCount(playerA, "Force of Will", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertLife(playerA, 20);
// TODO: Re-enable when checkPlayableAbility can be used instead of try-catch
// assertPermanentCount(playerA, "Snapcaster Mage", 0);
//
// assertGraveyardCount(playerA, "Snapcaster Mage", 1);
// assertGraveyardCount(playerA, "Force of Will", 1);
//
// assertGraveyardCount(playerB, "Lightning Bolt", 1);
//
// assertLife(playerA, 20);
}
/**
@ -597,7 +599,7 @@ public class FlashbackTest extends CardTestPlayerBase {
// Flashback-{1}{U}, Pay 3 life.
addCard(Zone.HAND, playerA, "Deep Analysis"); // {3}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Deep Analysis");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Deep Analysis", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -191,6 +191,7 @@ public class InfectTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Island", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Corrupted Conscience", "Phyrexian Obliterator");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enslave", "Phyrexian Obliterator");
setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);

View file

@ -25,6 +25,7 @@ public class JumpStartTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -52,6 +53,7 @@ public class JumpStartTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Counterspell", "Direct Current");
@ -86,6 +88,7 @@ public class JumpStartTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1); // 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Direct Current", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Experimental Frenzy");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Direct Current with jump-start", playerB);

View file

@ -268,12 +268,13 @@ public class KickerTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, "Sunscape Battlemage", 1);
}
/**
* Reported Bug:
* Hallar Not Procing Right: When I kick Thornscape Battlemage it doesn't proc Hallar effect for some reason.
* I tried this 3 times and it never triggered properly.
*/
@Test
public void test_Conditional_TriggeredAbilityMustSeeMultikickedStatus() {
// bug:
// Hallar Not Procing Right: When I kick Thornscape Battlemage it doesn't proc Hallar effect for some reason.
// I tried this 3 times and it never triggered properly.
// Kicker {R} and/or {W} (You may pay an additional {R} and/or {W} as you cast this spell.)
// When Thornscape Battlemage enters the battlefield, if it was kicked with its {R} kicker, it deals 2 damage to any target.
// When Thornscape Battlemage enters the battlefield, if it was kicked with its {W} kicker, destroy target artifact.
@ -300,14 +301,15 @@ public class KickerTest extends CardTestPlayerBase {
assertLife(playerB, 20 - 2 - 1); // 2 damage from kicked spell, 1 damage from hallar's trigger
}
/**
* Reported Bug:
* If a creature is cast with kicker, dies, and is then returned to play
* from graveyard, it still behaves like it were kicked.
* I noticed this while testing some newly implemented cards, but it can be reproduced for
* example by Zombifying a Gatekeeper of Malakir.
*/
@Test
public void test_ZCC_ReturnedPermanentMustNotBeKicked() {
// bug:
// If a creature is cast with kicker, dies, and is then returned to play
// from graveyard, it still behaves like it were kicked. I noticed this
// while testing some newly implemented cards, but it can be reproduced for
// example by Zombifying a Gatekeeper of Malakir.
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
// Kicker {B} (You may pay an additional {B} as you cast this spell.)
@ -342,14 +344,15 @@ public class KickerTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Gatekeeper of Malakir", 1);
}
/**
* Reported Bug: https://github.com/magefree/mage/issues/7192
* Krark, the thumbless and a copy of him are on the field, and I cast Rite of replication kicked.
* The first coinflip fails and returns it to my hand, and the second coinflip wins and copies it,
* but does not copy the kicked part.
* I believe I did this before in another game and the first flip won then it would be a kicked copy.
*/
@Test
public void test_ZCC_CopiedSpellMustKeepKickerStatus() {
// https://github.com/magefree/mage/issues/7192
// bug: Krark, the thumbless and a copy of him are on the field, and I cast Rite of replication kicked.
// The first coinflip fails and returns it to my hand, and the second coinflip wins and copies it,
// but does not copy the kicked part. I believe I did this before in another game and the first flip
// won then it would be a kicked copy.
// Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.
addCard(Zone.BATTLEFIELD, playerA, "Swarm Intelligence", 1);
//
@ -385,10 +388,11 @@ public class KickerTest extends CardTestPlayerBase {
assertLife(playerA, 20 - 2 * 2);
}
/**
* Copied spell must have access to kicker status.
*/
@Test
public void test_ZCC_CopiedSpellMustHaveIndependentZCC_InSpell() {
// reason: copied spell must have access to kicker status
// Whenever you cast an instant or sorcery spell, you may copy that spell. You may choose new targets for the copy.
addCard(Zone.BATTLEFIELD, playerA, "Swarm Intelligence", 1);
//
@ -446,10 +450,11 @@ public class KickerTest extends CardTestPlayerBase {
assertLife(playerA, 20 - 2 + 3);
}
/**
* Static ability from copied spell's permanent must have access to kicker status
*/
@Test
public void test_ZCC_CopiedSpellMustHaveIndependentZCC_InStaticAbility() {
// reason: static ability from copied spell's permanent must have access to kicker status
// {4}, {T}: Copy target permanent spell you control.
addCard(Zone.BATTLEFIELD, playerA, "Lithoform Engine", 1);
addCard(Zone.BATTLEFIELD, playerA, "Island", 4);
@ -559,10 +564,7 @@ public class KickerTest extends CardTestPlayerBase {
attack(1, playerA, "Raging Goblin");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
// Attack must be restricted, so no attack commands available
setStopAt(1, PhaseStep.END_TURN);
setStopAt(1, PhaseStep.END_COMBAT);
try {
execute();
@ -574,6 +576,21 @@ public class KickerTest extends CardTestPlayerBase {
}
}
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
// Attack must be restricted, so no attack commands available
setStopAt(1, PhaseStep.END_TURN);
try {
execute();
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Cast Lightning Bolt$targetPlayer=PlayerA")) {
Assert.fail("Should have thrown error about not being able to attack with Raging Golin, but got:\n" + e.getMessage());
}
}
assertGraveyardCount(playerA, "Orim's Chant", 1);
assertGraveyardCount(playerB, "Lightning Bolt", 0);
@ -581,12 +598,13 @@ public class KickerTest extends CardTestPlayerBase {
assertLife(playerB, 20);
}
/**
* Reported Bug:
* Bloodhusk Ritualist's discard trigger does nothing if the Ritualist
* leaves the battlefield before the trigger resolves.
*/
@Test
public void test_Single_BloodhuskRitualist() {
// bug:
// Bloodhusk Ritualist's discard trigger does nothing if the Ritualist
// leaves the battlefield before the trigger resolves.
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1);
addCard(Zone.HAND, playerB, "Lightning Bolt");
addCard(Zone.HAND, playerB, "Fireball", 2);
@ -599,6 +617,7 @@ public class KickerTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bloodhusk Ritualist");
setChoice(playerA, true, 2); // 2 x Multikicker
setChoice(playerA, false); // stop the kicking
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Bloodhusk Ritualist");
addTarget(playerA, playerB); // target for kicker's trigger (discard cards)
@ -614,13 +633,15 @@ public class KickerTest extends CardTestPlayerBase {
assertHandCount(playerB, 0);
}
/**
* Reported Bug:
* Paying the Kicker on "Marsh Casualties" has no effect.
* Target player's creatures still only get -1/-1 instead of -2/-2.
* Was playing against AI.
* It was me who cast the spell.
*/
@Test
public void test_Single_MarshCasualties() {
// bug:
// Paying the Kicker on "Marsh Casualties" has no effect. Target player's
// creatures still only get -1/-1 instead of -2/-2. Was playing against AI.
// It was me who cast the spell.
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
// Kicker {3}
@ -668,10 +689,12 @@ public class KickerTest extends CardTestPlayerBase {
assertCounterCount(playerA, "Ardent Soldier", CounterType.P1P1, 1); // from kicker
}
/**
* Reported Bug:
* Can cast Thieving Skydiver with kicker's X = 0 on Etali, Primal Storm
*/
@Test
public void test_FreeCast_MinXValueMustWork() {
// bug:
// Can cast Thieving Skydiver with kicker's X = 0 on Etali, Primal Storm
skipInitShuffling();
// Kicker {X}. X can't be 0.

View file

@ -42,8 +42,8 @@ public class MeldTest extends CardTestPlayerBase {
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerB must have 0 actions but found 1")) {
Assert.fail("Should have thrown error about cannot attack, but got:\n" + e.getMessage());
if (!e.getMessage().contains("Cast Silvercoat Lion")) {
Assert.fail("Should have thrown error about casting Silvercoat Lion, but got:\n" + e.getMessage());
}
}
@ -85,7 +85,7 @@ public class MeldTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bruna, the Fading Light");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Silvercoat Lion");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Gisela, the Broken Blade");
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Vanish into Memory", "Brisela, Voice of Nightmares");
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Vanish into Memory", "Brisela, Voice of Nightmares", true);
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Silvercoat Lion");
setStopAt(4, PhaseStep.BEGIN_COMBAT);
@ -127,10 +127,11 @@ public class MeldTest extends CardTestPlayerBase {
// If you do, discard cards equal to that creature's toughness.
addCard(Zone.HAND, playerB, "Vanish into Memory", 1); // Instant {2}{W}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bruna, the Fading Light");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Silvercoat Lion");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Gisela, the Broken Blade");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bruna, the Fading Light", true);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Silvercoat Lion", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Gisela, the Broken Blade", true);
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Vanish into Memory", "Brisela, Voice of Nightmares");
waitStackResolved(4, PhaseStep.PRECOMBAT_MAIN);
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Silvercoat Lion");
// End step turn 7 the meld takes place again

View file

@ -40,7 +40,7 @@ public class ModularTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Arcbound Bruiser");
addCard(Zone.HAND, playerA, "Arcbound Hybrid");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Bruiser");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Bruiser", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Hybrid");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -61,8 +61,8 @@ public class ModularTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Arcbound Hybrid");
addCard(Zone.HAND, playerA, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Bruiser");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Hybrid");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Bruiser", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Arcbound Hybrid", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Arcbound Bruiser");
setStopAt(3, PhaseStep.BEGIN_COMBAT);
setChoice(playerA, true);
@ -143,21 +143,18 @@ public class ModularTest extends CardTestPlayerBase {
// put three -1/-1 counters on lancer, which leaves it with one +1/+1
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Puncture Blast", "Arcbound Lancer");
setChoice(playerA, true, 2);
checkStackSize("stack1", 1, PhaseStep.PRECOMBAT_MAIN, playerA, 1);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
// kill lancer with one +1/+1 counter on it
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flame Slash", "Arcbound Lancer");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
checkStackSize("stack2", 1, PhaseStep.PRECOMBAT_MAIN, playerA, 1);
// in response to modular trigger, return lancer to the battlefield
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Makeshift Mannequin", "Arcbound Lancer");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Makeshift Mannequin", "Arcbound Lancer", "When it dies");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, true);
checkStackSize("stack3", 1, PhaseStep.PRECOMBAT_MAIN, playerA, 2);
// kill lancer again with original modular trigger on the stack
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Murder", "Arcbound Lancer");
checkStackSize("stack4", 1, PhaseStep.PRECOMBAT_MAIN, playerA, 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Murder", "Arcbound Lancer", "When it dies");
setStopAt(1, PhaseStep.END_TURN);
execute();

View file

@ -417,6 +417,7 @@ public class MorphTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birchlore Rangers");
setChoice(playerA, true); // cast it face down as 2/2 creature
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Swords to Plowshares", "");
@ -456,6 +457,7 @@ public class MorphTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix");
setChoice(playerA, true); // cast it face down as 2/2 creature
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString());
@ -661,7 +663,7 @@ public class MorphTest extends CardTestPlayerBase {
try {
execute();
} catch (Throwable e) {
if (!e.getMessage().contains("Can't find available command - activate:Cast Rattleclaw Mystic (use checkPlayableAbility for \"non available\" checks)")) {
if (!e.getMessage().contains("Cast Rattleclaw Mystic")) {
Assert.fail("Should have gotten an error about not being able to cast Rattleclaw, but got:\n" + e.getMessage());
}
}
@ -899,6 +901,7 @@ public class MorphTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Quicksilver Dragon");
setChoice(playerA, true); // cast it face down as 2/2 creature
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", EmptyNames.FACE_DOWN_CREATURE.toString());

View file

@ -61,7 +61,7 @@ public class PhasingTest extends CardTestPlayerBase {
// {R}: Enchanted creature gets +1/+0 until end of turn.
addCard(Zone.HAND, playerA, "Firebreathing", 1); // {R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tolarian Drake");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tolarian Drake", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Tolarian Drake");
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
@ -83,7 +83,7 @@ public class PhasingTest extends CardTestPlayerBase {
// {R}: Enchanted creature gets +1/+0 until end of turn.
addCard(Zone.HAND, playerA, "Firebreathing", 1); // {R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tolarian Drake");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tolarian Drake", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Tolarian Drake");
setStopAt(5, PhaseStep.PRECOMBAT_MAIN);

View file

@ -60,7 +60,7 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Trusted Forcemage", 2);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 6);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -188,6 +188,7 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Act of Treason", "Trusted Forcemage");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Elite Vanguard");
setStopAt(2, PhaseStep.BEGIN_COMBAT);
@ -216,6 +217,7 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Act of Treason", "Trusted Forcemage");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Elite Vanguard");
setStopAt(3, PhaseStep.PRECOMBAT_MAIN); // Effect of "Act of Treason" will end here
@ -261,6 +263,7 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Blinkmoth Nexus", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}: ");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -302,6 +305,7 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Blinkmoth Nexus", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}: ");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
@ -330,8 +334,8 @@ public class SoulbondKeywordTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Lightning Bolt", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Trusted Forcemage", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Elite Vanguard");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Phantasmal Bear");
setStopAt(1, PhaseStep.END_TURN);

View file

@ -243,13 +243,13 @@ public class StormTest extends CardTestPlayerBase {
// Storm
addCard(Zone.HAND, playerA, "Mind's Desire", 1); // {4}{U}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wheel of Fortune");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Emerald");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Turnabout");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Wheel of Fortune", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Emerald", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Turnabout", true);
setChoice(playerA, "Land");
setChoice(playerA, false);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yawgmoth's Will");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Palinchron");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yawgmoth's Will", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Palinchron", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind's Desire");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -264,7 +264,5 @@ public class StormTest extends CardTestPlayerBase {
assertExileCount("Mind's Desire", 1);
assertExileCount(playerA, 8); // 6 from Mind's Desire and the Desire and the Yawgmoth's Will
}
}

View file

@ -45,7 +45,7 @@ public class SurgeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Lightning Bolt");
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
// Create a tokenonto the battlefield that's a copy of target creature you control.
// Create a token that's a copy of target creature you control.
// Flashback {5}{U}{U}(You may cast this card from your graveyard for its flashback cost. Then exile it.)
addCard(Zone.HAND, playerB, "Cackling Counterpart");
addCard(Zone.BATTLEFIELD, playerB, "Island", 3);
@ -53,6 +53,7 @@ public class SurgeTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Cackling Counterpart", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Crush of Tentacles with surge");
@ -81,6 +82,7 @@ public class SurgeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tyrant of Valakut");
addTarget(playerA, playerB);
@ -106,6 +108,7 @@ public class SurgeTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Containment Membrane", "Silvercoat Lion");
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);

View file

@ -1,5 +1,6 @@
package org.mage.test.cards.abilities.keywords;
import mage.cards.s.SpringOfEternalPeace;
import mage.constants.CardType;
import mage.constants.PhaseStep;
import mage.constants.Zone;
@ -28,10 +29,11 @@ public class TransformTest extends CardTestPlayerBase {
// {G}{G}, Sacrifice Rootrunner: Put target land on top of its owner's library.
addCard(Zone.BATTLEFIELD, playerB, "Rootrunner"); // {2}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nissa, Vastwood Seer");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nissa, Vastwood Seer", true);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Forest");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "{G}{G}", "Swamp");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "+1: Reveal");
setStopAt(1, PhaseStep.END_TURN);
@ -167,6 +169,7 @@ public class TransformTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Island", 9);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Startled Awake", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{U}{U}");
@ -189,6 +192,7 @@ public class TransformTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Maskwood Nexus");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Startled Awake", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}{U}{U}");
@ -396,8 +400,8 @@ public class TransformTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Huntmaster of the Fells");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Huntmaster of the Fells", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
setStopAt(4, PhaseStep.PRECOMBAT_MAIN);
execute();

View file

@ -141,6 +141,7 @@ public class UndyingTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Anafenza, the Foremost");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Butcher Ghoul");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Butcher Ghoul");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -27,7 +27,7 @@ public class LoseAbilityByEquipmentTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Cobbled Wings"); // gives Flying
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Magebane Armor");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cobbled Wings");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cobbled Wings", true);
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip {1}", "Silvercoat Lion"); // give Flying
activateAbility(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Equip {2}", "Silvercoat Lion"); // lose Flying

View file

@ -23,7 +23,7 @@ public class LoseAbilityTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Air Elemental");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grounded", "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grounded", "Air Elemental");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Grounded", "Air Elemental");
setStopAt(2, PhaseStep.END_TURN);
execute();
@ -53,7 +53,7 @@ public class LoseAbilityTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Drake Umbra");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grounded", "Air Elemental");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Drake Umbra", "Air Elemental");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Drake Umbra", "Air Elemental");
setStopAt(2, PhaseStep.END_TURN);
execute();
@ -81,7 +81,9 @@ public class LoseAbilityTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Drake Umbra", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Drake Umbra", "Air Elemental");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Drake Umbra", "Air Elemental");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grounded", "Air Elemental");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -78,7 +78,7 @@ public class CounterspellTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Memory Lapse", "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Memory Lapse");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Memory Lapse", "Memory Lapse");
setChoice(playerA, true); // change the target
addTarget(playerA, "Memory Lapse");
@ -112,7 +112,7 @@ public class CounterspellTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Counterspell");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Counterspell", "Counterspell");
setChoice(playerA, true); // change the target
addTarget(playerA, "Counterspell");
@ -146,7 +146,7 @@ public class CounterspellTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Dissipate", "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Dissipate");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Twincast", "Dissipate", "Dissipate");
setChoice(playerA, true); // change the target
addTarget(playerA, "Dissipate");

View file

@ -47,7 +47,7 @@ public class ForceOfWillTest extends CardTestPlayerBase {
}
/**
* Test that Force of Will can'be played with alternate casting costs
* Test that Force of Will can't be played with alternate casting costs
* if no blue card is in hand and not enough mana available
*/
@Test
@ -55,7 +55,7 @@ public class ForceOfWillTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Thoughtseize");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
// No Red cards in hand
// No other Blue cards in hand
addCard(Zone.HAND, playerB, "Force of Will");
addCard(Zone.HAND, playerB, "Fireball", 2);
@ -75,15 +75,9 @@ public class ForceOfWillTest extends CardTestPlayerBase {
execute();
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Can't find available command - activate:Cast Force of Will$target=Thoughtseize")) {
Assert.fail("must throw error about bad targets, but got:\n" + e.getMessage());
if (!e.getMessage().contains("Cast Force of Will$target=Thoughtseize")) {
Assert.fail("must throw error about not being able to cast Force of Will, but got:\n" + e.getMessage());
}
}
assertLife(playerA, 18);
assertLife(playerB, 20); // losing 1 from Force of Will
assertHandCount(playerB, 2); // 1 Fireball 1 Force of Will
assertGraveyardCount(playerB, 1); // 1 Fireball discarded because of Thoughseize
}
}

View file

@ -85,17 +85,17 @@ public class SecondGuessTest extends CardTestPlayerBase {
*/
@Test
public void testOverallCount() {
addCard(Zone.HAND, playerA, "Second Guess");
addCard(Zone.HAND, playerA, "Lightning Bolt");
addCard(Zone.BATTLEFIELD, playerA, "Mountain");
addCard(Zone.BATTLEFIELD, playerA, "Island", 2);
addCard(Zone.HAND, playerA, "Second Guess");
addCard(Zone.HAND, playerB, "Shock");
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Shock", playerA);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Second Guess", "Shock");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Second Guess", "Shock", "Shock");
setStopAt(1, PhaseStep.END_TURN);
execute();

View file

@ -24,7 +24,7 @@ public class ExileAndReturnTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}, {T}", "Silvercoat Lion");
@ -80,8 +80,9 @@ public class ExileAndReturnTest extends CardTestPlayerBase {
// Whenever an Aura becomes attached to Bramble Elemental, put two 1/1 green Saproling creature tokens onto the battlefield.
addCard(Zone.BATTLEFIELD, playerB, "Bramble Elemental"); // Creature 4/4
// Put a +1/+1 counter on target creature.
addCard(Zone.BATTLEFIELD, playerB, "Forest", 5);
// Put a +1/+1 counter on target creature.
addCard(Zone.HAND, playerB, "Battlegrowth"); // Instant {G}
// Enchant creature (Target a creature as you cast this. This card enters the battlefield attached to that creature.)
// Enchanted creature gets +1/+1 for each Forest you control.
@ -91,10 +92,12 @@ public class ExileAndReturnTest extends CardTestPlayerBase {
// Enchanted creature has reach. (It can block creatures with flying.)
addCard(Zone.HAND, playerB, "Frog Tongue"); // Enchantment Aura {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin", true);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Battlegrowth", "Bramble Elemental");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Blanchwood Armor", "Bramble Elemental");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Frog Tongue", "Bramble Elemental");
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3}, {T}", "Bramble Elemental");
@ -130,7 +133,7 @@ public class ExileAndReturnTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Disenchant");
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tawnos's Coffin", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{3}, {T}", "Silvercoat Lion");
@ -145,6 +148,5 @@ public class ExileAndReturnTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, "Tawnos's Coffin", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 1);
}
}

View file

@ -8,34 +8,41 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* {@link mage.cards.a.AuratouchedMage Auratouched Mage}
* Creature Human Wizard 3/3
* {5}{W}
*
* When Auratouched Mage enters the battlefield, search your library for an Aura card that could enchant it.
* If Auratouched Mage is still on the battlefield, put that Aura card onto the battlefield attached to it.
* Otherwise, reveal the Aura card and put it into your hand.
* Then shuffle.
*
* @author jeffwadsworth
*/
public class AuratouchedMageTest extends CardTestPlayerBase {
/**
* Auratouched Mage Creature Human Wizard 3/3, 5W When Auratouched Mage
* enters the battlefield, search your library for an Aura card that could
* enchant it. If Auratouched Mage is still on the battlefield, put that
* Aura card onto the battlefield attached to it. Otherwise, reveal the Aura
* card and put it into your hand. Then shuffle your library.
* If Auramage's type is changed in the time between it entering the battlefield and its ETB ability resolving, you
* must be able to search for an Aura that can legally target it with whatever types it has at the ability resolves.
*
* Relevant Ruling:
* Any Aura card you find must be able to enchant Auratouched Mage as it currently exists,
* or as it most recently existed on the battlefield if its no longer on the battlefield.
* If an effect has made the Mage an artifact, for example, you could search for an Aura with enchant artifact.
* (2005-10-01)
*/
//If someone knows the way to elegantly handle the test mechanism in regards to no valid targets, please modify. The test works fine in practice.
@Ignore
@Test
public void testAuratouchedMageEffectHasMadeIntoTypeArtifact() {
//Any Aura card you find must be able to enchant Auratouched Mage as it currently exists, or as it most recently existed on the battlefield if it's no
//longer on the battlefield. If an effect has made the Mage an artifact, for example, you could search for an Aura with enchant artifact.
//Expected result: An effect has made Auratouched Mage into an artifact upon entering the battlefield. An aura that only works on artifacts should work.
addCard(Zone.BATTLEFIELD, playerA, "Plains", 7);
addCard(Zone.BATTLEFIELD, playerA, "Island", 7);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 1);
addCard(Zone.BATTLEFIELD, playerA, "Island", 8);
addCard(Zone.HAND, playerA, "Auratouched Mage"); //5W cost
addCard(Zone.HAND, playerA, "Argent Mutation"); //2U cost. Target is an artifact until end of turn
addCard(Zone.LIBRARY, playerA, "Relic Ward"); //Only enchants an artifact permanent
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Auratouched Mage");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Argent Mutation", "Auratouched Mage");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1); // Wait for Auratouched Mage to ETB
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Argent Mutation", "Auratouched Mage"); // Turn it into an artifact before its ETB ability resolves
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -43,9 +50,11 @@ public class AuratouchedMageTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Auratouched Mage", 1);
assertPermanentCount(playerA, "Relic Ward", 1);
}
/**
* Auratouched Mage's ETB ability resolves with it alive, so Aura should be equipped to it.
*/
@Test
public void testGainsLegalAura() {
// Expected result: Brainwash gets placed on Auratouched Mage
@ -61,21 +70,22 @@ public class AuratouchedMageTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Auratouched Mage", 1);
assertPermanentCount(playerA, "Brainwash", 1);
}
//If someone knows the way to elegantly handle the test mechanism in regards to no valid targets, please modify. The test works fine in practice.
/**
* Auratouched Mage's ETB ability resolves, but they're dead, so the legal aura (Brainwash) gets put into Auratouched Mage's controller's hand.
*/
@Test
public void testAuratouchedMageNotOnBattlefield() {
// Expected result: Auratouched Mage is exiled immediately after entering the battlefield, the legal aura (Brainwash) gets put into controller's hand
addCard(Zone.BATTLEFIELD, playerA, "Plains", 7);
addCard(Zone.HAND, playerA, "Auratouched Mage");
addCard(Zone.HAND, playerA, "Swords to Plowshares"); //exiles Auratouched Mage
addCard(Zone.LIBRARY, playerA, "Brainwash"); //valid aura for Auratouched Mage
addCard(Zone.LIBRARY, playerA, "Brainwash"); // valid aura for Auratouched Mage
addCard(Zone.LIBRARY, playerA, "Animate Wall"); //not a valid aura for the Auratouched Mage
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Auratouched Mage");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Swords to Plowshares", "Auratouched Mage");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1); // Wait for the Auratouched Mage to enter
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Swords to Plowshares", "Auratouched Mage"); // It's ETB is still on the stack
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -83,8 +93,7 @@ public class AuratouchedMageTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Auratouched Mage", 0);
assertPermanentCount(playerA, "Brainwash", 0);
assertHandCount(playerA, "Brainwash", 1);
assertHandCount(playerA, "Brainwash", 1); // In hand since Auratouched Mage died before ability resolved
assertLibraryCount(playerA, "Animate Wall", 1);
}
}

View file

@ -69,7 +69,7 @@ public class ChorusOfTheConclaveTest extends CardTestPlayerBase {
// Creature spells you cast cost {1} less to cast for each creature you control with a +1/+1 counter on it.
addCard(Zone.HAND, playerA, "Hamza, Guardian of Arashin"); // {4}{G}{W}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Goblin Roughrider");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Goblin Roughrider", true);
setChoice(playerA, true);
setChoice(playerA, "X=1");
@ -78,6 +78,7 @@ public class ChorusOfTheConclaveTest extends CardTestPlayerBase {
setChoice(playerA, "X=1");
playLand(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mountain");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Akki Drillmaster");
setChoice(playerA, true);
setChoice(playerA, "X=1");

View file

@ -133,6 +133,7 @@ public class EndTurnEffectTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Disenchant"); //Instant {1}{W}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sundial of the Infinite");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Disenchant", "Sundial of the Infinite");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1},", TestPlayer.NO_TARGET, "Disenchant");
@ -146,6 +147,5 @@ public class EndTurnEffectTest extends CardTestPlayerBase {
assertHandCount(playerA, 7); // Discard to maximum hand size
assertHandCount(playerB, 1); // 1 card drawn at start of 2nd turn
}
}

View file

@ -26,6 +26,7 @@ public class GainAbilitiesTest extends CardTestPlayerBase {
// attach all
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@attach.1", "@bear");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@attach.2", "@bear");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
checkAbility("after", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "@bear", VigilanceAbility.class, true);
@ -50,9 +51,8 @@ public class GainAbilitiesTest extends CardTestPlayerBase {
// attach all
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@attach.1", "@bear");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@attach.2", "@bear");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
//checkAbility("after", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "@bear", VigilanceAbility.class, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "@attach.2", "@bear");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -103,7 +103,7 @@ public class LimitedCountedActivationsTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.UPKEEP, playerA, "{R}: ");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Terror", "Dragon Whelp");
castSpell(1, PhaseStep.UPKEEP, playerB, "Terror", "Dragon Whelp");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reanimate", "Dragon Whelp");
castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Unnatural Speed", "Dragon Whelp");
@ -149,9 +149,11 @@ public class LimitedCountedActivationsTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.UPKEEP, playerA, "{R}: ");
activateAbility(1, PhaseStep.UPKEEP, playerA, "{R}: ");
activateAbility(1, PhaseStep.UPKEEP, playerA, "{R}: ");
waitStackResolved(1, PhaseStep.UPKEEP);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Terror", "Dragon Whelp");
castSpell(1, PhaseStep.UPKEEP, playerB, "Terror", "Dragon Whelp");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reanimate", "Dragon Whelp");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Unnatural Speed", "Dragon Whelp");
activateAbility(1, PhaseStep.DECLARE_ATTACKERS, playerA, "{R}: ");

View file

@ -23,7 +23,7 @@ public class AlchemistsRefugeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Elite Vanguard");
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerA, "{G}{U}, {T}:");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Elite Vanguard");
castSpell(2, PhaseStep.BEGIN_COMBAT, playerA, "Elite Vanguard");
setStopAt(2, PhaseStep.BEGIN_COMBAT);
execute();

View file

@ -25,7 +25,7 @@ public class CastAsInstantTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Silvercoat Lion", 2);
castSpell(1, PhaseStep.UPKEEP, playerB, "Quicken");
castSpell(1, PhaseStep.UPKEEP, playerB, "Quicken", true);
castSpell(1, PhaseStep.UPKEEP, playerB, "Witness the End", playerA);
setStopAt(1, PhaseStep.PRECOMBAT_MAIN);

View file

@ -46,7 +46,7 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
try {
execute();
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
if (!e.getMessage().contains("Cast Worldheart Phoenix")) {
Assert.fail("Must have thrown error about not being able to cast Worldheart Phoenix, but got:\n" + e.getMessage());
}
}
@ -102,8 +102,8 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
checkPlayableAbility("Can't cast Silvercoat", 2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Cast Silvercoat", false);
// CAN cast from exile
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Abzan Banner");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Dragon Grip", "Narset, Enlightened Master");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Abzan Banner", true);
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Dragon Grip", "Narset, Enlightened Master", true);
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Peach Garden Oath");
setStopAt(2, PhaseStep.END_TURN);
@ -245,9 +245,10 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{W}{U}{B}{R}{G}: Exile");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karn's Temporal Sundering");
addTarget(playerA, playerA);
addTarget(playerA, "Silvercoat Lion");
@ -291,9 +292,11 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
addCard(Zone.BATTLEFIELD, playerA, "Forest", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{W}{U}{B}{R}{G}: Exile");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mountain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karn's Temporal Sundering");
addTarget(playerA, playerA);
addTarget(playerA, "Golos, Tireless Pilgrim"); // Return to hand
@ -341,7 +344,7 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
attack(2, playerB, "Fallen Shinobi");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Tormenting Voice");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Tormenting Voice", true);
setChoice(playerB, "Pillarfield Ox"); // Discord for Tormenting Voice
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Demon of Catastrophes");
@ -391,7 +394,7 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
attack(2, playerB, "Fallen Shinobi");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Angelic Purge");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Angelic Purge", true);
setChoice(playerB, "Silvercoat Lion"); // Sacrifice for Purge
addTarget(playerB, "Amulet of Kroog"); // Exile with Purge
@ -451,7 +454,7 @@ public class PlayFromNonHandZoneTest extends CardTestPlayerBaseWithAIHelps {
// cast purge from exile
checkPlayableAbility("after exile - can play purge", 2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Cast Angelic Purge", true);
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Angelic Purge");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Angelic Purge", true);
setChoice(playerB, "Silvercoat Lion"); // sacrifice cost
addTarget(playerB, "Amulet of Kroog"); // exile target

View file

@ -204,7 +204,7 @@ public class PlayTopCardFromLibraryTest extends CardTestPlayerBase {
addCard(Zone.GRAVEYARD, playerA, "Balduvian Bears", 1);
// prepare mind
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind's Desire");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind's Desire", true);
// Return target creature card with converted mana cost 3 or less from your graveyard to the battlefield.
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Revival", "Balduvian Bears"); // {W/B}{W/B} = 2 life

View file

@ -98,7 +98,7 @@ public class SpendOtherManaTest extends CardTestPlayerBase {
// -7: You gain X life and draw X cards, where X is the number of lands you control.
addCard(Zone.LIBRARY, playerA, "Nissa, Voice of Zendikar"); // {1}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dark Petition");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Dark Petition", true);
addTarget(playerA, "Nissa, Voice of Zendikar");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nissa, Voice of Zendikar");

View file

@ -29,14 +29,15 @@ public class JacesPhantasmTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Jace's Phantasm");
addCard(Zone.HAND, playerA, "Mind Sculpt", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mind Sculpt", true);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Jace's Phantasm");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertGraveyardCount(playerB, 21);
assertPowerToughness(playerA, "Jace's Phantasm", 5, 5);
}
@ -47,15 +48,18 @@ public class JacesPhantasmTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Mind Sculpt", 3);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Jace's Phantasm");
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt", playerB);
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt", playerB);
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt", playerA);
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt");
waitStackResolved(3, PhaseStep.POSTCOMBAT_MAIN);
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt");
waitStackResolved(3, PhaseStep.POSTCOMBAT_MAIN);
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Mind Sculpt", true);
setStopAt(3, PhaseStep.END_TURN);
execute();
assertGraveyardCount(playerB, 14);
assertPowerToughness(playerA, "Jace's Phantasm", 5, 5);
// assertGraveyardCount(playerB, 21);
// assertPowerToughness(playerA, "Jace's Phantasm", 5, 5);
}
}

View file

@ -1,7 +1,9 @@
package org.mage.test.cards.conditional;
import com.sun.org.apache.bcel.internal.generic.POP;
import mage.abilities.keyword.FirstStrikeAbility;
import mage.abilities.keyword.HasteAbility;
import mage.constants.ManaType;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
@ -112,7 +114,7 @@ public class ManaWasSpentToCastTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Jaded Sell-Sword");
addCard(Zone.HAND, playerA, "Strike It Rich", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Strike It Rich");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Strike It Rich", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Jaded Sell-Sword");
setStopAt(1, PhaseStep.END_TURN);
@ -175,7 +177,7 @@ public class ManaWasSpentToCastTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Pyretic Ritual");
addCard(Zone.HAND, playerA, "Gray Ogre");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pyretic Ritual");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pyretic Ritual", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gray Ogre");
setStrictChooseMode(true);
@ -200,6 +202,7 @@ public class ManaWasSpentToCastTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}, {T}:");
setChoice(playerA, true);
setChoice(playerA, true);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gray Ogre");
setStrictChooseMode(true);
@ -222,9 +225,9 @@ public class ManaWasSpentToCastTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gray Ogre");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mana Drain", "Gray Ogre");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN); // Let the Mana Drain delayed triggered ability resolve
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Sliver Construct");
setStrictChooseMode(true);
setStopAt(1, PhaseStep.END_TURN);
execute();
@ -251,6 +254,7 @@ public class ManaWasSpentToCastTest extends CardTestPlayerBase {
setChoice(playerA, true);
addTarget(playerA, "Gray Ogre");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN); // Let the Mana Drain delayed triggered ability resolve
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Sliver Construct");
setStrictChooseMode(true);

View file

@ -28,6 +28,7 @@ public class AngelsTombTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Llanowar Elves");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Unsummon", "Angel's Tomb");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Angel's Tomb");
setStopAt(1, PhaseStep.END_TURN);

View file

@ -25,6 +25,8 @@ public class BecomesCreatureTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chimeric Mass");
setChoice(playerA, "X=3");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}:");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -46,6 +48,8 @@ public class BecomesCreatureTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chimeric Mass");
setChoice(playerA, "X=3");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}:");
setStopAt(2, PhaseStep.BEGIN_COMBAT);

View file

@ -2,6 +2,7 @@ package org.mage.test.cards.continuous;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.players.Player;
import org.junit.Test;
import org.mage.test.player.TestPlayer;
import org.mage.test.serverside.base.CardTestPlayerBase;
@ -19,6 +20,7 @@ public class BoostEnchantedTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Firebreathing"); // {R} Enchantment - Aura
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: Enchanted creature");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -51,6 +53,7 @@ public class BoostEnchantedTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Boomerang"); // {U}{U} Instant
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Boomerang", "Firebreathing");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: Enchanted creature", TestPlayer.NO_TARGET, "Boomerang");
@ -66,7 +69,6 @@ public class BoostEnchantedTest extends CardTestPlayerBase {
* If the aura moves between activation and resolution, the new enchanted
* creature should be boosted, not the old one.
*/
@Test
public void testFirebreathingWithAuraGraft() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
@ -80,8 +82,9 @@ public class BoostEnchantedTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Aura Graft"); // {1}{U} Instant
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Firebreathing", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}: Enchanted creature");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Aura Graft", "Firebreathing");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Aura Graft", "Firebreathing", "{R}: Enchanted");
setChoice(playerB, "Pillarfield Ox");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -91,7 +94,5 @@ public class BoostEnchantedTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "Firebreathing", 1);
assertPowerToughness(playerA, "Silvercoat Lion", 2, 2);
assertPowerToughness(playerB, "Pillarfield Ox", 3, 4);
}
}

View file

@ -77,7 +77,7 @@ public class ChangelingTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, woodlandChangeling, 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, mimic);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, mimic, true);
setChoice(playerA, "Sliver");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, woodlandChangeling);

View file

@ -22,12 +22,11 @@ public class ChiefOfTheFoundryTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Chief of the Foundry");
addCard(Zone.HAND, playerA, "Chief of the Foundry");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chief of the Foundry");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chief of the Foundry", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Chief of the Foundry");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPowerToughness(playerA, "Chief of the Foundry", 3, 4, Filter.ComparisonScope.All);
}
}

View file

@ -265,14 +265,15 @@ public class CommandersCastTest extends CardTestCommander4PlayersWithAIHelps {
execute();
}
/**
* Reported bug: https://github.com/magefree/mage/issues/5121
* Exiling your commander from your graveyard should give you the option to put it in command zone
* We were playing in a restarted-by-Karn game (if that mattered), and a player who exiled their
* commander from graveyard via Delve was not given the opportunity to place it in the command zone.
* Instead, it went directly to the exiled zone.
*/
@Test
public void test_ExileWithDelvePayAndReturn() {
// https://github.com/magefree/mage/issues/5121
// Exiling your commander from your graveyard should give you the option to put it in command zone
// We were playing in a restarted-by-Karn game (if that mattered), and a player who exiled their
// commander from graveyard via Delve was not given the opportunity to place it in the command zone.
// Instead, it went directly to the exiled zone.
// disable auto-payment for delve test
disableManaAutoPayment(playerA);
@ -298,6 +299,7 @@ public class CommandersCastTest extends CardTestCommander4PlayersWithAIHelps {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Balduvian Bears");
setChoice(playerA, "Red"); // pay
setChoice(playerA, false); // leave in graveyard
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
// use commander as delve pay
activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {U}", 5);

View file

@ -32,8 +32,8 @@ public class DaxosTheReturnedTest extends CardTestPlayerBase {
// Whenever an opponent draws a card, Underworld Dreams deals 1 damage to that player.
addCard(Zone.HAND, playerA, "Underworld Dreams", 2); // {B}{B}{B}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Underworld Dreams");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Underworld Dreams");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Underworld Dreams", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Underworld Dreams", true);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{1}{W}{B}");
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();

View file

@ -33,7 +33,7 @@ public class DependentEffectsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence",true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -13,9 +13,6 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*/
public class InfestTest extends CardTestPlayerBase {
/**
* Tests creatures for Flying gained from Wonder ability when all conditions were met
*/
@Test
public void testMassBoostEffectLocked() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
@ -26,9 +23,9 @@ public class InfestTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Grizzly Bears");
addCard(Zone.HAND, playerA, "Grizzly Bears");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infest");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Grizzly Bears");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Grizzly Bears");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infest", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grizzly Bears", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Grizzly Bears");
setStopAt(1, PhaseStep.END_TURN);
execute();
@ -38,7 +35,4 @@ public class InfestTest extends CardTestPlayerBase {
assertGraveyardCount(playerA, "Elite Vanguard", 2);
assertPermanentCount(playerA, "Grizzly Bears", 2);
}
}

View file

@ -5,12 +5,13 @@ import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
public class IrencragFeatTest extends CardTestPlayerBase {
/*
Irencrag Feat
Add seven {R}. You can cast only one more spell this turn.
/**
* {@link mage.cards.i.IrencragFeat Irencrag Feat}
* Sorcery
* {1}{R}{R}{R}
* Add seven {R}. You can cast only one more spell this turn.
*/
public class IrencragFeatTest extends CardTestPlayerBase {
@Test
public void castFirst() {
@ -78,6 +79,8 @@ public class IrencragFeatTest extends CardTestPlayerBase {
@Test
public void castThirdOnStack() {
// You may cast sorcery spell as though they had flash
addCard(Zone.BATTLEFIELD, playerA, "Wizards of Thay");
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 10);
addCard(Zone.HAND, playerA, "Irencrag Feat", 1);
addCard(Zone.HAND, playerA, "Lightning Bolt", 4);
@ -89,7 +92,6 @@ public class IrencragFeatTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
@ -108,6 +110,7 @@ public class IrencragFeatTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
checkPlayableAbility("can cast before feat 2", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Lightning Bolt", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
// feat
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Irencrag Feat");
@ -134,9 +137,9 @@ public class IrencragFeatTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Dwarven Trader", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Irencrag Feat");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Dwarven Trader");
setStrictChooseMode(true);

View file

@ -16,13 +16,17 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
*/
public class LayerTests extends CardTestPlayerBase {
/**
* Conspiracy -> Opalescence -> Enchanted Evening
* Conspiracy is dependent on Opalescence
* Opalescence is dependent on Enchanted Evening
*
* So, the effects should be applied as follows:
* Enchanted Evening -> Opalescence -> Conspiracy
*/
@Test
public void testMultipleLayeredDependency() {
//Conspiracy->Opalescence->Enchanted Evening
//Conspiracy is dependent on Opalescence
//Opalescence is dependent on Enchanted Evening
//So, the effects should be applied as follows:
//Enchanted Evening->Opalescence->Conspiracy
addCard(Zone.HAND, playerA, "Conspiracy"); // creatures get chosen subtype
addCard(Zone.HAND, playerA, "Opalescence"); // enchantments become creatures P/T equal to CMC
@ -33,9 +37,9 @@ public class LayerTests extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Glorious Anthem", 1); // keep lands alive // all creatures +1/+1
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Conspiracy");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Conspiracy", true);
setChoice(playerA, "Advisor");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Opalescence", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Enchanted Evening");
setStrictChooseMode(true);
@ -49,18 +53,15 @@ public class LayerTests extends CardTestPlayerBase {
}
/**
* Reported bug:
* This came up in a recent EDH game and we had no idea how to progress.
* Player A cast a Humility, then a March of the Machines, and finally a Mycosynth Lattice.
* Does the game get stuck in an endless loop of each card gaining and losing its respective creature-ness and abilities?
* Answer: No, they all die
*/
@Test
public void testMycosynthLatticeAndMarchOfTheMachinesAndHumility() {
// example from Reddit
/*
This came up in a recent EDH game and we had no idea how to progress.
Player A cast a Humility, then a March of the Machines, and finally
a Mycosynth Lattice.
Does the game get stuck in an endless loop of each card gaining and
losing its respective creature-ness and abilities?
Answer: No, they all die
*/
addCard(Zone.HAND, playerA, "Mycosynth Lattice"); // all permanents are artifacts
addCard(Zone.HAND, playerA, "March of the Machines"); // artifacts become creatures
addCard(Zone.HAND, playerA, "Humility"); // all creatures lose abilities and P/T is 1/1
@ -69,8 +70,8 @@ public class LayerTests extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Plains", 10);
addCard(Zone.BATTLEFIELD, playerA, "Island", 10);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Humility");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "March of the Machines");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Humility", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "March of the Machines", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mycosynth Lattice");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
@ -81,7 +82,6 @@ public class LayerTests extends CardTestPlayerBase {
assertPermanentCount(playerA, "March of the Machines", 0);
assertPermanentCount(playerA, "Mycosynth Lattice", 0);
assertPermanentCount(playerA, "Island", 0);
}
@Test
@ -151,7 +151,7 @@ public class LayerTests extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Island", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Animate Land", "Urborg, Tomb of Yawgmoth");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ovinize", "Urborg, Tomb of Yawgmoth");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Ovinize", "Urborg, Tomb of Yawgmoth");
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute();

View file

@ -43,7 +43,7 @@ public class SerraAscendantTest extends CardTestPlayerBase {
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Wild Nacatl");
playLand(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Plains");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Martyr of Sands");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Martyr of Sands", true);
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}, You may reveal X white cards from your hand");
setChoice(playerA, "Silvercoat Lion");
setChoice(playerA, "Silvercoat Lion");

View file

@ -28,14 +28,15 @@ public class SplitSecondTest extends CardTestPlayerBase {
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
if (!e.getMessage().contains("Cast Counterspell$target=Sudden Shock")) {
Assert.fail("Should have thrown error about trying to use Counterspell, but got:\n" + e.getMessage());
}
}
assertHandCount(playerA, "Counterspell", 1);
assertGraveyardCount(playerA, "Sudden Shock", 1);
assertLife(playerB, 20 - 2);
// TODO: Re-enable when checkPlayableAbility can be used instead of try-catch
// assertHandCount(playerA, "Counterspell", 1);
// assertGraveyardCount(playerA, "Sudden Shock", 1);
// assertLife(playerB, 20 - 2);
}
@Test

View file

@ -9,6 +9,11 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* {@link mage.cards.s.SwarmSurge Swarm Surge}
* {2}{B}
* Devoid
* Creatures you control get +2/+0 until end of turn.
* Colorless creatures you control also gain first strike until end of turn.
*
* @author LevelX2
*/
@ -23,12 +28,9 @@ public class SwarmSurgeTest extends CardTestPlayerBase {
// When Birthing Hulk enters the battlefield, put two 1/1 colorless Eldrazi Scion creature tokens onto the battlefield. They have "Sacrifice this creature: Add {C}."
// {1}{C}: Regenerate Birthing Hulk.
addCard(Zone.HAND, playerA, "Birthing Hulk"); // {6}{G} 5/4
// Devoid
// Creatures you control get +2/+0 until end of turn.
// Colorless creatures you control also gain first strike until end of turn.
addCard(Zone.HAND, playerA, "Swarm Surge"); // {2}{B}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birthing Hulk");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Birthing Hulk", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Swarm Surge");
attack(1, playerA, "Silvercoat Lion");

View file

@ -26,7 +26,7 @@ public class WardenOfTheFirstTreeTest extends CardTestPlayerBase {
// {3}{W/B}{W/B}{W/B}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it.
addCard(Zone.HAND, playerA, "Warden of the First Tree", 2); // {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{W/B}:");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -48,7 +48,7 @@ public class WardenOfTheFirstTreeTest extends CardTestPlayerBase {
// {3}{W/B}{W/B}{W/B}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it.
addCard(Zone.HAND, playerA, "Warden of the First Tree", 2); // {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{W/B}:");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2}{W/B}{W/B}:");
@ -72,7 +72,7 @@ public class WardenOfTheFirstTreeTest extends CardTestPlayerBase {
// {3}{W/B}{W/B}{W/B}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it.
addCard(Zone.HAND, playerA, "Warden of the First Tree", 2); // {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{W/B}:");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2}{W/B}{W/B}:");
@ -104,7 +104,7 @@ public class WardenOfTheFirstTreeTest extends CardTestPlayerBase {
// {3}{W/B}{W/B}{W/B}: If Warden of the First Tree is a Spirit, put five +1/+1 counters on it.
addCard(Zone.HAND, playerA, "Warden of the First Tree", 2); // {G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Warden of the First Tree", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{W/B}:");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{2}{W/B}{W/B}:");

View file

@ -28,9 +28,10 @@ public class PlayCardsFromGraveyardTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
addCard(Zone.HAND, playerB, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yawgmoth's Will");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reviving Dose");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Yawgmoth's Will", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reviving Dose", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -52,10 +52,11 @@ public class CastOtherPlayersCardFromExileTest extends CardTestPlayerBase {
// setStrictChooseMode(true);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Bottle Gnomes");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Bottle Gnomes", true);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Sacrifice");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Wildwood Rebirth", "Bottle Gnomes");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Bottle Gnomes");
setStopAt(2, PhaseStep.BEGIN_COMBAT);
@ -86,6 +87,7 @@ public class CastOtherPlayersCardFromExileTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Bottle Gnomes");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Saving Grasp", "Bottle Gnomes");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Bottle Gnomes");
setStopAt(2, PhaseStep.BEGIN_COMBAT);

View file

@ -26,6 +26,7 @@ public class DebtOfLoyaltyTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Metallic Sliver"); // 1/1
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Debt of Loyalty", "Metallic Sliver");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Tremor");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -91,7 +91,7 @@ public class ExileAndReturnUnderYourControl extends CardTestPlayerBase {
setStrictChooseMode(true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Master of Pearls");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Master of Pearls", true);
setChoice(playerA, true); // cast it face down as 2/2 creature
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Villainous Wealth", playerB);

View file

@ -62,7 +62,7 @@ public class GainControlTargetEffectTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}, {T}: Gain control of target creature with power less than or equal to the number of Islands you control for as long as {this} remains tapped.", "Glen Elendra Archmage");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Strike", playerA);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}, Sacrifice {this}: Counter target noncreature spell.", "Lightning Strike");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}, Sacrifice {this}: Counter target noncreature spell.", "Lightning Strike", "Lightning Strike");
setStopAt(1, PhaseStep.END_TURN);
execute();
@ -117,7 +117,7 @@ public class GainControlTargetEffectTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Plains", 2);
addCard(Zone.HAND, playerB, "Silvercoat Lion", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Steel Golem");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Steel Golem", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Donate", playerB);
addTarget(playerA, "Steel Golem");

View file

@ -176,7 +176,7 @@ public class GontiLordOfLuxuryEffectTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gonti, Lord of Luxury");
// Player B is autochosen since only option
setChoice(playerA, "Ob Nixilis Reignited");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Ob Nixilis Reignited");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Ob Nixilis Reignited", true);
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "-3:", "Dross Crocodile");
attack(2, playerB, "Dross Crocodile", "Ob Nixilis Reignited");
@ -197,6 +197,5 @@ public class GontiLordOfLuxuryEffectTest extends CardTestPlayerBase {
assertHandCount(playerB, "Ob Nixilis Reignited", 0);
assertPermanentCount(playerB, "Ob Nixilis Reignited", 1);
}
}

View file

@ -28,6 +28,7 @@ public class ItThatBetraysTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "It That Betrays");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}, Pay 1 life, Sacrifice");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}, Pay 1 life, Sacrifice");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -29,9 +29,9 @@ public class WelcomeToTheFoldTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Jace, Vryn's Prodigy", 1); // 0/2
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard", 1); // 2/1
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Welcome to the Fold");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Welcome to the Fold", true);
addTarget(playerA, "Arashin Cleric"); // does not gain control
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Welcome to the Fold");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Welcome to the Fold", true);
addTarget(playerA, "Jace, Vryn's Prodigy"); // gains control
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Welcome to the Fold");
addTarget(playerA, "Elite Vanguard"); // gains control

View file

@ -64,7 +64,7 @@ public class CleverImpersonatorTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Balduvian Bears", 1);
addCard(Zone.HAND, playerB, "Balduvian Bears", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clever Impersonator");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clever Impersonator", true);
setChoice(playerA, true); // make copy
setChoice(playerA, "Liliana, Defiant Necromancer"); // copy target
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2: Each player discards a card");
@ -157,8 +157,9 @@ public class CleverImpersonatorTest extends CardTestPlayerBase {
}
/*
* Reported bug: could not use Clever Impersonator to copy Dawn's Reflection
/**
* Reported bug:
* Could not use Clever Impersonator to copy Dawn's Reflection
*/
@Test
public void dawnsReflectionCopiedByImpersonator() {
@ -181,10 +182,10 @@ public class CleverImpersonatorTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Forest", 6);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, dReflection, "Forest"); // enchant a forest
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, impersonator);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, impersonator);
setChoice(playerA, dReflection); // have Impersonator enter as copy of Dawn's Reflection
setStopAt(1, PhaseStep.BEGIN_COMBAT);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertHandCount(playerA, dReflection, 0);
@ -206,14 +207,22 @@ public class CleverImpersonatorTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Dragon Appeasement");
addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
setStrictChooseMode(true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Kindred Discovery"); // Construct token auto-chosen
setChoice(playerA, "Thopter");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clever Impersonator");
setChoice(playerB, "Yes");
setChoice(playerB, "Kindred Discovery");
setChoice(playerB, "Thopter");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Ornithopter");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Ornithopter");
waitStackResolved(2, PhaseStep.PRECOMBAT_MAIN);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Memnite");
setStopAt(2, PhaseStep.END_COMBAT);
@ -221,5 +230,4 @@ public class CleverImpersonatorTest extends CardTestPlayerBase {
assertHandCount(playerB, 2);
}
}

View file

@ -69,9 +69,10 @@ public class CopyCreatureCardToTokenImplTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Thrashing Brontodon"); // Creature {1}{G}{G}
addCard(Zone.BATTLEFIELD, playerB, "Forest", 4);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Thrashing Brontodon");
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}, Sacrifice");
// Alpha Myr is auto-chosen since only valid target
setStrictChooseMode(true);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Thrashing Brontodon", true);
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}, Sacrifice", "Alpha Myr");
setStopAt(2, PhaseStep.BEGIN_COMBAT);
execute();
@ -84,5 +85,4 @@ public class CopyCreatureCardToTokenImplTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Thrashing Brontodon", 1);
assertType("Thrashing Brontodon", CardType.ARTIFACT, true);
}
}

View file

@ -33,6 +33,7 @@ public class EldraziMimicTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Thought Harvester");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Terror", "Thought Harvester");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -145,7 +145,7 @@ public class EssenceOfTheWildCopyTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Silvercoat Lion", 1);
// apply -1/-1 effect (+2: Put a -1/-1 counter on up to one target creature.)
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "+2:", "Essence of the Wild");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2:", "Essence of the Wild");
// copy
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Silvercoat Lion");

View file

@ -102,7 +102,7 @@ public class EssenceOfTheWildTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Silvercoat Lion", 1);
// apply -1/-1 effect (+2: Put a -1/-1 counter on up to one target creature.)
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "+2:", "Essence of the Wild");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "+2:", "Essence of the Wild");
// copy
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Silvercoat Lion");

View file

@ -32,9 +32,11 @@ public class HelmOfTheHostTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Helm of the Host", 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip");
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn");
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "0: Until end of turn");
attack(3, playerA, "Gideon of the Trials");
@ -50,5 +52,4 @@ public class HelmOfTheHostTest extends CardTestPlayerBase {
assertLife(playerB, 12);
assertLife(playerA, 20);
}
}

View file

@ -31,7 +31,7 @@ public class InfiniteReflectionTest extends CardTestPlayerBase {
// Nontoken creatures you control enter the battlefield as a copy of enchanted creature.
addCard(Zone.HAND, playerA, "Infinite Reflection", 1); // {5}{U}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infinite Reflection", "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Infinite Reflection", "Silvercoat Lion", true);
// castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Nantuko Husk");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Reanimate", "Pillarfield Ox");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -134,7 +134,7 @@ public class KikiJikiMirrorBreakerTest extends CardTestPlayerBase {
// You may have Body Double enter the battlefield as a copy of any creature card in a graveyard.
addCard(Zone.HAND, playerB, "Body Double", 1); // {4}{U}
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Body Double");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Body Double", true);
setChoice(playerB, "Silvercoat Lion");
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}: Create a token that's a copy of target nonlegendary creature you control, except it has haste. Sacrifice it at the beginning of the next end step.");

View file

@ -169,8 +169,9 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase {
skipInitShuffling();
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Target player mills a card.", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Tribute to Hunger");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Tribute to Hunger");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Reanimate", "Lazav, Dimir Mastermind");
@ -213,7 +214,7 @@ public class LazavDimirMastermindTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Target player mills a card.", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rest in Peace");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Rest in Peace");
setStopAt(1, PhaseStep.END_TURN);
execute();

View file

@ -40,7 +40,7 @@ public class MimicVatTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
// clone the opponent's creature
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone", true);
setChoice(playerA, true); // use clone on etb
setChoice(playerA, "Silvercoat Lion");
@ -77,7 +77,7 @@ public class MimicVatTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phyrexian Metamorph");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phyrexian Metamorph", true);
setChoice(playerA, true);
setChoice(playerA, "Silvercoat Lion");

View file

@ -75,6 +75,7 @@ public class PhantasmalImageTest extends CardTestPlayerBase {
for (int i = 0; i < 12; i++) {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
}
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Phantasmal Image");
@ -110,12 +111,11 @@ public class PhantasmalImageTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Phantasmal Image", 2);
addCard(Zone.BATTLEFIELD, playerA, "Illusionary Servant");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phantasmal Image", true);
setChoice(playerA, "Illusionary Servant");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phantasmal Image");
setChoice(playerA, "Illusionary Servant-M10");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phantasmal Image");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Phantasmal Image");
setStopAt(1, PhaseStep.END_TURN);
execute();

View file

@ -16,7 +16,7 @@ public class SplinterTwinTest extends CardTestPlayerBase {
public void testCopyCreature() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
// Enchant creature
// Enchanted creature has "{T}: Create a tokenthat's a copy of this creature onto the battlefield. That token has haste. Exile it at the beginning of the next end step."
// Enchanted creature has "{T}: Create a token that's a copy of this creature onto the battlefield. That token has haste. Exile it at the beginning of the next end step."
addCard(Zone.HAND, playerA, "Splinter Twin"); // {2}{R}{R}
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion");
@ -24,8 +24,9 @@ public class SplinterTwinTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Splinter Twin", "Silvercoat Lion");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Create a token");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Create a token");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion", "{T}: Create a token");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -39,5 +40,4 @@ public class SplinterTwinTest extends CardTestPlayerBase {
assertPermanentCount(playerA, "Silvercoat Lion", 1);
}
}

View file

@ -41,7 +41,7 @@ public class TheMimeoplasmTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
castSpell(1,PhaseStep.PRECOMBAT_MAIN, playerA, "The Mimeoplasm");
castSpell(1,PhaseStep.PRECOMBAT_MAIN, playerA, "The Mimeoplasm", true);
setChoice(playerA, "Aven Riftwatcher");
setChoice(playerA, "Silvercoat Lion");

View file

@ -20,10 +20,11 @@ public class RemoveCounterCostTest extends CardTestPlayerBase {
// {1}, Remove two +1/+1 counters from among creatures you control: Draw a card.
addCard(Zone.HAND, playerA, "Novijen Sages");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Novijen Sages");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Novijen Sages", true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}, Remove two +1/+1 counters");
setChoice(playerA, "X=2");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();

View file

@ -85,8 +85,8 @@ public class AdventureCardsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Forest");
addCard(Zone.HAND, playerA, "Curious Pair");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair", true);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -154,8 +154,8 @@ public class AdventureCardsTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Edgewall Innkeeper");
addCard(Zone.HAND, playerA, "Curious Pair");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair", true);
setStrictChooseMode(true);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -319,8 +319,9 @@ public class AdventureCardsTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Psychic Intrusion", playerB);
setChoice(playerA, "Curious Pair");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Treats to Share", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curious Pair");
setStrictChooseMode(true);
@ -361,8 +362,10 @@ public class AdventureCardsTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Rimrock Knight", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Boulder Rush", "Eager Cadet");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Boulder Rush", "Eager Cadet");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rimrock Knight");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rimrock Knight", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rimrock Knight");
setStrictChooseMode(true);

View file

@ -364,7 +364,7 @@ public class CastFromHandWithoutPayingManaCostTest extends CardTestPlayerBase {
// Creature - 3/3 Swampwalk
addCard(Zone.HAND, playerA, "Bog Wraith", 1); // Creature {3}{B} (3/3)
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Omniscience");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Omniscience", true);
setChoice(playerA, true); // Pay alternative costs? ({W}{U}{B}{R}{G})
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Bog Wraith");

View file

@ -36,6 +36,7 @@ public class CastFromLibraryWithoutPayingManaCostTest extends CardTestPlayerBase
// Equip Sunforger to Storm Crow.
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Equip", "Storm Crow");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
// Unattach Sunforger to cast Utter End from library targeting Gray Ogre.
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{R}{W}, Unattach");
addTarget(playerA, "Utter End");
@ -46,6 +47,7 @@ public class CastFromLibraryWithoutPayingManaCostTest extends CardTestPlayerBase
// Equip Sunforger to Storm Crow again.
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Equip", "Storm Crow");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN);
// Unattach Sunforger to cast Utter End from library targeting Hill Giant.
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{R}{W}, Unattach");
addTarget(playerA, "Utter End");
@ -73,11 +75,12 @@ public class CastFromLibraryWithoutPayingManaCostTest extends CardTestPlayerBase
// converted mana cost 4 or less and cast that card without paying its mana cost. Then shuffle your library.
// Equip {3}
addCard(Zone.BATTLEFIELD, playerA, "Sunforger");
addCard(Zone.BATTLEFIELD, playerA, "Elixir of Immortality");
// {2}, {T}: You gain 5 life. Shuffle Elixir of Immortality and your graveyard into their owner's library.
addCard(Zone.BATTLEFIELD, playerA, "Elixir of Immortality");
addCard(Zone.BATTLEFIELD, playerA, "Plains", 10);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 10);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 10);
// Instant
// Exile target nonland permanent.
addCard(Zone.HAND, playerA, "Utter End");
@ -92,6 +95,7 @@ public class CastFromLibraryWithoutPayingManaCostTest extends CardTestPlayerBase
// Equip Sunforger to Storm Crow.
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Equip", "Storm Crow");
waitStackResolved(1, PhaseStep.POSTCOMBAT_MAIN);
// Unattach Sunforger to cast Utter End from library targeting Hill Giant.
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{R}{W}, Unattach");
addTarget(playerA, "Utter End");
@ -111,5 +115,4 @@ public class CastFromLibraryWithoutPayingManaCostTest extends CardTestPlayerBase
// Check that Utter End is in the graveyard.
assertGraveyardCount(playerA, "Utter End", 1);
}
}

View file

@ -73,7 +73,7 @@ public class CostModificationTest extends CardTestPlayerBase {
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerB must have 0 actions but found 1")) {
if (!e.getMessage().contains("Cast Gitaxian Probe$targetPlayer=PlayerA")) {
Assert.fail("must throw error about having 0 actions, but got:\n" + e.getMessage());
}
}
@ -121,7 +121,7 @@ public class CostModificationTest extends CardTestPlayerBase {
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
if (!e.getMessage().contains("Cast Myr Superion")) {
Assert.fail("must throw error about having 0 actions, but got:\n" + e.getMessage());
}
}
@ -144,7 +144,7 @@ public class CostModificationTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Carnivorous Moss-Beast"); // 4/5
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pyretic Ritual");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Pyretic Ritual", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Fated Conflagration", "Carnivorous Moss-Beast");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
@ -212,8 +212,8 @@ public class CostModificationTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Zoetic Cavern");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
playLand(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Zoetic Cavern");
setChoice(playerA, true);
@ -247,7 +247,7 @@ public class CostModificationTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Zoetic Cavern");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
setStopAt(1, PhaseStep.END_TURN);
@ -439,6 +439,7 @@ public class CostModificationTest extends CardTestPlayerBase {
Assert.assertEquals("must have max possible X as 4", 4, cost.getMaxValue(ability, game));
});
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
// Huatli: make x cost -3 instead -4
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "-X: {this} deals X damage divided as you choose");
setChoice(playerA, "X=4");
@ -473,7 +474,7 @@ public class CostModificationTest extends CardTestPlayerBase {
checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "-8:", false);
// prepare duplicates
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spark Double");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spark Double", true);
setChoice(playerA, true); // copy
setChoice(playerA, "Carth the Lion"); // copy target
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Spark Double");

View file

@ -90,9 +90,8 @@ public class CostReduceForEachTest extends CardTestPlayerBaseWithAIHelps {
checkPlayableAbility("no cost reduction 1", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Khalni Hydra", false);
// prepare creatures for reduce
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears", true);
checkPlayableAbility("no cost reduction 2", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Khalni Hydra", false);
// can cast on next turn
@ -120,14 +119,12 @@ public class CostReduceForEachTest extends CardTestPlayerBaseWithAIHelps {
// prepare creatures for reduce
activateManaAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add {G}", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Balduvian Bears");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN, playerA);
checkPlayableAbility("no cost reduction 2", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Torgaar, Famine Incarnate", false);
// can cast on next turn
checkPlayableAbility("must reduce", 3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Torgaar, Famine Incarnate", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Torgaar, Famine Incarnate");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Torgaar, Famine Incarnate", true);
setChoice(playerA, "X=2"); // two creatures sacrifice
setChoice(playerA, "Balduvian Bears");
setChoice(playerA, "Balduvian Bears");

View file

@ -28,7 +28,7 @@ public class HeartstoneTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerB, "Lightning Bolt");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{U}, Tap two untapped Wizards you control: Copy target instant or sorcery spell. You may choose new targets for the copy.", "Lightning Bolt");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{1}{U}", "Lightning Bolt", "Lightning Bolt");
setChoice(playerA, true);
addTarget(playerA, playerB);
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -72,11 +72,12 @@ public class KaradorGhostChieftainTest extends CardTestPlayerBase {
// During each of your turns, you may cast one creature card from your graveyard.
addCard(Zone.HAND, playerA, "Karador, Ghost Chieftain");// {5}{B}{G}{W}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karador, Ghost Chieftain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karador, Ghost Chieftain", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion", true);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cloudshift", "Karador, Ghost Chieftain");
waitStackResolved(3, PhaseStep.PRECOMBAT_MAIN);
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Silvercoat Lion");
@ -112,7 +113,7 @@ public class KaradorGhostChieftainTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Gisa and Geralf"); // CREATURE {2}{U}{B} (4/4)
// prepare spels with same AsThough effects and puts creature to graveyard
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karador, Ghost Chieftain");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Karador, Ghost Chieftain", true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gisa and Geralf");
// you play any creatures due to two approve objects
@ -132,5 +133,4 @@ public class KaradorGhostChieftainTest extends CardTestPlayerBase {
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
}
}

View file

@ -24,6 +24,7 @@ public class MizzixOfTheIzmagnusTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Incinerate"); // {1}{R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Incinerate", playerB);
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
@ -51,6 +52,7 @@ public class MizzixOfTheIzmagnusTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blaze", playerB);
setChoice(playerA, "X=1");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Blaze", playerB);
setChoice(playerA, "X=2");
@ -79,6 +81,7 @@ public class MizzixOfTheIzmagnusTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Seething Anger"); // {R} Buyback {3}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Seething Anger", "Mizzix of the Izmagnus");
setChoice(playerA, true);
@ -113,6 +116,7 @@ public class MizzixOfTheIzmagnusTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");// 2/2
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Engulfing Flames", "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback", "Silvercoat Lion");
setStopAt(1, PhaseStep.BEGIN_COMBAT);

View file

@ -100,7 +100,7 @@ public class ExcessDamageTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, bolt);
setStrictChooseMode(true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bolt, gideon);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, bolt, gideon, true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "0:");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, spill, gideon);

View file

@ -36,7 +36,7 @@ public class ConjureTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Plains", 6);
addCard(Zone.HAND, playerA, trainer);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trainer);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, trainer, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, pegasus);
setStrictChooseMode(true);

View file

@ -54,9 +54,9 @@ public class EmblemsTest extends CardTestPlayerBase {
addCounters(1, PhaseStep.UPKEEP, playerA, "Sorin, Lord of Innistrad", CounterType.LOYALTY, 1);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "-2: You get an emblem");
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "-2: You get an emblem");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Elite Inquisitor");
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Elite Inquisitor");
setStopAt(3, PhaseStep.END_COMBAT);
setStopAt(3, PhaseStep.END_TURN);
execute();
assertGraveyardCount(playerA, "Sorin, Lord of Innistrad", 1);

View file

@ -88,6 +88,7 @@ public class AnimateDeadTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Animate Dead", "Eternal Witness");
setChoice(playerA, "Yes");
addTarget(playerA, "Silvercoat Lion");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Eternal Witness");

View file

@ -62,6 +62,7 @@ public class ClassTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, merfolk);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{U}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{4}{U}");
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
@ -88,7 +89,9 @@ public class ClassTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, forest, 2);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{G}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, forest);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, forest);
setStopAt(1, PhaseStep.END_TURN);
@ -108,8 +111,11 @@ public class ClassTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, wastes);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{G}");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, forest);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, wastes);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{4}{G}");
addTarget(playerA, wastes);

View file

@ -72,7 +72,7 @@ public class EnchantingGraveyardCardsTest extends CardTestPlayerBase {
// Lightning Bolt deals 3 damage to any target.
addCard(Zone.GRAVEYARD, playerB, "Lightning Bolt", 1); // Instant {R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, SPELLWEAVER_VOLUTE, LIGHTNING_BOLT);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, SPELLWEAVER_VOLUTE, LIGHTNING_BOLT, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cloak of Feathers", "Silvercoat Lion");
setChoice(playerA, true); // play the L. Bold
addTarget(playerA, playerB); // Add Target for the L. Bold
@ -118,7 +118,7 @@ public class EnchantingGraveyardCardsTest extends CardTestPlayerBase {
// Lightning Bolt deals 3 damage to any target.
addCard(Zone.GRAVEYARD, playerB, "Lightning Bolt", 1); // Instant {R}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, SPELLWEAVER_VOLUTE, LIGHTNING_BOLT);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, SPELLWEAVER_VOLUTE, LIGHTNING_BOLT, true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cloak of Feathers", "Silvercoat Lion");
setChoice(playerA, true); // play the L. Bold
addTarget(playerA, playerB); // Add Target for the L. Bold

View file

@ -23,6 +23,7 @@ public class ParadoxHazeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Verdant Force", 1); // {5}{G}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Paradox Haze", playerA);
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Verdant Force");
setStopAt(3, PhaseStep.PRECOMBAT_MAIN);
@ -48,7 +49,8 @@ public class ParadoxHazeTest extends CardTestPlayerBase {
addCard(Zone.HAND, playerA, "Verdant Force", 1); // {5}{G}{G}{G}
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Paradox Haze", playerA);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Copy Enchantment");
waitStackResolved(1, PhaseStep.PRECOMBAT_MAIN);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Copy Enchantment", true);
setChoice(playerA, "Paradox Haze");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Verdant Force");

Some files were not shown because too many files have changed in this diff Show more