diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ChangelingTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ChangelingTest.java index a1effc69a41..26c217ad904 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ChangelingTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/ChangelingTest.java @@ -28,7 +28,7 @@ public class ChangelingTest extends CardTestPlayerBase { 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); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/CyclingTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/CyclingTest.java index eeee404dc2d..cbc4742c9a4 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/CyclingTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/keywords/CyclingTest.java @@ -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 public void cycleFromGraveyard() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5); + // Destroy all creatures. They can't be regenerated. Draw a card for each creature destroyed this way. // Cycling {3}{B}{B} // When you cycle Decree of Pain, all creatures get -2/-2 until end of turn. addCard(Zone.GRAVEYARD, playerA, "Decree of Pain"); + // Protection from black // Cycling {2} ({2}, Discard this card: Draw a card.) addCard(Zone.BATTLEFIELD, playerB, "Disciple of Grace"); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cycling {3}{B}{B}"); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Cycling {2}"); + checkPlayableAbility("before", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cycling", false); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaSourceTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaSourceTest.java index f381bc6b392..0fc9c2b2f43 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaSourceTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/mana/ManaSourceTest.java @@ -2,6 +2,7 @@ package org.mage.test.cards.mana; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -18,22 +19,28 @@ public class ManaSourceTest extends CardTestPlayerBase { @Test public void testCantCastWithCreatureCard() { // 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. - 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"); - castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Myr Superion"); + activateManaAbility(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Exile"); + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerA, "Myr Superion"); setStopAt(2, PhaseStep.BEGIN_COMBAT); - execute(); - assertExileCount("Simian Spirit Guide", 1); + try { + execute(); - assertPermanentCount(playerB, "Myr Superion", 0); - assertHandCount(playerB, "Myr Superion", 1); + assertExileCount("Simian Spirit Guide", 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()); + } + } } - } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/DenseFoliageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/DenseFoliageTest.java index bc8eae01410..1f2140c670f 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/DenseFoliageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/replacement/canttarget/DenseFoliageTest.java @@ -2,36 +2,51 @@ package org.mage.test.cards.replacement.canttarget; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Assert; import org.junit.Test; 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 */ public class DenseFoliageTest extends CardTestPlayerBase { /** - * Test spell + * Test tagrgeting spell, it shouldn't work. */ @Test public void testSpellCantTarget() { - addCard(Zone.BATTLEFIELD, playerA, "Dense Foliage"); addCard(Zone.HAND, playerA, "Lightning Bolt"); + + addCard(Zone.BATTLEFIELD, playerA, "Dense Foliage"); addCard(Zone.BATTLEFIELD, playerA, "Mountain"); 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); - 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 public void testAbilityCanTarget() { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java index eafdfe7fbcc..b2d7a4a6e55 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/rules/CantCastTest.java @@ -4,6 +4,7 @@ import mage.constants.EmptyNames; import mage.constants.PhaseStep; import mage.constants.Zone; import mage.counters.CounterType; +import org.junit.Assert; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; @@ -13,12 +14,13 @@ import org.mage.test.serverside.base.CardTestPlayerBase; public class CantCastTest extends CardTestPlayerBase { /** - * I control Void Winnower. But my opponent can cast Jayemdae Tome (that's - * converted mana cost is even) They can cast other even spell. Test casting - * cost 4 + * I control Void Winnower. + * But my opponent can cast Jayemdae Tome (that's converted mana cost is even). + * They can cast other even spell. + * Test casting cost 4. */ @Test - public void testVoidWinnower1() { + public void testVoidWinnowerEvenSpell() { // 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. addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); @@ -30,19 +32,27 @@ public class CantCastTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Jayemdae Tome"); // {4} 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 - public void testVoidWinnower2() { + public void testVoidWinnowerEvenSpellWithX() { // 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. addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); @@ -56,19 +66,30 @@ public class CantCastTest extends CardTestPlayerBase { setChoice(playerA, "X=3"); 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 - public void testVoidWinnower3() { + public void testVoidWinnowerUnevenSpellWithX() { // 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. addCard(Zone.BATTLEFIELD, playerB, "Void Winnower"); @@ -91,6 +112,9 @@ public class CantCastTest extends CardTestPlayerBase { } + /** + * Test mmorphing a creature. + */ @Test public void testVoidWinnowerWithMorph() { // 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 setStopAt(1, PhaseStep.BEGIN_COMBAT); - execute(); - assertPermanentCount(playerA, EmptyNames.FACE_DOWN_CREATURE.toString(), 0); - assertHandCount(playerA, "Pine Walker", 1); + try { + 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"); setStopAt(1, PhaseStep.BEGIN_COMBAT); - execute(); - assertHandCount(playerA, "Mox Opal", 1); - - assertLife(playerB, 20); + try { + execute(); + 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, 4); assertGraveyardCount(playerA, "Panic", 1); - } /** diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/afr/PowerWordKillTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/afr/PowerWordKillTest.java index 008d7ee4a4c..f950f5c0148 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/afr/PowerWordKillTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/afr/PowerWordKillTest.java @@ -5,9 +5,16 @@ import mage.constants.Zone; import org.junit.Test; 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 { - // Destroy target non-Angel, non-Demon, non-Devil, non-Dragon creature. private final String powerWordKill = "Power Word Kill"; @Test @@ -28,9 +35,11 @@ public class PowerWordKillTest extends CardTestPlayerBase { public void canNotTargetChangeling(){ addCard(Zone.HAND, playerA, powerWordKill); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); + 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); execute(); assertPermanentCount(playerB, "Avian Changeling", 1); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/arb/SenTripletsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/arb/SenTripletsTest.java index 1c12a2e96f5..2888863974c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/arb/SenTripletsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/arb/SenTripletsTest.java @@ -2,10 +2,18 @@ package org.mage.test.cards.single.arb; import mage.constants.PhaseStep; import mage.constants.Zone; +import org.junit.Assert; import org.junit.Test; 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 can’t cast spells or activate abilities and plays with their hand revealed. + * You may play lands and cast spells from that player’s hand this turn. + * * @author TheElk801 */ public class SenTripletsTest extends CardTestPlayerBase { @@ -17,12 +25,19 @@ public class SenTripletsTest extends CardTestPlayerBase { private void initTriplets() { addCard(Zone.BATTLEFIELD, playerA, triplets); addCard(Zone.BATTLEFIELD, playerA, "Mountain"); + addCard(Zone.BATTLEFIELD, playerB, "Taiga"); + addCard(Zone.HAND, playerB, bolt); addCard(Zone.HAND, playerB, relic); 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 public void testCastSpell() { initTriplets(); @@ -43,6 +58,9 @@ public class SenTripletsTest extends CardTestPlayerBase { assertLife(playerB, 20 - 3); } + /** + * Target player (playerB) can't activate abilities on turn 1 since Sen Triplets was just cast. + */ @Test public void testCantActivate() { initTriplets(); @@ -50,11 +68,24 @@ public class SenTripletsTest extends CardTestPlayerBase { activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerB, "{T}"); 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); } + /** + * Target player (playerB) can't cast a spell on turn 1 since Sen Triplets was just cast. + */ @Test public void testCantCast() { initTriplets(); @@ -62,7 +93,17 @@ public class SenTripletsTest extends CardTestPlayerBase { castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, bolt, playerA); 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); assertLife(playerA, 20); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/ChampionOfLambholtTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/ChampionOfLambholtTest.java index ed78013f1f4..86866a99020 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/ChampionOfLambholtTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/avr/ChampionOfLambholtTest.java @@ -30,7 +30,8 @@ public class ChampionOfLambholtTest extends CardTestPlayerBase { addCard(Zone.BATTLEFIELD, playerB, "Plains", 5); 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); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/dka/GrafdiggersCageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/dka/GrafdiggersCageTest.java index 6c4fcfbac8e..03ac27dc58c 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/dka/GrafdiggersCageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/dka/GrafdiggersCageTest.java @@ -6,15 +6,21 @@ import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** + * {@link mage.cards.g.GrafdiggersCage Grafdigger's Cage} + * {1} + * Artifact + * Creature cards in graveyards and libraries can’t enter the battlefield. + * Players can’t cast spells from graveyards or libraries. * * @author BetaSteward */ public class GrafdiggersCageTest extends CardTestPlayerBase { + /** + * Test that the flashback ability can't be used. + */ @Test - public void testCard1() { - // Creature cards can't enter the battlefield from graveyards or libraries. - // Players can't cast cards in graveyards or libraries. + public void testFlashback() { addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); @@ -22,30 +28,32 @@ public class GrafdiggersCageTest extends CardTestPlayerBase { // Flashback {1}{B} 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); 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 - public void testCard2() { + public void testBeingPutOnBattlefieldFromGraveyard() { addCard(Zone.BATTLEFIELD, playerA, "Grafdigger's Cage"); 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.GRAVEYARD, playerA, "Craw Wurm"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Rise from the Grave", "Craw Wurm"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - assertLife(playerA, 20); - assertLife(playerB, 20); assertPermanentCount(playerA, "Craw Wurm", 0); + assertGraveyardCount(playerA, "Craw Wurm", 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. */ @Test - public void testCard3() { - // Creature cards can't enter the battlefield from graveyards or libraries. - // Players can't cast cards in graveyards or libraries. + public void testFlashbackNonPermanent() { 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. - // 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"); - activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback"); + checkPlayableAbility("flashback", 1, PhaseStep.PRECOMBAT_MAIN, playerA, "Flashback", false); + setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); - - assertLife(playerA, 20); - assertLife(playerB, 20); - assertPermanentCount(playerA, "Silvercoat Lion", 2); - assertGraveyardCount(playerA, "Cabal Therapy", 1); - } - + } } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/KeranosGodOfStormsTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/KeranosGodOfStormsTest.java index b7d72b3c0d7..abf44aa7d81 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/KeranosGodOfStormsTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/ths/KeranosGodOfStormsTest.java @@ -61,7 +61,6 @@ public class KeranosGodOfStormsTest extends CardTestPlayerBase { 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 - addTarget(playerB, playerA); // not needed if it works correct setStopAt(2, PhaseStep.END_TURN); execute(); diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java index bd329162c2c..5900a909c7d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/base/impl/CardTestPlayerAPIImpl.java @@ -439,6 +439,24 @@ public abstract class CardTestPlayerAPIImpl extends MageTestPlayerBase implement 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) { check(checkName, turnNum, step, player, CHECK_COMMAND_PLAYABLE_ABILITY, abilityStartText, mustHave.toString()); } diff --git a/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java b/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java index 6026f5e103f..04f56b64d9d 100644 --- a/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/serverside/cards/abilities/ProtectionFromColorTest.java @@ -17,12 +17,10 @@ public class ProtectionFromColorTest extends CardTestPlayerBase { // tapped White Knight with Protection from Black 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); execute(); - - // no one should be destroyed - assertPermanentCount(playerB, "White Knight", 1); } @Test