package org.mage.test.cards.abilities.keywords; import mage.constants.PhaseStep; import mage.constants.Zone; import mage.counters.CounterType; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * @author noxx */ public class UndyingTest extends CardTestPlayerBase { /** * Tests boost weren't be applied second time when creature back to * battlefield */ @Test public void testWithBoost() { addCard(Zone.BATTLEFIELD, playerA, "Geralf's Messenger"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); addCard(Zone.HAND, playerA, "Last Gasp"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Last Gasp", "Geralf's Messenger"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Geralf's Messenger", 1); assertPowerToughness(playerA, "Geralf's Messenger", 4, 3); } /** * Tests boost weren't be applied second time when creature back to * battlefield */ @Test public void testWithMassBoost() { addCard(Zone.BATTLEFIELD, playerA, "Strangleroot Geist"); addCard(Zone.BATTLEFIELD, playerB, "Swamp", 3); addCard(Zone.HAND, playerB, "Cower in Fear"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Cower in Fear"); setStopAt(2, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Strangleroot Geist", 1); // dies then returned with +1/+1 counter (and boost doesn't work anymore) assertPowerToughness(playerA, "Strangleroot Geist", 3, 2); } /** * Tests "Target creature gains undying until end of turn" */ @Test public void testUndyingEvil() { // Elite Vanguard // Creature — Human Soldier 2/1 addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard"); addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3); // Last Gasp // Instant, 1B // Target creature gets -3/-3 until end of turn. addCard(Zone.HAND, playerA, "Last Gasp"); // Undying Evil // Target creature gains undying until end of turn. // When it dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) addCard(Zone.HAND, playerA, "Undying Evil"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Last Gasp", "Elite Vanguard"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Undying Evil", "Elite Vanguard"); setStopAt(1, PhaseStep.END_COMBAT); execute(); assertPermanentCount(playerA, "Elite Vanguard", 1); assertCounterCount(playerA, "Elite Vanguard", CounterType.P1P1, 1); assertPowerToughness(playerA, "Elite Vanguard", 3, 2); } /** * Tests "Threads of Disloyalty enchanting Strangleroot Geist: after geist * died it returns to the bf under opponent's control." */ @Test public void testUndyingControlledReturnsToOwner() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); // Strangleroot Geist 2/1 // Haste // Undying // (When it dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) addCard(Zone.HAND, playerA, "Strangleroot Geist"); addCard(Zone.HAND, playerA, "Lightning Bolt"); addCard(Zone.BATTLEFIELD, playerB, "Island", 3); // Threads of Disloyalty {1}{U}{U} // Enchant creature with converted mana cost 2 or less // You control enchanted creature. addCard(Zone.HAND, playerB, "Threads of Disloyalty"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Strangleroot Geist"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Threads of Disloyalty", "Strangleroot Geist"); castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", "Strangleroot Geist"); setStopAt(2, PhaseStep.END_TURN); execute(); assertGraveyardCount(playerB, "Threads of Disloyalty", 1); assertGraveyardCount(playerA, "Lightning Bolt", 1); assertPermanentCount(playerB, "Strangleroot Geist", 0); assertPermanentCount(playerA, "Strangleroot Geist", 1); assertCounterCount(playerA, "Strangleroot Geist", CounterType.P1P1, 1); assertPowerToughness(playerA, "Strangleroot Geist", 3, 2); } /** * Tests "Target creature with Undying will be exiled by Anafenza before it * returns to battlefield * * Anafenza the foremost doesn't exile an undying creature when dying at the * same time as that undying one. The undying comes back to the field when * he shouldn't. */ @Test public void testReplacementEffectPreventsReturnOfUndying() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); // Butcher Ghoul // Creature - Zombie, 1/1 {1}{B} // Undying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) addCard(Zone.HAND, playerA, "Butcher Ghoul"); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); addCard(Zone.HAND, playerB, "Lightning Bolt"); // Anafenza, the Foremost // Whenever Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control. // If a creature card would be put into an opponent's graveyard from anywhere, exile it instead. addCard(Zone.BATTLEFIELD, playerB, "Anafenza, the Foremost"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Butcher Ghoul"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Butcher Ghoul"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerB, "Anafenza, the Foremost", 1); assertGraveyardCount(playerB, "Lightning Bolt", 1); assertPermanentCount(playerA, "Butcher Ghoul", 0); assertExileCount("Butcher Ghoul", 1); } /** * Tests "Target creature with Undying will be exiled by Anafenza before it * returns to battlefield if both leave the battlefield at the same time * * Anafenza the foremost doesn't exile an undying creature when dying at the * same time as that undying one. The undying comes back to the field when * he shouldn't. */ @Test public void testReplacementEffectPreventsReturnOfUndyingWrath() { addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); // Butcher Ghoul // Creature - Zombie, 1/1 {1}{B} // Undying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) addCard(Zone.HAND, playerA, "Butcher Ghoul"); addCard(Zone.BATTLEFIELD, playerB, "Plains", 4); // Destroy all creatures. They can't be regenerated. addCard(Zone.HAND, playerB, "Wrath of God"); // Anafenza, the Foremost // Whenever Anafenza, the Foremost attacks, put a +1/+1 counter on another target tapped creature you control. // If a creature card would be put into an opponent's graveyard from anywhere, exile it instead. addCard(Zone.BATTLEFIELD, playerB, "Anafenza, the Foremost"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Butcher Ghoul"); castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Wrath of God"); setStopAt(2, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerB, "Anafenza, the Foremost", 1); assertGraveyardCount(playerB, "Wrath of God", 1); assertPermanentCount(playerA, "Butcher Ghoul", 0); assertExileCount("Butcher Ghoul", 1); } /** * Tests that the undying granted by Mikaeus, the Unhallowed works * */ @Test public void testUndyingMikaeusTheUnhallowed() { addCard(Zone.HAND, playerA, "Lightning Bolt", 1); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); // Other non-Human creatures you control get +1/+1 and have undying. addCard(Zone.BATTLEFIELD, playerA, "Mikaeus, the Unhallowed", 1); addCard(Zone.BATTLEFIELD, playerA, "Silvercoat Lion", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Silvercoat Lion"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerA, "Lightning Bolt", 1); assertPermanentCount(playerA, "Silvercoat Lion", 1); assertPermanentCount(playerA, "Mikaeus, the Unhallowed", 1); assertCounterCount(playerA, "Silvercoat Lion", CounterType.P1P1, 1); assertPowerToughness(playerA, "Silvercoat Lion", 4, 4); } /** * Tatterkite is getting counters on it, I have him in a edh deck with * Mikaeus, the Lunarch and when Tatterkite dies it triggers the undying and * he gets the +1/+1 counters */ @Test public void testUndyingMikaeusAndTatterkite() { addCard(Zone.HAND, playerA, "Lightning Bolt", 1); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); // Whenever a Human deals damage to you, destroy it. // Other non-Human creatures you control get +1/+1 and have undying. addCard(Zone.BATTLEFIELD, playerA, "Mikaeus, the Unhallowed", 1); // Flying // Tatterkite can't have counters placed on it. addCard(Zone.BATTLEFIELD, playerA, "Tatterkite", 1); // Artifact Creature - Scarecrow 2/1 castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Tatterkite"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerA, "Lightning Bolt", 1); assertPermanentCount(playerA, "Tatterkite", 1); assertPermanentCount(playerA, "Mikaeus, the Unhallowed", 1); assertCounterCount("Tatterkite", CounterType.P1P1, 0); assertPowerToughness(playerA, "Tatterkite", 3, 2); } @Test public void testUndyingMikaeusAndTatterkiteSacrifice() { // Sacrifice a creature: Add {C}{C} to your mana pool. addCard(Zone.BATTLEFIELD, playerA, "Ashnod's Altar", 1); // Whenever a Human deals damage to you, destroy it. // Other non-Human creatures you control get +1/+1 and have undying // (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.). addCard(Zone.BATTLEFIELD, playerA, "Mikaeus, the Unhallowed", 1); // Flying // Tatterkite can't have counters placed on it. addCard(Zone.BATTLEFIELD, playerA, "Tatterkite", 1); // Artifact Creature - Scarecrow 2/1 activateAbility(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Sacrifice a creature"); setChoice(playerA, "Tatterkite"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Tatterkite", 1); assertPermanentCount(playerA, "Mikaeus, the Unhallowed", 1); assertCounterCount("Tatterkite", CounterType.P1P1, 0); assertPowerToughness(playerA, "Tatterkite", 3, 2); } /** * I stole my opponents Vorapede using Simic Manipulator and shortly after * someone played Wrath of God. Instead of returning to my opponent's board, * Vorapede came back under my control. The rules text for Undying states * that it should return under its owner's control, not its controller's. */ @Test public void testUndyingCreatureReturnsUnderOwnersControl() { // Creature — Insect // Vigilance, trample // Undying (When this creature dies, if it had no +1/+1 counters on it, return it to the battlefield under its owner's control with a +1/+1 counter on it.) addCard(Zone.BATTLEFIELD, playerB, "Vorapede"); // {2}{G}{G}{G} 5/4 addCard(Zone.HAND, playerB, "Doom Blade"); // {1}{B} destroy target non-black creature addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2); // {2}{R} sorcery - Gain control of target creature until end of turn. Untap that creature. It gains haste until end of turn. addCard(Zone.HAND, playerA, "Act of Treason"); addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); // playerA takes control of Vorapede from playerB castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Act of Treason", "Vorapede"); attack(1, playerA, "Vorapede"); // playerB kills Vorapede under the control of playerA now castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Doom Blade", "Vorapede"); setStopAt(1, PhaseStep.END_TURN); execute(); assertLife(playerA, 20); assertLife(playerB, 15); assertGraveyardCount(playerA, "Act of Treason", 1); assertGraveyardCount(playerB, "Doom Blade", 1); // Vorapede should return under control of playerA, not playerB assertPermanentCount(playerB, "Vorapede", 1); assertPermanentCount(playerA, "Vorapede", 0); assertCounterCount(playerB, "Vorapede", CounterType.P1P1, 1); assertPowerToughness(playerB, "Vorapede", 6, 5); } }