package org.mage.test.cards.abilities.curses;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author BetaSteward
*/
public class CursesTest extends CardTestPlayerBase {
/*
Cruel Reality {5}{B}{B}
Enchantment - Aura Curse
Enchant player
At the beginning of enchanted player's upkeep, that player sacrifices a creature or planeswalker. If the player can't, he or she loses 5 life.
*/
private String cReality = "Cruel Reality";
@Test
public void testCurseOfBloodletting() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 7);
addCard(Zone.HAND, playerA, "Curse of Bloodletting");
addCard(Zone.HAND, playerA, "Lightning Bolt", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Bloodletting", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerA);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertLife(playerA, 17);
assertLife(playerB, 14);
}
@Test
public void testCurseOfEchoes() {
addCard(Zone.BATTLEFIELD, playerA, "Island", 5);
addCard(Zone.BATTLEFIELD, playerB, "Island", 5);
// Enchant player
// Whenever enchanted player casts an instant or sorcery spell, each other player may copy that
// spell and may choose new targets for the copy he or she controls.
addCard(Zone.HAND, playerA, "Curse of Echoes");
// Draw three cards.
addCard(Zone.HAND, playerB, "Jace's Ingenuity");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Echoes", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Jace's Ingenuity");
setStopAt(1, PhaseStep.END_TURN);
execute();
assertHandCount(playerA, 3);
assertHandCount(playerB, 3);
}
@Test
public void testCurseOfExhaustion1() {
addCard(Zone.BATTLEFIELD, playerA, "Plains", 4);
// Enchant player
// Enchanted player can't cast more than one spell each turn.
addCard(Zone.HAND, playerA, "Curse of Exhaustion");
addCard(Zone.BATTLEFIELD, playerB, "Mountain", 2);
addCard(Zone.HAND, playerB, "Lightning Bolt", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Exhaustion", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerB, "Lightning Bolt", playerA);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertLife(playerB, 20);
assertLife(playerA, 17);
}
@Test
public void testCurseOfExhaustion2() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 4);
addCard(Zone.BATTLEFIELD, playerA, "Plains", 2);
addCard(Zone.HAND, playerA, "Curse of Exhaustion");
addCard(Zone.HAND, playerA, "Lightning Bolt", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Exhaustion", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
setStopAt(1, PhaseStep.END_TURN);
execute();
assertLife(playerA, 20);
assertLife(playerB, 14);
}
/**
* Checks if Copy Enchantment works for player auras
*/
@Test
public void testCurseOfExhaustion3() {
addCard(Zone.BATTLEFIELD, playerA, "Plains", 4);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
addCard(Zone.BATTLEFIELD, playerB, "Island", 3);
// Enchant player
// Enchanted player can't cast more than one spell each turn.
addCard(Zone.HAND, playerA, "Curse of Exhaustion");
addCard(Zone.HAND, playerA, "Lightning Bolt", 2);
addCard(Zone.HAND, playerB, "Copy Enchantment", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Exhaustion", playerB);
castSpell(4, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(4, PhaseStep.PRECOMBAT_MAIN, playerB, "Copy Enchantment");
setChoice(playerB, "Yes");
setChoice(playerB, "Curse of Exhaustion");
setChoice(playerB, "targetPlayer=PlayerA");
castSpell(4, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
setStopAt(4, PhaseStep.END_TURN);
execute();
assertHandCount(playerB, "Copy Enchantment", 0);
assertGraveyardCount(playerB, "Copy Enchantment", 0);
assertPermanentCount(playerA, "Curse of Exhaustion", 1);
assertPermanentCount(playerB, "Curse of Exhaustion", 1);
assertLife(playerA, 20);
assertLife(playerB, 17);
}
// returng curse enchantment from graveyard to battlefield
@Test
public void testCurseOfExhaustion4() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2);
addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2);
addCard(Zone.HAND, playerA, "Lightning Bolt", 2);
addCard(Zone.GRAVEYARD, playerB, "Curse of Exhaustion", 1);
addCard(Zone.HAND, playerB, "Obzedat's Aid", 1);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Obzedat's Aid", "Curse of Exhaustion");
setChoice(playerB, "PlayerA");
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
castSpell(2, PhaseStep.POSTCOMBAT_MAIN, playerA, "Lightning Bolt", playerB);
setStopAt(2, PhaseStep.END_TURN);
execute();
assertHandCount(playerB, "Obzedat's Aid", 0);
assertGraveyardCount(playerB, "Obzedat's Aid", 1);
assertGraveyardCount(playerB, "Curse of Exhaustion", 0);
assertPermanentCount(playerB, "Curse of Exhaustion", 1);
assertLife(playerA, 20);
assertLife(playerB, 17);
}
@Test
public void testCurseOfThirst1() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
addCard(Zone.HAND, playerA, "Curse of Thirst");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Thirst", playerB);
setStopAt(2, PhaseStep.DRAW);
execute();
assertLife(playerA, 20);
assertLife(playerB, 19);
}
@Test
public void testCurseOfThirst2() {
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
addCard(Zone.HAND, playerA, "Curse of Thirst");
addCard(Zone.HAND, playerA, "Curse of Bloodletting");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Bloodletting", playerB);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Thirst", playerB);
setStopAt(2, PhaseStep.DRAW);
execute();
assertLife(playerA, 20);
assertLife(playerB, 16);
}
@Test
public void testCurseOfMisfortune1() {
removeAllCardsFromLibrary(playerA);
// At the beginning of your upkeep, you may search your library for a Curse card that doesn't have the same name as a
// Curse attached to enchanted player, put it onto the battlefield attached to that player, then shuffle your library.
addCard(Zone.LIBRARY, playerA, "Curse of Misfortunes", 2);
addCard(Zone.HAND, playerA, "Curse of Misfortunes");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Misfortunes", playerB);
setStopAt(3, PhaseStep.DRAW);
execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Curse of Misfortunes", 1);
}
@Test
public void testCurseOfMisfortune2() {
removeAllCardsFromLibrary(playerA);
addCard(Zone.LIBRARY, playerA, "Curse of Bloodletting", 2);
addCard(Zone.HAND, playerA, "Curse of Misfortunes");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Misfortunes", playerB);
setStopAt(3, PhaseStep.DRAW);
execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Curse of Misfortunes", 1);
assertPermanentCount(playerA, "Curse of Bloodletting", 1);
}
@Test
public void testCurseOfDeathsHold() {
// Creatures enchanted player controls get -1/-1.
addCard(Zone.HAND, playerA, "Curse of Death's Hold");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 5);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Death's Hold", playerB);
setStopAt(1, PhaseStep.END_COMBAT);
execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Curse of Death's Hold", 1);
assertPowerToughness(playerB, "Silvercoat Lion", 1, 1);
}
@Test
public void testCurseOfDeathsHold2() {
// Creatures enchanted player controls get -1/-1.
addCard(Zone.HAND, playerA, "Curse of Death's Hold");
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 2);
addCard(Zone.BATTLEFIELD, playerA, "Tasigur, the Golden Fang", 1);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
addCard(Zone.BATTLEFIELD, playerB, "Forest", 3);
addCard(Zone.HAND, playerB, "Reclamation Sage");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Death's Hold", playerB);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Reclamation Sage");
addTarget(playerB, "Curse of Death's Hold");
// {2}{G/U}{G/U}: Put the top two cards of your library into your graveyard, then return a nonland card of an opponent's choice from your graveyard to your hand.
activateAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{2}{G/U}{G/U}: Put the top two cards");
castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Curse of Death's Hold", playerB);
setStopAt(3, PhaseStep.END_COMBAT);
execute();
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Reclamation Sage", 1);
assertPermanentCount(playerA, "Curse of Death's Hold", 1);
assertGraveyardCount(playerA, 2);
assertPowerToughness(playerB, "Silvercoat Lion", 1, 1);
}
@Test
public void cruelRealityHasBothCreatureAndPwChoosePw() {
String ugin = "Ugin, the Spirit Dragon";
String memnite = "Memnite"; // {0} 1/1
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, ugin);
addCard(Zone.BATTLEFIELD, playerB, memnite);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setChoice(playerB, ugin);
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerB, ugin, 1);
assertPermanentCount(playerB, memnite, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 20);
}
@Test
public void cruelRealityHasBothCreatureAndPwChooseCreature() {
String ugin = "Ugin, the Spirit Dragon";
String memnite = "Memnite"; // {0} 1/1
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, ugin);
addCard(Zone.BATTLEFIELD, playerB, memnite);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setChoice(playerB, memnite);
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerB, memnite, 1);
assertPermanentCount(playerB, ugin, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 20);
}
@Test
public void cruelRealityOnlyHasCreatureNoChoiceMade() {
String memnite = "Memnite"; // {0} 1/1
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, memnite);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerB, memnite, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 20);
}
@Test
public void cruelRealityOnlyHasPwNoChoiceMade() {
String ugin = "Ugin, the Spirit Dragon";
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, ugin);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerB, ugin, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 20);
}
@Test
public void cruelRealityOnlyHasCreatureTryToChooseNotToSac() {
String memnite = "Memnite"; // {0} 1/1
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, memnite);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setChoice(playerB, "No");
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertGraveyardCount(playerB, memnite, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 20);
}
@Test
public void cruelRealityNoCreatureOrPwForcesLifeLoss() {
String gPrison = "Ghostly Prison"; // {2}{W} enchantment - doesnt matter text for this
addCard(Zone.HAND, playerA, cReality);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 7);
addCard(Zone.BATTLEFIELD, playerB, gPrison);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, cReality, playerB);
setChoice(playerB, gPrison); // try to set choice to enchantment
setStopAt(2, PhaseStep.PRECOMBAT_MAIN);
execute();
assertPermanentCount(playerB, gPrison, 1);
assertPermanentCount(playerA, cReality, 1);
assertLife(playerB, 15);
}
/*
* Reported bug issue #3326 (NOTE test is failing due to bug in code)
* When {Witchbane Orb} triggers when entering the field and there IS a curse attached to you, an error message (I sadly skipped) appears and your turn is reset.
This happened to me in a 4-player Commander game with {Curse of the Shallow Graves} on the field.
*/
@Test
public void witchbaneOrbDestroysCursesOnETB() {
/*
Witchbane Orb {4}
Artifact
When Witchbane Orb enters the battlefield, destroy all Curses attached to you.
You have hexproof.
*/
String wOrb = "Witchbane Orb";
/*
Curse of Shallow Graves {2}{B}
Enchantment — Aura Curse
Enchant player
Whenever a player attacks enchanted player with one or more creatures, that attacking player may create a tapped 2/2 black Zombie creature token.
*/
String curseSG = "Curse of Shallow Graves";
addCard(Zone.HAND, playerA, curseSG);
addCard(Zone.BATTLEFIELD, playerA, "Swamp", 3);
addCard(Zone.HAND, playerB, wOrb);
addCard(Zone.BATTLEFIELD, playerB, "Wastes", 4);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, curseSG, playerB);
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, wOrb);
setStopAt(2, PhaseStep.BEGIN_COMBAT);
execute();
assertPermanentCount(playerB, wOrb, 1);
assertGraveyardCount(playerA, curseSG, 1);
}
}