/* * To change this template, choose Tools | Templates * and open the template in the editor. */ package org.mage.test.cards.abilities.keywords; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * 702.87. Rebound * 702.87a Rebound appears on some instants and sorceries. It represents a static ability that functions while * the spell is on the stack and may create a delayed triggered ability. "Rebound" means "If this spell was cast * from your hand, instead of putting it into your graveyard as it resolves, exile it and, at the beginning of * your next upkeep, you may cast this card from exile without paying its mana cost." * 702.87b Casting a card without paying its mana cost as the result of a rebound ability follows the rules for * paying alternative costs in rules 601.2b and 601.2e–g. * 702.87c Multiple instances of rebound on the same spell are redundant. * * @author jeff */ public class ReboundTest extends CardTestPlayerBase{ /** * Test that the spell with rebound is moved to exile if * the spell resolves */ @Test public void testCastFromHandMovedToExile() { addCard(Zone.BATTLEFIELD, playerA, "Island", 1); // Target creature gets +1/+0 until end of turn and is unblockable this turn. addCard(Zone.HAND, playerA, "Distortion Strike"); addCard(Zone.BATTLEFIELD, playerB, "Memnite", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distortion Strike", "Memnite"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); //check exile and graveyard assertExileCount("Distortion Strike", 1); assertGraveyardCount(playerA, 0); } /** * Test that the spell with rebound can be cast again * on the beginning of the next upkeep without paying mana costs */ @Test public void testRecastFromExile() { addCard(Zone.BATTLEFIELD, playerA, "Island", 1); // Target creature gets +1/+0 until end of turn and is unblockable this turn. addCard(Zone.HAND, playerA, "Distortion Strike"); addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distortion Strike", "Memnite"); setStopAt(3, PhaseStep.PRECOMBAT_MAIN); execute(); //check exile and graveyard assertPowerToughness(playerA, "Memnite", 2, 1); assertExileCount("Distortion Strike", 0); assertGraveyardCount(playerA, "Distortion Strike", 1); } /** * Check that a countered spell with rebound * is not cast again */ @Test public void testDontRecastAfterCounter() { addCard(Zone.BATTLEFIELD, playerA, "Island", 1); // Target creature gets +1/+0 until end of turn and is unblockable this turn. addCard(Zone.HAND, playerA, "Distortion Strike"); addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); addCard(Zone.HAND, playerB, "Counterspell"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distortion Strike", "Memnite"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Distortion Strike"); setStopAt(3, PhaseStep.PRECOMBAT_MAIN); execute(); //check exile and graveyard assertGraveyardCount(playerB, "Counterspell", 1); assertGraveyardCount(playerA, "Distortion Strike", 1); assertPowerToughness(playerA, "Memnite", 1, 1); assertExileCount("Distortion Strike", 0); } /** * Check that a fizzled spell with rebound * is not cast again on the next controllers upkeep */ @Test public void testDontRecastAfterFizzling() { addCard(Zone.BATTLEFIELD, playerA, "Island", 1); // Target creature gets +1/+0 until end of turn and is unblockable this turn. // Rebound (If you cast this spell from your hand, exile it as it resolves. At the beginning of your next upkeep, // you may cast this card from exile without paying its mana cost.) addCard(Zone.HAND, playerA, "Distortion Strike"); addCard(Zone.BATTLEFIELD, playerA, "Memnite", 1); addCard(Zone.BATTLEFIELD, playerB, "Mountain", 1); addCard(Zone.HAND, playerB, "Lightning Bolt", 1); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Distortion Strike", "Memnite"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Memnite","Distortion Strike"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); //check exile and graveyard assertGraveyardCount(playerB, "Lightning Bolt", 1); assertGraveyardCount(playerA, "Memnite", 1); assertGraveyardCount(playerA, "Distortion Strike", 1); } }