Fixing several tests. Working towards enabling assertAllCommandsUsed() inside execute().

This commit is contained in:
Alex Vasile 2022-05-15 10:51:38 -06:00
parent e955d47821
commit 2497e44182
12 changed files with 201 additions and 78 deletions

View file

@ -28,7 +28,7 @@ public class ChangelingTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerA, "Long-Forgotten Gohei"); addCard(Zone.BATTLEFIELD, playerA, "Long-Forgotten Gohei");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Woodland Changeling"); checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Woodlan", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();

View file

@ -62,21 +62,22 @@ public class CyclingTest extends CardTestPlayerBase {
} }
/** /**
* Cycle from graveyard or battlefield may not work * Cycle from graveyard or battlefield should not work.
*/ */
@Test @Test
public void cycleFromGraveyard() { public void cycleFromGraveyard() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
// Destroy all creatures. They can't be regenerated. Draw a card for each creature destroyed this way. // Destroy all creatures. They can't be regenerated. Draw a card for each creature destroyed this way.
// Cycling {3}{B}{B} // Cycling {3}{B}{B}
// When you cycle Decree of Pain, all creatures get -2/-2 until end of turn. // When you cycle Decree of Pain, all creatures get -2/-2 until end of turn.
addCard(Zone.GRAVEYARD, playerA, "Decree of Pain"); addCard(Zone.GRAVEYARD, playerA, "Decree of Pain");
// Protection from black // Protection from black
// Cycling {2} ({2}, Discard this card: Draw a card.) // Cycling {2} ({2}, Discard this card: Draw a card.)
addCard(Zone.BATTLEFIELD, playerB, "Disciple of Grace"); addCard(Zone.BATTLEFIELD, playerB, "Disciple of Grace");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cycling {3}{B}{B}"); checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cycling", false);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Cycling {2}");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();

View file

@ -2,6 +2,7 @@ package org.mage.test.cards.mana;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
@ -18,22 +19,28 @@ public class ManaSourceTest extends CardTestPlayerBase {
@Test @Test
public void testCantCastWithCreatureCard() { public void testCantCastWithCreatureCard() {
// Exile Simian Spirit Guide from your hand: Add {R}. // Exile Simian Spirit Guide from your hand: Add {R}.
addCard(Zone.HAND, playerB, "Simian Spirit Guide", 1); addCard(Zone.HAND, playerA, "Simian Spirit Guide", 1);
// Spend only mana produced by creatures to cast Myr Superion. // Spend only mana produced by creatures to cast Myr Superion.
addCard(Zone.HAND, playerB, "Myr Superion", 1); // {2} addCard(Zone.HAND, playerA, "Myr Superion", 1); // {2}
addCard(Zone.BATTLEFIELD, playerB, "Manakin", 1); addCard(Zone.BATTLEFIELD, playerA, "Manakin", 1);
activateManaAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Exile"); activateManaAbility(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Exile");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Myr Superion"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Myr Superion");
setStopAt(2, PhaseStep.BEGIN_COMBAT); setStopAt(2, PhaseStep.BEGIN_COMBAT);
execute();
assertExileCount("Simian Spirit Guide", 1); try {
execute();
assertPermanentCount(playerB, "Myr Superion", 0); assertExileCount("Simian Spirit Guide", 1);
assertHandCount(playerB, "Myr Superion", 1);
assertPermanentCount(playerA, "Myr Superion", 0);
assertHandCount(playerA, "Myr Superion", 1);
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
Assert.fail("must not have throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
} }

View file

@ -2,36 +2,51 @@ package org.mage.test.cards.replacement.canttarget;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
/** /**
* DenseFoliage: Creatures can't be the targets of spells. * {@link mage.cards.d.DenseFoliage Dense Foliage}
* {2}{G}
* Enchantment
* Creatures can't be the targets of spells.
* *
* @author Quercitron * @author Quercitron
*/ */
public class DenseFoliageTest extends CardTestPlayerBase { public class DenseFoliageTest extends CardTestPlayerBase {
/** /**
* Test spell * Test tagrgeting spell, it shouldn't work.
*/ */
@Test @Test
public void testSpellCantTarget() { public void testSpellCantTarget() {
addCard(Zone.BATTLEFIELD, playerA, "Dense Foliage");
addCard(Zone.HAND, playerA, "Lightning Bolt"); addCard(Zone.HAND, playerA, "Lightning Bolt");
addCard(Zone.BATTLEFIELD, playerA, "Dense Foliage");
addCard(Zone.BATTLEFIELD, playerA, "Mountain"); addCard(Zone.BATTLEFIELD, playerA, "Mountain");
addCard(Zone.BATTLEFIELD, playerB, "Eager Cadet"); addCard(Zone.BATTLEFIELD, playerB, "Eager Cadet");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Eager Cadet"); // setStrictChooseMode(true);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt");
addTarget(playerA, "Eager Cadet");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerB, "Eager Cadet", 1); try {
execute();
assertPermanentCount(playerB, "Eager Cadet", 1);
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("setup good targets")) {
Assert.fail("must throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
/** /**
* Tests activated ability * Tests targeting activated ability, it should work.
*/ */
@Test @Test
public void testAbilityCanTarget() { public void testAbilityCanTarget() {

View file

@ -4,6 +4,7 @@ import mage.constants.EmptyNames;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import mage.counters.CounterType; import mage.counters.CounterType;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
@ -13,12 +14,13 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class CantCastTest extends CardTestPlayerBase { public class CantCastTest extends CardTestPlayerBase {
/** /**
* I control Void Winnower. But my opponent can cast Jayemdae Tome (that's * I control Void Winnower.
* converted mana cost is even) They can cast other even spell. Test casting * But my opponent can cast Jayemdae Tome (that's converted mana cost is even).
* cost 4 * They can cast other even spell.
* Test casting cost 4.
*/ */
@Test @Test
public void testVoidWinnower1() { public void testVoidWinnowerEvenSpell() {
// Your opponent can't cast spells with even converted mana costs. (Zero is even.) // Your opponent can't cast spells with even converted mana costs. (Zero is even.)
// Your opponents can't block with creatures with even converted mana costs. // Your opponents can't block with creatures with even converted mana costs.
addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); addCard(Zone.BATTLEFIELD, playerB, "Void Winnower");
@ -30,19 +32,27 @@ public class CantCastTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Jayemdae Tome"); // {4} castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Jayemdae Tome"); // {4}
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertHandCount(playerA, "Jayemdae Tome", 1); try {
execute();
assertAllCommandsUsed();
assertPermanentCount(playerA, "Jayemdae Tome", 0); assertHandCount(playerA, "Jayemdae Tome", 1);
assertPermanentCount(playerA, "Jayemdae Tome", 0);
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
Assert.fail("must not have throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
/** /**
* Test with X=3 * Test Blaze ({X}{R}) with X=3 so that it's total cost is even.
*/ */
@Test @Test
public void testVoidWinnower2() { public void testVoidWinnowerEvenSpellWithX() {
// Your opponent can't cast spells with even converted mana costs. (Zero is even.) // Your opponent can't cast spells with even converted mana costs. (Zero is even.)
// Your opponents can't block with creatures with even converted mana costs. // Your opponents can't block with creatures with even converted mana costs.
addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); addCard(Zone.BATTLEFIELD, playerB, "Void Winnower");
@ -56,19 +66,30 @@ public class CantCastTest extends CardTestPlayerBase {
setChoice(playerA, "X=3"); setChoice(playerA, "X=3");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertHandCount(playerA, "Blaze", 1); // TODO: Replace these with checkPlayableAbility when the effect has been implemented so that the card is no
// longer shown as castable.
try {
execute();
assertAllCommandsUsed();
assertLife(playerB, 20); assertHandCount(playerA, "Blaze", 1);
assertLife(playerB, 20);
Assert.fail("must throw exception on execute");
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
Assert.fail("must not have throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
/** /**
* Test with X=4 * Test Blaze ({X}{R}) with X=4 so that it's total cost is odd.
*/ */
@Test @Test
public void testVoidWinnower3() { public void testVoidWinnowerUnevenSpellWithX() {
// Your opponent can't cast spells with even converted mana costs. (Zero is even.) // Your opponent can't cast spells with even converted mana costs. (Zero is even.)
// Your opponents can't block with creatures with even converted mana costs. // Your opponents can't block with creatures with even converted mana costs.
addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); addCard(Zone.BATTLEFIELD, playerB, "Void Winnower");
@ -91,6 +112,9 @@ public class CantCastTest extends CardTestPlayerBase {
} }
/**
* Test mmorphing a creature.
*/
@Test @Test
public void testVoidWinnowerWithMorph() { public void testVoidWinnowerWithMorph() {
// Your opponent can't cast spells with even converted mana costs. (Zero is even.) // Your opponent can't cast spells with even converted mana costs. (Zero is even.)
@ -110,11 +134,17 @@ public class CantCastTest extends CardTestPlayerBase {
setChoice(playerA, true); // cast it face down as 2/2 creature setChoice(playerA, true); // cast it face down as 2/2 creature
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 0); try {
assertHandCount(playerA, "Pine Walker", 1); execute();
assertPermanentCount(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 0);
assertHandCount(playerA, "Pine Walker", 1);
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
Assert.fail("must not have throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
/** /**
@ -132,12 +162,16 @@ public class CantCastTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Opal"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Mox Opal");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertHandCount(playerA, "Mox Opal", 1); try {
execute();
assertLife(playerB, 20);
assertHandCount(playerA, "Mox Opal", 1);
} catch (Throwable e) {
if (!e.getMessage().contains("Player PlayerA must have 0 actions but found 1")) {
Assert.fail("must not have throw error about bad targets, but got:\n" + e.getMessage());
}
}
} }
/** /**
@ -165,7 +199,6 @@ public class CantCastTest extends CardTestPlayerBase {
assertHandCount(playerA, "Panic", 3); assertHandCount(playerA, "Panic", 3);
assertHandCount(playerA, 4); assertHandCount(playerA, 4);
assertGraveyardCount(playerA, "Panic", 1); assertGraveyardCount(playerA, "Panic", 1);
} }
/** /**

View file

@ -5,9 +5,16 @@ import mage.constants.Zone;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* {@link mage.cards.p.PowerWordKill Power Word Kill}
* {1}{B}
* Instant
* Destroy target non-Angel, non-Demon, non-Devil, non-Dragon creature.
*
* @author Ingmar Goudt
*/
public class PowerWordKillTest extends CardTestPlayerBase { public class PowerWordKillTest extends CardTestPlayerBase {
// Destroy target non-Angel, non-Demon, non-Devil, non-Dragon creature.
private final String powerWordKill = "Power Word Kill"; private final String powerWordKill = "Power Word Kill";
@Test @Test
@ -28,9 +35,11 @@ public class PowerWordKillTest extends CardTestPlayerBase {
public void canNotTargetChangeling(){ public void canNotTargetChangeling(){
addCard(Zone.HAND, playerA, powerWordKill); addCard(Zone.HAND, playerA, powerWordKill);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
addCard(Zone.BATTLEFIELD, playerB, "Avian Changeling"); addCard(Zone.BATTLEFIELD, playerB, "Avian Changeling");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, powerWordKill, "Avian Changeling"); checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cast Power", false);
setStopAt(1, PhaseStep.POSTCOMBAT_MAIN); setStopAt(1, PhaseStep.POSTCOMBAT_MAIN);
execute(); execute();
assertPermanentCount(playerB, "Avian Changeling", 1); assertPermanentCount(playerB, "Avian Changeling", 1);

View file

@ -2,10 +2,18 @@ package org.mage.test.cards.single.arb;
import mage.constants.PhaseStep; import mage.constants.PhaseStep;
import mage.constants.Zone; import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test; import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
/** /**
* Sen Triplets
* {2}{W}{U}{B}
* Legendary Artifact Creature Human Wizard
* At the beginning of your upkeep, choose target opponent.
* This turn, that player cant cast spells or activate abilities and plays with their hand revealed.
* You may play lands and cast spells from that players hand this turn.
*
* @author TheElk801 * @author TheElk801
*/ */
public class SenTripletsTest extends CardTestPlayerBase { public class SenTripletsTest extends CardTestPlayerBase {
@ -17,12 +25,19 @@ public class SenTripletsTest extends CardTestPlayerBase {
private void initTriplets() { private void initTriplets() {
addCard(Zone.BATTLEFIELD, playerA, triplets); addCard(Zone.BATTLEFIELD, playerA, triplets);
addCard(Zone.BATTLEFIELD, playerA, "Mountain"); addCard(Zone.BATTLEFIELD, playerA, "Mountain");
addCard(Zone.BATTLEFIELD, playerB, "Taiga"); addCard(Zone.BATTLEFIELD, playerB, "Taiga");
addCard(Zone.HAND, playerB, bolt); addCard(Zone.HAND, playerB, bolt);
addCard(Zone.HAND, playerB, relic); addCard(Zone.HAND, playerB, relic);
addCard(Zone.HAND, playerB, "Island"); addCard(Zone.HAND, playerB, "Island");
assertAllCommandsUsed();
} }
/**
* Player who cast Sen Triplets must still be able to cast spells this turn, it's only playerB who can't.
*/
@Test @Test
public void testCastSpell() { public void testCastSpell() {
initTriplets(); initTriplets();
@ -43,6 +58,9 @@ public class SenTripletsTest extends CardTestPlayerBase {
assertLife(playerB, 20 - 3); assertLife(playerB, 20 - 3);
} }
/**
* Target player (playerB) can't activate abilities on turn 1 since Sen Triplets was just cast.
*/
@Test @Test
public void testCantActivate() { public void testCantActivate() {
initTriplets(); initTriplets();
@ -50,11 +68,24 @@ public class SenTripletsTest extends CardTestPlayerBase {
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}"); activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}");
setStopAt(1, PhaseStep.END_TURN); setStopAt(1, PhaseStep.END_TURN);
execute();
try {
execute();
assertAllCommandsUsed();
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("must throw error about bad targets, but got:\n" + e.getMessage());
}
}
assertTapped("Taiga", false); assertTapped("Taiga", false);
} }
/**
* Target player (playerB) can't cast a spell on turn 1 since Sen Triplets was just cast.
*/
@Test @Test
public void testCantCast() { public void testCantCast() {
initTriplets(); initTriplets();
@ -62,7 +93,17 @@ public class SenTripletsTest extends CardTestPlayerBase {
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, bolt, playerA); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, bolt, playerA);
setStopAt(1, PhaseStep.END_TURN); setStopAt(1, PhaseStep.END_TURN);
execute();
try {
execute();
assertAllCommandsUsed();
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("must throw error about bad targets, but got:\n" + e.getMessage());
}
}
assertHandCount(playerB, bolt, 1); assertHandCount(playerB, bolt, 1);
assertLife(playerA, 20); assertLife(playerA, 20);

View file

@ -30,7 +30,8 @@ public class ChampionOfLambholtTest extends CardTestPlayerBase {
addCard(Zone.BATTLEFIELD, playerB, "Plains", 5); addCard(Zone.BATTLEFIELD, playerB, "Plains", 5);
addCard(Zone.HAND, playerB, "Increasing Devotion"); addCard(Zone.HAND, playerB, "Increasing Devotion");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Increasing Devotion"); checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerB, "Cast Increasing", false);
// castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Increasing Devotion");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();

View file

@ -6,15 +6,21 @@ import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase; import org.mage.test.serverside.base.CardTestPlayerBase;
/** /**
* {@link mage.cards.g.GrafdiggersCage Grafdigger's Cage}
* {1}
* Artifact
* Creature cards in graveyards and libraries cant enter the battlefield.
* Players cant cast spells from graveyards or libraries.
* *
* @author BetaSteward * @author BetaSteward
*/ */
public class GrafdiggersCageTest extends CardTestPlayerBase { public class GrafdiggersCageTest extends CardTestPlayerBase {
/**
* Test that the flashback ability can't be used.
*/
@Test @Test
public void testCard1() { public void testFlashback() {
// Creature cards can't enter the battlefield from graveyards or libraries.
// Players can't cast cards in graveyards or libraries.
addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage"); addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
@ -22,30 +28,32 @@ public class GrafdiggersCageTest extends CardTestPlayerBase {
// Flashback {1}{B} // Flashback {1}{B}
addCard(Zone.GRAVEYARD, playerA, "Lingering Souls"); addCard(Zone.GRAVEYARD, playerA, "Lingering Souls");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback {1}{B}"); checkPlayableAbility("flashback", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Spirit Token", 0);
assertGraveyardCount(playerA, "Lingering Souls", 1);
} }
/**
* Test that a creature can't be put onto the battlefield from the graveyard.
*/
@Test @Test
public void testCard2() { public void testBeingPutOnBattlefieldFromGraveyard() {
addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage"); addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
// Put target creature card from a graveyard onto the battlefield under your control.
// That creature is a black Zombie in addition to its other colors and types.
addCard(Zone.HAND, playerA, "Rise from the Grave", 1); addCard(Zone.HAND, playerA, "Rise from the Grave", 1);
addCard(Zone.GRAVEYARD, playerA, "Craw Wurm"); addCard(Zone.GRAVEYARD, playerA, "Craw Wurm");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rise from the Grave", "Craw Wurm"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rise from the Grave", "Craw Wurm");
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Craw Wurm", 0); assertPermanentCount(playerA, "Craw Wurm", 0);
assertGraveyardCount(playerA, "Craw Wurm", 1); assertGraveyardCount(playerA, "Craw Wurm", 1);
assertGraveyardCount(playerA, "Rise from the Grave", 1); assertGraveyardCount(playerA, "Rise from the Grave", 1);
} }
@ -59,24 +67,17 @@ public class GrafdiggersCageTest extends CardTestPlayerBase {
* Same thing goes for cards like Ethersworn Canonist, assuming that the flashback isn't the first non-artifact spell for the turn. * Same thing goes for cards like Ethersworn Canonist, assuming that the flashback isn't the first non-artifact spell for the turn.
*/ */
@Test @Test
public void testCard3() { public void testFlashbackNonPermanent() {
// Creature cards can't enter the battlefield from graveyards or libraries.
// Players can't cast cards in graveyards or libraries.
addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage"); addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage");
addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 2); addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1);
// Name a nonland card. Target player reveals their hand and discards all cards with that name. // Name a nonland card. Target player reveals their hand and discards all cards with that name.
// Flashback-Sacrifice a creature. (You may cast this card from your graveyard for its flashback cost. Then exile it.) // Flashback - Sacrifice a creature. (You may cast this card from your graveyard for its flashback cost. Then exile it.)
addCard(Zone.GRAVEYARD, playerA, "Cabal Therapy"); addCard(Zone.GRAVEYARD, playerA, "Cabal Therapy");
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback"); checkPlayableAbility("flashback", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Silvercoat Lion", 2);
assertGraveyardCount(playerA, "Cabal Therapy", 1);
} }
} }

View file

@ -61,7 +61,6 @@ public class KeranosGodOfStormsTest extends CardTestPlayerBase {
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Keranos, God of Storms"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Keranos, God of Storms");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Peek", playerA); // you won't do damage because it's not the first draw this turn - Draw in draw phase was the first castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "Peek", playerA); // you won't do damage because it's not the first draw this turn - Draw in draw phase was the first
addTarget(playerB, playerA); // not needed if it works correct
setStopAt(2, PhaseStep.END_TURN); setStopAt(2, PhaseStep.END_TURN);
execute(); execute();

View file

@ -439,6 +439,24 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement
check(checkName, turnNum, step, player, CHECK_COMMAND_ABILITY, permanentName, abilityClass.getName(), mustHave.toString()); check(checkName, turnNum, step, player, CHECK_COMMAND_ABILITY, permanentName, abilityClass.getName(), mustHave.toString());
} }
/**
* Checks whether or not a given playable ability (someting that lets you cast a card) is available.
* This function will only check IF the ability is available or not, it does not check the number of times that it's available.
*
* If using with mustHave = false be very careful about spelling and options, otherwise you may get a false negative.
* It is reccomended that you set up the test so that the ability is available at the point you wish to check it,
* check it with checkPlayableAbility(..., mustHave = true), then add whatever condition would stop you from being
* able to activat the abiltiy
*
* TODO: Currently does not work
*
* @param checkName String to show up if the check fails, for display purposes only.
* @param turnNum The turn number to check on.
* @param step The step to check the ability on.
* @param player The player to be checked for the ability.
* @param abilityStartText The starting portion of the ability name.
* @param mustHave Whether the ability should be activatable of not
*/
public void checkPlayableAbility(String checkName, int turnNum, PhaseStep step, TestPlayer player, String abilityStartText, Boolean mustHave) { public void checkPlayableAbility(String checkName, int turnNum, PhaseStep step, TestPlayer player, String abilityStartText, Boolean mustHave) {
check(checkName, turnNum, step, player, CHECK_COMMAND_PLAYABLE_ABILITY, abilityStartText, mustHave.toString()); check(checkName, turnNum, step, player, CHECK_COMMAND_PLAYABLE_ABILITY, abilityStartText, mustHave.toString());
} }

View file

@ -17,12 +17,10 @@ public class ProtectionFromColorTest extends CardTestPlayerBase {
// tapped White Knight with Protection from Black // tapped White Knight with Protection from Black
addCard(Zone.BATTLEFIELD, playerB, "White Knight", 1, true); addCard(Zone.BATTLEFIELD, playerB, "White Knight", 1, true);
activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Destroy target tapped creature.", "White Knight"); checkPlayableAbility("test", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}", false);
setStopAt(1, PhaseStep.BEGIN_COMBAT); setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute(); execute();
// no one should be destroyed
assertPermanentCount(playerB, "White Knight", 1);
} }
@Test @Test