package org.mage.test.cards.single.avr; import mage.constants.PhaseStep; import mage.constants.Zone; import org.junit.Test; import org.mage.test.serverside.base.CardTestPlayerBase; /** * * @author noxx */ public class CavernOfSoulsTest extends CardTestPlayerBase { /** * Tests simple cast */ @Test public void testCastDrake() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); addCard(Zone.HAND, playerA, "Cavern of Souls"); addCard(Zone.HAND, playerA, "Azure Drake"); setChoice(playerA, "Drake"); setChoice(playerA, "Blue"); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Azure Drake"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Azure Drake", 1); } /** * Tests "Cavern of Souls" with "Human" creature type chosen. Then tests * casting Azure Drake (should fail) and Elite Vanguard (should be ok as it * has "Human" subtype) */ @Test public void testNoCastBecauseOfCreatureType() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 1); addCard(Zone.HAND, playerA, "Cavern of Souls"); addCard(Zone.HAND, playerA, "Abuna Acolyte"); addCard(Zone.HAND, playerA, "Elite Vanguard"); setChoice(playerA, "Human"); setChoice(playerA, "White"); setChoice(playerA, "White"); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); // choose Human castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Abuna Acolyte"); // not Human but Cat Cleric castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Elite Vanguard"); // Human setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Abuna Acolyte", 0); assertPermanentCount(playerA, "Elite Vanguard", 1); } /** * Tests card can be countered for usual cast */ @Test public void testDrakeCountered() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); addCard(Zone.HAND, playerA, "Island"); addCard(Zone.HAND, playerA, "Azure Drake"); addCard(Zone.HAND, playerB, "Remove Soul"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Island"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Azure Drake"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Remove Soul"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Azure Drake", 0); assertGraveyardCount(playerA, "Azure Drake", 1); } /** * Tests spell can't be countered for cast with Cavern of Souls */ @Test public void testDrakeCantBeCountered() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3); // As Cavern of Souls enters the battlefield, choose a creature type. // {T}: Add {C} to your mana pool. // {T}: Add one mana of any color to your mana pool. Spend this mana only to cast a creature spell of the chosen type, and that spell can't be countered. addCard(Zone.HAND, playerA, "Cavern of Souls"); addCard(Zone.HAND, playerA, "Azure Drake"); // {1}{U} Remove Soul - Counter target creature spell. addCard(Zone.HAND, playerB, "Remove Soul"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); setChoice(playerA, "Drake"); setChoice(playerA, "Blue"); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Azure Drake"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Remove Soul"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); // check wasn't countered assertGraveyardCount(playerA, "Azure Drake", 0); assertPermanentCount(playerA, "Azure Drake", 1); } /** * Tests spell can be countered if cast with colorless mana from Cavern */ @Test public void testDrakeCanBeCountered() { addCard(Zone.BATTLEFIELD, playerA, "Mountain", 2); addCard(Zone.BATTLEFIELD, playerA, "Island", 1); addCard(Zone.HAND, playerA, "Cavern of Souls"); addCard(Zone.HAND, playerA, "Azure Drake"); // {1}{U} Remove Soul - Counter target creature spell. addCard(Zone.HAND, playerB, "Remove Soul"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); setChoice(playerA, "Drake"); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Azure Drake"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Remove Soul"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); // check it was countered assertGraveyardCount(playerB, "Remove Soul", 1); assertGraveyardCount(playerA, "Azure Drake", 1); assertPermanentCount(playerA, "Azure Drake", 0); } /** * Tests conditional mana from Cavern in pool will still work if Cavern got * back to hand and is played again with other creature type */ @Test public void testConditionlManaWorksIfCavernIsReplayed() { addCard(Zone.HAND, playerA, "Cavern of Souls"); addCard(Zone.HAND, playerA, "Gladecover Scout"); // Elf costing {G} // addCard(Zone.HAND, playerA, "Fume Spitter"); // Horror costing {B} // Instant - {U}{U} - Return target permanent to its owner's hand. addCard(Zone.HAND, playerB, "Boomerang"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); setChoice(playerA, "Elf"); // getting green mana for Elf into pool activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add 1 mana of any one color to your mana pool. Spend this mana only to cast a creature spell of the chosen type, and that spell can't be countered."); setChoice(playerA, "Green"); // return cavern to hand castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerB, "Boomerang", "Cavern of Souls"); // playing the cavern again choose different creature type playLand(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); setChoice(playerA, "Horror"); // the green mana usable for Elf should be in the mana pool castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Gladecover Scout"); activateManaAbility(3, PhaseStep.PRECOMBAT_MAIN, playerA, "{T}: Add 1 mana of any one color to your mana pool. Spend this mana only to cast a creature spell of the chosen type, and that spell can't be countered."); setChoice(playerA, "Black"); // the black mana usable for Horror should be in the mana pool // castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Fume Spitter"); setStopAt(3, PhaseStep.BEGIN_COMBAT); execute(); assertGraveyardCount(playerB, "Boomerang", 1); assertPermanentCount(playerA, "Cavern of Souls", 1); // Check the elf was cast assertPermanentCount(playerA, "Gladecover Scout", 1); // Check Horror on the Battlefield // assertPermanentCount(playerA, "Fume Spitter", 1); } /** * Return to the Ranks cannot be countered if mana produced by Cavern of * Souls was used to pay X. Can be bug also for all other spells with X in * their cost, not sure. * */ @Test public void testCastWithColorlessManaCanBeCountered() { addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); addCard(Zone.HAND, playerA, "Cavern of Souls"); // Sorcery {X}{W}{W} // Convoke (Your creatures can help cast this spell. Each creature you tap while casting this spell pays for or one mana of that creature's color.) // Return X target creature cards with converted mana cost 2 or less from your graveyard to the battlefield. addCard(Zone.HAND, playerA, "Return to the Ranks"); addCard(Zone.GRAVEYARD, playerA, "Silvercoat Lion"); // {1}{U} Remove Soul - Counter target creature spell. addCard(Zone.HAND, playerB, "Counterspell"); addCard(Zone.BATTLEFIELD, playerB, "Island", 2); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); setChoice(playerA, "Drake"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Return to the Ranks", "Silvercoat Lion"); setChoice(playerA, "X=1"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Counterspell", "Return to the Ranks"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); // check it was countered assertGraveyardCount(playerA, "Return to the Ranks", 1); assertGraveyardCount(playerB, "Counterspell", 1); assertGraveyardCount(playerA, "Silvercoat Lion", 1); assertPermanentCount(playerA, "Silvercoat Lion", 0); } /** * Cavern of Souls can produce any colour of mana with its second ability * when Contamination is in play. */ @Test public void testUseWithConversionInPlay() { addCard(Zone.BATTLEFIELD, playerA, "Plains", 3); addCard(Zone.HAND, playerA, "Cavern of Souls"); // Creature - Drake {3}{R} addCard(Zone.HAND, playerA, "Desert Drake"); addCard(Zone.BATTLEFIELD, playerB, "Contamination", 1); playLand(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Cavern of Souls"); setChoice(playerA, "Drake"); castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Desert Drake"); setStopAt(1, PhaseStep.BEGIN_COMBAT); execute(); assertPermanentCount(playerA, "Cavern of Souls", 1); assertPermanentCount(playerA, "Desert Drake", 0); } }