package org.mage.test.cards.copy;
import mage.abilities.effects.ContinuousEffect;
import mage.abilities.effects.ContinuousEffectsList;
import mage.cards.Card;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.filter.FilterCard;
import mage.filter.common.FilterCreaturePermanent;
import mage.filter.predicate.mageobject.NamePredicate;
import mage.game.permanent.Permanent;
import org.apache.log4j.Logger;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
* @author noxx
*/
public class CloneTest extends CardTestPlayerBase {
/**
* Tests triggers working on both sides after Clone coming onto battlefield
*/
@Test
public void testCloneTriggered() {
addCard(Zone.BATTLEFIELD, playerA, "Bloodgift Demon", 1);
addCard(Zone.HAND, playerB, "Clone");
addCard(Zone.BATTLEFIELD, playerB, "Island", 4);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clone");
setStopAt(4, PhaseStep.END_TURN);
execute();
assertLife(playerA, 18);
assertLife(playerB, 19);
// 1 from draw steps + 2 from Demon
assertHandCount(playerA, 3);
// 2 from draw steps + 1 from Demon
assertHandCount(playerB, 3);
assertPermanentCount(playerA, "Bloodgift Demon", 1);
assertPermanentCount(playerB, "Bloodgift Demon", 1);
}
/**
* Tests Clone is sacrificed and only one effect is turned on
*/
@Test
public void testCloneSacrifice() {
addCard(Zone.BATTLEFIELD, playerA, "Bloodgift Demon", 1);
addCard(Zone.HAND, playerA, "Diabolic Edict");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2);
addCard(Zone.HAND, playerB, "Clone");
addCard(Zone.BATTLEFIELD, playerB, "Island", 4);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Clone");
castSpell(3, PhaseStep.POSTCOMBAT_MAIN, playerA, "Diabolic Edict", playerB);
setStopAt(4, PhaseStep.END_TURN);
execute();
assertPermanentCount(playerA, "Bloodgift Demon", 1);
assertGraveyardCount(playerA, "Diabolic Edict", 1);
assertPermanentCount(playerB, "Bloodgift Demon", 0);
assertGraveyardCount(playerB, "Clone", 1);
// 1 from draw steps + 2 from Demon
assertHandCount(playerA, 3);
// 2 from draw steps + no from Demon (should be sacrificed)
assertHandCount(playerB, 2);
assertLife(playerA, 18);
assertLife(playerB, 20);
}
@Test
public void testCard3() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 6);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 6);
addCard(Zone.HAND, playerA, "Public Execution");
addCard(Zone.HAND, playerA, "Clone");
addCard(Zone.BATTLEFIELD, playerB, "Llanowar Elves");
addCard(Zone.BATTLEFIELD, playerB, "Craw Wurm");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Public Executio", "Llanowar Elves");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Clone");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertPermanentCount(playerB, "Llanowar Elves", 0);
assertPowerToughness(playerB, "Craw Wurm", 4, 4);
assertPowerToughness(playerA, "Craw Wurm", 6, 4);
}
// copy Nightmare test, check that the P/T setting effect ends
// if the clone leaves battlefield
@Test
public void testCopyNightmare() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 1);
addCard(Zone.BATTLEFIELD, playerB, "Swamp", 6);
addCard(Zone.BATTLEFIELD, playerB, "Forest", 1);
// Target creature you control gets +1/+1 and gains hexproof until end of turn. (It can't be the target of spells or abilities your opponents control.)
addCard(Zone.HAND, playerB, "Ranger's Guile");
addCard(Zone.HAND, playerA, "Clone");
// Return target nonland permanent to its owner's hand.
addCard(Zone.HAND, playerA, "Disperse");
addCard(Zone.BATTLEFIELD, playerB, "Nightmare", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone");
setChoice(playerA, "Nightmare");
castSpell(1, PhaseStep.BEGIN_COMBAT, playerB, "Ranger's Guile", "Nightmare");
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Disperse", "Nightmare");
setStopAt(2, PhaseStep.UPKEEP);
execute();
assertPermanentCount(playerB, "Nightmare", 1);
assertPowerToughness(playerB, "Nightmare", 6, 6);
assertPermanentCount(playerA, "Nightmare", 0);
assertHandCount(playerA, "Disperse", 0);
FilterCard filter = new FilterCard();
filter.add(new NamePredicate("Clone"));
Card card = playerA.getHand().getCards(filter, currentGame).iterator().next();
if (card != null) {
Assert.assertEquals("Power has to be 0 because copy from nightmare P/T ability may no longer be applied", 0, card.getPower().getValue());
}
Logger.getLogger(CloneTest.class).debug("EXISTING CONTINUOUS EFFECTS:");
for (ContinuousEffectsList effectsList : currentGame.getContinuousEffects().allEffectsLists) {
for (Object anEffectsList : effectsList) {
ContinuousEffect effect = (ContinuousEffect) anEffectsList;
Logger.getLogger(CloneTest.class).debug("- " + effect.toString());
}
}
}
/**
* When I Clone a creature, and I try to use Vesuvan Doppelganger to my
* cloned creature, The Vesuvan disappears and the creature is not created.
*/
@Test
public void testCloneAndVesuvanDoppelganger() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
// You may have Clone enter the battlefield as a copy of any creature on the battlefield.
addCard(Zone.HAND, playerA, "Clone"); // Creature {3}{U}
// You may have Vesuvan Doppelganger enter the battlefield as a copy of any creature on the battlefield
// except it doesn't copy that creature's color and it gains "At the beginning of your upkeep,
// you may have this creature become a copy of target creature except it doesn't copy that creature's color.
// If you do, this creature gains this ability."
addCard(Zone.HAND, playerA, "Vesuvan Doppelganger"); // Creature {3}{U}{U}
addCard(Zone.BATTLEFIELD, playerB, "Island", 2);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
// {2}, {T} , Sacrifice a creature: Draw a card.
addCard(Zone.BATTLEFIELD, playerB, "Phyrexian Vault", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Clone");
setChoice(playerA, "Silvercoat Lion");
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{2}");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Vesuvan Doppelganger");
setChoice(playerA, "Silvercoat Lion");
setStopAt(3, PhaseStep.BEGIN_COMBAT);
execute();
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
assertGraveyardCount(playerA, "Vesuvan Doppelganger", 0);
assertPermanentCount(playerA, "Silvercoat Lion", 2);
assertPermanentCount(playerB, "Silvercoat Lion", 0);
assertHandCount(playerB, 2);
boolean whiteLion = false;
boolean blueLion = false;
for (Permanent permanent : currentGame.getBattlefield().getAllActivePermanents(new FilterCreaturePermanent(), playerA.getId(), currentGame)) {
if (permanent.getColor(currentGame).isWhite()) {
whiteLion = true;
}
if (permanent.getColor(currentGame).isBlue()) {
blueLion = true;
}
}
Assert.assertTrue("There should be a white and a blue Silvercoat Lion be on the battlefield", blueLion && whiteLion);
}
}