Merge origin/master

This commit is contained in:
LevelX2 2015-04-14 22:29:41 +02:00
commit 4785ebd5f8
16 changed files with 420 additions and 138 deletions

View file

@ -287,4 +287,42 @@ public class ManifestTest extends CardTestPlayerBase {
assertPermanentCount(playerB, "face down creature", 1);
}
// Check if a Megamorph card is manifested and truned by their megamorph ability
// it gets the +1/+1 counter.
@Test
public void testManifestMegamorph() {
addCard(Zone.BATTLEFIELD, playerB, "Swamp", 2);
addCard(Zone.BATTLEFIELD, playerB, "Plains", 5);
// {1}{B}, {T}, Sacrifice another creature: Manifest the top card of your library.
addCard(Zone.BATTLEFIELD, playerB, "Qarsi High Priest", 1);
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
addCard(Zone.LIBRARY, playerB, "Sandstorm Charger", 1);
addCard(Zone.LIBRARY, playerB, "Mountain", 1);
skipInitShuffling();
activateAbility(2, PhaseStep.PRECOMBAT_MAIN, playerB, "{1}{B},{T}, Sacrifice another creature");
addTarget(playerB, "Silvercoat Lion");
activateAbility(2, PhaseStep.POSTCOMBAT_MAIN, playerB, "{4}{W}: Turn");
setStopAt(2, PhaseStep.END_TURN);
execute();
// no life gain
assertLife(playerA, 20);
assertLife(playerB, 20);
assertGraveyardCount(playerB, "Silvercoat Lion", 1);
assertPermanentCount(playerB, "face down creature", 0);
assertPermanentCount(playerB, "Sandstorm Charger", 1);
assertPowerToughness(playerB, "Sandstorm Charger", 4, 5); // 3/4 and the +1/+1 counter from Megamorph
}
}

View file

@ -476,6 +476,10 @@ public class MorphTest extends CardTestPlayerBase {
@Test
public void testDiesTriggeredDoesNotTriggerIfFaceDown() {
// Flying
// When Ashcloud Phoenix dies, return it to the battlefield face down.
// Morph (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.)
// When Ashcloud Phoenix is turned face up, it deals 2 damage to each player.
addCard(Zone.HAND, playerA, "Ashcloud Phoenix", 1);
addCard(Zone.BATTLEFIELD, playerA, "Forest", 3);
@ -505,5 +509,47 @@ public class MorphTest extends CardTestPlayerBase {
}
}
}
/**
* Check that a DiesTriggeredAbility of a creature does not trigger
* if the creature dies face down in combat
*/
@Test
public void testDiesTriggeredDoesNotTriggerInCombatIfFaceDown() {
// Flying
// When Ashcloud Phoenix dies, return it to the battlefield face down.
// Morph (You may cast this card face down as a 2/2 creature for . Turn it face up any time for its morph cost.)
// When Ashcloud Phoenix is turned face up, it deals 2 damage to each player.
addCard(Zone.HAND, playerA, "Ashcloud Phoenix", 1);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 3);
// First strike, forestwalk, vigilance
// (This creature deals combat damage before creatures without first strike, it can't be blocked as long as defending player controls a Forest, and attacking doesn't cause this creature to tap.)
addCard(Zone.BATTLEFIELD, playerB, "Mirri, Cat Warrior");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Ashcloud Phoenix");
setChoice(playerA, "Yes"); // cast it face down as 2/2 creature
attack(2, playerB, "Mirri, Cat Warrior");
block(2, playerA, "face down creature", "Mirri, Cat Warrior");
setStopAt(2, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertGraveyardCount(playerA, "Ashcloud Phoenix", 1);
for (Card card: playerA.getGraveyard().getCards(currentGame)) {
if (card.getName().equals("Ashcloud Phoenix")) {
Assert.assertEquals("Ashcloud Phoenix has to be face up in graveyard", false, card.isFaceDown(currentGame));
break;
}
}
assertLife(playerA, 20);
assertLife(playerB, 20);
}
}

View file

@ -0,0 +1,93 @@
/*
* Copyright 2010 BetaSteward_at_googlemail.com. All rights reserved.
*
* Redistribution and use in source and binary forms, with or without modification, are
* permitted provided that the following conditions are met:
*
* 1. Redistributions of source code must retain the above copyright notice, this list of
* conditions and the following disclaimer.
*
* 2. Redistributions in binary form must reproduce the above copyright notice, this list
* of conditions and the following disclaimer in the documentation and/or other materials
* provided with the distribution.
*
* THIS SOFTWARE IS PROVIDED BY BetaSteward_at_googlemail.com ``AS IS'' AND ANY EXPRESS OR IMPLIED
* WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND
* FITNESS FOR A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL BetaSteward_at_googlemail.com OR
* CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
* CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR
* SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON
* ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING
* NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF
* ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
*
* The views and conclusions contained in the software and documentation are those of the
* authors and should not be interpreted as representing official policies, either expressed
* or implied, of BetaSteward_at_googlemail.com.
*/
package org.mage.test.cards.abilities.keywords;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author LevelX2
*/
public class ProvokeTest extends CardTestPlayerBase{
@Test
public void testProvokeTappedCreature() {
// Creature - Beast 5/3
// Trample
// Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)
addCard(Zone.BATTLEFIELD, playerA, "Brontotherium");
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 1);
attack(2, playerB, "Silvercoat Lion"); // So it's tapped
attack(3, playerA, "Brontotherium");
addTarget(playerA, "Silvercoat Lion");
setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertLife(playerA, 18); // one attack from Lion
assertLife(playerB, 17); // Because of Trample
assertPermanentCount(playerA, "Brontotherium", 1);
assertGraveyardCount(playerB,"Silvercoat Lion", 1);
}
@Test
public void testProvokeCreatureThatCantBlock() {
// Creature - Beast 5/3
// Trample
// Provoke (When this attacks, you may have target creature defending player controls untap and block it if able.)
addCard(Zone.BATTLEFIELD, playerA, "Brontotherium");
// Creature - Zombie Imp 1/1
// Discard a card: Putrid Imp gains flying until end of turn.
// Threshold - As long as seven or more cards are in your graveyard, Putrid Imp gets +1/+1 and can't block.
addCard(Zone.BATTLEFIELD, playerB, "Putrid Imp", 1);
addCard(Zone.GRAVEYARD, playerB, "Swamp", 7);
attack(2, playerB, "Putrid Imp"); // So it's tapped
attack(3, playerA, "Brontotherium");
addTarget(playerA, "Putrid Imp");
setStopAt(3, PhaseStep.POSTCOMBAT_MAIN);
execute();
assertPermanentCount(playerA, "Brontotherium", 1);
assertPermanentCount(playerB, "Putrid Imp", 1); // Can't Block so still alive
assertLife(playerA, 18); // one attack from Imp
assertLife(playerB, 15); // Not blocked
}
}

View file

@ -29,6 +29,7 @@ package org.mage.test.cards.replacement;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
@ -40,11 +41,11 @@ import org.mage.test.serverside.base.CardTestPlayerBase;
public class GrindstoneTest extends CardTestPlayerBase {
/**
* Tests that instead of one spore counter there were two spore counters added to Pallid Mycoderm
* if Doubling Season is on the battlefield.
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
* Leaving one Progenius in play
*/
@Test
public void testGrindstoneTest() {
public void testGrindstoneProgenius() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
@ -52,18 +53,88 @@ public class GrindstoneTest extends CardTestPlayerBase {
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
addCard(Zone.LIBRARY, playerA, "Progenitus", 2);
// Protection from everything
// If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead.
addCard(Zone.LIBRARY, playerB, "Progenitus", 1);
skipInitShuffling();
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
addTarget(playerA, playerB);
setStopAt(1, PhaseStep.END_TURN);
execute();
Assert.assertEquals("Progenitus has to be in the libarary", 1, playerB.getLibrary().size());
assertPermanentCount(playerA, "Painter's Servant", 1);
}
/**
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
* Iterating with two Progenius for a draw
*/
@Test
public void testGrindstoneProgeniusDraw() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant");
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
// Protection from everything
// If Progenitus would be put into a graveyard from anywhere, reveal Progenitus and shuffle it into its owner's library instead.
addCard(Zone.LIBRARY, playerB, "Progenitus", 2);
skipInitShuffling();
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
addTarget(playerA, playerB);
setStopAt(1, PhaseStep.END_TURN);
execute();
Assert.assertTrue("Has to be a draw because of endless iteration", currentGame.isADraw());
assertPermanentCount(playerA, "Painter's Servant", 1);
}
/**
* Tests that Grindstone mills all cards to graveyard while Painter's Servant is in play
* Iterating with two Progenius for a draw
*/
@Test
public void testGrindstoneUlamog() {
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 5);
// As Painter's Servant enters the battlefield, choose a color.
// All cards that aren't on the battlefield, spells, and permanents are the chosen color in addition to their other colors.
addCard(Zone.HAND, playerA, "Painter's Servant");
// {3}, {T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.
addCard(Zone.BATTLEFIELD, playerA, "Grindstone");
// When you cast Ulamog, the Infinite Gyre, destroy target permanent.
// Annihilator 4 (Whenever this creature attacks, defending player sacrifices four permanents.)
// Ulamog is indestructible.
// When Ulamog is put into a graveyard from anywhere, its owner shuffles his or her graveyard into his or her library.
addCard(Zone.LIBRARY, playerB, "Ulamog, the Infinite Gyre", 2);
skipInitShuffling();
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Painter's Servant");
setChoice(playerA, "Blue");
activateAbility(1, PhaseStep.POSTCOMBAT_MAIN, playerA, "{3},{T}: Target player puts the top two cards of his or her library into his or her graveyard. If both cards share a color, repeat this process.");
addTarget(playerA, playerB);
setStopAt(1, PhaseStep.END_TURN);
execute();
// No cards in graveyard because Ulamog shuffle all cards back to Lib
assertGraveyardCount(playerB, 0);
assertPermanentCount(playerA, "Painter's Servant", 1);
}
}