From c2ea8246d24cc68120f5465ea075d713c176b3c5 Mon Sep 17 00:00:00 2001 From: magenoxx Date: Wed, 2 May 2012 19:21:29 +0400 Subject: [PATCH] Tests for LevelUpAbility --- .../riseoftheeldrazi/TranscendentMaster.java | 23 ++--- .../activated/LevelUpAbilityTest.java | 99 ++++++++++++++++++- .../test/cards/copy/PhantasmalImageTest.java | 1 - Mage/src/mage/abilities/AbilitiesImpl.java | 15 ++- .../condition/common/HasCounterCondition.java | 21 +++- .../mage/abilities/keyword/LevelAbility.java | 15 ++- .../mage/game/permanent/PermanentCard.java | 13 +-- 7 files changed, 148 insertions(+), 39 deletions(-) diff --git a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TranscendentMaster.java b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TranscendentMaster.java index 0dd28141fc5..42b3cad14a3 100644 --- a/Mage.Sets/src/mage/sets/riseoftheeldrazi/TranscendentMaster.java +++ b/Mage.Sets/src/mage/sets/riseoftheeldrazi/TranscendentMaster.java @@ -27,7 +27,6 @@ */ package mage.sets.riseoftheeldrazi; -import java.util.UUID; import mage.Constants.CardType; import mage.Constants.Rarity; import mage.MageInt; @@ -35,14 +34,12 @@ import mage.abilities.Abilities; import mage.abilities.AbilitiesImpl; import mage.abilities.Ability; import mage.abilities.costs.mana.ManaCostsImpl; -import mage.abilities.keyword.IndestructibleAbility; -import mage.abilities.keyword.LevelAbility; -import mage.abilities.keyword.LevelUpAbility; -import mage.abilities.keyword.LifelinkAbility; +import mage.abilities.keyword.*; import mage.cards.LevelerCard; +import java.util.UUID; + /** - * * @author North */ public class TranscendentMaster extends LevelerCard { @@ -60,14 +57,14 @@ public class TranscendentMaster extends LevelerCard { this.addAbility(new LevelUpAbility(new ManaCostsImpl("{1}"))); - Abilities abilities1 = new AbilitiesImpl(); - abilities1.add(LifelinkAbility.getInstance()); - this.getLevels().add(new LevelAbility(6, 11, abilities1, 6, 6)); + Abilities abilities1 = new AbilitiesImpl(LifelinkAbility.getInstance()); + Abilities abilities2 = new AbilitiesImpl(LifelinkAbility.getInstance(), + IndestructibleAbility.getInstance()); - Abilities abilities2 = new AbilitiesImpl(); - abilities2.add(LifelinkAbility.getInstance()); - abilities2.add(IndestructibleAbility.getInstance()); - this.getLevels().add(new LevelAbility(12, -1, abilities2, 9, 9)); + LevelAbilityBuilder.construct(this, + new LevelAbility(6, 11, abilities1, 6, 6), + new LevelAbility(12, -1, abilities2, 9, 9) + ); } public TranscendentMaster(final TranscendentMaster card) { diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/activated/LevelUpAbilityTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/activated/LevelUpAbilityTest.java index 4ff023159d4..dfa28fcaed1 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/abilities/activated/LevelUpAbilityTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/abilities/activated/LevelUpAbilityTest.java @@ -14,11 +14,79 @@ import org.mage.test.serverside.base.CardTestPlayerBase; */ public class LevelUpAbilityTest extends CardTestPlayerBase { + /** + * Tests creature without any level up counter + */ + @Test + public void testFirstLevel() { + addCard(Constants.Zone.BATTLEFIELD, playerA, "Transcendent Master"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Plains", 15); + + setStopAt(2, Constants.PhaseStep.END_TURN); + execute(); + + Permanent master = getPermanent("Transcendent Master", playerA.getId()); + Assert.assertTrue(master.getCounters().isEmpty()); + + Assert.assertEquals(3, master.getPower().getValue()); + Assert.assertEquals(3, master.getToughness().getValue()); + Assert.assertFalse(master.getAbilities().contains(LifelinkAbility.getInstance())); + Assert.assertFalse(master.getAbilities().contains(IndestructibleAbility.getInstance())); + } + /** * Tests that putting level up counters really makes effect */ @Test - public void testLevelChanged() { + public void testFirstLevelWithOneCounter() { + addCard(Constants.Zone.BATTLEFIELD, playerA, "Transcendent Master"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Plains", 15); + + activateAbility(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}"); + + setStopAt(2, Constants.PhaseStep.END_TURN); + execute(); + + Permanent master = getPermanent("Transcendent Master", playerA.getId()); + Assert.assertEquals(1, master.getCounters().getCount(CounterType.LEVEL)); + + Assert.assertEquals(3, master.getPower().getValue()); + Assert.assertEquals(3, master.getToughness().getValue()); + Assert.assertFalse(master.getAbilities().contains(LifelinkAbility.getInstance())); + Assert.assertFalse(master.getAbilities().contains(IndestructibleAbility.getInstance())); + } + + /** + * Tests second level that gives Lifelink as well as 6/6 + */ + @Test + public void testSecondLevel() { + addCard(Constants.Zone.BATTLEFIELD, playerA, "Transcendent Master"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Plains", 15); + + for (int i = 0; i < 6; i++) { + activateAbility(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}"); + } + + setStopAt(2, Constants.PhaseStep.END_TURN); + execute(); + + Permanent master = getPermanent("Transcendent Master", playerA.getId()); + Assert.assertEquals(6, master.getCounters().getCount(CounterType.LEVEL)); + + Assert.assertEquals(6, master.getPower().getValue()); + Assert.assertEquals(6, master.getToughness().getValue()); + // since now Lifelink will appear + Assert.assertTrue(master.getAbilities().contains(LifelinkAbility.getInstance())); + // but still no Indestructible + Assert.assertFalse(master.getAbilities().contains(IndestructibleAbility.getInstance())); + } + + /** + * Tests third level that gives both Lifelink and Indestructible as well as 9/9 + */ + @Test + public void testThirdLevel() { addCard(Constants.Zone.BATTLEFIELD, playerA, "Transcendent Master"); addCard(Constants.Zone.BATTLEFIELD, playerA, "Plains", 15); @@ -30,10 +98,6 @@ public class LevelUpAbilityTest extends CardTestPlayerBase { execute(); Permanent master = getPermanent("Transcendent Master", playerA.getId()); - Assert.assertNotNull(master); - - Assert.assertNotNull(master.getCounters()); - Assert.assertFalse(master.getCounters().isEmpty()); Assert.assertEquals(12, master.getCounters().getCount(CounterType.LEVEL)); Assert.assertEquals("Power different", 9, master.getPower().getValue()); @@ -41,4 +105,29 @@ public class LevelUpAbilityTest extends CardTestPlayerBase { Assert.assertTrue(master.getAbilities().contains(LifelinkAbility.getInstance())); Assert.assertTrue(master.getAbilities().contains(IndestructibleAbility.getInstance())); } + + /** + * Tests that extra counters won't make any effect over third level + */ + @Test + public void testExtraCounters() { + addCard(Constants.Zone.BATTLEFIELD, playerA, "Transcendent Master"); + addCard(Constants.Zone.BATTLEFIELD, playerA, "Plains", 15); + + for (int i = 0; i < 15; i++) { + activateAbility(1, Constants.PhaseStep.PRECOMBAT_MAIN, playerA, "Level up {1}"); + } + + setStopAt(2, Constants.PhaseStep.END_TURN); + execute(); + + Permanent master = getPermanent("Transcendent Master", playerA.getId()); + Assert.assertEquals(15, master.getCounters().getCount(CounterType.LEVEL)); + + Assert.assertEquals("Power different", 9, master.getPower().getValue()); + Assert.assertEquals("Toughness different", 9, master.getToughness().getValue()); + Assert.assertTrue(master.getAbilities().contains(LifelinkAbility.getInstance())); + Assert.assertTrue(master.getAbilities().contains(IndestructibleAbility.getInstance())); + } + } diff --git a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java index d0d4961b7ab..843e2efa8aa 100644 --- a/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/cards/copy/PhantasmalImageTest.java @@ -71,7 +71,6 @@ public class PhantasmalImageTest extends CardTestPlayerBase { castSpell(2, Constants.PhaseStep.PRECOMBAT_MAIN, playerB, "Phantasmal Image"); - setStopAt(2, Constants.PhaseStep.END_TURN); execute(); diff --git a/Mage/src/mage/abilities/AbilitiesImpl.java b/Mage/src/mage/abilities/AbilitiesImpl.java index e2688ee77ea..ea344f601c8 100644 --- a/Mage/src/mage/abilities/AbilitiesImpl.java +++ b/Mage/src/mage/abilities/AbilitiesImpl.java @@ -28,10 +28,6 @@ package mage.abilities; -import java.util.ArrayList; -import java.util.Collections; -import java.util.List; -import java.util.UUID; import mage.Constants.Zone; import mage.abilities.common.ZoneChangeTriggeredAbility; import mage.abilities.keyword.KickerAbility; @@ -39,6 +35,11 @@ import mage.abilities.keyword.ProtectionAbility; import mage.abilities.mana.ManaAbility; import mage.game.Game; +import java.util.ArrayList; +import java.util.Collections; +import java.util.List; +import java.util.UUID; + /** * * @author BetaSteward_at_googlemail.com @@ -46,6 +47,12 @@ import mage.game.Game; public class AbilitiesImpl extends ArrayList implements Abilities { public AbilitiesImpl() {} + + public AbilitiesImpl(T... abilities) { + for (T ability : abilities) { + add(ability); + } + } public AbilitiesImpl(final AbilitiesImpl abilities) { for (T ability: abilities) { diff --git a/Mage/src/mage/abilities/condition/common/HasCounterCondition.java b/Mage/src/mage/abilities/condition/common/HasCounterCondition.java index 1958e4a43a9..41789086e5b 100644 --- a/Mage/src/mage/abilities/condition/common/HasCounterCondition.java +++ b/Mage/src/mage/abilities/condition/common/HasCounterCondition.java @@ -37,8 +37,11 @@ import mage.game.Game; * @author nantuko */ public class HasCounterCondition implements Condition { - private CounterType counterType; + + private CounterType counterType; private int amount = 1; + private int from = -1; + private int to; public HasCounterCondition(CounterType type) { this.counterType = type; @@ -49,8 +52,22 @@ public class HasCounterCondition implements Condition { this.amount = amount; } + public HasCounterCondition(CounterType type, int from, int to) { + this.counterType = type; + this.from = from; + this.to = to; + } + @Override public boolean apply(Game game, Ability source) { - return game.getPermanent(source.getSourceId()).getCounters().getCount(counterType) >= amount; + if (from != -1) { //range compare + int count = game.getPermanent(source.getSourceId()).getCounters().getCount(counterType); + if (to == Integer.MAX_VALUE) { + return count >= from; + } + return count >= from && count <= to; + } else { // single compare (lte) + return game.getPermanent(source.getSourceId()).getCounters().getCount(counterType) >= amount; + } } } diff --git a/Mage/src/mage/abilities/keyword/LevelAbility.java b/Mage/src/mage/abilities/keyword/LevelAbility.java index 84438ddd4e4..7eb3fc22924 100644 --- a/Mage/src/mage/abilities/keyword/LevelAbility.java +++ b/Mage/src/mage/abilities/keyword/LevelAbility.java @@ -35,16 +35,21 @@ import mage.abilities.Ability; import mage.abilities.StaticAbility; /** + * The implementation by BetaSteward was discarded as requires special handling in Mage.Core. + * + * Instead it was replaced by conditional continuous effects and builder pattern. * * @author BetaSteward_at_googlemail.com + * @author noxx */ public class LevelAbility extends StaticAbility { - private int level1; - private int level2; - private Abilities abilities = new AbilitiesImpl(); - private int power; - private int toughness; + private int level1; + private int level2; + private int power; + private int toughness; + + private Abilities abilities = new AbilitiesImpl(); public LevelAbility(int level1, int level2, Abilities abilities, int power, int toughness) { super(Zone.BATTLEFIELD, null); diff --git a/Mage/src/mage/game/permanent/PermanentCard.java b/Mage/src/mage/game/permanent/PermanentCard.java index 8b07605187e..dbc15112dd0 100644 --- a/Mage/src/mage/game/permanent/PermanentCard.java +++ b/Mage/src/mage/game/permanent/PermanentCard.java @@ -29,13 +29,8 @@ package mage.game.permanent; import mage.Constants.Zone; -import mage.abilities.Ability; -import mage.abilities.TriggeredAbility; -import mage.abilities.common.ZoneChangeTriggeredAbility; -import mage.abilities.keyword.LevelAbility; import mage.cards.Card; import mage.cards.LevelerCard; -import mage.counters.CounterType; import mage.game.Game; import mage.game.events.ZoneChangeEvent; import mage.players.Player; @@ -103,7 +98,7 @@ public class PermanentCard extends PermanentImpl { this.manaCost = card.getManaCost().copy(); this.power = card.getPower().copy(); this.toughness = card.getToughness().copy(); - if (card instanceof LevelerCard) { + /*if (card instanceof LevelerCard) { LevelAbility level = ((LevelerCard) card).getLevel(this.getCounters().getCount(CounterType.LEVEL)); if (level != null) { this.power.setValue(level.getPower()); @@ -112,7 +107,7 @@ public class PermanentCard extends PermanentImpl { this.addAbility(ability); } } - } + }*/ if (card instanceof PermanentCard) { this.maxLevelCounters = ((PermanentCard) card).maxLevelCounters; } @@ -142,7 +137,7 @@ public class PermanentCard extends PermanentImpl { this.manaCost = card.getManaCost().copy(); this.power = card.getPower().copy(); this.toughness = card.getToughness().copy(); - if (card instanceof LevelerCard) { + /*if (card instanceof LevelerCard) { LevelAbility level = ((LevelerCard) card).getLevel(this.getCounters().getCount(CounterType.LEVEL)); if (level != null) { this.power.setValue(level.getPower()); @@ -151,7 +146,7 @@ public class PermanentCard extends PermanentImpl { this.addAbility(ability, game); } } - } + }*/ if (card instanceof PermanentCard) { this.maxLevelCounters = ((PermanentCard) card).maxLevelCounters; }