diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SpellQuellerTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SpellQuellerTest.java new file mode 100644 index 00000000000..9e3444e4434 --- /dev/null +++ b/Mage.Tests/src/test/java/org/mage/test/cards/single/emn/SpellQuellerTest.java @@ -0,0 +1,149 @@ +/* + * To change this license header, choose License Headers in Project Properties. + * To change this template file, choose Tools | Templates + * and open the template in the editor. + */ +package org.mage.test.cards.single.emn; + +import mage.constants.PhaseStep; +import mage.constants.Zone; +import org.junit.Test; +import org.mage.test.serverside.base.CardTestPlayerBase; + +/** + * + * @author escplan9 (Derek Monturo - dmontur1 at gmail dot com) + */ +public class SpellQuellerTest extends CardTestPlayerBase { + + @Test + public void testExileSpellCMCFour() { + + // {1}{W}{U} Flash Flying 2/3 Spirit + // When Spell Queller enters the battlefield, exile target spell with converted mana cost 4 or less. + // When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost. + addCard(Zone.HAND, playerB, "Spell Queller"); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + addCard(Zone.HAND, playerA, "Languish"); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 4); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Languish"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Spell Queller"); + addTarget(playerB, "Languish"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerB, "Spell Queller", 1); + assertExileCount("Languish", 1); + } + + @Test + public void testAttemptExileSpellCMCFive() { + + // {1}{W}{U} Flash Flying 2/3 Spirit + // When Spell Queller enters the battlefield, exile target spell with converted mana cost 4 or less. + // When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost. + addCard(Zone.HAND, playerB, "Spell Queller"); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + addCard(Zone.HAND, playerA, "Battle Sliver"); // {4}{R} 3/3 Sliver - Sliver creatures you control get +2/+0 + addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Battle Sliver"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Spell Queller"); + addTarget(playerB, "Battle Sliver"); + + setStopAt(1, PhaseStep.BEGIN_COMBAT); + execute(); + + assertPermanentCount(playerB, "Spell Queller", 1); + assertPermanentCount(playerA, "Battle Sliver", 1); + assertExileCount(playerA, 0); + } + + @Test + public void testExileSpellAndDiesAllowsFreeCast() { + + // {1}{W}{U} Flash Flying 2/3 Spirit + // When Spell Queller enters the battlefield, exile target spell with converted mana cost 4 or less. + // When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost. + addCard(Zone.HAND, playerB, "Spell Queller"); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + + addCard(Zone.HAND, playerA, "Divination"); // {2}{U} sorcery - draw 2 cards + addCard(Zone.HAND, playerA, "Murder"); // {1}{B}{B} instant - destroy target creature + addCard(Zone.BATTLEFIELD, playerA, "Island", 1); + addCard(Zone.BATTLEFIELD, playerA, "Swamp", 2); + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Divination"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Spell Queller"); + addTarget(playerB, "Divination"); + + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Murder"); + addTarget(playerA, "Spell Queller"); + setChoice(playerB, "Yes"); // elect to cast exiled card (divination) for free + + setStopAt(3, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerB, "Spell Queller", 1); + assertGraveyardCount(playerA, "Murder", 1); + assertGraveyardCount(playerA, "Divination", 1); + assertExileCount("Divination", 0); + assertHandCount(playerA, 3); // card drawn on draw step + 2 from divination + } + + /* + Reported bug: "...Spell Queller exiled my Nissa, Vastwood Seeker. Next turn he processed Nissa with Wasteland Strangler and killed my Tireless Tracker. + I then cast Quarantine Field, targeting Spell Queller and Wasteland Strangler. That's when the error message occurred. (fatal exception)" + */ + @Test + public void testExiledSpellProcessedThenQuellerDies() { + + // {1}{W}{U} Flash Flying 2/3 Spirit + // When Spell Queller enters the battlefield, exile target spell with converted mana cost 4 or less. + // When Spell Queller leaves the battlefield, the exiled card's owner may cast that card without paying its mana cost. + addCard(Zone.HAND, playerB, "Spell Queller"); + + // {2}{B} 3/2 Eldrazi (devoid) + // When Wasteland Strangler enters the battlefield, you may put a card an opponent owns from exile into that player's graveyard. + // If you do, target creature gets -3/-3 until end of turn. + addCard(Zone.HAND, playerB, "Wasteland Strangler"); + addCard(Zone.BATTLEFIELD, playerB, "Plains", 1); + addCard(Zone.BATTLEFIELD, playerB, "Island", 2); + addCard(Zone.BATTLEFIELD, playerB, "Swamp", 1); + + addCard(Zone.HAND, playerA, "Centaur Courser"); // {2}{G} 3/3 + addCard(Zone.HAND, playerA, "Wrath of God"); // {2}{W}{W} sorcery - Destroy all creatures, no regen + addCard(Zone.BATTLEFIELD, playerA, "Forest", 2); + addCard(Zone.BATTLEFIELD, playerA, "Plains", 2); + addCard(Zone.BATTLEFIELD, playerA, "Sylvan Advocate"); // {1}{G} 2/3 vigilance + + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Centaur Courser"); + castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerB, "Spell Queller"); + addTarget(playerB, "Centaur Courser"); // exiles courser + + castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Wasteland Strangler"); + setChoice(playerB, "Yes"); + setChoice(playerB, "Centaur Courser"); // put courser from exile into grave from ETB ability + addTarget(playerB, "Sylvan Advocate"); // gives -3/-3 to Advocate + + castSpell(3, PhaseStep.PRECOMBAT_MAIN, playerA, "Wrath of God"); // kill queller and strangler + + setStopAt(3, PhaseStep.BEGIN_COMBAT); + execute(); + + assertGraveyardCount(playerA, "Wrath of God", 1); + assertGraveyardCount(playerA, "Centaur Courser", 1); // in grave from processing + assertGraveyardCount(playerA, "Sylvan Advocate", 1); + assertGraveyardCount(playerB, "Spell Queller", 1); + assertGraveyardCount(playerB, "Wasteland Strangler", 1); + assertExileCount(playerA, 0); + } + +}