package org.mage.test.cards.control;
import mage.abilities.keyword.FlyingAbility;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author noxx
*/
public class ExchangeControlTest extends CardTestPlayerBase {
/**
* Tests switching controls for two creatures on different sides
*/
@Test
public void testSimpleExchange() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.BATTLEFIELD, playerA, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "Llanowar Elves^Elite Vanguard");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
// check creatures changes their controllers
assertPermanentCount(playerA, "Elite Vanguard", 1);
assertPermanentCount(playerB, "Llanowar Elves", 1);
}
/**
* Tests switching control for two creature on one side (both creatures are
* under the same player's control)
*
* Also tests "7/1/2012: You don't have to control either target."
*/
@Test
public void testOneSideExchange() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "Llanowar Elves^Elite Vanguard");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
// check spell was cast
assertGraveyardCount(playerA, "Switcheroo", 1);
// check nothing happened
assertPermanentCount(playerB, "Elite Vanguard", 1);
assertPermanentCount(playerB, "Llanowar Elves", 1);
}
/**
* Tests: 7/1/2012: If one of the target creatures is an illegal target when
* Switcheroo resolves, the exchange won't happen.
*
* Targets opponent's creature
*/
@Test
public void testOneTargetBecomesIllegal() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.HAND, playerA, "Lightning Bolt");
addCard(Zone.BATTLEFIELD, playerA, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "Llanowar Elves^Elite Vanguard");
// cast in response
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Elite Vanguard");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertGraveyardCount(playerB, "Elite Vanguard", 1);
// check nothing happened
assertPermanentCount(playerA, "Llanowar Elves", 1);
}
/**
* Tests: 7/1/2012: If one of the target creatures is an illegal target when
* Switcheroo resolves, the exchange won't happen.
*
* Targets its own creature.
*/
@Test
public void testOneTargetBecomesIllegal2() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.HAND, playerA, "Lightning Bolt");
addCard(Zone.BATTLEFIELD, playerA, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "Llanowar Elves^Elite Vanguard");
// cast in response
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "Llanowar Elves");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertGraveyardCount(playerA, "Llanowar Elves", 1);
// check nothing happened
assertPermanentCount(playerB, "Elite Vanguard", 1);
}
/**
* First gain control by Act of Treason. Then exchange control with other
* opponent's creature.
*
* Finally second creature should stay under ours control permanently.
*/
@Test
public void testInteractionWithOtherChangeControlEffect() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.HAND, playerA, "Act of Treason");
// both creatures on opponent's side
addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Elite Vanguard");
// get control
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Act of Treason", "Elite Vanguard");
// attack
attack(1, playerA, "Elite Vanguard");
// exchange control after combat
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Switcheroo", "Llanowar Elves^Elite Vanguard");
// check the control effect still works on second turn
setStopAt(2, PhaseStep.END_TURN);
execute();
// now it is our creature for ages
assertPermanentCount(playerA, "Llanowar Elves", 1);
// this one is still on opponent's side
assertPermanentCount(playerB, "Elite Vanguard", 1);
}
/**
* Tests switching controls will affect restriction effect
*/
@Test
public void testRestrictionEffect() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.HAND, playerA, "Switcheroo");
addCard(Zone.BATTLEFIELD, playerA, "War Falcon");
addCard(Zone.BATTLEFIELD, playerA, "Elite Vanguard");
addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Switcheroo", "War Falcon^Llanowar Elves");
attack(2, playerB, "War Falcon");
setStopAt(2, PhaseStep.END_TURN);
execute();
// check creatures changes their controllers
assertPermanentCount(playerA, "Llanowar Elves", 1);
assertPermanentCount(playerB, "War Falcon", 1);
// War Falcon can't attack
assertLife(playerA, 20);
}
/**
* An control exchanged creature gets an copy effect from an creature with
* an activated ability to the by exchange controlled creature. Check that
* the activated ability is controlled by the new controller of the copy
* target.
*/
@Test
public void testExchangeAnCopyEffect() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
// Gilded Drake {1}{U} Creature - Drake
// Flying
// When Gilded Drake enters the battlefield, exchange control of Gilded Drake and up to one target
// creature an opponent controls. If you don't make an exchange, sacrifice Gilded Drake. This ability
// can't be countered except by spells and abilities. (This effect lasts indefinitely.)
addCard(Zone.HAND, playerA, "Gilded Drake");
// Polymorphous Rush {2}{U} - Instant
// Strive — Polymorphous Rush costs {1}{U} more to cast for each target beyond the first.
// Choose a creature on the battlefield. Any number of target creatures you control each become a copy of that creature until end of turn.
addCard(Zone.HAND, playerA, "Polymorphous Rush");
// {U}: Manta Riders gains flying until end of turn.
addCard(Zone.BATTLEFIELD, playerB, "Manta Riders");
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");
// exchange control between Gilded Drake and Silvercoat Lion
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gilded Drake");
addTarget(playerA, "Silvercoat Lion");
// Let your Silvercoat Lion now be a copy of the Manta Riders
castSpell(1, PhaseStep.BEGIN_COMBAT, playerA, "Polymorphous Rush", "Silvercoat Lion");
addTarget(playerA, "Manta Riders");
// now use the activated ability to make the "Silvercoat Lions" (that became Mana Riders) flying
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{U}: {this} gains Flying until end of turn.");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
// check creatures change their controllers
assertPermanentCount(playerB, "Gilded Drake", 1);
assertGraveyardCount(playerA, "Polymorphous Rush", 1);
assertPermanentCount(playerB, "Silvercoat Lion", 0);
assertPermanentCount(playerA, "Silvercoat Lion", 0);
assertPermanentCount(playerB, "Manta Riders", 1);
assertPermanentCount(playerA, "Manta Riders", 1);
Permanent controlledMantas = getPermanent("Manta Riders", playerA.getId());
Assert.assertTrue("Manta Riders should have flying ability", controlledMantas.getAbilities().contains(FlyingAbility.getInstance()));
}
/**
* Gilded Drake doesn't get sacrificed if the creature its ability targets
* is invalid when it enters the battlefield
*/
@Test
public void testDrakeSacrificedIfNoExchangeHappens() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
// Gilded Drake {1}{U} Creature - Drake
// Flying
// When Gilded Drake enters the battlefield, exchange control of Gilded Drake and up to one target
// creature an opponent controls. If you don't make an exchange, sacrifice Gilded Drake. This ability
// can't be countered except by spells and abilities. (This effect lasts indefinitely.)
addCard(Zone.HAND, playerA, "Gilded Drake");
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion");
addCard(Zone.BATTLEFIELD, playerB, "Mountain");
addCard(Zone.HAND, playerB, "Lightning Bolt");
// exchange control between Gilded Drake and Silvercoat Lion
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Gilded Drake");
addTarget(playerA, "Silvercoat Lion");
// Destroy Silvercoat Lion before the exchange resolves so the Drake has to be sacrificed
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Lightning Bolt", "Silvercoat Lion", "When");
setStopAt(1, PhaseStep.BEGIN_COMBAT);
execute();
assertGraveyardCount(playerB, "Lightning Bolt", 1);
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
assertGraveyardCount(playerA, "Gilded Drake", 1);
}
}