package org.mage.test.combat;
import mage.constants.PhaseStep;
import mage.constants.Zone;
import mage.counters.CounterType;
import mage.game.permanent.Permanent;
import org.junit.Assert;
import org.junit.Test;
import org.mage.test.serverside.base.CardTestPlayerBase;
/**
*
* @author ayrat
*/
public class DamageDistributionTest extends CardTestPlayerBase {
@Test
public void testDoubleStrike() {
addCard(Zone.BATTLEFIELD, playerA, "Warren Instigator");
addCard(Zone.BATTLEFIELD, playerB, "Merfolk Looter");
setLife(playerB, 4);
attack(1, playerA, "Warren Instigator");
block(1, playerB, "Merfolk Looter", "Warren Instigator");
setStopAt(1, PhaseStep.END_COMBAT);
execute();
Permanent instigator = getPermanent("Warren Instigator", playerA.getId());
Assert.assertNotEquals(null, instigator);
Assert.assertEquals("Computer didn't attacked with Warren Instigator", true, instigator.isTapped());
// should block and die
assertPermanentCount(playerB, "Merfolk Looter", 0);
// creature is blocked
// blocker dies and second strike does nothing
assertLife(playerB, 4);
}
@Test
public void testDoubleStrikeUnblocked() {
addCard(Zone.BATTLEFIELD, playerA, "Warren Instigator");
setLife(playerB, 4);
attack(1, playerA, "Warren Instigator");
setStopAt(1, PhaseStep.END_COMBAT);
execute();
assertLife(playerB, 2);
}
@Test
public void testNotAttackingVersusDoubleStrike() {
addCard(Zone.BATTLEFIELD, playerA, "Merfolk Looter");
addCard(Zone.BATTLEFIELD, playerB, "Warren Instigator");
setLife(playerB, 4);
setStopAt(1, PhaseStep.END_COMBAT);
execute();
// should block and die
assertPermanentCount(playerA, "Merfolk Looter", 1);
assertPermanentCount(playerB, "Warren Instigator", 1);
// creature is blocked
// blocker dies and second strike does nothing
assertLife(playerB, 4);
}
@Test
public void testDoubleStrikeTrampleVersusIndestructible() {
addCard(Zone.BATTLEFIELD, playerA, "Darksteel Gargoyle");
addCard(Zone.BATTLEFIELD, playerB, "Drogskol Reaver");
addCard(Zone.BATTLEFIELD, playerB, "Primal Rage");
attack(2, playerB, "Drogskol Reaver");
block(2, playerA, "Darksteel Gargoyle", "Drogskol Reaver");
setStopAt(2, PhaseStep.END_TURN);
execute();
// no creatures dies
assertPermanentCount(playerA, "Darksteel Gargoyle", 1);
assertPermanentCount(playerB, "Drogskol Reaver", 1);
// creature is blocked
// blocker does not die and second strike can trample through for 3
assertLife(playerA, 17);
assertLife(playerB, 26);
}
/**
*
*/
@Test
public void testDoubleStrikeTrampleVersusIndestructibleGod() {
/**
* Heliod, God of the Sun Legendary Enchantment Creature — God 5/6, 3W
* Indestructible As long as your devotion to white is less than five,
* Heliod isn't a creature. (Each {W} in the mana costs of permanents
* you control counts toward your devotion to white.) Other creatures
* you control have vigilance. {2}{W}{W}: Create a 2/1 white Cleric
* enchantment creature token.
*/
addCard(Zone.BATTLEFIELD, playerA, "Heliod, God of the Sun");
addCard(Zone.BATTLEFIELD, playerA, "Terra Eternal"); // only for devotion
addCard(Zone.BATTLEFIELD, playerA, "Terra Eternal"); // only for devotion
/* Primeval Titan
* Creature — Giant 6/6, 4GG
* Trample
* Whenever Primeval Titan enters the battlefield or attacks, you may search your library for up to two land cards, put them onto the battlefield tapped, then shuffle your library.
*/
addCard(Zone.BATTLEFIELD, playerB, "Primeval Titan");
addCard(Zone.BATTLEFIELD, playerB, "Plains", 3);
// {W}{W}{2}
// If Leyline of Sanctity is in your opening hand, you may begin the game with it on the battlefield.
// You have hexproof.
addCard(Zone.HAND, playerA, "Leyline of Sanctity", 1);
// Enchantment - Aura {W}{2}
// Enchant creature
// Enchanted creature has double strike.
addCard(Zone.HAND, playerB, "Battle Mastery");
castSpell(2, PhaseStep.PRECOMBAT_MAIN, playerB, "Battle Mastery", "Primeval Titan");
attack(2, playerB, "Primeval Titan");
block(2, playerA, "Heliod, God of the Sun", "Primeval Titan");
setStopAt(2, PhaseStep.END_TURN);
execute();
// creature is blocked
// blocker does not die and second strike can trample through for 6
assertLife(playerA, 14);
assertLife(playerB, 20);
assertPermanentCount(playerA, "Leyline of Sanctity", 1);
assertPermanentCount(playerB, "Battle Mastery", 1);
// no creatures dies
assertPermanentCount(playerA, "Heliod, God of the Sun", 1);
assertPowerToughness(playerA, "Heliod, God of the Sun", 5, 6);
assertPermanentCount(playerB, "Primeval Titan", 1);
assertPowerToughness(playerB, "Primeval Titan", 6, 6);
}
/**
* Damage of one combat phase
*/
@Test
public void testCombatDamagePhyrexianUnlife() {
addCard(Zone.HAND, playerA, "Lightning Bolt", 6);
addCard(Zone.BATTLEFIELD, playerA, "Mountain", 6);
/**
* Phyrexian Unlife {2}{W} Enchantment
*
* You don't lose the game for having 0 or less life. As long as you
* have 0 or less life, all damage is dealt to you as though its source
* had infect.
*/
addCard(Zone.BATTLEFIELD, playerA, "Phyrexian Unlife");
addCard(Zone.BATTLEFIELD, playerB, "Silvercoat Lion", 2);
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
castSpell(1, PhaseStep.PRECOMBAT_MAIN, playerA, "Lightning Bolt", "targetPlayer=PlayerA");
attack(2, playerB, "Silvercoat Lion");
attack(2, playerB, "Silvercoat Lion");
setStopAt(2, PhaseStep.END_TURN);
execute();
// No poison counter yet
assertCounterCount(playerA, CounterType.POISON, 0);
assertPermanentCount(playerB, "Silvercoat Lion", 2);
// 4 damage from attack must be dealt as damage (not as poison counter)
assertLife(playerA, -2);
assertLife(playerB, 20);
}
}