From ac4917a0931a67768bf8714210e5d57ba0e7513a Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Sun, 17 Apr 2022 02:21:27 -0300 Subject: [PATCH 1/7] forge-game: tests: migrate from JUnit3 to TestNG --- forge-game/pom.xml | 7 ++-- .../forge/game/ability/AbilityKeyTest.java | 30 ++++++------- .../game/mana/ManaCostBeingPaidTest.java | 42 ++++++++++--------- 3 files changed, 41 insertions(+), 38 deletions(-) diff --git a/forge-game/pom.xml b/forge-game/pom.xml index 94382991af3..c826bb3edaa 100644 --- a/forge-game/pom.xml +++ b/forge-game/pom.xml @@ -24,11 +24,10 @@ 1.2 - junit - junit - 4.13.2 + org.testng + testng + 7.4.0 test - jar io.sentry diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java index 26a4490efb7..1d00d9a6d3d 100644 --- a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -1,24 +1,26 @@ package forge.game.ability; +import org.testng.annotations.Test; +import org.testng.AssertJUnit; import java.util.Map; import com.google.common.collect.Maps; -import junit.framework.TestCase; +public class AbilityKeyTest { + @Test + public void testFromStringWorksForAllKeys() { + for (AbilityKey key : AbilityKey.values()) { + AssertJUnit.assertEquals(key, AbilityKey.fromString(key.toString())); + } + } -public class AbilityKeyTest extends TestCase { - public void testFromStringWorksForAllKeys() { - for (AbilityKey key : AbilityKey.values()) { - assertEquals(key, AbilityKey.fromString(key.toString())); - } - } + @Test + public void testCopyingEmptyMapWorks() { + Map map = Maps.newHashMap(); - public void testCopyingEmptyMapWorks() { - Map map = Maps.newHashMap(); + Map newMap = AbilityKey.newMap(map); - Map newMap = AbilityKey.newMap(map); - - // An actual copy should be made. - assertNotSame(map, newMap); - } + // An actual copy should be made. + AssertJUnit.assertNotSame(map, newMap); + } } diff --git a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java index 977e97f377a..65b3fce7566 100644 --- a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java +++ b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java @@ -1,5 +1,7 @@ package forge.game.mana; +import org.testng.annotations.Test; +import org.testng.AssertJUnit; import static forge.card.MagicColor.COLORLESS; import static forge.card.MagicColor.GREEN; import static forge.card.MagicColor.RED; @@ -7,27 +9,27 @@ import static forge.card.MagicColor.WHITE; import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; -import junit.framework.TestCase; -public class ManaCostBeingPaidTest extends TestCase { - public void testPayManaViaConvoke() { - runConvokeTest("1 W W", new byte[] { WHITE, COLORLESS, WHITE }, new String[] {"{1}{W}{W}", "{1}{W}", "{W}"}); - runConvokeTest("1 W W", new byte[] { COLORLESS, WHITE, WHITE }, new String[] {"{1}{W}{W}", "{W}{W}", "{W}"}); - runConvokeTest("1 W W", new byte[] { GREEN, WHITE, WHITE }, new String[] {"{1}{W}{W}", "{W}{W}", "{W}"}); - runConvokeTest("1 W G", new byte[] { GREEN, RED, WHITE }, new String[] {"{1}{W}{G}", "{1}{W}", "{W}"}); - } +public class ManaCostBeingPaidTest { + @Test + public void testPayManaViaConvoke() { + runConvokeTest("1 W W", new byte[] { WHITE, COLORLESS, WHITE }, new String[] { "{1}{W}{W}", "{1}{W}", "{W}" }); + runConvokeTest("1 W W", new byte[] { COLORLESS, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); + runConvokeTest("1 W W", new byte[] { GREEN, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); + runConvokeTest("1 W G", new byte[] { GREEN, RED, WHITE }, new String[] { "{1}{W}{G}", "{1}{W}", "{W}" }); + } - private void runConvokeTest(String initialCost, byte[] colorsToPay, String[] expectedRemainder) { - ManaCostBeingPaid cost = createManaCostBeingPaid(initialCost); - for (int i = 0; i < colorsToPay.length; i++) { - assertEquals(expectedRemainder[i], cost.toString()); - cost.payManaViaConvoke(colorsToPay[i]); - } - assertEquals("0", cost.toString()); - } + private void runConvokeTest(String initialCost, byte[] colorsToPay, String[] expectedRemainder) { + ManaCostBeingPaid cost = createManaCostBeingPaid(initialCost); + for (int i = 0; i < colorsToPay.length; i++) { + AssertJUnit.assertEquals(expectedRemainder[i], cost.toString()); + cost.payManaViaConvoke(colorsToPay[i]); + } + AssertJUnit.assertEquals("0", cost.toString()); + } - private ManaCostBeingPaid createManaCostBeingPaid(String cost) { - ManaCostParser parser = new ManaCostParser(cost); - return new ManaCostBeingPaid(new ManaCost(parser)); - } + private ManaCostBeingPaid createManaCostBeingPaid(String cost) { + ManaCostParser parser = new ManaCostParser(cost); + return new ManaCostBeingPaid(new ManaCost(parser)); + } } From 19962f4b9ea39e6e3d011b048c4bcdccb335d771 Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Sun, 17 Apr 2022 02:45:55 -0300 Subject: [PATCH 2/7] forge-game: tests: refactor --- .../forge/game/ability/AbilityKeyTest.java | 2 +- .../game/mana/ManaCostBeingPaidTest.java | 20 ++++++++++++------- 2 files changed, 14 insertions(+), 8 deletions(-) diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java index 1d00d9a6d3d..7090bf45c4c 100644 --- a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -7,6 +7,7 @@ import java.util.Map; import com.google.common.collect.Maps; public class AbilityKeyTest { + @Test public void testFromStringWorksForAllKeys() { for (AbilityKey key : AbilityKey.values()) { @@ -17,7 +18,6 @@ public class AbilityKeyTest { @Test public void testCopyingEmptyMapWorks() { Map map = Maps.newHashMap(); - Map newMap = AbilityKey.newMap(map); // An actual copy should be made. diff --git a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java index 65b3fce7566..7612c649bb7 100644 --- a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java +++ b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java @@ -11,6 +11,7 @@ import forge.card.mana.ManaCost; import forge.card.mana.ManaCostParser; public class ManaCostBeingPaidTest { + @Test public void testPayManaViaConvoke() { runConvokeTest("1 W W", new byte[] { WHITE, COLORLESS, WHITE }, new String[] { "{1}{W}{W}", "{1}{W}", "{W}" }); @@ -20,16 +21,21 @@ public class ManaCostBeingPaidTest { } private void runConvokeTest(String initialCost, byte[] colorsToPay, String[] expectedRemainder) { - ManaCostBeingPaid cost = createManaCostBeingPaid(initialCost); + + ManaCostBeingPaid costBeingPaid = createManaCostBeingPaid(initialCost); + for (int i = 0; i < colorsToPay.length; i++) { - AssertJUnit.assertEquals(expectedRemainder[i], cost.toString()); - cost.payManaViaConvoke(colorsToPay[i]); + AssertJUnit.assertEquals(expectedRemainder[i], costBeingPaid.toString()); + costBeingPaid.payManaViaConvoke(colorsToPay[i]); } - AssertJUnit.assertEquals("0", cost.toString()); + + AssertJUnit.assertEquals("0", costBeingPaid.toString()); } - private ManaCostBeingPaid createManaCostBeingPaid(String cost) { - ManaCostParser parser = new ManaCostParser(cost); - return new ManaCostBeingPaid(new ManaCost(parser)); + private ManaCostBeingPaid createManaCostBeingPaid(String costString) { + ManaCostParser parsedCostString = new ManaCostParser(costString); + ManaCost manaCost = new ManaCost(parsedCostString); + + return new ManaCostBeingPaid(manaCost); } } From c7d0dde3e70fb554f17babb5fd271051b303825e Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Sun, 17 Apr 2022 03:09:40 -0300 Subject: [PATCH 3/7] forge-gui-desktop: tests: migrate from JUnit3 to TestNG Affected namespace: forge.ai.simulation --- .../ai/simulation/GameSimulatorTest.java | 1078 +++++++++-------- ...ationTestCase.java => SimulationTest.java} | 2 +- .../ai/simulation/SpellAbilityPickerTest.java | 147 ++- 3 files changed, 653 insertions(+), 574 deletions(-) rename forge-gui-desktop/src/test/java/forge/ai/simulation/{SimulationTestCase.java => SimulationTest.java} (98%) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java index 5051be15ff3..d2047150c4d 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java @@ -2,6 +2,9 @@ package forge.ai.simulation; import java.util.List; +import org.testng.AssertJUnit; +import org.testng.annotations.Test; + import com.google.common.collect.Lists; import forge.ai.ComputerUtilAbility; @@ -18,9 +21,10 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -public class GameSimulatorTest extends SimulationTestCase { +public class GameSimulatorTest extends SimulationTest { - public void testActivateAbilityTriggers() { + @Test + public void testActivateAbilityTriggers() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -34,28 +38,29 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - assertNotNull(outlastSA); + AssertJUnit.assertNotNull(outlastSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(outlastSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card heraldCopy = findCardWithName(simGame, heraldCardName); - assertNotNull(heraldCopy); - assertTrue(heraldCopy.isTapped()); - assertTrue(heraldCopy.hasCounters()); - assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); - assertEquals(1, heraldCopy.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(heraldCopy); + AssertJUnit.assertTrue(heraldCopy.isTapped()); + AssertJUnit.assertTrue(heraldCopy.hasCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getPowerBonusFromCounters()); Card warriorToken = findCardWithName(simGame, "Warrior Token"); - assertNotNull(warriorToken); - assertTrue(warriorToken.isSick()); - assertEquals(1, warriorToken.getCurrentPower()); - assertEquals(1, warriorToken.getCurrentToughness()); + AssertJUnit.assertNotNull(warriorToken); + AssertJUnit.assertTrue(warriorToken.isSick()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentPower()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentToughness()); } - public void testStaticAbilities() { + @Test + public void testStaticAbilities() { String sliverCardName = "Sidewinder Sliver"; String heraldCardName = "Herald of Anafenza"; Game game = initAndCreateGame(); @@ -73,24 +78,25 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); game.getAction().checkStateEffects(true); - assertEquals(1, sliver.getAmountOfKeyword("Flanking")); - assertEquals(2, sliver.getNetPower()); - assertEquals(2, sliver.getNetToughness()); + AssertJUnit.assertEquals(1, sliver.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - assertNotNull(outlastSA); + AssertJUnit.assertNotNull(outlastSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(outlastSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card sliverCopy = findCardWithName(simGame, sliverCardName); - assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); - assertEquals(2, sliver.getNetPower()); - assertEquals(2, sliver.getNetToughness()); + AssertJUnit.assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); } - public void testStaticEffectsMonstrous() { + @Test + public void testStaticEffectsMonstrous() { String lionCardName = "Fleecemane Lion"; Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -99,19 +105,20 @@ public class GameSimulatorTest extends SimulationTestCase { lion.setMonstrous(true); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); - assertTrue(lion.isMonstrous()); - assertEquals(1, lion.getAmountOfKeyword("Hexproof")); - assertEquals(1, lion.getAmountOfKeyword("Indestructible")); + AssertJUnit.assertTrue(lion.isMonstrous()); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Indestructible")); GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); Card lionCopy = findCardWithName(simGame, lionCardName); - assertTrue(lionCopy.isMonstrous()); - assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); - assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); + AssertJUnit.assertTrue(lionCopy.isMonstrous()); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); } - public void testEquippedAbilities() { + @Test + public void testEquippedAbilities() { String bearCardName = "Runeclaw Bear"; Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -121,15 +128,16 @@ public class GameSimulatorTest extends SimulationTestCase { cloak.attachToEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); - assertEquals(1, bear.getAmountOfKeyword("Unblockable")); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Unblockable")); GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); Card bearCopy = findCardWithName(simGame, bearCardName); - assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); } - public void testEnchantedAbilities() { + @Test + public void testEnchantedAbilities() { String bearCardName = "Runeclaw Bear"; Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -139,15 +147,16 @@ public class GameSimulatorTest extends SimulationTestCase { lifelink.attachToEntity(bear); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); game.getAction().checkStateEffects(true); - assertEquals(1, bear.getAmountOfKeyword("Lifelink")); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Lifelink")); GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); Card bearCopy = findCardWithName(simGame, bearCardName); - assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); } - public void testEtbTriggers() { + @Test + public void testEtbTriggers() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Black Knight", p); @@ -165,13 +174,14 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int origScore = sim.getScoreForOrigGame().value; int score = sim.simulateSpellAbility(playMerchantSa).value; - assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); Game simGame = sim.getSimulatedGameState(); - assertEquals(24, simGame.getPlayers().get(1).getLife()); - assertEquals(16, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(24, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(16, simGame.getPlayers().get(0).getLife()); } - public void testSimulateUnmorph() { + @Test + public void testSimulateUnmorph() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); Card ripper = createCard("Ruthless Ripper", p); @@ -181,18 +191,19 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(20, game.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(20, game.getPlayers().get(0).getLife()); GameSimulator sim = createSimulator(game, p); Game simGame = sim.getSimulatedGameState(); SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); - assertNotNull(unmorphSA); + AssertJUnit.assertNotNull(unmorphSA); sim.simulateSpellAbility(unmorphSA); - assertEquals(18, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(18, simGame.getPlayers().get(0).getLife()); } - public void testFindingOwnCard() { + @Test + public void testFindingOwnCard() { Game game = initAndCreateGame(); Player p0 = game.getPlayers().get(0); Player p1 = game.getPlayers().get(1); @@ -207,14 +218,15 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); SpellAbility fractureSa = fractureP1.getSpellAbilities().get(0); - assertNotNull(fractureSa); + AssertJUnit.assertNotNull(fractureSa); fractureSa.getTargets().add(p0); sim.simulateSpellAbility(fractureSa); - assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); - assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); } - public void testPlaneswalkerAbilities() { + @Test + public void testPlaneswalkerAbilities() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); Card sorin = addCard("Sorin, Solemn Visitor", p); @@ -226,24 +238,24 @@ public class GameSimulatorTest extends SimulationTestCase { CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); SpellAbility minusTwo = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - assertNotNull(minusTwo); + AssertJUnit.assertNotNull(minusTwo); minusTwo.setActivatingPlayer(p); - assertTrue(minusTwo.canPlay()); + AssertJUnit.assertTrue(minusTwo.canPlay()); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(minusTwo); Game simGame = sim.getSimulatedGameState(); Card vampireToken = findCardWithName(simGame, "Vampire Token"); - assertNotNull(vampireToken); + AssertJUnit.assertNotNull(vampireToken); Player simP = simGame.getPlayers().get(1); cards = ComputerUtilAbility.getAvailableCards(simGame, simP); abilities = ComputerUtilAbility.getSpellAbilities(cards, simP); SpellAbility minusTwoSim = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - assertNotNull(minusTwoSim); + AssertJUnit.assertNotNull(minusTwoSim); minusTwoSim.setActivatingPlayer(simP); - assertFalse(minusTwoSim.canPlay()); - assertEquals(1, minusTwoSim.getActivationsThisTurn()); + AssertJUnit.assertFalse(minusTwoSim.canPlay()); + AssertJUnit.assertEquals(1, minusTwoSim.getActivationsThisTurn()); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); @@ -252,11 +264,12 @@ public class GameSimulatorTest extends SimulationTestCase { abilities = ComputerUtilAbility.getSpellAbilities(cards, copyP); SpellAbility minusTwoCopy = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); minusTwoCopy.setActivatingPlayer(copyP); - assertFalse(minusTwoCopy.canPlay()); - assertEquals(1, minusTwoCopy.getActivationsThisTurn()); + AssertJUnit.assertFalse(minusTwoCopy.canPlay()); + AssertJUnit.assertEquals(1, minusTwoCopy.getActivationsThisTurn()); } - public void testPlaneswalkerEmblems() { + @Test + public void testPlaneswalkerEmblems() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); String bearCardName = "Runeclaw Bear"; @@ -270,23 +283,24 @@ public class GameSimulatorTest extends SimulationTestCase { CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); - assertNotNull(minusFour); + AssertJUnit.assertNotNull(minusFour); minusFour.setActivatingPlayer(p); - assertTrue(minusFour.canPlay()); + AssertJUnit.assertTrue(minusFour.canPlay()); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(minusFour); Game simGame = sim.getSimulatedGameState(); Card simBear = findCardWithName(simGame, bearCardName); - assertEquals(3, simBear.getNetPower()); + AssertJUnit.assertEquals(3, simBear.getNetPower()); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card copyBear = findCardWithName(copy, bearCardName); - assertEquals(3, copyBear.getNetPower()); + AssertJUnit.assertEquals(3, copyBear.getNetPower()); } - public void testManifest() { + @Test + public void testManifest() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Plains", p); @@ -303,12 +317,12 @@ public class GameSimulatorTest extends SimulationTestCase { sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); Card manifestedCreature = findCardWithName(simGame, ""); - assertNotNull(manifestedCreature); + AssertJUnit.assertNotNull(manifestedCreature); SpellAbility unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(p, false), "Unmanifest"); - assertNotNull(unmanifestSA); - assertEquals(2, manifestedCreature.getNetPower()); - assertFalse(manifestedCreature.hasKeyword("Flying")); + AssertJUnit.assertNotNull(unmanifestSA); + AssertJUnit.assertEquals(2, manifestedCreature.getNetPower()); + AssertJUnit.assertFalse(manifestedCreature.hasKeyword("Flying")); GameSimulator sim2 = createSimulator(simGame, simGame.getPlayers().get(1)); Game simGame2 = sim2.getSimulatedGameState(); @@ -318,17 +332,18 @@ public class GameSimulatorTest extends SimulationTestCase { sim2.simulateSpellAbility(unmanifestSA); Card ornithopter = findCardWithName(simGame2, "Ornithopter"); - assertEquals(0, ornithopter.getNetPower()); - assertTrue(ornithopter.hasKeyword("Flying")); - assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); + AssertJUnit.assertEquals(0, ornithopter.getNetPower()); + AssertJUnit.assertTrue(ornithopter.hasKeyword("Flying")); + AssertJUnit.assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); GameCopier copier = new GameCopier(simGame2); Game copy = copier.makeCopy(); Card ornithopterCopy = findCardWithName(copy, "Ornithopter"); - assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); + AssertJUnit.assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); } - public void testManifest2() { + @Test + public void testManifest2() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Plains", p); @@ -345,16 +360,17 @@ public class GameSimulatorTest extends SimulationTestCase { sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); Card manifestedCreature = findCardWithName(simGame, ""); - assertNotNull(manifestedCreature); - assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card manifestedCreatureCopy = findCardWithName(copy, ""); - assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); } - public void testManifest3() { + @Test + public void testManifest3() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Plains", p); @@ -371,16 +387,17 @@ public class GameSimulatorTest extends SimulationTestCase { sim.simulateSpellAbility(manifestSA); Game simGame = sim.getSimulatedGameState(); Card manifestedCreature = findCardWithName(simGame, ""); - assertNotNull(manifestedCreature); - assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card manifestedCreatureCopy = findCardWithName(copy, ""); - assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); } - public void testTypeOfPermanentChanging() { + @Test + public void testTypeOfPermanentChanging() { String sarkhanCardName = "Sarkhan, the Dragonspeaker"; Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -389,27 +406,28 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertFalse(sarkhan.isCreature()); - assertTrue(sarkhan.isPlaneswalker()); + AssertJUnit.assertFalse(sarkhan.isCreature()); + AssertJUnit.assertTrue(sarkhan.isPlaneswalker()); SpellAbility becomeDragonSA = findSAWithPrefix(sarkhan, "+1"); - assertNotNull(becomeDragonSA); + AssertJUnit.assertNotNull(becomeDragonSA); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(becomeDragonSA); Game simGame = sim.getSimulatedGameState(); Card sarkhanSim = findCardWithName(simGame, sarkhanCardName); - assertTrue(sarkhanSim.isCreature()); - assertFalse(sarkhanSim.isPlaneswalker()); + AssertJUnit.assertTrue(sarkhanSim.isCreature()); + AssertJUnit.assertFalse(sarkhanSim.isPlaneswalker()); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card sarkhanCopy = findCardWithName(copy, sarkhanCardName); - assertTrue(sarkhanCopy.isCreature()); - assertFalse(sarkhanCopy.isPlaneswalker()); + AssertJUnit.assertTrue(sarkhanCopy.isCreature()); + AssertJUnit.assertFalse(sarkhanCopy.isPlaneswalker()); } - public void testDistributeCountersAbility() { + @Test + public void testDistributeCountersAbility() { String ajaniCardName = "Ajani, Mentor of Heroes"; String ornithoperCardName = "Ornithopter"; String bearCardName = "Runeclaw Bear"; @@ -424,7 +442,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbility sa = findSAWithPrefix(ajani, "+1: Distribute"); - assertNotNull(sa); + AssertJUnit.assertNotNull(sa); sa.setActivatingPlayer(p); MultiTargetSelector selector = new MultiTargetSelector(sa, null); @@ -434,11 +452,12 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); Card thopterSim = findCardWithName(simGame, ornithoperCardName); Card bearSim = findCardWithName(simGame, bearCardName); - assertEquals(3, thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(3, thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); } } - public void testDamagePreventedTrigger() { + @Test + public void testDamagePreventedTrigger() { String ajaniCardName = "Ajani Steadfast"; String selflessCardName = "Selfless Squire"; @@ -455,7 +474,7 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbility sa = findSAWithPrefix(ajani, "-7:"); - assertNotNull(sa); + AssertJUnit.assertNotNull(sa); sa.setActivatingPlayer(p); GameSimulator sim = createSimulator(game, p); @@ -466,16 +485,17 @@ public class GameSimulatorTest extends SimulationTestCase { Card simSelfless = findCardWithName(simGame, selflessCardName); // only one damage - assertEquals(19, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(19, simGame.getPlayers().get(0).getLife()); // only triggered once - assertTrue(simSelfless.hasCounters()); - assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); - assertEquals(2, simSelfless.getToughnessBonusFromCounters()); - assertEquals(2, simSelfless.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simSelfless.hasCounters()); + AssertJUnit.assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simSelfless.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simSelfless.getPowerBonusFromCounters()); } - public void testChosenColors() { + @Test + public void testChosenColors() { String bearCardName = "Runeclaw Bear"; Game game = initAndCreateGame(); @@ -485,15 +505,16 @@ public class GameSimulatorTest extends SimulationTestCase { hall.setChosenColors(Lists.newArrayList("green")); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(3, bear.getNetToughness()); + AssertJUnit.assertEquals(3, bear.getNetToughness()); GameCopier copier = new GameCopier(game); Game copy = copier.makeCopy(); Card bearCopy = findCardWithName(copy, bearCardName); - assertEquals(3, bearCopy.getNetToughness()); + AssertJUnit.assertEquals(3, bearCopy.getNetToughness()); } - public void testDarkDepthsCopy() { + @Test + public void testDarkDepthsCopy() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Swamp", p); @@ -503,11 +524,11 @@ public class GameSimulatorTest extends SimulationTestCase { Card thespian = addCard("Thespian's Stage", p); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertTrue(depths.hasCounters()); + AssertJUnit.assertTrue(depths.hasCounters()); SpellAbility sa = findSAWithPrefix(thespian, "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - assertNotNull(sa); + AssertJUnit.assertNotNull(sa); sa.getTargets().add(depths); GameSimulator sim = createSimulator(game, p); @@ -515,35 +536,37 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); String strSimGame = gameStateToString(simGame); - assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); - assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); - assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); + AssertJUnit.assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); } - public void testThespianStageSelfCopy() { + @Test + public void testThespianStageSelfCopy() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Swamp", p); addCard("Swamp", p); Card thespian = addCard("Thespian's Stage", p); - assertTrue(thespian.isLand()); + AssertJUnit.assertTrue(thespian.isLand()); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); SpellAbility sa = findSAWithPrefix(thespian, "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - assertNotNull(sa); + AssertJUnit.assertNotNull(sa); sa.getTargets().add(thespian); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(sa); Game simGame = sim.getSimulatedGameState(); Card thespianSim = findCardWithName(simGame, "Thespian's Stage"); - assertNotNull(gameStateToString(simGame), thespianSim); - assertTrue(thespianSim.isLand()); + AssertJUnit.assertNotNull(gameStateToString(simGame), thespianSim); + AssertJUnit.assertTrue(thespianSim.isLand()); } - public void testDash() { + @Test + public void testDash() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -555,33 +578,34 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); SpellAbility dashSA = findSAWithPrefix(berserkerCard, "Dash"); - assertNotNull(dashSA); + AssertJUnit.assertNotNull(dashSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(dashSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card berserker = findCardWithName(simGame, berserkerCardName); - assertNotNull(berserker); - assertEquals(1, berserker.getNetPower()); - assertEquals(1, berserker.getNetToughness()); - assertFalse(berserker.isSick()); + AssertJUnit.assertNotNull(berserker); + AssertJUnit.assertEquals(1, berserker.getNetPower()); + AssertJUnit.assertEquals(1, berserker.getNetToughness()); + AssertJUnit.assertFalse(berserker.isSick()); SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); - assertNotNull(pumpSA); + AssertJUnit.assertNotNull(pumpSA); GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); sim2.simulateSpellAbility(pumpSA); Game simGame2 = sim2.getSimulatedGameState(); Card berserker2 = findCardWithName(simGame2, berserkerCardName); - assertNotNull(berserker2); - assertEquals(2, berserker2.getNetPower()); - assertEquals(1, berserker2.getNetToughness()); - assertFalse(berserker2.isSick()); + AssertJUnit.assertNotNull(berserker2); + AssertJUnit.assertEquals(2, berserker2.getNetPower()); + AssertJUnit.assertEquals(1, berserker2.getNetToughness()); + AssertJUnit.assertFalse(berserker2.isSick()); } - public void testTokenAbilities() { + @Test + public void testTokenAbilities() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -596,27 +620,28 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(callTheScionsSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card scion = findCardWithName(simGame, "Eldrazi Scion Token"); - assertNotNull(scion); - assertEquals(1, scion.getNetPower()); - assertEquals(1, scion.getNetToughness()); - assertTrue(scion.isSick()); - assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); + AssertJUnit.assertNotNull(scion); + AssertJUnit.assertEquals(1, scion.getNetPower()); + AssertJUnit.assertEquals(1, scion.getNetToughness()); + AssertJUnit.assertTrue(scion.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card scionCopy = findCardWithName(copy, "Eldrazi Scion Token"); - assertNotNull(scionCopy); - assertEquals(1, scionCopy.getNetPower()); - assertEquals(1, scionCopy.getNetToughness()); - assertTrue(scionCopy.isSick()); - assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); + AssertJUnit.assertNotNull(scionCopy); + AssertJUnit.assertEquals(1, scionCopy.getNetPower()); + AssertJUnit.assertEquals(1, scionCopy.getNetToughness()); + AssertJUnit.assertTrue(scionCopy.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); } - public void testMarkedDamage() { + @Test + public void testMarkedDamage() { // Marked damage is important, as it's used during the AI declare // attackers logic // which affects game state score - since P/T boosts are evaluated @@ -634,24 +659,25 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(3, giant.getNetPower()); - assertEquals(3, giant.getNetToughness()); - assertEquals(0, giant.getDamage()); + AssertJUnit.assertEquals(3, giant.getNetPower()); + AssertJUnit.assertEquals(3, giant.getNetToughness()); + AssertJUnit.assertEquals(0, giant.getDamage()); GameSimulator sim = createSimulator(game, p); shockSA.setTargetCard(giant); sim.simulateSpellAbility(shockSA); Game simGame = sim.getSimulatedGameState(); Card simGiant = findCardWithName(simGame, giantCardName); - assertEquals(2, simGiant.getDamage()); + AssertJUnit.assertEquals(2, simGiant.getDamage()); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card giantCopy = findCardWithName(copy, giantCardName); - assertEquals(2, giantCopy.getDamage()); + AssertJUnit.assertEquals(2, giantCopy.getDamage()); } - public void testLifelinkDamageSpell() { + @Test + public void testLifelinkDamageSpell() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -690,24 +716,25 @@ public class GameSimulatorTest extends SimulationTestCase { Card simBrood = findCardWithName(simGame, broodName); // because it was destroyed - assertNull(simBrood); - assertNotNull(simPridemate); + AssertJUnit.assertNull(simBrood); + AssertJUnit.assertNotNull(simPridemate); - assertEquals(0, simKalitas.getDamage()); - assertEquals(3, simPridemate.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); // only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); // 3 times 3 damage with life gain = 9 + 20 = 29 - assertEquals(29, simGame.getPlayers().get(0).getLife()); - assertEquals(17, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(29, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); } - public void testLifelinkDamageSpellMultiplier() { + @Test + public void testLifelinkDamageSpellMultiplier() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -745,26 +772,27 @@ public class GameSimulatorTest extends SimulationTestCase { Card simBrood = findCardWithName(simGame, broodName); // because it was destroyed - assertNull(simBrood); + AssertJUnit.assertNull(simBrood); - assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); // 2 of the 3 are prevented - assertEquals(1, simPridemate.getDamage()); - assertEquals(1, simGisela.getDamage()); + AssertJUnit.assertEquals(1, simPridemate.getDamage()); + AssertJUnit.assertEquals(1, simGisela.getDamage()); // only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); // 2 times 3 / 2 rounded down = 2 * 1 = 2 // 2 times 3 * 2 = 12 - assertEquals(34, simGame.getPlayers().get(0).getLife()); - assertEquals(14, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(14, simGame.getPlayers().get(1).getLife()); } - public void testLifelinkDamageSpellRedirected() { + @Test + public void testLifelinkDamageSpellRedirected() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -806,28 +834,29 @@ public class GameSimulatorTest extends SimulationTestCase { Card simPalisade = findCardWithName(simGame, palisadeName); // not destroyed because damage redirected - assertNotNull(simBrood); - assertEquals(0, simBrood.getDamage()); + AssertJUnit.assertNotNull(simBrood); + AssertJUnit.assertEquals(0, simBrood.getDamage()); // destroyed because of to much redirected damage - assertNull(simPalisade); - assertNotNull(simPridemate); + AssertJUnit.assertNull(simPalisade); + AssertJUnit.assertNotNull(simPridemate); - assertEquals(0, simKalitas.getDamage()); - assertEquals(3, simPridemate.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); // only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); // 4 times 3 damage with life gain = 12 + 20 = 32 - assertEquals(32, simGame.getPlayers().get(0).getLife()); - assertEquals(20, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(32, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(20, simGame.getPlayers().get(1).getLife()); } - public void testLifelinkDamageSpellMultipleDamage() { + @Test + public void testLifelinkDamageSpellMultipleDamage() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -876,21 +905,21 @@ public class GameSimulatorTest extends SimulationTestCase { // spell deals multiple damages to multiple targets, only one cause of // lifegain - assertNotNull(simPridemate); - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - assertNotNull(simBear); - assertEquals(1, simBear.getDamage()); + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); - assertNotNull(simGiant); - assertEquals(2, simGiant.getDamage()); + AssertJUnit.assertNotNull(simGiant); + AssertJUnit.assertEquals(2, simGiant.getDamage()); // 1 + 2 + 3 lifegain - assertEquals(26, simGame.getPlayers().get(0).getLife()); - assertEquals(17, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(26, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); // second pard with Everlasting Torment addCard(tormentName, p2); @@ -904,29 +933,29 @@ public class GameSimulatorTest extends SimulationTestCase { Card simPridemate2 = findCardWithName(simGame2, pridemateName); // no Lifegain because of Everlasting Torment - assertNotNull(simPridemate2); - assertFalse(simPridemate2.hasCounters()); - assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); - assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); - assertEquals(0, simPridemate2.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simPridemate2); + AssertJUnit.assertFalse(simPridemate2.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getPowerBonusFromCounters()); - assertNotNull(simBear2); - assertEquals(0, simBear2.getDamage()); - assertTrue(simBear2.hasCounters()); - assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); - assertEquals(-1, simBear2.getToughnessBonusFromCounters()); - assertEquals(-1, simBear2.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simBear2); + AssertJUnit.assertEquals(0, simBear2.getDamage()); + AssertJUnit.assertTrue(simBear2.hasCounters()); + AssertJUnit.assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-1, simBear2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-1, simBear2.getPowerBonusFromCounters()); - assertNotNull(simGiant2); - assertEquals(0, simGiant2.getDamage()); - assertTrue(simGiant2.hasCounters()); - assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); - assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); - assertEquals(-2, simGiant2.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simGiant2); + AssertJUnit.assertEquals(0, simGiant2.getDamage()); + AssertJUnit.assertTrue(simGiant2.hasCounters()); + AssertJUnit.assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-2, simGiant2.getPowerBonusFromCounters()); // no life gain - assertEquals(20, simGame2.getPlayers().get(0).getLife()); - assertEquals(17, simGame2.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); // third pard with Melira prevents wither addCard(meliraName, p2); @@ -940,32 +969,33 @@ public class GameSimulatorTest extends SimulationTestCase { Card simPridemate3 = findCardWithName(simGame3, pridemateName); // no Lifegain because of Everlasting Torment - assertNotNull(simPridemate3); - assertFalse(simPridemate3.hasCounters()); - assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); - assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); - assertEquals(0, simPridemate3.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simPridemate3); + AssertJUnit.assertFalse(simPridemate3.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getPowerBonusFromCounters()); - assertNotNull(simBear3); - assertEquals(0, simBear3.getDamage()); - assertFalse(simBear3.hasCounters()); - assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); - assertEquals(0, simBear3.getToughnessBonusFromCounters()); - assertEquals(0, simBear3.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simBear3); + AssertJUnit.assertEquals(0, simBear3.getDamage()); + AssertJUnit.assertFalse(simBear3.hasCounters()); + AssertJUnit.assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simBear3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simBear3.getPowerBonusFromCounters()); - assertNotNull(simGiant3); - assertEquals(0, simGiant3.getDamage()); - assertFalse(simGiant3.hasCounters()); - assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); - assertEquals(0, simGiant3.getToughnessBonusFromCounters()); - assertEquals(0, simGiant3.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simGiant3); + AssertJUnit.assertEquals(0, simGiant3.getDamage()); + AssertJUnit.assertFalse(simGiant3.hasCounters()); + AssertJUnit.assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simGiant3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simGiant3.getPowerBonusFromCounters()); // no life gain - assertEquals(20, simGame2.getPlayers().get(0).getLife()); - assertEquals(17, simGame2.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); } - public void testTransform() { + @Test + public void testTransform() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Swamp", p); @@ -979,29 +1009,30 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertTrue(lilianaInPlay.isCreature()); - assertEquals(2, lilianaInPlay.getNetPower()); - assertEquals(3, lilianaInPlay.getNetToughness()); + AssertJUnit.assertTrue(lilianaInPlay.isCreature()); + AssertJUnit.assertEquals(2, lilianaInPlay.getNetPower()); + AssertJUnit.assertEquals(3, lilianaInPlay.getNetToughness()); SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(playLiliana); Game simGame = sim.getSimulatedGameState(); - assertNull(findCardWithName(simGame, lilianaCardName)); + AssertJUnit.assertNull(findCardWithName(simGame, lilianaCardName)); Card lilianaPW = findCardWithName(simGame, lilianaPWName); - assertNotNull(lilianaPW); - assertTrue(lilianaPW.isPlaneswalker()); - assertEquals(3, lilianaPW.getCurrentLoyalty()); + AssertJUnit.assertNotNull(lilianaPW); + AssertJUnit.assertTrue(lilianaPW.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPW.getCurrentLoyalty()); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Card lilianaPWCopy = findCardWithName(copy, lilianaPWName); - assertNotNull(lilianaPWCopy); - assertTrue(lilianaPWCopy.isPlaneswalker()); - assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); + AssertJUnit.assertNotNull(lilianaPWCopy); + AssertJUnit.assertTrue(lilianaPWCopy.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); } - public void testEnergy() { + @Test + public void testEnergy() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Island", p); @@ -1010,22 +1041,23 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); + AssertJUnit.assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); SpellAbility playTurtle = turtleCard.getSpellAbilities().get(0); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(playTurtle); Game simGame = sim.getSimulatedGameState(); Player simP = simGame.getPlayers().get(1); - assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); + AssertJUnit.assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); GameCopier copier = new GameCopier(simGame); Game copy = copier.makeCopy(); Player copyP = copy.getPlayers().get(1); - assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); + AssertJUnit.assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); } - public void testFloatingMana() { + @Test + public void testFloatingMana() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); addCard("Swamp", p); @@ -1035,15 +1067,15 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertTrue(p.getManaPool().isEmpty()); + AssertJUnit.assertTrue(p.getManaPool().isEmpty()); SpellAbility playRitual = darkRitualCard.getSpellAbilities().get(0); GameSimulator sim = createSimulator(game, p); sim.simulateSpellAbility(playRitual); Game simGame = sim.getSimulatedGameState(); Player simP = simGame.getPlayers().get(1); - assertEquals(3, simP.getManaPool().totalMana()); - assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); + AssertJUnit.assertEquals(3, simP.getManaPool().totalMana()); + AssertJUnit.assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); @@ -1053,8 +1085,8 @@ public class GameSimulatorTest extends SimulationTestCase { sim2.simulateSpellAbility(playDarkConfidant2); Game sim2Game = sim2.getSimulatedGameState(); Player sim2P = sim2Game.getPlayers().get(1); - assertEquals(1, sim2P.getManaPool().totalMana()); - assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + AssertJUnit.assertEquals(1, sim2P.getManaPool().totalMana()); + AssertJUnit.assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); Card deathriteCard3 = (Card) sim2.getGameCopier().find(deathriteCard2); SpellAbility playDeathriteCard3 = deathriteCard3.getSpellAbilities().get(0); @@ -1063,11 +1095,12 @@ public class GameSimulatorTest extends SimulationTestCase { sim3.simulateSpellAbility(playDeathriteCard3); Game sim3Game = sim3.getSimulatedGameState(); Player sim3P = sim3Game.getPlayers().get(1); - assertEquals(0, sim3P.getManaPool().totalMana()); - assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + AssertJUnit.assertEquals(0, sim3P.getManaPool().totalMana()); + AssertJUnit.assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); } - public void testEnKor() { + @Test + public void testEnKor() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1096,13 +1129,13 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(2, enKor.getNetPower()); - assertEquals(2, enKor.getNetToughness()); - assertEquals(0, enKor.getDamage()); + AssertJUnit.assertEquals(2, enKor.getNetPower()); + AssertJUnit.assertEquals(2, enKor.getNetToughness()); + AssertJUnit.assertEquals(0, enKor.getDamage()); - assertEquals(2, bear.getNetPower()); - assertEquals(2, bear.getNetToughness()); - assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); GameSimulator sim = createSimulator(game, p); enKorSA.setTargetCard(bear); @@ -1113,24 +1146,25 @@ public class GameSimulatorTest extends SimulationTestCase { Card simEnKor = findCardWithName(simGame, enKorName); Card simBear = findCardWithName(simGame, bearName); - assertNotNull(simEnKor); - assertEquals(1, simEnKor.getDamage()); + AssertJUnit.assertNotNull(simEnKor); + AssertJUnit.assertEquals(1, simEnKor.getDamage()); - assertNotNull(simBear); - assertEquals(1, simBear.getDamage()); + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); Card simPridemate = findCardWithName(simGame, pridemateName); // only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - assertEquals(22, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(22, simGame.getPlayers().get(0).getLife()); } - public void testRazia() { + @Test + public void testRazia() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1161,11 +1195,11 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - assertEquals(2, bear.getNetPower()); - assertEquals(2, bear.getNetToughness()); - assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); GameSimulator sim = createSimulator(game, p); preventSA.setTargetCard(razia); @@ -1177,24 +1211,25 @@ public class GameSimulatorTest extends SimulationTestCase { Card simRazia = findCardWithName(simGame, raziaName); Card simBear = findCardWithName(simGame, bearName); - assertNotNull(simRazia); - assertEquals(1, simRazia.getDamage()); + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); // bear destroyed - assertNull(simBear); + AssertJUnit.assertNull(simBear); Card simPridemate = findCardWithName(simGame, pridemateName); // only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - assertEquals(24, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); } - public void testRazia2() { + @Test + public void testRazia2() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1227,11 +1262,11 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - assertEquals(4, elemental.getNetPower()); - assertEquals(4, elemental.getNetToughness()); - assertEquals(0, elemental.getDamage()); + AssertJUnit.assertEquals(4, elemental.getNetPower()); + AssertJUnit.assertEquals(4, elemental.getNetToughness()); + AssertJUnit.assertEquals(0, elemental.getDamage()); GameSimulator sim = createSimulator(game, p); preventSA.setTargetCard(razia); @@ -1245,25 +1280,26 @@ public class GameSimulatorTest extends SimulationTestCase { Card simRazia = findCardWithName(simGame, raziaName); Card simElemental = findCardWithName(simGame, elementalName); - assertNotNull(simRazia); - assertEquals(1, simRazia.getDamage()); + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); // elemental not destroyed - assertNotNull(simElemental); - assertEquals(3, simElemental.getDamage()); + AssertJUnit.assertNotNull(simElemental); + AssertJUnit.assertEquals(3, simElemental.getDamage()); Card simPridemate = findCardWithName(simGame, pridemateName); // only triggered twice - assertTrue(simPridemate.hasCounters()); - assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(2, simPridemate.getToughnessBonusFromCounters()); - assertEquals(2, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simPridemate.getPowerBonusFromCounters()); - assertEquals(24, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); } - public void testMassRemovalVsKalitas() { + @Test + public void testMassRemovalVsKalitas() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); Player opp = game.getPlayers().get(1); @@ -1281,18 +1317,19 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - assertNotNull(wrathSA); + AssertJUnit.assertNotNull(wrathSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(wrathSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); int numZombies = countCardsWithName(simGame, "Zombie Token"); - assertEquals(2, numZombies); + AssertJUnit.assertEquals(2, numZombies); } - public void testKalitasNumberOfTokens() { + @Test + public void testKalitasNumberOfTokens() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); Player opp = game.getPlayers().get(1); @@ -1311,26 +1348,27 @@ public class GameSimulatorTest extends SimulationTestCase { Card fatalPush = addCardToZone("Fatal Push", p, ZoneType.Hand); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); SpellAbility fatalPushSA = fatalPush.getFirstSpellAbility(); - assertNotNull(fatalPushSA); + AssertJUnit.assertNotNull(fatalPushSA); fatalPushSA.setTargetCard(goblin); // Electrify: should also generate 2 tokens after the Ixalan rules update Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); SpellAbility electrifySA = electrify.getFirstSpellAbility(); - assertNotNull(electrifySA); + AssertJUnit.assertNotNull(electrifySA); electrifySA.setTargetCard(goblin2); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(fatalPushSA).value; - assertTrue(score > 0); - assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); score = sim.simulateSpellAbility(electrifySA).value; - assertTrue(score > 0); - assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); } - public void testPlayerXCount() { + @Test + public void testPlayerXCount() { // If playerXCount is operational, then conditions that count something // about the player (e.g. // cards in hand, life total) should work, similar to the Bloodghast @@ -1351,7 +1389,8 @@ public class GameSimulatorTest extends SimulationTestCase { assert (bloodghast.hasKeyword("Haste")); } - public void testDeathsShadow() { + @Test + public void testDeathsShadow() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1369,7 +1408,8 @@ public class GameSimulatorTest extends SimulationTestCase { // always be 13/13 } - public void testBludgeonBrawlLatticeAura() { + @Test + public void testBludgeonBrawlLatticeAura() { // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment // Creature Auras should stay on String bearCardName = "Runeclaw Bear"; @@ -1383,33 +1423,34 @@ public class GameSimulatorTest extends SimulationTestCase { Card lifelink = addCard("Lifelink", p); lifelink.attachToEntity(bear); - assertTrue(bear.isEnchanted()); - assertTrue(bear.hasCardAttachment(lifelink)); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.hasCardAttachment(lifelink)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assertTrue(bear.isEnchanted()); - assertFalse(bear.isEquipped()); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertFalse(bear.isEquipped()); - assertTrue(lifelink.isArtifact()); - assertFalse(lifelink.isEquipment()); + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertFalse(lifelink.isEquipment()); // this add Equipment and causes it to fall off addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assertTrue(bear.isEnchanted()); - assertTrue(bear.isEquipped()); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.isEquipped()); - assertTrue(lifelink.isArtifact()); - assertTrue(lifelink.isEquipment()); + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertTrue(lifelink.isEquipment()); // still in battlefield - assertTrue(lifelink.isInPlay()); + AssertJUnit.assertTrue(lifelink.isInPlay()); } - public void testBludgeonBrawlLatticeCurse() { + @Test + public void testBludgeonBrawlLatticeCurse() { // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment // Curses can only attach Player, but Equipment can only attach to Creature so it does fall off Game game = initAndCreateGame(); @@ -1421,27 +1462,28 @@ public class GameSimulatorTest extends SimulationTestCase { Card curse = addCard(curseName, p); curse.attachToEntity(p); game.getAction().checkStateEffects(true); - assertTrue(p.isEnchanted()); - assertTrue(p.hasCardAttachment(curse)); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(p.hasCardAttachment(curse)); // this adds Artifact Type addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assertTrue(p.isEnchanted()); - assertTrue(curse.isArtifact()); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(curse.isArtifact()); // this add Equipment and causes it to fall off addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assertFalse(p.isEnchanted()); + AssertJUnit.assertFalse(p.isEnchanted()); // not in Battlefield anymore - assertFalse(curse.isInPlay()); - assertTrue(curse.isInZone(ZoneType.Graveyard)); + AssertJUnit.assertFalse(curse.isInPlay()); + AssertJUnit.assertTrue(curse.isInZone(ZoneType.Graveyard)); } - public void testBludgeonBrawlFortification() { + @Test + public void testBludgeonBrawlFortification() { // Bludgeon Brawl makes Fortification into Equipment // that means it can't attach a Land anymore if the Land is no Creature @@ -1455,26 +1497,27 @@ public class GameSimulatorTest extends SimulationTestCase { fortification.attachToEntity(mountain); game.getAction().checkStateEffects(true); - assertTrue(fortification.isFortification()); - assertFalse(fortification.isEquipment()); + AssertJUnit.assertTrue(fortification.isFortification()); + AssertJUnit.assertFalse(fortification.isEquipment()); - assertTrue(mountain.isFortified()); - assertTrue(mountain.hasCardAttachment(fortification)); - assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(mountain.isFortified()); + AssertJUnit.assertTrue(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment and it to // fall off addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); game.getAction().checkStateEffects(true); - assertFalse(fortification.isFortification()); - assertTrue(fortification.isEquipment()); + AssertJUnit.assertFalse(fortification.isFortification()); + AssertJUnit.assertTrue(fortification.isEquipment()); - assertFalse(mountain.hasCardAttachment(fortification)); - assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertFalse(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); } - public void testBludgeonBrawlFortificationDryad() { + @Test + public void testBludgeonBrawlFortificationDryad() { // Bludgeon Brawl makes Fortification into Equipment // that means it can't attach a Land anymore if the Land is no Creature too // Dryad Arbor is both a Land and a Creature so it stays attached @@ -1489,11 +1532,11 @@ public class GameSimulatorTest extends SimulationTestCase { fortification.attachToEntity(dryad); game.getAction().checkStateEffects(true); - assertTrue(dryad.isFortified()); - assertFalse(dryad.isEquipped()); + AssertJUnit.assertTrue(dryad.isFortified()); + AssertJUnit.assertFalse(dryad.isEquipped()); - assertTrue(dryad.hasCardAttachment(fortification)); - assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); // adding Brawl will cause the Fortification into Equipment // because Dryad Arbor is a Creature it stays attached @@ -1501,15 +1544,16 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); // switched from Fortification to Equipment - assertFalse(dryad.isFortified()); - assertTrue(dryad.isEquipped()); + AssertJUnit.assertFalse(dryad.isFortified()); + AssertJUnit.assertTrue(dryad.isEquipped()); - assertTrue(dryad.hasCardAttachment(fortification)); - assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); } - public void testRiotEnchantment() { + @Test + public void testRiotEnchantment() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1524,22 +1568,23 @@ public class GameSimulatorTest extends SimulationTestCase { addCard("Forest", p); SpellAbility goblinSA = goblin.getFirstSpellAbility(); - assertNotNull(goblinSA); + AssertJUnit.assertNotNull(goblinSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(goblinSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); Card simGoblin = findCardWithName(simGame, goblinName); - assertNotNull(simGoblin); + AssertJUnit.assertNotNull(simGoblin); int effects = simGoblin.getCounters(CounterEnumType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); - assertEquals(2, effects); + AssertJUnit.assertEquals(2, effects); } - public void testTeysaKarlovXathridNecromancer() { + @Test + public void testTeysaKarlovXathridNecromancer() { // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token Game game = initAndCreateGame(); @@ -1557,18 +1602,19 @@ public class GameSimulatorTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - assertNotNull(wrathSA); + AssertJUnit.assertNotNull(wrathSA); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(wrathSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); int numZombies = countCardsWithName(simGame, "Zombie Token"); - assertEquals(4, numZombies); + AssertJUnit.assertEquals(4, numZombies); } - public void testDoubleTeysaKarlovXathridNecromancer() { + @Test + public void testDoubleTeysaKarlovXathridNecromancer() { // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer trigger 3 times Game game = initAndCreateGame(); @@ -1589,15 +1635,16 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(secondSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); int numZombies = countCardsWithName(simGame, "Zombie Token"); - assertEquals(3, numZombies); + AssertJUnit.assertEquals(3, numZombies); } - public void testTeysaKarlovGitrogMonster() { + @Test + public void testTeysaKarlovGitrogMonster() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1620,14 +1667,15 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(armageddonSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); // Two cards drawn - assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + AssertJUnit.assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); } - public void testTeysaKarlovGitrogMonsterGitrogDies() { + @Test + public void testTeysaKarlovGitrogMonsterGitrogDies() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1658,14 +1706,15 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(armageddonSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); // One cards drawn - assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); } - public void testTeysaKarlovGitrogMonsterTeysaDies() { + @Test + public void testTeysaKarlovGitrogMonsterTeysaDies() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); @@ -1696,15 +1745,16 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(armageddonSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); // One cards drawn - assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); } - public void testCloneTransform() { + @Test + public void testCloneTransform() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -1717,14 +1767,14 @@ public class GameSimulatorTest extends SimulationTestCase { Card outlaw = addCard(outLawName, p2); Card giant = addCard(hillGiantName, p); - assertFalse(outlaw.isCloned()); - assertTrue(outlaw.isDoubleFaced()); - assertTrue(outlaw.hasState(CardStateName.Transformed)); - assertTrue(outlaw.canTransform(null)); - assertFalse(outlaw.isBackSide()); + AssertJUnit.assertFalse(outlaw.isCloned()); + AssertJUnit.assertTrue(outlaw.isDoubleFaced()); + AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(outlaw.canTransform(null)); + AssertJUnit.assertFalse(outlaw.isBackSide()); - assertFalse(giant.isDoubleFaced()); - assertFalse(giant.canTransform(null)); + AssertJUnit.assertFalse(giant.isDoubleFaced()); + AssertJUnit.assertFalse(giant.canTransform(null)); addCard("Forest", p); addCard("Forest", p); @@ -1743,62 +1793,63 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(cytoSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Game simGame = sim.getSimulatedGameState(); - assertEquals(0, countCardsWithName(simGame, outLawName)); - assertEquals(2, countCardsWithName(simGame, hillGiantName)); - assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); Card clonedOutLaw = (Card)sim.getGameCopier().find(outlaw); - assertTrue(clonedOutLaw.isCloned()); - assertTrue(clonedOutLaw.isDoubleFaced()); - assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); - assertTrue(clonedOutLaw.canTransform(null)); - assertFalse(clonedOutLaw.isBackSide()); + AssertJUnit.assertTrue(clonedOutLaw.isCloned()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(clonedOutLaw.canTransform(null)); + AssertJUnit.assertFalse(clonedOutLaw.isBackSide()); - assertEquals(clonedOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(clonedOutLaw.getName(), hillGiantName); - assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); score = sim.simulateSpellAbility(moonmistSA).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); simGame = sim.getSimulatedGameState(); - assertEquals(0, countCardsWithName(simGame, outLawName)); - assertEquals(2, countCardsWithName(simGame, hillGiantName)); - assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); Card transformOutLaw = (Card)sim.getGameCopier().find(outlaw); - assertTrue(transformOutLaw.isCloned()); - assertTrue(transformOutLaw.isDoubleFaced()); - assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); - assertTrue(transformOutLaw.canTransform(null)); - assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertTrue(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - assertEquals(transformOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(transformOutLaw.getName(), hillGiantName); // need to clean up the clone state simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.CLEANUP); - assertEquals(0, countCardsWithName(simGame, outLawName)); - assertEquals(1, countCardsWithName(simGame, hillGiantName)); - assertEquals(1, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, terrorName)); - assertFalse(transformOutLaw.isCloned()); - assertTrue(transformOutLaw.isDoubleFaced()); - assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); - assertTrue(transformOutLaw.canTransform(null)); - assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertFalse(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - assertEquals(transformOutLaw.getName(), terrorName); + AssertJUnit.assertEquals(transformOutLaw.getName(), terrorName); } - public void testVolrathsShapeshifter() { + @Test + public void testVolrathsShapeshifter() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1807,34 +1858,35 @@ public class GameSimulatorTest extends SimulationTestCase { // 1. Assert that Volrath has the Discard ability SpellAbility discard = findSAWithPrefix(volrath, "{2}"); - assertTrue(discard != null && discard.getApi() == ApiType.Discard); + AssertJUnit.assertTrue(discard != null && discard.getApi() == ApiType.Discard); // 2. Copy the text from a creature addCardToZone("Abattoir Ghoul", p, ZoneType.Graveyard); game.getAction().checkStateEffects(true); - assertEquals("Abattoir Ghoul", volrath.getName()); - assertEquals(3, volrath.getNetPower()); - assertEquals(2, volrath.getNetToughness()); - assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); + AssertJUnit.assertEquals("Abattoir Ghoul", volrath.getName()); + AssertJUnit.assertEquals(3, volrath.getNetPower()); + AssertJUnit.assertEquals(2, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); SpellAbility discardAfterCopy = findSAWithPrefix(volrath, "{2}"); - assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); + AssertJUnit.assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); // 3. Revert back to not copying any text addCardToZone("Plains", p, ZoneType.Graveyard); game.getAction().checkStateEffects(true); - assertEquals("Volrath's Shapeshifter", volrath.getName()); - assertEquals(0, volrath.getNetPower()); - assertEquals(1, volrath.getNetToughness()); - assertTrue(volrath.getKeywords().isEmpty()); + AssertJUnit.assertEquals("Volrath's Shapeshifter", volrath.getName()); + AssertJUnit.assertEquals(0, volrath.getNetPower()); + AssertJUnit.assertEquals(1, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.getKeywords().isEmpty()); SpellAbility discardAfterRevert = findSAWithPrefix(volrath, "{2}"); - assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); + AssertJUnit.assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); } - public void testSparkDoubleAndGideon() { + @Test + public void testSparkDoubleAndGideon() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1854,13 +1906,14 @@ public class GameSimulatorTest extends SimulationTestCase { Card simSpark = sim.getSimulatedGameState().findById(sparkDouble.getId()); - assertNotNull(simSpark); - assertTrue(simSpark.isInZone(ZoneType.Battlefield)); - assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); - assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); + AssertJUnit.assertNotNull(simSpark); + AssertJUnit.assertTrue(simSpark.isInZone(ZoneType.Battlefield)); + AssertJUnit.assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); } - public void testVituGhaziAndCytoshape() { + @Test + public void testVituGhaziAndCytoshape() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1887,14 +1940,15 @@ public class GameSimulatorTest extends SimulationTestCase { Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); - assertNotNull(awakened); - assertEquals("Vitu-Ghazi", awakened.getName()); - assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); - assertTrue(awakened.hasKeyword(Keyword.HASTE)); - assertTrue(awakened.getType().hasSubtype("Goblin")); + AssertJUnit.assertNotNull(awakened); + AssertJUnit.assertEquals("Vitu-Ghazi", awakened.getName()); + AssertJUnit.assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertTrue(awakened.hasKeyword(Keyword.HASTE)); + AssertJUnit.assertTrue(awakened.getType().hasSubtype("Goblin")); } - public void testNecroticOozeActivateOnce() { + @Test + public void testNecroticOozeActivateOnce() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); @@ -1911,14 +1965,15 @@ public class GameSimulatorTest extends SimulationTestCase { Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); - assertNotNull(oozeOTB); + AssertJUnit.assertNotNull(oozeOTB); SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); - assertNotNull(copiedSA); - assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); + AssertJUnit.assertNotNull(copiedSA); + AssertJUnit.assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); } - public void testEpochrasite() { + @Test + public void testEpochrasite() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); @@ -1936,8 +1991,8 @@ public class GameSimulatorTest extends SimulationTestCase { Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); - assertNotNull(epoOTB); - assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertNotNull(epoOTB); + AssertJUnit.assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); } @SuppressWarnings("unused") @@ -1959,7 +2014,7 @@ public class GameSimulatorTest extends SimulationTestCase { dimirdg.setSickness(false); SpellAbility saDimirClone = findSAWithPrefix(dimirdg, "{1}{U}{B}"); - assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); + AssertJUnit.assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); Card jushi = addCardToZone("Jushi Apprentice", p, ZoneType.Graveyard); Card bear = addCardToZone("Runeclaw Bear", p, ZoneType.Graveyard); @@ -1969,15 +2024,15 @@ public class GameSimulatorTest extends SimulationTestCase { saDimirClone.getTargets().add(jushi); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(saDimirClone).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Card dimirdgAfterCopy1 = (Card)sim.getGameCopier().find(dimirdg); - assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); - assertEquals(1, dimirdgAfterCopy1.getNetPower()); - assertEquals(2, dimirdgAfterCopy1.getNetToughness()); - assertTrue(dimirdgAfterCopy1.isFlipCard()); - assertFalse(dimirdgAfterCopy1.isFlipped()); - assertFalse(dimirdgAfterCopy1.getType().isLegendary()); + AssertJUnit.assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); + AssertJUnit.assertEquals(1, dimirdgAfterCopy1.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy1.isFlipCard()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.getType().isLegendary()); bear = (Card)sim.getGameCopier().find(bear); @@ -1987,15 +2042,15 @@ public class GameSimulatorTest extends SimulationTestCase { Player copiedPlayer = (Player)sim.getGameCopier().find(p); int handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - assertEquals(9, handSize); + AssertJUnit.assertEquals(9, handSize); SpellAbility draw = findSAWithPrefix(dimirdgAfterCopy1, "{2}{U}"); score = sim.simulateSpellAbility(draw).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); copiedPlayer = (Player)sim.getGameCopier().find(p); handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - assertEquals(10, handSize); + AssertJUnit.assertEquals(10, handSize); simGame = sim.getSimulatedGameState(); @@ -2011,11 +2066,11 @@ public class GameSimulatorTest extends SimulationTestCase { Card dimirdgAfterFlip1 = (Card)sim.getGameCopier().find(dimirdgAfterCopy1); - assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); - assertEquals(2, dimirdgAfterFlip1.getNetPower()); - assertEquals(3, dimirdgAfterFlip1.getNetToughness()); - assertTrue(dimirdgAfterFlip1.isFlipped()); - assertTrue(dimirdgAfterFlip1.getType().isLegendary()); + AssertJUnit.assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterFlip1.getNetPower()); + AssertJUnit.assertEquals(3, dimirdgAfterFlip1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.isFlipped()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.getType().isLegendary()); saDimirClone = findSAWithPrefix(dimirdgAfterCopy1, "{1}{U}{B}"); // Clone Bear first @@ -2023,7 +2078,7 @@ public class GameSimulatorTest extends SimulationTestCase { saDimirClone.getTargets().add(bear); score = sim.simulateSpellAbility(saDimirClone).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); Card dimirdgAfterCopy2 = (Card)sim.getGameCopier().find(dimirdgAfterCopy1); @@ -2035,14 +2090,15 @@ public class GameSimulatorTest extends SimulationTestCase { System.out.println(dimirdgAfterCopy2.isFlipCard()); System.out.println(dimirdgAfterCopy2.isFlipped()); - assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); - assertEquals(2, dimirdgAfterCopy2.getNetPower()); - assertEquals(2, dimirdgAfterCopy2.getNetToughness()); - assertTrue(dimirdgAfterCopy2.isFlipped()); - assertFalse(dimirdgAfterCopy2.getType().isLegendary()); + AssertJUnit.assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy2.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy2.getType().isLegendary()); } - public void testStaticMultiPump() { + @Test + public void testStaticMultiPump() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -2054,14 +2110,15 @@ public class GameSimulatorTest extends SimulationTestCase { // update stats state game.getAction().checkStateEffects(true); - assertEquals(4, c1.getNetPower()); - assertEquals(4, c1.getNetToughness()); + AssertJUnit.assertEquals(4, c1.getNetPower()); + AssertJUnit.assertEquals(4, c1.getNetToughness()); - assertEquals(4, c2.getNetPower()); - assertEquals(4, c2.getNetToughness()); + AssertJUnit.assertEquals(4, c2.getNetPower()); + AssertJUnit.assertEquals(4, c2.getNetToughness()); } - public void testPathtoExileActofTreason() { + @Test + public void testPathtoExileActofTreason() { Game game = initAndCreateGame(); Player p0 = game.getPlayers().get(0); Player p1 = game.getPlayers().get(1); @@ -2081,25 +2138,26 @@ public class GameSimulatorTest extends SimulationTestCase { Game simGame = sim.getSimulatedGameState(); SpellAbility actSA = actOfTreason.getSpellAbilities().get(0); - assertNotNull(actSA); + AssertJUnit.assertNotNull(actSA); actSA.setActivatingPlayer(p0); actSA.setTargetCard(serraAngel); sim.simulateSpellAbility(actSA); simGame.getAction().checkStateEffects(true); SpellAbility pathSA = pathToExile.getSpellAbilities().get(0); - assertNotNull(pathSA); + AssertJUnit.assertNotNull(pathSA); pathSA.setActivatingPlayer(p0); pathSA.setTargetCard(serraAngel); sim.simulateSpellAbility(pathSA); simGame.getAction().checkStateEffects(true); int numForest = countCardsWithName(simGame, "Forest"); - assertEquals(1, numForest); - assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); + AssertJUnit.assertEquals(1, numForest); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); } - public void testAmassTrigger() { + @Test + public void testAmassTrigger() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); String WCname = "Woodland Champion"; @@ -2118,17 +2176,18 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int origScore = sim.getScoreForOrigGame().value; int score = sim.simulateSpellAbility(playSa).value; - assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); Game simGame = sim.getSimulatedGameState(); Card simWC = findCardWithName(simGame, WCname); - assertEquals(1, simWC.getPowerBonusFromCounters()); - assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); + AssertJUnit.assertEquals(1, simWC.getPowerBonusFromCounters()); + AssertJUnit.assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); } - public void testEverAfterWithWaywardServant() { + @Test + public void testEverAfterWithWaywardServant() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(0); String everAfter = "Ever After"; @@ -2153,7 +2212,7 @@ public class GameSimulatorTest extends SimulationTestCase { GameSimulator sim = createSimulator(game, p); int origScore = sim.getScoreForOrigGame().value; int score = sim.simulateSpellAbility(playSa).value; - assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); Game simGame = sim.getSimulatedGameState(); @@ -2162,12 +2221,13 @@ public class GameSimulatorTest extends SimulationTestCase { simGame.getAction().checkStateEffects(true); simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.MAIN2); - assertEquals(21, simGame.getPlayers().get(0).getLife()); - assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); - assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); + AssertJUnit.assertEquals(21, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); + AssertJUnit.assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); } - public void testCantBePrevented() { + @Test + public void testCantBePrevented() { String polukranosCardName = "Polukranos, Unchained"; String hydraCardName = "Phyrexian Hydra"; String leylineCardName = "Leyline of Punishment"; @@ -2194,15 +2254,16 @@ public class GameSimulatorTest extends SimulationTestCase { Card simPolukranos = findCardWithName(simGame, polukranosCardName); Card simHydra = findCardWithName(simGame, hydraCardName); - assertTrue(simPolukranos.hasCounters()); - assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); - assertEquals(2, simPolukranos.getDamage()); + AssertJUnit.assertTrue(simPolukranos.hasCounters()); + AssertJUnit.assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPolukranos.getDamage()); - assertFalse(simHydra.hasCounters()); - assertEquals(2, simHydra.getDamage()); + AssertJUnit.assertFalse(simHydra.hasCounters()); + AssertJUnit.assertEquals(2, simHydra.getDamage()); } - public void testAlphaBrawl() { + @Test + public void testAlphaBrawl() { Game game = initAndCreateGame(); Player p1 = game.getPlayers().get(0); Player p2 = game.getPlayers().get(1); @@ -2243,38 +2304,39 @@ public class GameSimulatorTest extends SimulationTestCase { Card simBear = findCardWithName(simGame, bearName); // bear is destroyed - assertNull(simBear); + AssertJUnit.assertNull(simBear); - assertNotNull(simNishoba); - assertTrue(simNishoba.hasCounters()); + AssertJUnit.assertNotNull(simNishoba); + AssertJUnit.assertTrue(simNishoba.hasCounters()); // Damage prevented and only 1 +1/+1 counter is removed - assertEquals(0, simNishoba.getDamage()); - assertTrue(simNishoba.hasCounters()); - assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); - assertEquals(6, simNishoba.getToughnessBonusFromCounters()); - assertEquals(6, simNishoba.getPowerBonusFromCounters()); + AssertJUnit.assertEquals(0, simNishoba.getDamage()); + AssertJUnit.assertTrue(simNishoba.hasCounters()); + AssertJUnit.assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(6, simNishoba.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(6, simNishoba.getPowerBonusFromCounters()); - assertNotNull(simCapridor); + AssertJUnit.assertNotNull(simCapridor); // Damage prevented and that many +1/+1 counters are put - assertEquals(0, simCapridor.getDamage()); - assertTrue(simCapridor.hasCounters()); - assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); - assertEquals(7, simCapridor.getToughnessBonusFromCounters()); - assertEquals(7, simCapridor.getPowerBonusFromCounters()); + AssertJUnit.assertEquals(0, simCapridor.getDamage()); + AssertJUnit.assertTrue(simCapridor.hasCounters()); + AssertJUnit.assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(7, simCapridor.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(7, simCapridor.getPowerBonusFromCounters()); - assertNotNull(simPridemate); - assertEquals(7, simPridemate.getDamage()); + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertEquals(7, simPridemate.getDamage()); // Life gain only triggered once - assertTrue(simPridemate.hasCounters()); - assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor is prevented) - assertEquals(34, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); } - public void testGlarecaster() { + @Test + public void testGlarecaster() { String glarecasterName = "Glarecaster"; Game game = initAndCreateGame(); @@ -2294,21 +2356,21 @@ public class GameSimulatorTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); - assertNotNull(saGlarecaster); + AssertJUnit.assertNotNull(saGlarecaster); saGlarecaster.getTargets().add(p2); GameSimulator sim = createSimulator(game, p); int score = sim.simulateSpellAbility(saGlarecaster).value; - assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); sim.simulateSpellAbility(infernoSA); Game simGame = sim.getSimulatedGameState(); Card simGlarecaster = findCardWithName(simGame, glarecasterName); - assertNotNull(simGlarecaster); - assertEquals(0, simGlarecaster.getDamage()); + AssertJUnit.assertNotNull(simGlarecaster); + AssertJUnit.assertEquals(0, simGlarecaster.getDamage()); // 6 * 3 = 18 damage are all dealt to p2 - assertEquals(20, simGame.getPlayers().get(0).getLife()); - assertEquals(2, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(20, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(2, simGame.getPlayers().get(1).getLife()); } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java similarity index 98% rename from forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java rename to forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java index dca9519ca91..fa66aaa4600 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java @@ -26,7 +26,7 @@ import java.util.HashSet; import java.util.List; import java.util.Set; -public class SimulationTestCase extends TestCase { +public class SimulationTest { private static boolean initialized = false; protected Game initAndCreateGame() { diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java index 489b6ad476d..2459ef96921 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java @@ -2,6 +2,9 @@ package forge.ai.simulation; import java.util.List; +import org.testng.AssertJUnit; +import org.testng.annotations.Test; + import forge.game.Game; import forge.game.card.Card; import forge.game.card.CounterEnumType; @@ -11,8 +14,9 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -public class SpellAbilityPickerTest extends SimulationTestCase { - public void testPickingLethalDamage() { +public class SpellAbilityPickerTest extends SimulationTest { + @Test + public void testPickingLethalDamage() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); p.setTeam(0); @@ -31,12 +35,13 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertNotNull(sa); - assertNull(sa.getTargetCard()); - assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertNull(sa.getTargetCard()); + AssertJUnit.assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); } - public void testPickingKillingCreature() { + @Test + public void testPickingKillingCreature() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -52,12 +57,13 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertNotNull(sa); - assertEquals(bearCard, sa.getTargetCard()); - assertNull(sa.getTargets().getFirstTargetedPlayer()); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(bearCard, sa.getTargetCard()); + AssertJUnit.assertNull(sa.getTargets().getFirstTargetedPlayer()); } - public void testSequenceStartingWithPlayingLand() { + @Test + public void testSequenceStartingWithPlayingLand() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -74,16 +80,17 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); //assertEquals(game.PLAY_LAND_SURROGATE, sa); - assertEquals(mountain, sa.getHostCard()); + AssertJUnit.assertEquals(mountain, sa.getHostCard()); Plan plan = picker.getPlan(); - assertEquals(2, plan.getDecisions().size()); - assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); - assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); - assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); + AssertJUnit.assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); } - public void testModeSelection() { + @Test + public void testModeSelection() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -101,11 +108,12 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // Expected: All creatures get -2/-2 to kill the bear. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(spell.getSpellAbilities().get(0), sa); - assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", picker.getPlan().getDecisions().get(0).modesStr); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", picker.getPlan().getDecisions().get(0).modesStr); } - public void testModeSelection2() { + @Test + public void testModeSelection2() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -120,11 +128,12 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // Expected: Gain 5 life, since other modes aren't helpful. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(spell.getSpellAbilities().get(0), sa); - assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); } - public void testMultipleModes() { + @Test + public void testMultipleModes() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -144,15 +153,16 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // Expected: 2x 1 damage to each creature, 1x 2 damage to each opponent. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); String dmgCreaturesStr = "Fiery Confluence deals 1 damage to each creature."; String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; String expected = "Fiery Confluence -> " + dmgCreaturesStr + " " + dmgCreaturesStr + " " + dmgOppStr; - assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); } - public void testMultipleModes2() { + @Test + public void testMultipleModes2() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -172,14 +182,15 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // Expected: 3x 2 damage to each opponent. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; String expected = "Fiery Confluence -> " + dmgOppStr + " " + dmgOppStr + " " + dmgOppStr; - assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); } - public void testMultipleTargets() { + @Test + public void testMultipleTargets() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -197,15 +208,16 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(spell.getSpellAbilities().get(0), sa); - assertEquals(bear, sa.getTargetCard()); - assertEquals("2", sa.getParam("NumDmg")); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(bear, sa.getTargetCard()); + AssertJUnit.assertEquals("2", sa.getParam("NumDmg")); SpellAbility subSa = sa.getSubAbility(); - assertEquals(men, subSa.getTargetCard()); - assertEquals("1", subSa.getParam("NumDmg")); + AssertJUnit.assertEquals(men, subSa.getTargetCard()); + AssertJUnit.assertEquals("1", subSa.getParam("NumDmg")); } - public void testLandSearchForCombo() { + @Test + public void testLandSearchForCombo() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -224,23 +236,24 @@ public class SpellAbilityPickerTest extends SimulationTestCase { game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); game.getAction().checkStateEffects(true); - assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); + AssertJUnit.assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(cropRotation.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(cropRotation.getSpellAbilities().get(0), sa); // Expected: Sac a Forest to get an Urborg. List choices = picker.getPlan().getDecisions().get(0).choices; - assertEquals(2, choices.size()); - assertEquals("Forest", choices.get(0)); - assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); + AssertJUnit.assertEquals(2, choices.size()); + AssertJUnit.assertEquals("Forest", choices.get(0)); + AssertJUnit.assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); // Next, expected to use Thespian's Stage to copy Dark Depths. Plan.Decision d2 = picker.getPlan().getDecisions().get(1); String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; - assertEquals(expected, d2.saRef.toString()); - assertTrue(d2.targets.toString().contains("Dark Depths")); + AssertJUnit.assertEquals(expected, d2.saRef.toString()); + AssertJUnit.assertTrue(d2.targets.toString().contains("Dark Depths")); } - public void testPlayRememberedCardsLand() { + @Test + public void testPlayRememberedCardsLand() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -262,14 +275,15 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // 3. Play Bolt targeting opponent. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(abbot.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); Plan plan = picker.getPlan(); - assertEquals(3, plan.getDecisions().size()); - assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); - assertEquals("Lightning Bolt deals 3 damage to any target.", plan.getDecisions().get(2).saRef.toString()); + AssertJUnit.assertEquals(3, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertEquals("Lightning Bolt deals 3 damage to any target.", plan.getDecisions().get(2).saRef.toString()); } - public void testPlayRememberedCardsSpell() { + @Test + public void testPlayRememberedCardsSpell() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); @@ -290,14 +304,15 @@ public class SpellAbilityPickerTest extends SimulationTestCase { // 3. Play Bolt exiled by Abbot. SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertEquals(abbot.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); Plan plan = picker.getPlan(); - assertEquals(2, plan.getDecisions().size()); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); String saDesc = plan.getDecisions().get(1).saRef.toString(); - assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); + AssertJUnit.assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); } - public void testPlayingPumpSpellsAfterBlocks() { + @Test + public void testPlayingPumpSpellsAfterBlocks() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); Player opponent = game.getPlayers().get(0); @@ -315,11 +330,11 @@ public class SpellAbilityPickerTest extends SimulationTestCase { game.getAction().checkStateEffects(true); SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - assertNull(picker.chooseSpellAbilityToPlay(null)); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); game.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_BEGIN); game.getAction().checkStateEffects(true); - assertNull(picker.chooseSpellAbilityToPlay(null)); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, p); Combat combat = new Combat(p); @@ -327,7 +342,7 @@ public class SpellAbilityPickerTest extends SimulationTestCase { combat.addAttacker(attacker2, opponent); game.getPhaseHandler().setCombat(combat); game.getAction().checkStateEffects(true); - assertNull(picker.chooseSpellAbilityToPlay(null)); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_BLOCKERS, p, false); game.getAction().checkStateEffects(true); @@ -337,12 +352,13 @@ public class SpellAbilityPickerTest extends SimulationTestCase { combat.orderBlockersForDamageAssignment(); combat.orderAttackersForDamageAssignment(); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertNotNull(sa); - assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); - assertEquals(attacker2, sa.getTargetCard()); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); + AssertJUnit.assertEquals(attacker2, sa.getTargetCard()); } - public void testPlayingSorceryPumpSpellsBeforeBlocks() { + @Test + public void testPlayingSorceryPumpSpellsBeforeBlocks() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); Player opponent = game.getPlayers().get(0); @@ -361,12 +377,13 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertNotNull(sa); - assertEquals(furor.getSpellAbilities().get(0), sa); - assertEquals(attacker1, sa.getTargetCard()); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(furor.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(attacker1, sa.getTargetCard()); } - public void testPlayingRemovalBeforeBlocks() { + @Test + public void testPlayingRemovalBeforeBlocks() { Game game = initAndCreateGame(); Player p = game.getPlayers().get(1); Player opponent = game.getPlayers().get(0); @@ -384,8 +401,8 @@ public class SpellAbilityPickerTest extends SimulationTestCase { SpellAbilityPicker picker = new SpellAbilityPicker(game, p); SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - assertNotNull(sa); - assertEquals("Destroy target nonblack creature.", sa.toString()); - assertEquals(blocker, sa.getTargetCard()); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Destroy target nonblack creature.", sa.toString()); + AssertJUnit.assertEquals(blocker, sa.getTargetCard()); } } From efa45f8889379111710c8a9da194eb039f123e87 Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Sun, 17 Apr 2022 03:17:06 -0300 Subject: [PATCH 4/7] forge-gui-desktop: tests: refactor (rename) Affected namespace: forge.ai.simulation --- ...imulatorTest.java => GameSimulationTest.java} | 2 +- .../java/forge/ai/simulation/SimulationTest.java | 16 ++++++++++------ ...ava => SpellAbilityPickerSimulationTest.java} | 2 +- 3 files changed, 12 insertions(+), 8 deletions(-) rename forge-gui-desktop/src/test/java/forge/ai/simulation/{GameSimulatorTest.java => GameSimulationTest.java} (99%) rename forge-gui-desktop/src/test/java/forge/ai/simulation/{SpellAbilityPickerTest.java => SpellAbilityPickerSimulationTest.java} (99%) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java similarity index 99% rename from forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java rename to forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java index d2047150c4d..0e907be9c9c 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulatorTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java @@ -21,7 +21,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -public class GameSimulatorTest extends SimulationTest { +public class GameSimulationTest extends SimulationTest { @Test public void testActivateAbilityTriggers() { diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java index fa66aaa4600..c5031bbb480 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java @@ -1,14 +1,23 @@ package forge.ai.simulation; +import java.util.HashSet; +import java.util.List; +import java.util.Set; + import com.google.common.base.Function; import com.google.common.collect.Lists; + import forge.GuiDesktop; import forge.StaticData; import forge.ai.AIOption; import forge.ai.LobbyPlayerAi; import forge.ai.simulation.GameStateEvaluator.Score; import forge.deck.Deck; -import forge.game.*; +import forge.game.Game; +import forge.game.GameRules; +import forge.game.GameStage; +import forge.game.GameType; +import forge.game.Match; import forge.game.card.Card; import forge.game.card.CardCollectionView; import forge.game.player.Player; @@ -20,11 +29,6 @@ import forge.item.IPaperCard; import forge.localinstance.properties.ForgePreferences; import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; -import junit.framework.TestCase; - -import java.util.HashSet; -import java.util.List; -import java.util.Set; public class SimulationTest { private static boolean initialized = false; diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java similarity index 99% rename from forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java rename to forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java index 2459ef96921..07a9bea458a 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java @@ -14,7 +14,7 @@ import forge.game.player.Player; import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; -public class SpellAbilityPickerTest extends SimulationTest { +public class SpellAbilityPickerSimulationTest extends SimulationTest { @Test public void testPickingLethalDamage() { Game game = initAndCreateGame(); From 1a57bee27f4308e7bea85627d162f401686380cb Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Sun, 17 Apr 2022 03:18:38 -0300 Subject: [PATCH 5/7] forge-gui-desktop: tests: refactor (format) Affected namespace: forge.ai.simulation --- .../ai/simulation/GameSimulationTest.java | 3579 +++++++++-------- .../forge/ai/simulation/SimulationTest.java | 192 +- .../SpellAbilityPickerSimulationTest.java | 620 +-- 3 files changed, 2207 insertions(+), 2184 deletions(-) diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java index 0e907be9c9c..987c7ee7a10 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java @@ -23,2354 +23,2375 @@ import forge.game.zone.ZoneType; public class GameSimulationTest extends SimulationTest { - @Test + @Test public void testActivateAbilityTriggers() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - addCard("Plains", p); - String heraldCardName = "Herald of Anafenza"; - Card herald = addCard(heraldCardName, p); - herald.setSickness(false); + addCard("Plains", p); + addCard("Plains", p); + addCard("Plains", p); + String heraldCardName = "Herald of Anafenza"; + Card herald = addCard(heraldCardName, p); + herald.setSickness(false); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - AssertJUnit.assertNotNull(outlastSA); + SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); + AssertJUnit.assertNotNull(outlastSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(outlastSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(outlastSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - Card heraldCopy = findCardWithName(simGame, heraldCardName); - AssertJUnit.assertNotNull(heraldCopy); - AssertJUnit.assertTrue(heraldCopy.isTapped()); - AssertJUnit.assertTrue(heraldCopy.hasCounters()); - AssertJUnit.assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, heraldCopy.getPowerBonusFromCounters()); + Card heraldCopy = findCardWithName(simGame, heraldCardName); + AssertJUnit.assertNotNull(heraldCopy); + AssertJUnit.assertTrue(heraldCopy.isTapped()); + AssertJUnit.assertTrue(heraldCopy.hasCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getPowerBonusFromCounters()); - Card warriorToken = findCardWithName(simGame, "Warrior Token"); - AssertJUnit.assertNotNull(warriorToken); - AssertJUnit.assertTrue(warriorToken.isSick()); - AssertJUnit.assertEquals(1, warriorToken.getCurrentPower()); - AssertJUnit.assertEquals(1, warriorToken.getCurrentToughness()); - } + Card warriorToken = findCardWithName(simGame, "Warrior Token"); + AssertJUnit.assertNotNull(warriorToken); + AssertJUnit.assertTrue(warriorToken.isSick()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentPower()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentToughness()); + } - @Test + @Test public void testStaticAbilities() { - String sliverCardName = "Sidewinder Sliver"; - String heraldCardName = "Herald of Anafenza"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sliver = addCard(sliverCardName, p); - sliver.setSickness(false); - Card herald = addCard(heraldCardName, p); - herald.setSickness(false); - addCard("Plains", p); - addCard("Plains", p); - addCard("Plains", p); - addCard("Spear of Heliod", p); + String sliverCardName = "Sidewinder Sliver"; + String heraldCardName = "Herald of Anafenza"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sliver = addCard(sliverCardName, p); + sliver.setSickness(false); + Card herald = addCard(heraldCardName, p); + herald.setSickness(false); + addCard("Plains", p); + addCard("Plains", p); + addCard("Plains", p); + addCard("Spear of Heliod", p); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(1, sliver.getAmountOfKeyword("Flanking")); - AssertJUnit.assertEquals(2, sliver.getNetPower()); - AssertJUnit.assertEquals(2, sliver.getNetToughness()); + AssertJUnit.assertEquals(1, sliver.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); - SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - AssertJUnit.assertNotNull(outlastSA); + SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); + AssertJUnit.assertNotNull(outlastSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(outlastSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - Card sliverCopy = findCardWithName(simGame, sliverCardName); - AssertJUnit.assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); - AssertJUnit.assertEquals(2, sliver.getNetPower()); - AssertJUnit.assertEquals(2, sliver.getNetToughness()); - } + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(outlastSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + Card sliverCopy = findCardWithName(simGame, sliverCardName); + AssertJUnit.assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); + } - @Test + @Test public void testStaticEffectsMonstrous() { - String lionCardName = "Fleecemane Lion"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card lion = addCard(lionCardName, p); - lion.setSickness(false); - lion.setMonstrous(true); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(lion.isMonstrous()); - AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Hexproof")); - AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Indestructible")); + String lionCardName = "Fleecemane Lion"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card lion = addCard(lionCardName, p); + lion.setSickness(false); + lion.setMonstrous(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(lion.isMonstrous()); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Indestructible")); - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card lionCopy = findCardWithName(simGame, lionCardName); - AssertJUnit.assertTrue(lionCopy.isMonstrous()); - AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); - AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); - } + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card lionCopy = findCardWithName(simGame, lionCardName); + AssertJUnit.assertTrue(lionCopy.isMonstrous()); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); + } - @Test + @Test public void testEquippedAbilities() { - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card cloak = addCard("Whispersilk Cloak", p); - cloak.attachToEntity(bear); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Unblockable")); + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card cloak = addCard("Whispersilk Cloak", p); + cloak.attachToEntity(bear); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Unblockable")); - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card bearCopy = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); - } + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card bearCopy = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); + } - @Test + @Test public void testEnchantedAbilities() { - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card lifelink = addCard("Lifelink", p); - lifelink.attachToEntity(bear); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Lifelink")); + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card lifelink = addCard("Lifelink", p); + lifelink.attachToEntity(bear); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Lifelink")); - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card bearCopy = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); - } + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card bearCopy = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); + } - @Test + @Test public void testEtbTriggers() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Black Knight", p); - for (int i = 0; i < 5; i++) - addCard("Swamp", p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Black Knight", p); + for (int i = 0; i < 5; i++) + addCard("Swamp", p); - String merchantCardName = "Gray Merchant of Asphodel"; - Card c = addCardToZone(merchantCardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + String merchantCardName = "Gray Merchant of Asphodel"; + Card c = addCardToZone(merchantCardName, p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility playMerchantSa = c.getSpellAbilities().get(0); - playMerchantSa.setActivatingPlayer(p); + SpellAbility playMerchantSa = c.getSpellAbilities().get(0); + playMerchantSa.setActivatingPlayer(p); - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playMerchantSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(24, simGame.getPlayers().get(1).getLife()); - AssertJUnit.assertEquals(16, simGame.getPlayers().get(0).getLife()); - } + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playMerchantSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + Game simGame = sim.getSimulatedGameState(); + AssertJUnit.assertEquals(24, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(16, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testSimulateUnmorph() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card ripper = createCard("Ruthless Ripper", p); - ripper.turnFaceDownNoUpdate(); - p.getZone(ZoneType.Battlefield).add(ripper); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card ripper = createCard("Ruthless Ripper", p); + ripper.turnFaceDownNoUpdate(); + p.getZone(ZoneType.Battlefield).add(ripper); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(20, game.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(20, game.getPlayers().get(0).getLife()); - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); - SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); - AssertJUnit.assertNotNull(unmorphSA); - sim.simulateSpellAbility(unmorphSA); - AssertJUnit.assertEquals(18, simGame.getPlayers().get(0).getLife()); - } + SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); + AssertJUnit.assertNotNull(unmorphSA); + sim.simulateSpellAbility(unmorphSA); + AssertJUnit.assertEquals(18, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testFindingOwnCard() { - Game game = initAndCreateGame(); - Player p0 = game.getPlayers().get(0); - Player p1 = game.getPlayers().get(1); - addCardToZone("Skull Fracture", p0, ZoneType.Hand); - addCardToZone("Runeclaw Bear", p0, ZoneType.Hand); - Card fractureP1 = addCardToZone("Skull Fracture", p1, ZoneType.Hand); - addCard("Swamp", p1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); + Game game = initAndCreateGame(); + Player p0 = game.getPlayers().get(0); + Player p1 = game.getPlayers().get(1); + addCardToZone("Skull Fracture", p0, ZoneType.Hand); + addCardToZone("Runeclaw Bear", p0, ZoneType.Hand); + Card fractureP1 = addCardToZone("Skull Fracture", p1, ZoneType.Hand); + addCard("Swamp", p1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p1); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p1); + Game simGame = sim.getSimulatedGameState(); - SpellAbility fractureSa = fractureP1.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(fractureSa); - fractureSa.getTargets().add(p0); - sim.simulateSpellAbility(fractureSa); - AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); - AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); - } + SpellAbility fractureSa = fractureP1.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(fractureSa); + fractureSa.getTargets().add(p0); + sim.simulateSpellAbility(fractureSa); + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); + } - @Test + @Test public void testPlaneswalkerAbilities() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sorin = addCard("Sorin, Solemn Visitor", p); - sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sorin = addCard("Sorin, Solemn Visitor", p); + sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); - List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); - SpellAbility minusTwo = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - AssertJUnit.assertNotNull(minusTwo); - minusTwo.setActivatingPlayer(p); - AssertJUnit.assertTrue(minusTwo.canPlay()); + CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); + List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); + SpellAbility minusTwo = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + AssertJUnit.assertNotNull(minusTwo); + minusTwo.setActivatingPlayer(p); + AssertJUnit.assertTrue(minusTwo.canPlay()); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(minusTwo); - Game simGame = sim.getSimulatedGameState(); - Card vampireToken = findCardWithName(simGame, "Vampire Token"); - AssertJUnit.assertNotNull(vampireToken); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(minusTwo); + Game simGame = sim.getSimulatedGameState(); + Card vampireToken = findCardWithName(simGame, "Vampire Token"); + AssertJUnit.assertNotNull(vampireToken); - Player simP = simGame.getPlayers().get(1); - cards = ComputerUtilAbility.getAvailableCards(simGame, simP); - abilities = ComputerUtilAbility.getSpellAbilities(cards, simP); - SpellAbility minusTwoSim = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - AssertJUnit.assertNotNull(minusTwoSim); - minusTwoSim.setActivatingPlayer(simP); - AssertJUnit.assertFalse(minusTwoSim.canPlay()); - AssertJUnit.assertEquals(1, minusTwoSim.getActivationsThisTurn()); + Player simP = simGame.getPlayers().get(1); + cards = ComputerUtilAbility.getAvailableCards(simGame, simP); + abilities = ComputerUtilAbility.getSpellAbilities(cards, simP); + SpellAbility minusTwoSim = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + AssertJUnit.assertNotNull(minusTwoSim); + minusTwoSim.setActivatingPlayer(simP); + AssertJUnit.assertFalse(minusTwoSim.canPlay()); + AssertJUnit.assertEquals(1, minusTwoSim.getActivationsThisTurn()); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Player copyP = copy.getPlayers().get(1); - cards = ComputerUtilAbility.getAvailableCards(copy, copyP); - abilities = ComputerUtilAbility.getSpellAbilities(cards, copyP); - SpellAbility minusTwoCopy = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - minusTwoCopy.setActivatingPlayer(copyP); - AssertJUnit.assertFalse(minusTwoCopy.canPlay()); - AssertJUnit.assertEquals(1, minusTwoCopy.getActivationsThisTurn()); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Player copyP = copy.getPlayers().get(1); + cards = ComputerUtilAbility.getAvailableCards(copy, copyP); + abilities = ComputerUtilAbility.getSpellAbilities(cards, copyP); + SpellAbility minusTwoCopy = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + minusTwoCopy.setActivatingPlayer(copyP); + AssertJUnit.assertFalse(minusTwoCopy.canPlay()); + AssertJUnit.assertEquals(1, minusTwoCopy.getActivationsThisTurn()); + } - @Test + @Test public void testPlaneswalkerEmblems() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - String bearCardName = "Runeclaw Bear"; - addCard(bearCardName, p); - Card gideon = addCard("Gideon, Ally of Zendikar", p); - gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + String bearCardName = "Runeclaw Bear"; + addCard(bearCardName, p); + Card gideon = addCard("Gideon, Ally of Zendikar", p); + gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); - List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); - SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); - AssertJUnit.assertNotNull(minusFour); - minusFour.setActivatingPlayer(p); - AssertJUnit.assertTrue(minusFour.canPlay()); + CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); + List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); + SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); + AssertJUnit.assertNotNull(minusFour); + minusFour.setActivatingPlayer(p); + AssertJUnit.assertTrue(minusFour.canPlay()); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(minusFour); - Game simGame = sim.getSimulatedGameState(); - Card simBear = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(3, simBear.getNetPower()); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(minusFour); + Game simGame = sim.getSimulatedGameState(); + Card simBear = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(3, simBear.getNetPower()); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card copyBear = findCardWithName(copy, bearCardName); - AssertJUnit.assertEquals(3, copyBear.getNetPower()); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card copyBear = findCardWithName(copy, bearCardName); + AssertJUnit.assertEquals(3, copyBear.getNetPower()); + } - @Test + @Test public void testManifest() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Ornithopter", p, ZoneType.Library); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Ornithopter", p, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); - SpellAbility unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(p, false), "Unmanifest"); - AssertJUnit.assertNotNull(unmanifestSA); - AssertJUnit.assertEquals(2, manifestedCreature.getNetPower()); - AssertJUnit.assertFalse(manifestedCreature.hasKeyword("Flying")); + SpellAbility unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(p, false), + "Unmanifest"); + AssertJUnit.assertNotNull(unmanifestSA); + AssertJUnit.assertEquals(2, manifestedCreature.getNetPower()); + AssertJUnit.assertFalse(manifestedCreature.hasKeyword("Flying")); - GameSimulator sim2 = createSimulator(simGame, simGame.getPlayers().get(1)); - Game simGame2 = sim2.getSimulatedGameState(); - manifestedCreature = findCardWithName(simGame2, ""); - unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(simGame2.getPlayers().get(1), false), "Unmanifest"); + GameSimulator sim2 = createSimulator(simGame, simGame.getPlayers().get(1)); + Game simGame2 = sim2.getSimulatedGameState(); + manifestedCreature = findCardWithName(simGame2, ""); + unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(simGame2.getPlayers().get(1), false), + "Unmanifest"); - sim2.simulateSpellAbility(unmanifestSA); + sim2.simulateSpellAbility(unmanifestSA); - Card ornithopter = findCardWithName(simGame2, "Ornithopter"); - AssertJUnit.assertEquals(0, ornithopter.getNetPower()); - AssertJUnit.assertTrue(ornithopter.hasKeyword("Flying")); - AssertJUnit.assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); + Card ornithopter = findCardWithName(simGame2, "Ornithopter"); + AssertJUnit.assertEquals(0, ornithopter.getNetPower()); + AssertJUnit.assertTrue(ornithopter.hasKeyword("Flying")); + AssertJUnit.assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); - GameCopier copier = new GameCopier(simGame2); - Game copy = copier.makeCopy(); - Card ornithopterCopy = findCardWithName(copy, "Ornithopter"); - AssertJUnit.assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); - } + GameCopier copier = new GameCopier(simGame2); + Game copy = copier.makeCopy(); + Card ornithopterCopy = findCardWithName(copy, "Ornithopter"); + AssertJUnit.assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); + } - @Test + @Test public void testManifest2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Plains", p, ZoneType.Library); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Plains", p, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card manifestedCreatureCopy = findCardWithName(copy, ""); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card manifestedCreatureCopy = findCardWithName(copy, ""); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + } - @Test + @Test public void testManifest3() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Dryad Arbor", p, ZoneType.Library); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Dryad Arbor", p, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card manifestedCreatureCopy = findCardWithName(copy, ""); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card manifestedCreatureCopy = findCardWithName(copy, ""); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + } - @Test + @Test public void testTypeOfPermanentChanging() { - String sarkhanCardName = "Sarkhan, the Dragonspeaker"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sarkhan = addCard(sarkhanCardName, p); - sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + String sarkhanCardName = "Sarkhan, the Dragonspeaker"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sarkhan = addCard(sarkhanCardName, p); + sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertFalse(sarkhan.isCreature()); - AssertJUnit.assertTrue(sarkhan.isPlaneswalker()); + AssertJUnit.assertFalse(sarkhan.isCreature()); + AssertJUnit.assertTrue(sarkhan.isPlaneswalker()); - SpellAbility becomeDragonSA = findSAWithPrefix(sarkhan, "+1"); - AssertJUnit.assertNotNull(becomeDragonSA); + SpellAbility becomeDragonSA = findSAWithPrefix(sarkhan, "+1"); + AssertJUnit.assertNotNull(becomeDragonSA); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(becomeDragonSA); - Game simGame = sim.getSimulatedGameState(); - Card sarkhanSim = findCardWithName(simGame, sarkhanCardName); - AssertJUnit.assertTrue(sarkhanSim.isCreature()); - AssertJUnit.assertFalse(sarkhanSim.isPlaneswalker()); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(becomeDragonSA); + Game simGame = sim.getSimulatedGameState(); + Card sarkhanSim = findCardWithName(simGame, sarkhanCardName); + AssertJUnit.assertTrue(sarkhanSim.isCreature()); + AssertJUnit.assertFalse(sarkhanSim.isPlaneswalker()); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card sarkhanCopy = findCardWithName(copy, sarkhanCardName); - AssertJUnit.assertTrue(sarkhanCopy.isCreature()); - AssertJUnit.assertFalse(sarkhanCopy.isPlaneswalker()); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card sarkhanCopy = findCardWithName(copy, sarkhanCardName); + AssertJUnit.assertTrue(sarkhanCopy.isCreature()); + AssertJUnit.assertFalse(sarkhanCopy.isPlaneswalker()); + } - @Test + @Test public void testDistributeCountersAbility() { - String ajaniCardName = "Ajani, Mentor of Heroes"; - String ornithoperCardName = "Ornithopter"; - String bearCardName = "Runeclaw Bear"; + String ajaniCardName = "Ajani, Mentor of Heroes"; + String ornithoperCardName = "Ornithopter"; + String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard(ornithoperCardName, p); - addCard(bearCardName, p); - Card ajani = addCard(ajaniCardName, p); - ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard(ornithoperCardName, p); + addCard(bearCardName, p); + Card ajani = addCard(ajaniCardName, p); + ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility sa = findSAWithPrefix(ajani, "+1: Distribute"); - AssertJUnit.assertNotNull(sa); - sa.setActivatingPlayer(p); + SpellAbility sa = findSAWithPrefix(ajani, "+1: Distribute"); + AssertJUnit.assertNotNull(sa); + sa.setActivatingPlayer(p); - MultiTargetSelector selector = new MultiTargetSelector(sa, null); - while (selector.selectNextTargets()) { - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); - Card thopterSim = findCardWithName(simGame, ornithoperCardName); - Card bearSim = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(3, thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); - } - } + MultiTargetSelector selector = new MultiTargetSelector(sa, null); + while (selector.selectNextTargets()) { + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); + Card thopterSim = findCardWithName(simGame, ornithoperCardName); + Card bearSim = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(3, + thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); + } + } - @Test + @Test public void testDamagePreventedTrigger() { - String ajaniCardName = "Ajani Steadfast"; - String selflessCardName = "Selfless Squire"; + String ajaniCardName = "Ajani Steadfast"; + String selflessCardName = "Selfless Squire"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - addCard(selflessCardName, p); - addCard("Mountain", p); - Card boltCard = addCardToZone("Lightning Bolt", p, ZoneType.Hand); - SpellAbility boltSA = boltCard.getFirstSpellAbility(); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + addCard(selflessCardName, p); + addCard("Mountain", p); + Card boltCard = addCardToZone("Lightning Bolt", p, ZoneType.Hand); + SpellAbility boltSA = boltCard.getFirstSpellAbility(); - Card ajani = addCard(ajaniCardName, p); - ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + Card ajani = addCard(ajaniCardName, p); + ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility sa = findSAWithPrefix(ajani, "-7:"); - AssertJUnit.assertNotNull(sa); - sa.setActivatingPlayer(p); + SpellAbility sa = findSAWithPrefix(ajani, "-7:"); + AssertJUnit.assertNotNull(sa); + sa.setActivatingPlayer(p); - GameSimulator sim = createSimulator(game, p); - boltSA.getTargets().add(p); - sim.simulateSpellAbility(sa); - sim.simulateSpellAbility(boltSA); - Game simGame = sim.getSimulatedGameState(); - Card simSelfless = findCardWithName(simGame, selflessCardName); + GameSimulator sim = createSimulator(game, p); + boltSA.getTargets().add(p); + sim.simulateSpellAbility(sa); + sim.simulateSpellAbility(boltSA); + Game simGame = sim.getSimulatedGameState(); + Card simSelfless = findCardWithName(simGame, selflessCardName); - // only one damage - AssertJUnit.assertEquals(19, simGame.getPlayers().get(0).getLife()); + // only one damage + AssertJUnit.assertEquals(19, simGame.getPlayers().get(0).getLife()); - // only triggered once - AssertJUnit.assertTrue(simSelfless.hasCounters()); - AssertJUnit.assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simSelfless.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(2, simSelfless.getPowerBonusFromCounters()); - } + // only triggered once + AssertJUnit.assertTrue(simSelfless.hasCounters()); + AssertJUnit.assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simSelfless.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simSelfless.getPowerBonusFromCounters()); + } - @Test + @Test public void testChosenColors() { - String bearCardName = "Runeclaw Bear"; + String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - Card hall = addCard("Hall of Triumph", p); - hall.setChosenColors(Lists.newArrayList("green")); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(3, bear.getNetToughness()); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + Card hall = addCard("Hall of Triumph", p); + hall.setChosenColors(Lists.newArrayList("green")); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(3, bear.getNetToughness()); - GameCopier copier = new GameCopier(game); - Game copy = copier.makeCopy(); - Card bearCopy = findCardWithName(copy, bearCardName); - AssertJUnit.assertEquals(3, bearCopy.getNetToughness()); - } + GameCopier copier = new GameCopier(game); + Game copy = copier.makeCopy(); + Card bearCopy = findCardWithName(copy, bearCardName); + AssertJUnit.assertEquals(3, bearCopy.getNetToughness()); + } - @Test + @Test public void testDarkDepthsCopy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - Card depths = addCard("Dark Depths", p); - depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null); - Card thespian = addCard("Thespian's Stage", p); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(depths.hasCounters()); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + Card depths = addCard("Dark Depths", p); + depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null); + Card thespian = addCard("Thespian's Stage", p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(depths.hasCounters()); - SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - AssertJUnit.assertNotNull(sa); - sa.getTargets().add(depths); + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); + AssertJUnit.assertNotNull(sa); + sa.getTargets().add(depths); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); - String strSimGame = gameStateToString(simGame); - AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); - AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); - AssertJUnit.assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); - } + String strSimGame = gameStateToString(simGame); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); + AssertJUnit.assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); + } - @Test + @Test public void testThespianStageSelfCopy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - Card thespian = addCard("Thespian's Stage", p); - AssertJUnit.assertTrue(thespian.isLand()); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + Card thespian = addCard("Thespian's Stage", p); + AssertJUnit.assertTrue(thespian.isLand()); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - AssertJUnit.assertNotNull(sa); - sa.getTargets().add(thespian); + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); + AssertJUnit.assertNotNull(sa); + sa.getTargets().add(thespian); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); - Card thespianSim = findCardWithName(simGame, "Thespian's Stage"); - AssertJUnit.assertNotNull(gameStateToString(simGame), thespianSim); - AssertJUnit.assertTrue(thespianSim.isLand()); - } + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); + Card thespianSim = findCardWithName(simGame, "Thespian's Stage"); + AssertJUnit.assertNotNull(gameStateToString(simGame), thespianSim); + AssertJUnit.assertTrue(thespianSim.isLand()); + } - @Test + @Test public void testDash() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - String berserkerCardName = "Lightning Berserker"; - Card berserkerCard = addCardToZone(berserkerCardName, p, ZoneType.Hand); + addCard("Mountain", p); + addCard("Mountain", p); + String berserkerCardName = "Lightning Berserker"; + Card berserkerCard = addCardToZone(berserkerCardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - SpellAbility dashSA = findSAWithPrefix(berserkerCard, "Dash"); - AssertJUnit.assertNotNull(dashSA); + SpellAbility dashSA = findSAWithPrefix(berserkerCard, "Dash"); + AssertJUnit.assertNotNull(dashSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(dashSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(dashSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - Card berserker = findCardWithName(simGame, berserkerCardName); - AssertJUnit.assertNotNull(berserker); - AssertJUnit.assertEquals(1, berserker.getNetPower()); - AssertJUnit.assertEquals(1, berserker.getNetToughness()); - AssertJUnit.assertFalse(berserker.isSick()); + Card berserker = findCardWithName(simGame, berserkerCardName); + AssertJUnit.assertNotNull(berserker); + AssertJUnit.assertEquals(1, berserker.getNetPower()); + AssertJUnit.assertEquals(1, berserker.getNetToughness()); + AssertJUnit.assertFalse(berserker.isSick()); - SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); - AssertJUnit.assertNotNull(pumpSA); - GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); - sim2.simulateSpellAbility(pumpSA); - Game simGame2 = sim2.getSimulatedGameState(); + SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); + AssertJUnit.assertNotNull(pumpSA); + GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); + sim2.simulateSpellAbility(pumpSA); + Game simGame2 = sim2.getSimulatedGameState(); - Card berserker2 = findCardWithName(simGame2, berserkerCardName); - AssertJUnit.assertNotNull(berserker2); - AssertJUnit.assertEquals(2, berserker2.getNetPower()); - AssertJUnit.assertEquals(1, berserker2.getNetToughness()); - AssertJUnit.assertFalse(berserker2.isSick()); - } + Card berserker2 = findCardWithName(simGame2, berserkerCardName); + AssertJUnit.assertNotNull(berserker2); + AssertJUnit.assertEquals(2, berserker2.getNetPower()); + AssertJUnit.assertEquals(1, berserker2.getNetToughness()); + AssertJUnit.assertFalse(berserker2.isSick()); + } - @Test + @Test public void testTokenAbilities() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - Card callTheScionsCard = addCardToZone("Call the Scions", p, ZoneType.Hand); + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + Card callTheScionsCard = addCardToZone("Call the Scions", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - SpellAbility callTheScionsSA = callTheScionsCard.getSpellAbilities().get(0); + SpellAbility callTheScionsSA = callTheScionsCard.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(callTheScionsSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(callTheScionsSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - Card scion = findCardWithName(simGame, "Eldrazi Scion Token"); - AssertJUnit.assertNotNull(scion); - AssertJUnit.assertEquals(1, scion.getNetPower()); - AssertJUnit.assertEquals(1, scion.getNetToughness()); - AssertJUnit.assertTrue(scion.isSick()); - AssertJUnit.assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); + Card scion = findCardWithName(simGame, "Eldrazi Scion Token"); + AssertJUnit.assertNotNull(scion); + AssertJUnit.assertEquals(1, scion.getNetPower()); + AssertJUnit.assertEquals(1, scion.getNetToughness()); + AssertJUnit.assertTrue(scion.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card scionCopy = findCardWithName(copy, "Eldrazi Scion Token"); - AssertJUnit.assertNotNull(scionCopy); - AssertJUnit.assertEquals(1, scionCopy.getNetPower()); - AssertJUnit.assertEquals(1, scionCopy.getNetToughness()); - AssertJUnit.assertTrue(scionCopy.isSick()); - AssertJUnit.assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card scionCopy = findCardWithName(copy, "Eldrazi Scion Token"); + AssertJUnit.assertNotNull(scionCopy); + AssertJUnit.assertEquals(1, scionCopy.getNetPower()); + AssertJUnit.assertEquals(1, scionCopy.getNetToughness()); + AssertJUnit.assertTrue(scionCopy.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); + } - @Test + @Test public void testMarkedDamage() { - // Marked damage is important, as it's used during the AI declare - // attackers logic - // which affects game state score - since P/T boosts are evaluated - // differently for - // creatures participating in combat. + // Marked damage is important, as it's used during the AI declare + // attackers logic + // which affects game state score - since P/T boosts are evaluated + // differently for + // creatures participating in combat. - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - String giantCardName = "Hill Giant"; - Card giant = addCard(giantCardName, p); - addCard("Mountain", p); - Card shockCard = addCardToZone("Shock", p, ZoneType.Hand); - SpellAbility shockSA = shockCard.getFirstSpellAbility(); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + String giantCardName = "Hill Giant"; + Card giant = addCard(giantCardName, p); + addCard("Mountain", p); + Card shockCard = addCardToZone("Shock", p, ZoneType.Hand); + SpellAbility shockSA = shockCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(3, giant.getNetPower()); - AssertJUnit.assertEquals(3, giant.getNetToughness()); - AssertJUnit.assertEquals(0, giant.getDamage()); + AssertJUnit.assertEquals(3, giant.getNetPower()); + AssertJUnit.assertEquals(3, giant.getNetToughness()); + AssertJUnit.assertEquals(0, giant.getDamage()); - GameSimulator sim = createSimulator(game, p); - shockSA.setTargetCard(giant); - sim.simulateSpellAbility(shockSA); - Game simGame = sim.getSimulatedGameState(); - Card simGiant = findCardWithName(simGame, giantCardName); - AssertJUnit.assertEquals(2, simGiant.getDamage()); + GameSimulator sim = createSimulator(game, p); + shockSA.setTargetCard(giant); + sim.simulateSpellAbility(shockSA); + Game simGame = sim.getSimulatedGameState(); + Card simGiant = findCardWithName(simGame, giantCardName); + AssertJUnit.assertEquals(2, simGiant.getDamage()); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card giantCopy = findCardWithName(copy, giantCardName); - AssertJUnit.assertEquals(2, giantCopy.getDamage()); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card giantCopy = findCardWithName(copy, giantCardName); + AssertJUnit.assertEquals(2, giantCopy.getDamage()); + } - @Test + @Test public void testLifelinkDamageSpell() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } - Card kalitas = addCard(kalitasName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); + Card kalitas = addCard(kalitasName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachToEntity(pridemate); + indestructibility.attachToEntity(pridemate); - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - addCard(broodName, p2); + addCard(broodName, p2); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBrood = findCardWithName(simGame, broodName); + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBrood = findCardWithName(simGame, broodName); - // because it was destroyed - AssertJUnit.assertNull(simBrood); - AssertJUnit.assertNotNull(simPridemate); + // because it was destroyed + AssertJUnit.assertNull(simBrood); + AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - AssertJUnit.assertEquals(3, simPridemate.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - // 3 times 3 damage with life gain = 9 + 20 = 29 - AssertJUnit.assertEquals(29, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); - } + // 3 times 3 damage with life gain = 9 + 20 = 29 + AssertJUnit.assertEquals(29, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); + } - @Test + @Test public void testLifelinkDamageSpellMultiplier() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String giselaName = "Gisela, Blade of Goldnight"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String giselaName = "Gisela, Blade of Goldnight"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } - Card kalitas = addCard(kalitasName, p1); - addCard(pridemateName, p1); - addCard(giselaName, p1); + Card kalitas = addCard(kalitasName, p1); + addCard(pridemateName, p1); + addCard(giselaName, p1); - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - addCard(broodName, p2); + addCard(broodName, p2); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simGisela = findCardWithName(simGame, giselaName); - Card simBrood = findCardWithName(simGame, broodName); + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simGisela = findCardWithName(simGame, giselaName); + Card simBrood = findCardWithName(simGame, broodName); - // because it was destroyed - AssertJUnit.assertNull(simBrood); + // because it was destroyed + AssertJUnit.assertNull(simBrood); - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - // 2 of the 3 are prevented - AssertJUnit.assertEquals(1, simPridemate.getDamage()); - AssertJUnit.assertEquals(1, simGisela.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + // 2 of the 3 are prevented + AssertJUnit.assertEquals(1, simPridemate.getDamage()); + AssertJUnit.assertEquals(1, simGisela.getDamage()); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - // 2 times 3 / 2 rounded down = 2 * 1 = 2 - // 2 times 3 * 2 = 12 - AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(14, simGame.getPlayers().get(1).getLife()); - } + // 2 times 3 / 2 rounded down = 2 * 1 = 2 + // 2 times 3 * 2 = 12 + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(14, simGame.getPlayers().get(1).getLife()); + } - @Test + @Test public void testLifelinkDamageSpellRedirected() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; - String palisadeName = "Palisade Giant"; + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; + String palisadeName = "Palisade Giant"; - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } - Card kalitas = addCard(kalitasName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); + Card kalitas = addCard(kalitasName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachToEntity(pridemate); + indestructibility.attachToEntity(pridemate); - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - addCard(broodName, p2); - addCard(palisadeName, p2); + addCard(broodName, p2); + addCard(palisadeName, p2); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBrood = findCardWithName(simGame, broodName); - Card simPalisade = findCardWithName(simGame, palisadeName); + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBrood = findCardWithName(simGame, broodName); + Card simPalisade = findCardWithName(simGame, palisadeName); - // not destroyed because damage redirected - AssertJUnit.assertNotNull(simBrood); - AssertJUnit.assertEquals(0, simBrood.getDamage()); + // not destroyed because damage redirected + AssertJUnit.assertNotNull(simBrood); + AssertJUnit.assertEquals(0, simBrood.getDamage()); - // destroyed because of to much redirected damage - AssertJUnit.assertNull(simPalisade); - AssertJUnit.assertNotNull(simPridemate); + // destroyed because of to much redirected damage + AssertJUnit.assertNull(simPalisade); + AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - AssertJUnit.assertEquals(3, simPridemate.getDamage()); + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - // 4 times 3 damage with life gain = 12 + 20 = 32 - AssertJUnit.assertEquals(32, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(20, simGame.getPlayers().get(1).getLife()); - } + // 4 times 3 damage with life gain = 12 + 20 = 32 + AssertJUnit.assertEquals(32, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(20, simGame.getPlayers().get(1).getLife()); + } - @Test + @Test public void testLifelinkDamageSpellMultipleDamage() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; - String coneName = "Cone of Flame"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; + String coneName = "Cone of Flame"; - String bearCardName = "Runeclaw Bear"; - String giantCardName = "Hill Giant"; + String bearCardName = "Runeclaw Bear"; + String giantCardName = "Hill Giant"; - String tormentName = "Everlasting Torment"; - String meliraName = "Melira, Sylvok Outcast"; + String tormentName = "Everlasting Torment"; + String meliraName = "Melira, Sylvok Outcast"; - // enough to cast Cone of Flame - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } + // enough to cast Cone of Flame + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } - addCard(soulfireName, p1); - addCard(pridemateName, p1); + addCard(soulfireName, p1); + addCard(pridemateName, p1); - Card bearCard = addCard(bearCardName, p2); - Card giantCard = addCard(giantCardName, p2); + Card bearCard = addCard(bearCardName, p2); + Card giantCard = addCard(giantCardName, p2); - Card cone = addCardToZone(coneName, p1, ZoneType.Hand); - SpellAbility coneSA = cone.getFirstSpellAbility(); + Card cone = addCardToZone(coneName, p1, ZoneType.Hand); + SpellAbility coneSA = cone.getFirstSpellAbility(); - coneSA.setTargetCard(bearCard); // one damage to bear - coneSA.getSubAbility().setTargetCard(giantCard); // two damage to giant - coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three - // damage - // to - // player + coneSA.setTargetCard(bearCard); // one damage to bear + coneSA.getSubAbility().setTargetCard(giantCard); // two damage to giant + coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three + // damage + // to + // player - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p1); + GameSimulator sim = createSimulator(game, p1); - sim.simulateSpellAbility(coneSA); - Game simGame = sim.getSimulatedGameState(); - Card simBear = findCardWithName(simGame, bearCardName); - Card simGiant = findCardWithName(simGame, giantCardName); - Card simPridemate = findCardWithName(simGame, pridemateName); + sim.simulateSpellAbility(coneSA); + Game simGame = sim.getSimulatedGameState(); + Card simBear = findCardWithName(simGame, bearCardName); + Card simGiant = findCardWithName(simGame, giantCardName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // spell deals multiple damages to multiple targets, only one cause of - // lifegain - AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // spell deals multiple damages to multiple targets, only one cause of + // lifegain + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simBear); - AssertJUnit.assertEquals(1, simBear.getDamage()); + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); - AssertJUnit.assertNotNull(simGiant); - AssertJUnit.assertEquals(2, simGiant.getDamage()); + AssertJUnit.assertNotNull(simGiant); + AssertJUnit.assertEquals(2, simGiant.getDamage()); - // 1 + 2 + 3 lifegain - AssertJUnit.assertEquals(26, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); + // 1 + 2 + 3 lifegain + AssertJUnit.assertEquals(26, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); - // second pard with Everlasting Torment - addCard(tormentName, p2); + // second pard with Everlasting Torment + addCard(tormentName, p2); - GameSimulator sim2 = createSimulator(game, p1); + GameSimulator sim2 = createSimulator(game, p1); - sim2.simulateSpellAbility(coneSA); - Game simGame2 = sim2.getSimulatedGameState(); - Card simBear2 = findCardWithName(simGame2, bearCardName); - Card simGiant2 = findCardWithName(simGame2, giantCardName); - Card simPridemate2 = findCardWithName(simGame2, pridemateName); + sim2.simulateSpellAbility(coneSA); + Game simGame2 = sim2.getSimulatedGameState(); + Card simBear2 = findCardWithName(simGame2, bearCardName); + Card simGiant2 = findCardWithName(simGame2, giantCardName); + Card simPridemate2 = findCardWithName(simGame2, pridemateName); - // no Lifegain because of Everlasting Torment - AssertJUnit.assertNotNull(simPridemate2); - AssertJUnit.assertFalse(simPridemate2.hasCounters()); - AssertJUnit.assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simPridemate2.getPowerBonusFromCounters()); + // no Lifegain because of Everlasting Torment + AssertJUnit.assertNotNull(simPridemate2); + AssertJUnit.assertFalse(simPridemate2.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simBear2); - AssertJUnit.assertEquals(0, simBear2.getDamage()); - AssertJUnit.assertTrue(simBear2.hasCounters()); - AssertJUnit.assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(-1, simBear2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(-1, simBear2.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simBear2); + AssertJUnit.assertEquals(0, simBear2.getDamage()); + AssertJUnit.assertTrue(simBear2.hasCounters()); + AssertJUnit.assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-1, simBear2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-1, simBear2.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simGiant2); - AssertJUnit.assertEquals(0, simGiant2.getDamage()); - AssertJUnit.assertTrue(simGiant2.hasCounters()); - AssertJUnit.assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(-2, simGiant2.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simGiant2); + AssertJUnit.assertEquals(0, simGiant2.getDamage()); + AssertJUnit.assertTrue(simGiant2.hasCounters()); + AssertJUnit.assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-2, simGiant2.getPowerBonusFromCounters()); - // no life gain - AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); + // no life gain + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); - // third pard with Melira prevents wither - addCard(meliraName, p2); + // third pard with Melira prevents wither + addCard(meliraName, p2); - GameSimulator sim3 = createSimulator(game, p1); + GameSimulator sim3 = createSimulator(game, p1); - sim3.simulateSpellAbility(coneSA); - Game simGame3 = sim3.getSimulatedGameState(); - Card simBear3 = findCardWithName(simGame3, bearCardName); - Card simGiant3 = findCardWithName(simGame3, giantCardName); - Card simPridemate3 = findCardWithName(simGame3, pridemateName); + sim3.simulateSpellAbility(coneSA); + Game simGame3 = sim3.getSimulatedGameState(); + Card simBear3 = findCardWithName(simGame3, bearCardName); + Card simGiant3 = findCardWithName(simGame3, giantCardName); + Card simPridemate3 = findCardWithName(simGame3, pridemateName); - // no Lifegain because of Everlasting Torment - AssertJUnit.assertNotNull(simPridemate3); - AssertJUnit.assertFalse(simPridemate3.hasCounters()); - AssertJUnit.assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simPridemate3.getPowerBonusFromCounters()); + // no Lifegain because of Everlasting Torment + AssertJUnit.assertNotNull(simPridemate3); + AssertJUnit.assertFalse(simPridemate3.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simBear3); - AssertJUnit.assertEquals(0, simBear3.getDamage()); - AssertJUnit.assertFalse(simBear3.hasCounters()); - AssertJUnit.assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(0, simBear3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simBear3.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simBear3); + AssertJUnit.assertEquals(0, simBear3.getDamage()); + AssertJUnit.assertFalse(simBear3.hasCounters()); + AssertJUnit.assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simBear3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simBear3.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simGiant3); - AssertJUnit.assertEquals(0, simGiant3.getDamage()); - AssertJUnit.assertFalse(simGiant3.hasCounters()); - AssertJUnit.assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(0, simGiant3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simGiant3.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simGiant3); + AssertJUnit.assertEquals(0, simGiant3.getDamage()); + AssertJUnit.assertFalse(simGiant3.hasCounters()); + AssertJUnit.assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simGiant3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simGiant3.getPowerBonusFromCounters()); - // no life gain - AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); - } + // no life gain + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); + } - @Test + @Test public void testTransform() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - addCard("Swamp", p); - String lilianaCardName = "Liliana, Heretical Healer"; - String lilianaPWName = "Liliana, Defiant Necromancer"; - Card lilianaInPlay = addCard(lilianaCardName, p); - Card lilianaInHand = addCardToZone(lilianaCardName, p, ZoneType.Hand); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + addCard("Swamp", p); + String lilianaCardName = "Liliana, Heretical Healer"; + String lilianaPWName = "Liliana, Defiant Necromancer"; + Card lilianaInPlay = addCard(lilianaCardName, p); + Card lilianaInHand = addCardToZone(lilianaCardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(lilianaInPlay.isCreature()); - AssertJUnit.assertEquals(2, lilianaInPlay.getNetPower()); - AssertJUnit.assertEquals(3, lilianaInPlay.getNetToughness()); + AssertJUnit.assertTrue(lilianaInPlay.isCreature()); + AssertJUnit.assertEquals(2, lilianaInPlay.getNetPower()); + AssertJUnit.assertEquals(3, lilianaInPlay.getNetToughness()); - SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playLiliana); - Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertNull(findCardWithName(simGame, lilianaCardName)); - Card lilianaPW = findCardWithName(simGame, lilianaPWName); - AssertJUnit.assertNotNull(lilianaPW); - AssertJUnit.assertTrue(lilianaPW.isPlaneswalker()); - AssertJUnit.assertEquals(3, lilianaPW.getCurrentLoyalty()); + SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playLiliana); + Game simGame = sim.getSimulatedGameState(); + AssertJUnit.assertNull(findCardWithName(simGame, lilianaCardName)); + Card lilianaPW = findCardWithName(simGame, lilianaPWName); + AssertJUnit.assertNotNull(lilianaPW); + AssertJUnit.assertTrue(lilianaPW.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPW.getCurrentLoyalty()); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card lilianaPWCopy = findCardWithName(copy, lilianaPWName); - AssertJUnit.assertNotNull(lilianaPWCopy); - AssertJUnit.assertTrue(lilianaPWCopy.isPlaneswalker()); - AssertJUnit.assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card lilianaPWCopy = findCardWithName(copy, lilianaPWName); + AssertJUnit.assertNotNull(lilianaPWCopy); + AssertJUnit.assertTrue(lilianaPWCopy.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); + } - @Test + @Test public void testEnergy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Island", p); - String turtleCardName = "Thriving Turtle"; - Card turtleCard = addCardToZone(turtleCardName, p, ZoneType.Hand); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Island", p); + String turtleCardName = "Thriving Turtle"; + Card turtleCard = addCardToZone(turtleCardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); - SpellAbility playTurtle = turtleCard.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playTurtle); - Game simGame = sim.getSimulatedGameState(); - Player simP = simGame.getPlayers().get(1); - AssertJUnit.assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); + SpellAbility playTurtle = turtleCard.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playTurtle); + Game simGame = sim.getSimulatedGameState(); + Player simP = simGame.getPlayers().get(1); + AssertJUnit.assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Player copyP = copy.getPlayers().get(1); - AssertJUnit.assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); - } + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Player copyP = copy.getPlayers().get(1); + AssertJUnit.assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); + } - @Test + @Test public void testFloatingMana() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - Card darkRitualCard = addCardToZone("Dark Ritual", p, ZoneType.Hand); - Card darkConfidantCard = addCardToZone("Dark Confidant", p, ZoneType.Hand); - Card deathriteCard = addCardToZone("Deathrite Shaman", p, ZoneType.Hand); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + Card darkRitualCard = addCardToZone("Dark Ritual", p, ZoneType.Hand); + Card darkConfidantCard = addCardToZone("Dark Confidant", p, ZoneType.Hand); + Card deathriteCard = addCardToZone("Deathrite Shaman", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.getManaPool().isEmpty()); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.getManaPool().isEmpty()); - SpellAbility playRitual = darkRitualCard.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playRitual); - Game simGame = sim.getSimulatedGameState(); - Player simP = simGame.getPlayers().get(1); - AssertJUnit.assertEquals(3, simP.getManaPool().totalMana()); - AssertJUnit.assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); + SpellAbility playRitual = darkRitualCard.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playRitual); + Game simGame = sim.getSimulatedGameState(); + Player simP = simGame.getPlayers().get(1); + AssertJUnit.assertEquals(3, simP.getManaPool().totalMana()); + AssertJUnit.assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); - Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); - SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); - Card deathriteCard2 = (Card) sim.getGameCopier().find(deathriteCard); + Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); + SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); + Card deathriteCard2 = (Card) sim.getGameCopier().find(deathriteCard); - GameSimulator sim2 = createSimulator(simGame, simP); - sim2.simulateSpellAbility(playDarkConfidant2); - Game sim2Game = sim2.getSimulatedGameState(); - Player sim2P = sim2Game.getPlayers().get(1); - AssertJUnit.assertEquals(1, sim2P.getManaPool().totalMana()); - AssertJUnit.assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + GameSimulator sim2 = createSimulator(simGame, simP); + sim2.simulateSpellAbility(playDarkConfidant2); + Game sim2Game = sim2.getSimulatedGameState(); + Player sim2P = sim2Game.getPlayers().get(1); + AssertJUnit.assertEquals(1, sim2P.getManaPool().totalMana()); + AssertJUnit.assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); - Card deathriteCard3 = (Card) sim2.getGameCopier().find(deathriteCard2); - SpellAbility playDeathriteCard3 = deathriteCard3.getSpellAbilities().get(0); + Card deathriteCard3 = (Card) sim2.getGameCopier().find(deathriteCard2); + SpellAbility playDeathriteCard3 = deathriteCard3.getSpellAbilities().get(0); - GameSimulator sim3 = createSimulator(sim2Game, sim2P); - sim3.simulateSpellAbility(playDeathriteCard3); - Game sim3Game = sim3.getSimulatedGameState(); - Player sim3P = sim3Game.getPlayers().get(1); - AssertJUnit.assertEquals(0, sim3P.getManaPool().totalMana()); - AssertJUnit.assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); - } + GameSimulator sim3 = createSimulator(sim2Game, sim2P); + sim3.simulateSpellAbility(playDeathriteCard3); + Game sim3Game = sim3.getSimulatedGameState(); + Player sim3P = sim3Game.getPlayers().get(1); + AssertJUnit.assertEquals(0, sim3P.getManaPool().totalMana()); + AssertJUnit.assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + } - @Test + @Test public void testEnKor() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; - String enKorName = "Spirit en-Kor"; - String bearName = "Runeclaw Bear"; - String shockName = "Shock"; + String enKorName = "Spirit en-Kor"; + String bearName = "Runeclaw Bear"; + String shockName = "Shock"; - addCard("Mountain", p); + addCard("Mountain", p); - addCard(soulfireName, p); - addCard(pridemateName, p); + addCard(soulfireName, p); + addCard(pridemateName, p); - Card shockCard = addCardToZone(shockName, p, ZoneType.Hand); + Card shockCard = addCardToZone(shockName, p, ZoneType.Hand); - Card enKor = addCard(enKorName, p); + Card enKor = addCard(enKorName, p); - SpellAbility enKorSA = findSAWithPrefix(enKor, "{0}:"); + SpellAbility enKorSA = findSAWithPrefix(enKor, "{0}:"); - Card bear = addCard(bearName, p); + Card bear = addCard(bearName, p); - SpellAbility shockSA = shockCard.getFirstSpellAbility(); + SpellAbility shockSA = shockCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(2, enKor.getNetPower()); - AssertJUnit.assertEquals(2, enKor.getNetToughness()); - AssertJUnit.assertEquals(0, enKor.getDamage()); + AssertJUnit.assertEquals(2, enKor.getNetPower()); + AssertJUnit.assertEquals(2, enKor.getNetToughness()); + AssertJUnit.assertEquals(0, enKor.getDamage()); - AssertJUnit.assertEquals(2, bear.getNetPower()); - AssertJUnit.assertEquals(2, bear.getNetToughness()); - AssertJUnit.assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); - GameSimulator sim = createSimulator(game, p); - enKorSA.setTargetCard(bear); - shockSA.setTargetCard(enKor); - sim.simulateSpellAbility(enKorSA); - sim.simulateSpellAbility(shockSA); - Game simGame = sim.getSimulatedGameState(); - Card simEnKor = findCardWithName(simGame, enKorName); - Card simBear = findCardWithName(simGame, bearName); + GameSimulator sim = createSimulator(game, p); + enKorSA.setTargetCard(bear); + shockSA.setTargetCard(enKor); + sim.simulateSpellAbility(enKorSA); + sim.simulateSpellAbility(shockSA); + Game simGame = sim.getSimulatedGameState(); + Card simEnKor = findCardWithName(simGame, enKorName); + Card simBear = findCardWithName(simGame, bearName); - AssertJUnit.assertNotNull(simEnKor); - AssertJUnit.assertEquals(1, simEnKor.getDamage()); + AssertJUnit.assertNotNull(simEnKor); + AssertJUnit.assertEquals(1, simEnKor.getDamage()); - AssertJUnit.assertNotNull(simBear); - AssertJUnit.assertEquals(1, simBear.getDamage()); + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); - Card simPridemate = findCardWithName(simGame, pridemateName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(22, simGame.getPlayers().get(0).getLife()); - } + AssertJUnit.assertEquals(22, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testRazia() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; - String raziaName = "Razia, Boros Archangel"; - String bearName = "Runeclaw Bear"; - String greetingName = "Alchemist's Greeting"; + String raziaName = "Razia, Boros Archangel"; + String bearName = "Runeclaw Bear"; + String greetingName = "Alchemist's Greeting"; - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p); - } + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p); + } - addCard(soulfireName, p); - addCard(pridemateName, p); + addCard(soulfireName, p); + addCard(pridemateName, p); - Card greetingCard = addCardToZone(greetingName, p, ZoneType.Hand); + Card greetingCard = addCardToZone(greetingName, p, ZoneType.Hand); - Card razia = addCard(raziaName, p); + Card razia = addCard(raziaName, p); - SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); + SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); - Card bear = addCard(bearName, p); + Card bear = addCard(bearName, p); - SpellAbility greetingSA = greetingCard.getFirstSpellAbility(); + SpellAbility greetingSA = greetingCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - AssertJUnit.assertEquals(2, bear.getNetPower()); - AssertJUnit.assertEquals(2, bear.getNetToughness()); - AssertJUnit.assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); - GameSimulator sim = createSimulator(game, p); - preventSA.setTargetCard(razia); - preventSA.getSubAbility().setTargetCard(bear); - greetingSA.setTargetCard(razia); - sim.simulateSpellAbility(preventSA); - sim.simulateSpellAbility(greetingSA); - Game simGame = sim.getSimulatedGameState(); - Card simRazia = findCardWithName(simGame, raziaName); - Card simBear = findCardWithName(simGame, bearName); + GameSimulator sim = createSimulator(game, p); + preventSA.setTargetCard(razia); + preventSA.getSubAbility().setTargetCard(bear); + greetingSA.setTargetCard(razia); + sim.simulateSpellAbility(preventSA); + sim.simulateSpellAbility(greetingSA); + Game simGame = sim.getSimulatedGameState(); + Card simRazia = findCardWithName(simGame, raziaName); + Card simBear = findCardWithName(simGame, bearName); - AssertJUnit.assertNotNull(simRazia); - AssertJUnit.assertEquals(1, simRazia.getDamage()); + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); - // bear destroyed - AssertJUnit.assertNull(simBear); + // bear destroyed + AssertJUnit.assertNull(simBear); - Card simPridemate = findCardWithName(simGame, pridemateName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); - } + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testRazia2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; - String raziaName = "Razia, Boros Archangel"; - String elementalName = "Air Elemental"; - String shockName = "Shock"; + String raziaName = "Razia, Boros Archangel"; + String elementalName = "Air Elemental"; + String shockName = "Shock"; - for (int i = 0; i < 2; ++i) { - addCard("Mountain", p); - } + for (int i = 0; i < 2; ++i) { + addCard("Mountain", p); + } - addCard(soulfireName, p); - addCard(pridemateName, p); + addCard(soulfireName, p); + addCard(pridemateName, p); - Card shockCard1 = addCardToZone(shockName, p, ZoneType.Hand); - Card shockCard2 = addCardToZone(shockName, p, ZoneType.Hand); + Card shockCard1 = addCardToZone(shockName, p, ZoneType.Hand); + Card shockCard2 = addCardToZone(shockName, p, ZoneType.Hand); - Card razia = addCard(raziaName, p); + Card razia = addCard(raziaName, p); - SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); + SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); - Card elemental = addCard(elementalName, p); + Card elemental = addCard(elementalName, p); - SpellAbility shockSA1 = shockCard1.getFirstSpellAbility(); - SpellAbility shockSA2 = shockCard2.getFirstSpellAbility(); + SpellAbility shockSA1 = shockCard1.getFirstSpellAbility(); + SpellAbility shockSA2 = shockCard2.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - AssertJUnit.assertEquals(4, elemental.getNetPower()); - AssertJUnit.assertEquals(4, elemental.getNetToughness()); - AssertJUnit.assertEquals(0, elemental.getDamage()); + AssertJUnit.assertEquals(4, elemental.getNetPower()); + AssertJUnit.assertEquals(4, elemental.getNetToughness()); + AssertJUnit.assertEquals(0, elemental.getDamage()); - GameSimulator sim = createSimulator(game, p); - preventSA.setTargetCard(razia); - preventSA.getSubAbility().setTargetCard(elemental); - shockSA1.setTargetCard(razia); - shockSA2.setTargetCard(razia); - sim.simulateSpellAbility(preventSA); - sim.simulateSpellAbility(shockSA1); - sim.simulateSpellAbility(shockSA2); - Game simGame = sim.getSimulatedGameState(); - Card simRazia = findCardWithName(simGame, raziaName); - Card simElemental = findCardWithName(simGame, elementalName); + GameSimulator sim = createSimulator(game, p); + preventSA.setTargetCard(razia); + preventSA.getSubAbility().setTargetCard(elemental); + shockSA1.setTargetCard(razia); + shockSA2.setTargetCard(razia); + sim.simulateSpellAbility(preventSA); + sim.simulateSpellAbility(shockSA1); + sim.simulateSpellAbility(shockSA2); + Game simGame = sim.getSimulatedGameState(); + Card simRazia = findCardWithName(simGame, raziaName); + Card simElemental = findCardWithName(simGame, elementalName); - AssertJUnit.assertNotNull(simRazia); - AssertJUnit.assertEquals(1, simRazia.getDamage()); + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); - // elemental not destroyed - AssertJUnit.assertNotNull(simElemental); - AssertJUnit.assertEquals(3, simElemental.getDamage()); + // elemental not destroyed + AssertJUnit.assertNotNull(simElemental); + AssertJUnit.assertEquals(3, simElemental.getDamage()); - Card simPridemate = findCardWithName(simGame, pridemateName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // only triggered twice - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(2, simPridemate.getPowerBonusFromCounters()); + // only triggered twice + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); - } + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testMassRemovalVsKalitas() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); - addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); - for (int i = 0; i < 4; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } + addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); + for (int i = 0; i < 4; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } - for (int i = 0; i < 2; i++) { - addCardToZone("Aboroth", opp, ZoneType.Battlefield); - } + for (int i = 0; i < 2; i++) { + addCardToZone("Aboroth", opp, ZoneType.Battlefield); + } - Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - AssertJUnit.assertNotNull(wrathSA); + SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); + AssertJUnit.assertNotNull(wrathSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(wrathSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(wrathSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(2, numZombies); - } + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(2, numZombies); + } - @Test + @Test public void testKalitasNumberOfTokens() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); - addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); - addCardToZone("Anointed Procession", p, ZoneType.Battlefield); - addCardToZone("Swamp", p, ZoneType.Battlefield); - for (int i = 0; i < 4; i++) { - addCardToZone("Mountain", p, ZoneType.Battlefield); - } + addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); + addCardToZone("Anointed Procession", p, ZoneType.Battlefield); + addCardToZone("Swamp", p, ZoneType.Battlefield); + for (int i = 0; i < 4; i++) { + addCardToZone("Mountain", p, ZoneType.Battlefield); + } - Card goblin = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); - Card goblin2 = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); + Card goblin = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); + Card goblin2 = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); - // Fatal Push: should generate 2 tokens - Card fatalPush = addCardToZone("Fatal Push", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility fatalPushSA = fatalPush.getFirstSpellAbility(); - AssertJUnit.assertNotNull(fatalPushSA); - fatalPushSA.setTargetCard(goblin); + // Fatal Push: should generate 2 tokens + Card fatalPush = addCardToZone("Fatal Push", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + SpellAbility fatalPushSA = fatalPush.getFirstSpellAbility(); + AssertJUnit.assertNotNull(fatalPushSA); + fatalPushSA.setTargetCard(goblin); - // Electrify: should also generate 2 tokens after the Ixalan rules update - Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); - SpellAbility electrifySA = electrify.getFirstSpellAbility(); - AssertJUnit.assertNotNull(electrifySA); - electrifySA.setTargetCard(goblin2); + // Electrify: should also generate 2 tokens after the Ixalan rules update + Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); + SpellAbility electrifySA = electrify.getFirstSpellAbility(); + AssertJUnit.assertNotNull(electrifySA); + electrifySA.setTargetCard(goblin2); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(fatalPushSA).value; - AssertJUnit.assertTrue(score > 0); - AssertJUnit.assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(fatalPushSA).value; + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); - score = sim.simulateSpellAbility(electrifySA).value; - AssertJUnit.assertTrue(score > 0); - AssertJUnit.assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); - } + score = sim.simulateSpellAbility(electrifySA).value; + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + } - @Test + @Test public void testPlayerXCount() { - // If playerXCount is operational, then conditions that count something - // about the player (e.g. - // cards in hand, life total) should work, similar to the Bloodghast - // "Haste" condition. - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + // If playerXCount is operational, then conditions that count something + // about the player (e.g. + // cards in hand, life total) should work, similar to the Bloodghast + // "Haste" condition. + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card bloodghast = addCardToZone("Bloodghast", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); + Card bloodghast = addCardToZone("Bloodghast", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); - assert (!bloodghast.hasKeyword("Haste")); + assert (!bloodghast.hasKeyword("Haste")); - opp.setLife(5, null); - game.getAction().checkStateEffects(true); + opp.setLife(5, null); + game.getAction().checkStateEffects(true); - assert (bloodghast.hasKeyword("Haste")); - } + assert (bloodghast.hasKeyword("Haste")); + } - @Test + @Test public void testDeathsShadow() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCardToZone("Platinum Angel", p, ZoneType.Battlefield); - Card deathsShadow = addCardToZone("Death's Shadow", p, ZoneType.Battlefield); + addCardToZone("Platinum Angel", p, ZoneType.Battlefield); + Card deathsShadow = addCardToZone("Death's Shadow", p, ZoneType.Battlefield); - p.setLife(1, null); - game.getAction().checkStateEffects(true); - assert (deathsShadow.getNetPower() == 12); + p.setLife(1, null); + game.getAction().checkStateEffects(true); + assert (deathsShadow.getNetPower() == 12); - p.setLife(-1, null); - game.getAction().checkStateEffects(true); - assert (deathsShadow.getNetPower() == 13); // on negative life, should - // always be 13/13 - } + p.setLife(-1, null); + game.getAction().checkStateEffects(true); + assert (deathsShadow.getNetPower() == 13); // on negative life, should + // always be 13/13 + } - @Test + @Test public void testBludgeonBrawlLatticeAura() { - // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment - // Creature Auras should stay on - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment + // - Aura Equipment + // Creature Auras should stay on + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card lifelink = addCard("Lifelink", p); - lifelink.attachToEntity(bear); + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card lifelink = addCard("Lifelink", p); + lifelink.attachToEntity(bear); - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertTrue(bear.hasCardAttachment(lifelink)); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.hasCardAttachment(lifelink)); - // this adds Artifact Type - addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertFalse(bear.isEquipped()); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertFalse(bear.isEquipped()); - AssertJUnit.assertTrue(lifelink.isArtifact()); - AssertJUnit.assertFalse(lifelink.isEquipment()); + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertFalse(lifelink.isEquipment()); - // this add Equipment and causes it to fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertTrue(bear.isEquipped()); + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.isEquipped()); - AssertJUnit.assertTrue(lifelink.isArtifact()); - AssertJUnit.assertTrue(lifelink.isEquipment()); + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertTrue(lifelink.isEquipment()); - // still in battlefield - AssertJUnit.assertTrue(lifelink.isInPlay()); - } + // still in battlefield + AssertJUnit.assertTrue(lifelink.isInPlay()); + } - @Test + @Test public void testBludgeonBrawlLatticeCurse() { - // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - Aura Equipment - // Curses can only attach Player, but Equipment can only attach to Creature so it does fall off - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment + // - Aura Equipment + // Curses can only attach Player, but Equipment can only attach to Creature so + // it does fall off + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - final String curseName = "Cruel Reality"; + final String curseName = "Cruel Reality"; - Card curse = addCard(curseName, p); - curse.attachToEntity(p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.isEnchanted()); - AssertJUnit.assertTrue(p.hasCardAttachment(curse)); + Card curse = addCard(curseName, p); + curse.attachToEntity(p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(p.hasCardAttachment(curse)); - // this adds Artifact Type - addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.isEnchanted()); - AssertJUnit.assertTrue(curse.isArtifact()); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(curse.isArtifact()); - // this add Equipment and causes it to fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertFalse(p.isEnchanted()); + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + AssertJUnit.assertFalse(p.isEnchanted()); - // not in Battlefield anymore - AssertJUnit.assertFalse(curse.isInPlay()); - AssertJUnit.assertTrue(curse.isInZone(ZoneType.Graveyard)); - } + // not in Battlefield anymore + AssertJUnit.assertFalse(curse.isInPlay()); + AssertJUnit.assertTrue(curse.isInZone(ZoneType.Graveyard)); + } - @Test + @Test public void testBludgeonBrawlFortification() { - // Bludgeon Brawl makes Fortification into Equipment - // that means it can't attach a Land anymore if the Land is no Creature + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); - Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachToEntity(mountain); - game.getAction().checkStateEffects(true); + fortification.attachToEntity(mountain); + game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(fortification.isFortification()); - AssertJUnit.assertFalse(fortification.isEquipment()); + AssertJUnit.assertTrue(fortification.isFortification()); + AssertJUnit.assertFalse(fortification.isEquipment()); - AssertJUnit.assertTrue(mountain.isFortified()); - AssertJUnit.assertTrue(mountain.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(mountain.isFortified()); + AssertJUnit.assertTrue(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); - // adding Brawl will cause the Fortification into Equipment and it to - // fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); + // adding Brawl will cause the Fortification into Equipment and it to + // fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); - AssertJUnit.assertFalse(fortification.isFortification()); - AssertJUnit.assertTrue(fortification.isEquipment()); + AssertJUnit.assertFalse(fortification.isFortification()); + AssertJUnit.assertTrue(fortification.isEquipment()); - AssertJUnit.assertFalse(mountain.hasCardAttachment(fortification)); - AssertJUnit.assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); - } + AssertJUnit.assertFalse(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + } - @Test + @Test public void testBludgeonBrawlFortificationDryad() { - // Bludgeon Brawl makes Fortification into Equipment - // that means it can't attach a Land anymore if the Land is no Creature too - // Dryad Arbor is both a Land and a Creature so it stays attached + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature too + // Dryad Arbor is both a Land and a Creature so it stays attached - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); - Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachToEntity(dryad); - game.getAction().checkStateEffects(true); + fortification.attachToEntity(dryad); + game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(dryad.isFortified()); - AssertJUnit.assertFalse(dryad.isEquipped()); + AssertJUnit.assertTrue(dryad.isFortified()); + AssertJUnit.assertFalse(dryad.isEquipped()); - AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); - // adding Brawl will cause the Fortification into Equipment - // because Dryad Arbor is a Creature it stays attached - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); + // adding Brawl will cause the Fortification into Equipment + // because Dryad Arbor is a Creature it stays attached + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); - // switched from Fortification to Equipment - AssertJUnit.assertFalse(dryad.isFortified()); - AssertJUnit.assertTrue(dryad.isEquipped()); + // switched from Fortification to Equipment + AssertJUnit.assertFalse(dryad.isFortified()); + AssertJUnit.assertTrue(dryad.isEquipped()); - AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); - } + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + } - - @Test + @Test public void testRiotEnchantment() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - final String goblinName = "Zhur-Taa Goblin"; + final String goblinName = "Zhur-Taa Goblin"; - addCard("Rhythm of the Wild", p); + addCard("Rhythm of the Wild", p); - Card goblin = addCardToZone(goblinName, p, ZoneType.Hand); + Card goblin = addCardToZone(goblinName, p, ZoneType.Hand); - addCard("Mountain", p); - addCard("Forest", p); + addCard("Mountain", p); + addCard("Forest", p); - SpellAbility goblinSA = goblin.getFirstSpellAbility(); - AssertJUnit.assertNotNull(goblinSA); + SpellAbility goblinSA = goblin.getFirstSpellAbility(); + AssertJUnit.assertNotNull(goblinSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(goblinSA).value; - AssertJUnit.assertTrue(score > 0); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(goblinSA).value; + AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - Card simGoblin = findCardWithName(simGame, goblinName); + Card simGoblin = findCardWithName(simGame, goblinName); - AssertJUnit.assertNotNull(simGoblin); - int effects = simGoblin.getCounters(CounterEnumType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); - AssertJUnit.assertEquals(2, effects); - } + AssertJUnit.assertNotNull(simGoblin); + int effects = simGoblin.getCounters(CounterEnumType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); + AssertJUnit.assertEquals(2, effects); + } - @Test + @Test public void testTeysaKarlovXathridNecromancer() { - // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token + // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("Xathrid Necromancer", p); + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); - for (int i = 0; i < 4; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } + for (int i = 0; i < 4; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } - Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - AssertJUnit.assertNotNull(wrathSA); + SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); + AssertJUnit.assertNotNull(wrathSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(wrathSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(wrathSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(4, numZombies); - } + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(4, numZombies); + } - @Test + @Test public void testDoubleTeysaKarlovXathridNecromancer() { - // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer trigger 3 times + // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer + // trigger 3 times - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("Xathrid Necromancer", p); + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); - for (int i = 0; i < 3; i++) { - addCard("Plains", p); - } - addCard("Swamp", p); + for (int i = 0; i < 3; i++) { + addCard("Plains", p); + } + addCard("Swamp", p); - Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand); + Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand); - SpellAbility secondSA = second.getFirstSpellAbility(); + SpellAbility secondSA = second.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(secondSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(secondSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(3, numZombies); - } + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(3, numZombies); + } - - @Test + @Test public void testTeysaKarlovGitrogMonster() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand); + Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // Two cards drawn - AssertJUnit.assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // Two cards drawn + AssertJUnit.assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - @Test + @Test public void testTeysaKarlovGitrogMonsterGitrogDies() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card teysa = addCard("Teysa Karlov", p); - addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + Card teysa = addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - String indestructibilityName = "Indestructibility"; - Card indestructibility = addCard(indestructibilityName, p); + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); - indestructibility.attachToEntity(teysa); + indestructibility.attachToEntity(teysa); - // update Indestructible state - game.getAction().checkStateEffects(true); + // update Indestructible state + game.getAction().checkStateEffects(true); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // One cards drawn - AssertJUnit.assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // One cards drawn + AssertJUnit.assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - @Test + @Test public void testTeysaKarlovGitrogMonsterTeysaDies() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - Card gitrog = addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + addCard("Teysa Karlov", p); + Card gitrog = addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - String indestructibilityName = "Indestructibility"; - Card indestructibility = addCard(indestructibilityName, p); + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); - indestructibility.attachToEntity(gitrog); + indestructibility.attachToEntity(gitrog); - // update Indestructible state - game.getAction().checkStateEffects(true); + // update Indestructible state + game.getAction().checkStateEffects(true); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // One cards drawn - AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // One cards drawn + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - - @Test + @Test public void testCloneTransform() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - final String outLawName = "Kruin Outlaw"; - final String hillGiantName = "Elite Vanguard"; - final String terrorName = "Terror of Kruin Pass"; + final String outLawName = "Kruin Outlaw"; + final String hillGiantName = "Elite Vanguard"; + final String terrorName = "Terror of Kruin Pass"; - Card outlaw = addCard(outLawName, p2); - Card giant = addCard(hillGiantName, p); + Card outlaw = addCard(outLawName, p2); + Card giant = addCard(hillGiantName, p); - AssertJUnit.assertFalse(outlaw.isCloned()); - AssertJUnit.assertTrue(outlaw.isDoubleFaced()); - AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(outlaw.canTransform(null)); - AssertJUnit.assertFalse(outlaw.isBackSide()); + AssertJUnit.assertFalse(outlaw.isCloned()); + AssertJUnit.assertTrue(outlaw.isDoubleFaced()); + AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(outlaw.canTransform(null)); + AssertJUnit.assertFalse(outlaw.isBackSide()); - AssertJUnit.assertFalse(giant.isDoubleFaced()); - AssertJUnit.assertFalse(giant.canTransform(null)); + AssertJUnit.assertFalse(giant.isDoubleFaced()); + AssertJUnit.assertFalse(giant.canTransform(null)); - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - addCard("Island", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Island", p); - Card cytoCard = addCardToZone("Cytoshape", p, ZoneType.Hand); - SpellAbility cytoSA = cytoCard.getFirstSpellAbility(); + Card cytoCard = addCardToZone("Cytoshape", p, ZoneType.Hand); + SpellAbility cytoSA = cytoCard.getFirstSpellAbility(); - Card moonmist = addCardToZone("Moonmist", p, ZoneType.Hand); - SpellAbility moonmistSA = moonmist.getFirstSpellAbility(); + Card moonmist = addCardToZone("Moonmist", p, ZoneType.Hand); + SpellAbility moonmistSA = moonmist.getFirstSpellAbility(); - cytoSA.getTargets().add(outlaw); + cytoSA.getTargets().add(outlaw); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(cytoSA).value; + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(cytoSA).value; - AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); - Card clonedOutLaw = (Card)sim.getGameCopier().find(outlaw); + Card clonedOutLaw = (Card) sim.getGameCopier().find(outlaw); - AssertJUnit.assertTrue(clonedOutLaw.isCloned()); - AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); - AssertJUnit.assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(clonedOutLaw.canTransform(null)); - AssertJUnit.assertFalse(clonedOutLaw.isBackSide()); + AssertJUnit.assertTrue(clonedOutLaw.isCloned()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(clonedOutLaw.canTransform(null)); + AssertJUnit.assertFalse(clonedOutLaw.isBackSide()); - AssertJUnit.assertEquals(clonedOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(clonedOutLaw.getName(), hillGiantName); - AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); - score = sim.simulateSpellAbility(moonmistSA).value; - AssertJUnit.assertTrue(score > 0); + score = sim.simulateSpellAbility(moonmistSA).value; + AssertJUnit.assertTrue(score > 0); - simGame = sim.getSimulatedGameState(); + simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); - Card transformOutLaw = (Card)sim.getGameCopier().find(outlaw); + Card transformOutLaw = (Card) sim.getGameCopier().find(outlaw); - AssertJUnit.assertTrue(transformOutLaw.isCloned()); - AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); - AssertJUnit.assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); - AssertJUnit.assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertTrue(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - AssertJUnit.assertEquals(transformOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(transformOutLaw.getName(), hillGiantName); - // need to clean up the clone state - simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.CLEANUP); + // need to clean up the clone state + simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.CLEANUP); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(1, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(1, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, terrorName)); - AssertJUnit.assertFalse(transformOutLaw.isCloned()); - AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); - AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); - AssertJUnit.assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertFalse(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - AssertJUnit.assertEquals(transformOutLaw.getName(), terrorName); - } + AssertJUnit.assertEquals(transformOutLaw.getName(), terrorName); + } - @Test + @Test public void testVolrathsShapeshifter() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card volrath = addCard("Volrath's Shapeshifter", p); + Card volrath = addCard("Volrath's Shapeshifter", p); - // 1. Assert that Volrath has the Discard ability - SpellAbility discard = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discard != null && discard.getApi() == ApiType.Discard); + // 1. Assert that Volrath has the Discard ability + SpellAbility discard = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discard != null && discard.getApi() == ApiType.Discard); - // 2. Copy the text from a creature - addCardToZone("Abattoir Ghoul", p, ZoneType.Graveyard); - game.getAction().checkStateEffects(true); + // 2. Copy the text from a creature + addCardToZone("Abattoir Ghoul", p, ZoneType.Graveyard); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals("Abattoir Ghoul", volrath.getName()); - AssertJUnit.assertEquals(3, volrath.getNetPower()); - AssertJUnit.assertEquals(2, volrath.getNetToughness()); - AssertJUnit.assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); + AssertJUnit.assertEquals("Abattoir Ghoul", volrath.getName()); + AssertJUnit.assertEquals(3, volrath.getNetPower()); + AssertJUnit.assertEquals(2, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); - SpellAbility discardAfterCopy = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); + SpellAbility discardAfterCopy = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); - // 3. Revert back to not copying any text - addCardToZone("Plains", p, ZoneType.Graveyard); - game.getAction().checkStateEffects(true); + // 3. Revert back to not copying any text + addCardToZone("Plains", p, ZoneType.Graveyard); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals("Volrath's Shapeshifter", volrath.getName()); - AssertJUnit.assertEquals(0, volrath.getNetPower()); - AssertJUnit.assertEquals(1, volrath.getNetToughness()); - AssertJUnit.assertTrue(volrath.getKeywords().isEmpty()); + AssertJUnit.assertEquals("Volrath's Shapeshifter", volrath.getName()); + AssertJUnit.assertEquals(0, volrath.getNetPower()); + AssertJUnit.assertEquals(1, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.getKeywords().isEmpty()); - SpellAbility discardAfterRevert = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); - } + SpellAbility discardAfterRevert = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); + } - @Test + @Test public void testSparkDoubleAndGideon() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - for (int i=0; i<7; i++) { addCardToZone("Plains", p, ZoneType.Battlefield); } - for (int i=0; i<7; i++) { addCardToZone("Island", p, ZoneType.Battlefield); } + for (int i = 0; i < 7; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Island", p, ZoneType.Battlefield); + } - Card gideon = addCardToZone("Gideon Blackblade", p, ZoneType.Hand); - Card sparkDouble = addCardToZone("Spark Double", p, ZoneType.Hand); + Card gideon = addCardToZone("Gideon Blackblade", p, ZoneType.Hand); + Card sparkDouble = addCardToZone("Spark Double", p, ZoneType.Hand); - SpellAbility gideonSA = gideon.getFirstSpellAbility(); - SpellAbility sparkDoubleSA = sparkDouble.getFirstSpellAbility(); + SpellAbility gideonSA = gideon.getFirstSpellAbility(); + SpellAbility sparkDoubleSA = sparkDouble.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(gideonSA); - sim.simulateSpellAbility(sparkDoubleSA); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(gideonSA); + sim.simulateSpellAbility(sparkDoubleSA); - Card simSpark = sim.getSimulatedGameState().findById(sparkDouble.getId()); + Card simSpark = sim.getSimulatedGameState().findById(sparkDouble.getId()); - AssertJUnit.assertNotNull(simSpark); - AssertJUnit.assertTrue(simSpark.isInZone(ZoneType.Battlefield)); - AssertJUnit.assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); - } + AssertJUnit.assertNotNull(simSpark); + AssertJUnit.assertTrue(simSpark.isInZone(ZoneType.Battlefield)); + AssertJUnit.assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); + } - @Test + @Test public void testVituGhaziAndCytoshape() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - for (int i=0; i<7; i++) { addCardToZone("Plains", p, ZoneType.Battlefield); } - for (int i=0; i<7; i++) { addCardToZone("Island", p, ZoneType.Battlefield); } - for (int i=0; i<7; i++) { addCardToZone("Forest", p, ZoneType.Battlefield); } + for (int i = 0; i < 7; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Island", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Forest", p, ZoneType.Battlefield); + } - Card tgtLand = addCardToZone("Wastes", p, ZoneType.Battlefield); + Card tgtLand = addCardToZone("Wastes", p, ZoneType.Battlefield); - Card vituGhazi = addCardToZone("Awakening of Vitu-Ghazi", p, ZoneType.Hand); - Card cytoshape = addCardToZone("Cytoshape", p, ZoneType.Hand); - Card goblin = addCardToZone("Raging Goblin", p, ZoneType.Battlefield); + Card vituGhazi = addCardToZone("Awakening of Vitu-Ghazi", p, ZoneType.Hand); + Card cytoshape = addCardToZone("Cytoshape", p, ZoneType.Hand); + Card goblin = addCardToZone("Raging Goblin", p, ZoneType.Battlefield); - SpellAbility vituSA = vituGhazi.getFirstSpellAbility(); - vituSA.getTargets().add(tgtLand); + SpellAbility vituSA = vituGhazi.getFirstSpellAbility(); + vituSA.getTargets().add(tgtLand); - SpellAbility cytoSA = cytoshape.getFirstSpellAbility(); - cytoSA.getTargets().add(tgtLand); + SpellAbility cytoSA = cytoshape.getFirstSpellAbility(); + cytoSA.getTargets().add(tgtLand); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(vituSA); - sim.simulateSpellAbility(cytoSA); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(vituSA); + sim.simulateSpellAbility(cytoSA); - Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); + Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); - AssertJUnit.assertNotNull(awakened); - AssertJUnit.assertEquals("Vitu-Ghazi", awakened.getName()); - AssertJUnit.assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertTrue(awakened.hasKeyword(Keyword.HASTE)); - AssertJUnit.assertTrue(awakened.getType().hasSubtype("Goblin")); - } + AssertJUnit.assertNotNull(awakened); + AssertJUnit.assertEquals("Vitu-Ghazi", awakened.getName()); + AssertJUnit.assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertTrue(awakened.hasKeyword(Keyword.HASTE)); + AssertJUnit.assertTrue(awakened.getType().hasSubtype("Goblin")); + } - @Test + @Test public void testNecroticOozeActivateOnce() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } - for (int i=0; i<7; i++) { addCardToZone("Forest", p, ZoneType.Battlefield); } + for (int i = 0; i < 7; i++) { + addCardToZone("Swamp", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Forest", p, ZoneType.Battlefield); + } - addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); - Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); + addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); + Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); - SpellAbility oozeSA = ooze.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(oozeSA); + SpellAbility oozeSA = ooze.getFirstSpellAbility(); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(oozeSA); - Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); + Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); - AssertJUnit.assertNotNull(oozeOTB); + AssertJUnit.assertNotNull(oozeOTB); - SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); - AssertJUnit.assertNotNull(copiedSA); - AssertJUnit.assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); - } + SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); + AssertJUnit.assertNotNull(copiedSA); + AssertJUnit.assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); + } - @Test + @Test public void testEpochrasite() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - for (int i=0; i<7; i++) { addCardToZone("Swamp", p, ZoneType.Battlefield); } + for (int i = 0; i < 7; i++) { + addCardToZone("Swamp", p, ZoneType.Battlefield); + } - Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); - Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); + Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); + Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); - SpellAbility saAnimate = animate.getFirstSpellAbility(); - saAnimate.getTargets().add(epo); + SpellAbility saAnimate = animate.getFirstSpellAbility(); + saAnimate.getTargets().add(epo); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(saAnimate); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(saAnimate); - Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); + Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); - AssertJUnit.assertNotNull(epoOTB); - AssertJUnit.assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); - } + AssertJUnit.assertNotNull(epoOTB); + AssertJUnit.assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); + } - @SuppressWarnings("unused") - public void broken_testCloneDimir() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + @SuppressWarnings("unused") + public void broken_testCloneDimir() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - // add enough cards to hand to flip Jushi - for (int i = 0; i < 9; i++) { - addCardToZone("Plains", p, ZoneType.Hand); - addCardToZone("Plains", p, ZoneType.Library); - addCard("Swamp", p); - addCard("Island", p); - } + // add enough cards to hand to flip Jushi + for (int i = 0; i < 9; i++) { + addCardToZone("Plains", p, ZoneType.Hand); + addCardToZone("Plains", p, ZoneType.Library); + addCard("Swamp", p); + addCard("Island", p); + } - Card dimirdg = addCard("Dimir Doppelganger", p); - // so T can be paid - dimirdg.setSickness(false); - SpellAbility saDimirClone = findSAWithPrefix(dimirdg, "{1}{U}{B}"); + Card dimirdg = addCard("Dimir Doppelganger", p); + // so T can be paid + dimirdg.setSickness(false); + SpellAbility saDimirClone = findSAWithPrefix(dimirdg, "{1}{U}{B}"); - AssertJUnit.assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); + AssertJUnit.assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); - Card jushi = addCardToZone("Jushi Apprentice", p, ZoneType.Graveyard); - Card bear = addCardToZone("Runeclaw Bear", p, ZoneType.Graveyard); - Card nezumi = addCardToZone("Nezumi Shortfang", p, ZoneType.Graveyard); + Card jushi = addCardToZone("Jushi Apprentice", p, ZoneType.Graveyard); + Card bear = addCardToZone("Runeclaw Bear", p, ZoneType.Graveyard); + Card nezumi = addCardToZone("Nezumi Shortfang", p, ZoneType.Graveyard); - // Clone Jushi first - saDimirClone.getTargets().add(jushi); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(saDimirClone).value; - AssertJUnit.assertTrue(score > 0); + // Clone Jushi first + saDimirClone.getTargets().add(jushi); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(saDimirClone).value; + AssertJUnit.assertTrue(score > 0); - Card dimirdgAfterCopy1 = (Card)sim.getGameCopier().find(dimirdg); - AssertJUnit.assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); - AssertJUnit.assertEquals(1, dimirdgAfterCopy1.getNetPower()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy1.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterCopy1.isFlipCard()); - AssertJUnit.assertFalse(dimirdgAfterCopy1.isFlipped()); - AssertJUnit.assertFalse(dimirdgAfterCopy1.getType().isLegendary()); + Card dimirdgAfterCopy1 = (Card) sim.getGameCopier().find(dimirdg); + AssertJUnit.assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); + AssertJUnit.assertEquals(1, dimirdgAfterCopy1.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy1.isFlipCard()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.getType().isLegendary()); - bear = (Card)sim.getGameCopier().find(bear); + bear = (Card) sim.getGameCopier().find(bear); - // make new simulator so new SpellAbility is found - Game simGame = sim.getSimulatedGameState(); - sim = createSimulator(simGame, p); + // make new simulator so new SpellAbility is found + Game simGame = sim.getSimulatedGameState(); + sim = createSimulator(simGame, p); - Player copiedPlayer = (Player)sim.getGameCopier().find(p); - int handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - AssertJUnit.assertEquals(9, handSize); + Player copiedPlayer = (Player) sim.getGameCopier().find(p); + int handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); + AssertJUnit.assertEquals(9, handSize); - SpellAbility draw = findSAWithPrefix(dimirdgAfterCopy1, "{2}{U}"); - score = sim.simulateSpellAbility(draw).value; - AssertJUnit.assertTrue(score > 0); + SpellAbility draw = findSAWithPrefix(dimirdgAfterCopy1, "{2}{U}"); + score = sim.simulateSpellAbility(draw).value; + AssertJUnit.assertTrue(score > 0); - copiedPlayer = (Player)sim.getGameCopier().find(p); - handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - AssertJUnit.assertEquals(10, handSize); + copiedPlayer = (Player) sim.getGameCopier().find(p); + handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); + AssertJUnit.assertEquals(10, handSize); - simGame = sim.getSimulatedGameState(); + simGame = sim.getSimulatedGameState(); - bear = (Card)sim.getGameCopier().find(bear); + bear = (Card) sim.getGameCopier().find(bear); - // make new simulator so new SpellAbility is found - simGame = sim.getSimulatedGameState(); - sim = createSimulator(simGame, p); + // make new simulator so new SpellAbility is found + simGame = sim.getSimulatedGameState(); + sim = createSimulator(simGame, p); - //bear = (Card)sim.getGameCopier().find(bear); + // bear = (Card)sim.getGameCopier().find(bear); - simGame = sim.getSimulatedGameState(); + simGame = sim.getSimulatedGameState(); - Card dimirdgAfterFlip1 = (Card)sim.getGameCopier().find(dimirdgAfterCopy1); + Card dimirdgAfterFlip1 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); - AssertJUnit.assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); - AssertJUnit.assertEquals(2, dimirdgAfterFlip1.getNetPower()); - AssertJUnit.assertEquals(3, dimirdgAfterFlip1.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterFlip1.isFlipped()); - AssertJUnit.assertTrue(dimirdgAfterFlip1.getType().isLegendary()); + AssertJUnit.assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterFlip1.getNetPower()); + AssertJUnit.assertEquals(3, dimirdgAfterFlip1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.isFlipped()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.getType().isLegendary()); - saDimirClone = findSAWithPrefix(dimirdgAfterCopy1, "{1}{U}{B}"); - // Clone Bear first - saDimirClone.resetTargets(); - saDimirClone.getTargets().add(bear); + saDimirClone = findSAWithPrefix(dimirdgAfterCopy1, "{1}{U}{B}"); + // Clone Bear first + saDimirClone.resetTargets(); + saDimirClone.getTargets().add(bear); - score = sim.simulateSpellAbility(saDimirClone).value; - AssertJUnit.assertTrue(score > 0); + score = sim.simulateSpellAbility(saDimirClone).value; + AssertJUnit.assertTrue(score > 0); - Card dimirdgAfterCopy2 = (Card)sim.getGameCopier().find(dimirdgAfterCopy1); + Card dimirdgAfterCopy2 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); - //System.out.println(sim.getSimulatedGameState().getCardsIn(ZoneType.Battlefield)); + // System.out.println(sim.getSimulatedGameState().getCardsIn(ZoneType.Battlefield)); - System.out.println(dimirdgAfterCopy2.getName()); - System.out.println(dimirdgAfterCopy2.getCloneStates()); - System.out.println(dimirdgAfterCopy2.getOriginalState(CardStateName.Original).getName()); - System.out.println(dimirdgAfterCopy2.isFlipCard()); - System.out.println(dimirdgAfterCopy2.isFlipped()); + System.out.println(dimirdgAfterCopy2.getName()); + System.out.println(dimirdgAfterCopy2.getCloneStates()); + System.out.println(dimirdgAfterCopy2.getOriginalState(CardStateName.Original).getName()); + System.out.println(dimirdgAfterCopy2.isFlipCard()); + System.out.println(dimirdgAfterCopy2.isFlipped()); - AssertJUnit.assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetPower()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterCopy2.isFlipped()); - AssertJUnit.assertFalse(dimirdgAfterCopy2.getType().isLegendary()); - } + AssertJUnit.assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy2.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy2.getType().isLegendary()); + } - @Test + @Test public void testStaticMultiPump() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - Card c1 = addCard("Creakwood Liege", p); - Card c2 = addCard("Creakwood Liege", p); + Card c1 = addCard("Creakwood Liege", p); + Card c2 = addCard("Creakwood Liege", p); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - // update stats state - game.getAction().checkStateEffects(true); + // update stats state + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(4, c1.getNetPower()); - AssertJUnit.assertEquals(4, c1.getNetToughness()); + AssertJUnit.assertEquals(4, c1.getNetPower()); + AssertJUnit.assertEquals(4, c1.getNetToughness()); - AssertJUnit.assertEquals(4, c2.getNetPower()); - AssertJUnit.assertEquals(4, c2.getNetToughness()); - } + AssertJUnit.assertEquals(4, c2.getNetPower()); + AssertJUnit.assertEquals(4, c2.getNetToughness()); + } - @Test + @Test public void testPathtoExileActofTreason() { - Game game = initAndCreateGame(); - Player p0 = game.getPlayers().get(0); - Player p1 = game.getPlayers().get(1); - Card serraAngel = addCardToZone("Serra Angel", p1, ZoneType.Battlefield); - Card actOfTreason = addCardToZone("Act of Treason", p0, ZoneType.Hand); - Card pathToExile = addCardToZone("Path to Exile", p0, ZoneType.Hand); - for (int i = 0; i < 4; i++) { - addCardToZone("Plateau", p0, ZoneType.Battlefield); - } - addCardToZone("Island", p1, ZoneType.Library); - addCardToZone("Forest", p0, ZoneType.Library); + Game game = initAndCreateGame(); + Player p0 = game.getPlayers().get(0); + Player p1 = game.getPlayers().get(1); + Card serraAngel = addCardToZone("Serra Angel", p1, ZoneType.Battlefield); + Card actOfTreason = addCardToZone("Act of Treason", p0, ZoneType.Hand); + Card pathToExile = addCardToZone("Path to Exile", p0, ZoneType.Hand); + for (int i = 0; i < 4; i++) { + addCardToZone("Plateau", p0, ZoneType.Battlefield); + } + addCardToZone("Island", p1, ZoneType.Library); + addCardToZone("Forest", p0, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p0); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p0); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p0); + Game simGame = sim.getSimulatedGameState(); - SpellAbility actSA = actOfTreason.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(actSA); - actSA.setActivatingPlayer(p0); - actSA.setTargetCard(serraAngel); - sim.simulateSpellAbility(actSA); - simGame.getAction().checkStateEffects(true); + SpellAbility actSA = actOfTreason.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(actSA); + actSA.setActivatingPlayer(p0); + actSA.setTargetCard(serraAngel); + sim.simulateSpellAbility(actSA); + simGame.getAction().checkStateEffects(true); - SpellAbility pathSA = pathToExile.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(pathSA); - pathSA.setActivatingPlayer(p0); - pathSA.setTargetCard(serraAngel); - sim.simulateSpellAbility(pathSA); - simGame.getAction().checkStateEffects(true); + SpellAbility pathSA = pathToExile.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(pathSA); + pathSA.setActivatingPlayer(p0); + pathSA.setTargetCard(serraAngel); + sim.simulateSpellAbility(pathSA); + simGame.getAction().checkStateEffects(true); - int numForest = countCardsWithName(simGame, "Forest"); - AssertJUnit.assertEquals(1, numForest); - AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); - } + int numForest = countCardsWithName(simGame, "Forest"); + AssertJUnit.assertEquals(1, numForest); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); + } - @Test + @Test public void testAmassTrigger() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - String WCname = "Woodland Champion"; - addCard(WCname, p); - for (int i = 0; i < 5; i++) - addCard("Island", p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + String WCname = "Woodland Champion"; + addCard(WCname, p); + for (int i = 0; i < 5; i++) + addCard("Island", p); - String CardName = "Eternal Skylord"; - Card c = addCardToZone(CardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + String CardName = "Eternal Skylord"; + Card c = addCardToZone(CardName, p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbility playSa = c.getSpellAbilities().get(0); - playSa.setActivatingPlayer(p); + SpellAbility playSa = c.getSpellAbilities().get(0); + playSa.setActivatingPlayer(p); - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - Card simWC = findCardWithName(simGame, WCname); + Card simWC = findCardWithName(simGame, WCname); - AssertJUnit.assertEquals(1, simWC.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); - } + AssertJUnit.assertEquals(1, simWC.getPowerBonusFromCounters()); + AssertJUnit.assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); + } - @Test + @Test public void testEverAfterWithWaywardServant() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - String everAfter = "Ever After"; - String waywardServant = "Wayward Servant"; - String goblin = "Raging Goblin"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + String everAfter = "Ever After"; + String waywardServant = "Wayward Servant"; + String goblin = "Raging Goblin"; - for (int i = 0; i < 8; i++) - addCard("Swamp", p); + for (int i = 0; i < 8; i++) + addCard("Swamp", p); - Card cardEverAfter = addCardToZone(everAfter, p, ZoneType.Hand); - Card cardWaywardServant = addCardToZone(waywardServant, p, ZoneType.Graveyard); - Card cardRagingGoblin = addCardToZone(goblin, p, ZoneType.Graveyard); + Card cardEverAfter = addCardToZone(everAfter, p, ZoneType.Hand); + Card cardWaywardServant = addCardToZone(waywardServant, p, ZoneType.Graveyard); + Card cardRagingGoblin = addCardToZone(goblin, p, ZoneType.Graveyard); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbility playSa = cardEverAfter.getSpellAbilities().get(0); - playSa.setActivatingPlayer(p); - playSa.getTargets().add(cardWaywardServant); - playSa.getTargets().add(cardRagingGoblin); + SpellAbility playSa = cardEverAfter.getSpellAbilities().get(0); + playSa.setActivatingPlayer(p); + playSa.getTargets().add(cardWaywardServant); + playSa.getTargets().add(cardRagingGoblin); - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - Card simGoblin = findCardWithName(simGame, goblin); + Card simGoblin = findCardWithName(simGame, goblin); - simGame.getAction().checkStateEffects(true); - simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.MAIN2); + simGame.getAction().checkStateEffects(true); + simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.MAIN2); - AssertJUnit.assertEquals(21, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); - AssertJUnit.assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); - } + AssertJUnit.assertEquals(21, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); + AssertJUnit.assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); + } - @Test + @Test public void testCantBePrevented() { - String polukranosCardName = "Polukranos, Unchained"; - String hydraCardName = "Phyrexian Hydra"; - String leylineCardName = "Leyline of Punishment"; + String polukranosCardName = "Polukranos, Unchained"; + String hydraCardName = "Phyrexian Hydra"; + String leylineCardName = "Leyline of Punishment"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - Card polukranos = addCard(polukranosCardName, p); - polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null); - addCard(hydraCardName, p); - addCard(leylineCardName, p); - for (int i = 0; i < 2; ++i) { - addCard("Mountain", p); - } - Card pyroCard = addCardToZone("Pyroclasm", p, ZoneType.Hand); - SpellAbility pyroSA = pyroCard.getFirstSpellAbility(); + Card polukranos = addCard(polukranosCardName, p); + polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null); + addCard(hydraCardName, p); + addCard(leylineCardName, p); + for (int i = 0; i < 2; ++i) { + addCard("Mountain", p); + } + Card pyroCard = addCardToZone("Pyroclasm", p, ZoneType.Hand); + SpellAbility pyroSA = pyroCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(pyroSA); - Game simGame = sim.getSimulatedGameState(); - Card simPolukranos = findCardWithName(simGame, polukranosCardName); - Card simHydra = findCardWithName(simGame, hydraCardName); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(pyroSA); + Game simGame = sim.getSimulatedGameState(); + Card simPolukranos = findCardWithName(simGame, polukranosCardName); + Card simHydra = findCardWithName(simGame, hydraCardName); - AssertJUnit.assertTrue(simPolukranos.hasCounters()); - AssertJUnit.assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simPolukranos.getDamage()); + AssertJUnit.assertTrue(simPolukranos.hasCounters()); + AssertJUnit.assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPolukranos.getDamage()); - AssertJUnit.assertFalse(simHydra.hasCounters()); - AssertJUnit.assertEquals(2, simHydra.getDamage()); - } + AssertJUnit.assertFalse(simHydra.hasCounters()); + AssertJUnit.assertEquals(2, simHydra.getDamage()); + } - @Test + @Test public void testAlphaBrawl() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - String nishobaName = "Phantom Nishoba"; - String capridorName = "Stormwild Capridor"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String bearName = "Runeclaw Bear"; - String alphaBrawlName = "Alpha Brawl"; + String nishobaName = "Phantom Nishoba"; + String capridorName = "Stormwild Capridor"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String bearName = "Runeclaw Bear"; + String alphaBrawlName = "Alpha Brawl"; - // enough to cast Alpha Brawl - for (int i = 0; i < 8; ++i) { - addCard("Mountain", p2); - } + // enough to cast Alpha Brawl + for (int i = 0; i < 8; ++i) { + addCard("Mountain", p2); + } - Card nishoba = addCard(nishobaName, p1); - nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null); - addCard(capridorName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachToEntity(pridemate); - addCard(bearName, p1); + Card nishoba = addCard(nishobaName, p1); + nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null); + addCard(capridorName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); + indestructibility.attachToEntity(pridemate); + addCard(bearName, p1); - Card alphaBrawl = addCardToZone(alphaBrawlName, p2, ZoneType.Hand); - SpellAbility alphaBrawlSA = alphaBrawl.getFirstSpellAbility(); + Card alphaBrawl = addCardToZone(alphaBrawlName, p2, ZoneType.Hand); + SpellAbility alphaBrawlSA = alphaBrawl.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p2); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p2); + game.getAction().checkStateEffects(true); - GameSimulator sim = createSimulator(game, p2); - alphaBrawlSA.setTargetCard(nishoba); - sim.simulateSpellAbility(alphaBrawlSA); - Game simGame = sim.getSimulatedGameState(); - Card simNishoba = findCardWithName(simGame, nishobaName); - Card simCapridor = findCardWithName(simGame, capridorName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBear = findCardWithName(simGame, bearName); + GameSimulator sim = createSimulator(game, p2); + alphaBrawlSA.setTargetCard(nishoba); + sim.simulateSpellAbility(alphaBrawlSA); + Game simGame = sim.getSimulatedGameState(); + Card simNishoba = findCardWithName(simGame, nishobaName); + Card simCapridor = findCardWithName(simGame, capridorName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBear = findCardWithName(simGame, bearName); - // bear is destroyed - AssertJUnit.assertNull(simBear); + // bear is destroyed + AssertJUnit.assertNull(simBear); - AssertJUnit.assertNotNull(simNishoba); - AssertJUnit.assertTrue(simNishoba.hasCounters()); - // Damage prevented and only 1 +1/+1 counter is removed - AssertJUnit.assertEquals(0, simNishoba.getDamage()); - AssertJUnit.assertTrue(simNishoba.hasCounters()); - AssertJUnit.assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(6, simNishoba.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(6, simNishoba.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simNishoba); + AssertJUnit.assertTrue(simNishoba.hasCounters()); + // Damage prevented and only 1 +1/+1 counter is removed + AssertJUnit.assertEquals(0, simNishoba.getDamage()); + AssertJUnit.assertTrue(simNishoba.hasCounters()); + AssertJUnit.assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(6, simNishoba.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(6, simNishoba.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simCapridor); - // Damage prevented and that many +1/+1 counters are put - AssertJUnit.assertEquals(0, simCapridor.getDamage()); - AssertJUnit.assertTrue(simCapridor.hasCounters()); - AssertJUnit.assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(7, simCapridor.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(7, simCapridor.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simCapridor); + // Damage prevented and that many +1/+1 counters are put + AssertJUnit.assertEquals(0, simCapridor.getDamage()); + AssertJUnit.assertTrue(simCapridor.hasCounters()); + AssertJUnit.assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(7, simCapridor.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(7, simCapridor.getPowerBonusFromCounters()); - AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertEquals(7, simPridemate.getDamage()); - // Life gain only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertEquals(7, simPridemate.getDamage()); + // Life gain only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor is prevented) - AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); - } + // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor + // is prevented) + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); + } - @Test + @Test public void testGlarecaster() { - String glarecasterName = "Glarecaster"; + String glarecasterName = "Glarecaster"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); - Card glarecaster = addCard(glarecasterName, p); - // enough to activate Glarecaster and cast Inferno - for (int i = 0; i < 7; ++i) { - addCard("Plains", p); - addCard("Mountain", p); - } - Card infernoCard = addCardToZone("Inferno", p, ZoneType.Hand); - SpellAbility infernoSA = infernoCard.getFirstSpellAbility(); + Card glarecaster = addCard(glarecasterName, p); + // enough to activate Glarecaster and cast Inferno + for (int i = 0; i < 7; ++i) { + addCard("Plains", p); + addCard("Mountain", p); + } + Card infernoCard = addCardToZone("Inferno", p, ZoneType.Hand); + SpellAbility infernoSA = infernoCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); - AssertJUnit.assertNotNull(saGlarecaster); - saGlarecaster.getTargets().add(p2); + SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); + AssertJUnit.assertNotNull(saGlarecaster); + saGlarecaster.getTargets().add(p2); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(saGlarecaster).value; - AssertJUnit.assertTrue(score > 0); - sim.simulateSpellAbility(infernoSA); - Game simGame = sim.getSimulatedGameState(); - Card simGlarecaster = findCardWithName(simGame, glarecasterName); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(saGlarecaster).value; + AssertJUnit.assertTrue(score > 0); + sim.simulateSpellAbility(infernoSA); + Game simGame = sim.getSimulatedGameState(); + Card simGlarecaster = findCardWithName(simGame, glarecasterName); - AssertJUnit.assertNotNull(simGlarecaster); - AssertJUnit.assertEquals(0, simGlarecaster.getDamage()); + AssertJUnit.assertNotNull(simGlarecaster); + AssertJUnit.assertEquals(0, simGlarecaster.getDamage()); - // 6 * 3 = 18 damage are all dealt to p2 - AssertJUnit.assertEquals(20, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(2, simGame.getPlayers().get(1).getLife()); - } + // 6 * 3 = 18 damage are all dealt to p2 + AssertJUnit.assertEquals(20, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(2, simGame.getPlayers().get(1).getLife()); + } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java index c5031bbb480..520b032675b 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java @@ -31,111 +31,111 @@ import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; public class SimulationTest { - private static boolean initialized = false; + private static boolean initialized = false; - protected Game initAndCreateGame() { + protected Game initAndCreateGame() { - if (!initialized) { - GuiBase.setInterface(new GuiDesktop()); - FModel.initialize(null, new Function() { - @Override - public Void apply(ForgePreferences preferences) { - preferences.setPref(FPref.LOAD_CARD_SCRIPTS_LAZILY, false); - preferences.setPref(FPref.UI_LANGUAGE, "en-US"); - return null; - } - }); - initialized = true; - } + if (!initialized) { + GuiBase.setInterface(new GuiDesktop()); + FModel.initialize(null, new Function() { + @Override + public Void apply(ForgePreferences preferences) { + preferences.setPref(FPref.LOAD_CARD_SCRIPTS_LAZILY, false); + preferences.setPref(FPref.UI_LANGUAGE, "en-US"); + return null; + } + }); + initialized = true; + } - // need to be done after FModel.initialize, or the Localizer isn't loaded yet - List players = Lists.newArrayList(); - Deck d1 = new Deck(); - players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p2", null))); - Set options = new HashSet<>(); - options.add(AIOption.USE_SIMULATION); - players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p1", options))); - GameRules rules = new GameRules(GameType.Constructed); - Match match = new Match(rules, players, "Test"); - Game game = new Game(players, rules, match); - game.setAge(GameStage.Play); + // need to be done after FModel.initialize, or the Localizer isn't loaded yet + List players = Lists.newArrayList(); + Deck d1 = new Deck(); + players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p2", null))); + Set options = new HashSet<>(); + options.add(AIOption.USE_SIMULATION); + players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p1", options))); + GameRules rules = new GameRules(GameType.Constructed); + Match match = new Match(rules, players, "Test"); + Game game = new Game(players, rules, match); + game.setAge(GameStage.Play); - return game; - } + return game; + } - protected GameSimulator createSimulator(Game game, Player p) { - return new GameSimulator(new SimulationController(new Score(0)) { - @Override - public boolean shouldRecurse() { - return false; - } - }, game, p, null); - } + protected GameSimulator createSimulator(Game game, Player p) { + return new GameSimulator(new SimulationController(new Score(0)) { + @Override + public boolean shouldRecurse() { + return false; + } + }, game, p, null); + } - protected int countCardsWithName(Game game, String name) { - int i = 0; - for (Card c : game.getCardsIn(ZoneType.Battlefield)) { - if (c.getName().equals(name)) { - i++; - } - } - return i; - } + protected int countCardsWithName(Game game, String name) { + int i = 0; + for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + if (c.getName().equals(name)) { + i++; + } + } + return i; + } - protected Card findCardWithName(Game game, String name) { - for (Card c : game.getCardsIn(ZoneType.Battlefield)) { - if (c.getName().equals(name)) { - return c; - } - } - return null; - } - - protected String gameStateToString(Game game) { - StringBuilder sb = new StringBuilder(); - for (ZoneType zone : ZoneType.values()) { - CardCollectionView cards = game.getCardsIn(zone); - if (!cards.isEmpty()) { - sb.append("Zone ").append(zone.name()).append(":\n"); - for (Card c : game.getCardsIn(zone)) { - sb.append(" ").append(c).append("\n"); - } - } - } - return sb.toString(); - } + protected Card findCardWithName(Game game, String name) { + for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + if (c.getName().equals(name)) { + return c; + } + } + return null; + } - protected SpellAbility findSAWithPrefix(Card c, String prefix) { - return findSAWithPrefix(c.getSpellAbilities(), prefix); - } - - protected SpellAbility findSAWithPrefix(Iterable abilities, String prefix) { - for (SpellAbility sa : abilities) { - if (sa.getDescription().startsWith(prefix)) { - return sa; - } - } - return null; - } + protected String gameStateToString(Game game) { + StringBuilder sb = new StringBuilder(); + for (ZoneType zone : ZoneType.values()) { + CardCollectionView cards = game.getCardsIn(zone); + if (!cards.isEmpty()) { + sb.append("Zone ").append(zone.name()).append(":\n"); + for (Card c : game.getCardsIn(zone)) { + sb.append(" ").append(c).append("\n"); + } + } + } + return sb.toString(); + } - protected Card createCard(String name, Player p) { - IPaperCard paperCard = FModel.getMagicDb().getCommonCards().getCard(name); - if (paperCard == null) { - StaticData.instance().attemptToLoadCard(name); - paperCard = FModel.getMagicDb().getCommonCards().getCard(name); - } - return Card.fromPaperCard(paperCard, p); - } + protected SpellAbility findSAWithPrefix(Card c, String prefix) { + return findSAWithPrefix(c.getSpellAbilities(), prefix); + } - protected Card addCardToZone(String name, Player p, ZoneType zone) { - Card c = createCard(name, p); - // card need a new Timestamp otherwise Static Abilities might collide - c.setTimestamp(p.getGame().getNextTimestamp()); - p.getZone(zone).add(c); - return c; - } + protected SpellAbility findSAWithPrefix(Iterable abilities, String prefix) { + for (SpellAbility sa : abilities) { + if (sa.getDescription().startsWith(prefix)) { + return sa; + } + } + return null; + } - protected Card addCard(String name, Player p) { - return addCardToZone(name, p, ZoneType.Battlefield); - } + protected Card createCard(String name, Player p) { + IPaperCard paperCard = FModel.getMagicDb().getCommonCards().getCard(name); + if (paperCard == null) { + StaticData.instance().attemptToLoadCard(name); + paperCard = FModel.getMagicDb().getCommonCards().getCard(name); + } + return Card.fromPaperCard(paperCard, p); + } + + protected Card addCardToZone(String name, Player p, ZoneType zone) { + Card c = createCard(name, p); + // card need a new Timestamp otherwise Static Abilities might collide + c.setTimestamp(p.getGame().getNextTimestamp()); + p.getZone(zone).add(c); + return c; + } + + protected Card addCard(String name, Player p) { + return addCardToZone(name, p, ZoneType.Battlefield); + } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java index 07a9bea458a..c67d7576ee5 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java @@ -15,394 +15,396 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; public class SpellAbilityPickerSimulationTest extends SimulationTest { - @Test + @Test public void testPickingLethalDamage() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - p.setTeam(0); - - addCard("Mountain", p); - addCardToZone("Shock", p, ZoneType.Hand); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + p.setTeam(0); - Player opponent = game.getPlayers().get(0); - opponent.setTeam(1); - - addCard("Runeclaw Bear", opponent); - opponent.setLife(2, null); + addCard("Mountain", p); + addCardToZone("Shock", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + Player opponent = game.getPlayers().get(0); + opponent.setTeam(1); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertNull(sa.getTargetCard()); - AssertJUnit.assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); - } + addCard("Runeclaw Bear", opponent); + opponent.setLife(2, null); - @Test + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertNull(sa.getTargetCard()); + AssertJUnit.assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); + } + + @Test public void testPickingKillingCreature() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCardToZone("Shock", p, ZoneType.Hand); + addCard("Mountain", p); + addCardToZone("Shock", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - Card bearCard = addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); + Player opponent = game.getPlayers().get(0); + Card bearCard = addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals(bearCard, sa.getTargetCard()); - AssertJUnit.assertNull(sa.getTargets().getFirstTargetedPlayer()); - } + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(bearCard, sa.getTargetCard()); + AssertJUnit.assertNull(sa.getTargets().getFirstTargetedPlayer()); + } - @Test + @Test public void testSequenceStartingWithPlayingLand() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - Card mountain = addCardToZone("Mountain", p, ZoneType.Hand); - addCardToZone("Shock", p, ZoneType.Hand); + Card mountain = addCardToZone("Mountain", p, ZoneType.Hand); + addCardToZone("Shock", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - //assertEquals(game.PLAY_LAND_SURROGATE, sa); - AssertJUnit.assertEquals(mountain, sa.getHostCard()); + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + // assertEquals(game.PLAY_LAND_SURROGATE, sa); + AssertJUnit.assertEquals(mountain, sa.getHostCard()); - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(2, plan.getDecisions().size()); - AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); - AssertJUnit.assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); - AssertJUnit.assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); - } + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); + AssertJUnit.assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); + } - @Test + @Test public void testModeSelection() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Island", p); - addCard("Swamp", p); - Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); + addCard("Plains", p); + addCard("Island", p); + addCard("Swamp", p); + Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected: All creatures get -2/-2 to kill the bear. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", picker.getPlan().getDecisions().get(0).modesStr); - } + // Expected: All creatures get -2/-2 to kill the bear. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", + picker.getPlan().getDecisions().get(0).modesStr); + } - @Test + @Test public void testModeSelection2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Island", p); - addCard("Swamp", p); - Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); + addCard("Plains", p); + addCard("Island", p); + addCard("Swamp", p); + Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected: Gain 5 life, since other modes aren't helpful. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); - } + // Expected: Gain 5 life, since other modes aren't helpful. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); + } - @Test + @Test public void testMultipleModes() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected: 2x 1 damage to each creature, 1x 2 damage to each opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + // Expected: 2x 1 damage to each creature, 1x 2 damage to each opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - String dmgCreaturesStr = "Fiery Confluence deals 1 damage to each creature."; - String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; - String expected = "Fiery Confluence -> " + dmgCreaturesStr + " " + dmgCreaturesStr + " " + dmgOppStr; - AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); - } + String dmgCreaturesStr = "Fiery Confluence deals 1 damage to each creature."; + String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; + String expected = "Fiery Confluence -> " + dmgCreaturesStr + " " + dmgCreaturesStr + " " + dmgOppStr; + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + } - @Test + @Test public void testMultipleModes2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(6, null); + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(6, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected: 3x 2 damage to each opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + // Expected: 3x 2 damage to each opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; - String expected = "Fiery Confluence -> " + dmgOppStr + " " + dmgOppStr + " " + dmgOppStr; - AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); - } + String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; + String expected = "Fiery Confluence -> " + dmgOppStr + " " + dmgOppStr + " " + dmgOppStr; + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + } - @Test + @Test public void testMultipleTargets() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Arc Trail", p, ZoneType.Hand); + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Arc Trail", p, ZoneType.Hand); - Player opponent = game.getPlayers().get(0); - Card bear = addCard("Runeclaw Bear", opponent); - Card men = addCard("Flying Men", opponent); - opponent.setLife(20, null); + Player opponent = game.getPlayers().get(0); + Card bear = addCard("Runeclaw Bear", opponent); + Card men = addCard("Flying Men", opponent); + opponent.setLife(20, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals(bear, sa.getTargetCard()); - AssertJUnit.assertEquals("2", sa.getParam("NumDmg")); - SpellAbility subSa = sa.getSubAbility(); - AssertJUnit.assertEquals(men, subSa.getTargetCard()); - AssertJUnit.assertEquals("1", subSa.getParam("NumDmg")); - } + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(bear, sa.getTargetCard()); + AssertJUnit.assertEquals("2", sa.getParam("NumDmg")); + SpellAbility subSa = sa.getSubAbility(); + AssertJUnit.assertEquals(men, subSa.getTargetCard()); + AssertJUnit.assertEquals("1", subSa.getParam("NumDmg")); + } - @Test + @Test public void testLandSearchForCombo() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Forest", p); - addCard("Thespian's Stage", p); - Card darkDepths = addCard("Dark Depths", p); + addCard("Forest", p); + addCard("Thespian's Stage", p); + Card darkDepths = addCard("Dark Depths", p); - Card cropRotation = addCardToZone("Crop Rotation", p, ZoneType.Hand); + Card cropRotation = addCardToZone("Crop Rotation", p, ZoneType.Hand); - addCardToZone("Forest", p, ZoneType.Library); - addCardToZone("Urborg, Tomb of Yawgmoth", p, ZoneType.Library); - addCardToZone("Swamp", p, ZoneType.Library); + addCardToZone("Forest", p, ZoneType.Library); + addCardToZone("Urborg, Tomb of Yawgmoth", p, ZoneType.Library); + addCardToZone("Swamp", p, ZoneType.Library); - darkDepths.setCounters(CounterEnumType.ICE, 10); + darkDepths.setCounters(CounterEnumType.ICE, 10); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(cropRotation.getSpellAbilities().get(0), sa); - // Expected: Sac a Forest to get an Urborg. - List choices = picker.getPlan().getDecisions().get(0).choices; - AssertJUnit.assertEquals(2, choices.size()); - AssertJUnit.assertEquals("Forest", choices.get(0)); - AssertJUnit.assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); - // Next, expected to use Thespian's Stage to copy Dark Depths. - Plan.Decision d2 = picker.getPlan().getDecisions().get(1); - String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; - AssertJUnit.assertEquals(expected, d2.saRef.toString()); - AssertJUnit.assertTrue(d2.targets.toString().contains("Dark Depths")); - } + AssertJUnit.assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(cropRotation.getSpellAbilities().get(0), sa); + // Expected: Sac a Forest to get an Urborg. + List choices = picker.getPlan().getDecisions().get(0).choices; + AssertJUnit.assertEquals(2, choices.size()); + AssertJUnit.assertEquals("Forest", choices.get(0)); + AssertJUnit.assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); + // Next, expected to use Thespian's Stage to copy Dark Depths. + Plan.Decision d2 = picker.getPlan().getDecisions().get(1); + String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; + AssertJUnit.assertEquals(expected, d2.saRef.toString()); + AssertJUnit.assertTrue(d2.targets.toString().contains("Dark Depths")); + } - @Test + @Test public void testPlayRememberedCardsLand() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); - addCardToZone("Lightning Bolt", p, ZoneType.Hand); - // Note: This assumes the top of library is revealed. If the AI is made - // smarter to not assume that, then this test can be updated to have - // something that reveals top of library active - e.g. Lens of Clarity. - addCardToZone("Mountain", p, ZoneType.Library); + addCard("Mountain", p); + addCard("Mountain", p); + Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); + addCardToZone("Lightning Bolt", p, ZoneType.Hand); + // Note: This assumes the top of library is revealed. If the AI is made + // smarter to not assume that, then this test can be updated to have + // something that reveals top of library active - e.g. Lens of Clarity. + addCardToZone("Mountain", p, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected plan: - // 1. Play Abbot. - // 2. Play land exiled by Abbot. - // 3. Play Bolt targeting opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(3, plan.getDecisions().size()); - AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); - AssertJUnit.assertEquals("Lightning Bolt deals 3 damage to any target.", plan.getDecisions().get(2).saRef.toString()); - } + // Expected plan: + // 1. Play Abbot. + // 2. Play land exiled by Abbot. + // 3. Play Bolt targeting opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(3, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertEquals("Lightning Bolt deals 3 damage to any target.", + plan.getDecisions().get(2).saRef.toString()); + } - @Test + @Test public void testPlayRememberedCardsSpell() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); - // Note: This assumes the top of library is revealed. If the AI is made - // smarter to not assume that, then this test can be updated to have - // something that reveals top of library active - e.g. Lens of Clarity. - addCardToZone("Lightning Bolt", p, ZoneType.Library); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); + // Note: This assumes the top of library is revealed. If the AI is made + // smarter to not assume that, then this test can be updated to have + // something that reveals top of library active - e.g. Lens of Clarity. + addCardToZone("Lightning Bolt", p, ZoneType.Library); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - // Expected plan: - // 1. Play Abbot. - // 3. Play Bolt exiled by Abbot. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(2, plan.getDecisions().size()); - String saDesc = plan.getDecisions().get(1).saRef.toString(); - AssertJUnit.assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); - } - - @Test + // Expected plan: + // 1. Play Abbot. + // 3. Play Bolt exiled by Abbot. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); + String saDesc = plan.getDecisions().get(1).saRef.toString(); + AssertJUnit.assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); + } + + @Test public void testPlayingPumpSpellsAfterBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); - - Card blocker = addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - Card attacker2 = addCard("Dwarven Trader", p); - attacker2.setSickness(false); - addCard("Mountain", p); - addCardToZone("Brute Force", p, ZoneType.Hand); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + Card blocker = addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + Card attacker2 = addCard("Dwarven Trader", p); + attacker2.setSickness(false); + addCard("Mountain", p); + addCardToZone("Brute Force", p, ZoneType.Hand); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - game.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_BEGIN); - game.getAction().checkStateEffects(true); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); - game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, p); - Combat combat = new Combat(p); - combat.addAttacker(attacker1, opponent); - combat.addAttacker(attacker2, opponent); - game.getPhaseHandler().setCombat(combat); - game.getAction().checkStateEffects(true); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + game.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_BEGIN); + game.getAction().checkStateEffects(true); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); - game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_BLOCKERS, p, false); - game.getAction().checkStateEffects(true); - combat.addBlocker(attacker1, blocker); - combat.getBandOfAttacker(attacker1).setBlocked(true); - combat.getBandOfAttacker(attacker2).setBlocked(false); - combat.orderBlockersForDamageAssignment(); - combat.orderAttackersForDamageAssignment(); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); - AssertJUnit.assertEquals(attacker2, sa.getTargetCard()); - } - - @Test + game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, p); + Combat combat = new Combat(p); + combat.addAttacker(attacker1, opponent); + combat.addAttacker(attacker2, opponent); + game.getPhaseHandler().setCombat(combat); + game.getAction().checkStateEffects(true); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + + game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_BLOCKERS, p, false); + game.getAction().checkStateEffects(true); + combat.addBlocker(attacker1, blocker); + combat.getBandOfAttacker(attacker1).setBlocked(true); + combat.getBandOfAttacker(attacker2).setBlocked(false); + combat.orderBlockersForDamageAssignment(); + combat.orderAttackersForDamageAssignment(); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); + AssertJUnit.assertEquals(attacker2, sa.getTargetCard()); + } + + @Test public void testPlayingSorceryPumpSpellsBeforeBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); - addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - Card attacker2 = addCard("Kird Ape", p); - attacker2.setSickness(false); - addCard("Mountain", p); - Card furor = addCardToZone("Furor of the Bitten", p, ZoneType.Hand); + addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + Card attacker2 = addCard("Kird Ape", p); + attacker2.setSickness(false); + addCard("Mountain", p); + Card furor = addCardToZone("Furor of the Bitten", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals(furor.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals(attacker1, sa.getTargetCard()); - } + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(furor.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(attacker1, sa.getTargetCard()); + } - @Test + @Test public void testPlayingRemovalBeforeBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); - Card blocker = addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - addCard("Swamp", p); - addCard("Swamp", p); - addCardToZone("Doom Blade", p, ZoneType.Hand); + Card blocker = addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + addCard("Swamp", p); + addCard("Swamp", p); + addCardToZone("Doom Blade", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals("Destroy target nonblack creature.", sa.toString()); - AssertJUnit.assertEquals(blocker, sa.getTargetCard()); - } + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Destroy target nonblack creature.", sa.toString()); + AssertJUnit.assertEquals(blocker, sa.getTargetCard()); + } } From e570222e31f48b47d10a97ddb06b2fc230be0608 Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Mon, 18 Apr 2022 15:27:25 -0300 Subject: [PATCH 6/7] format: convert tabs to spaces --- .../forge/game/ability/AbilityKeyTest.java | 26 +- .../game/mana/ManaCostBeingPaidTest.java | 40 +- .../ai/simulation/GameSimulationTest.java | 4402 ++++++++--------- .../forge/ai/simulation/SimulationTest.java | 188 +- .../SpellAbilityPickerSimulationTest.java | 784 +-- 5 files changed, 2720 insertions(+), 2720 deletions(-) diff --git a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java index 7090bf45c4c..17153e069cc 100644 --- a/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java +++ b/forge-game/src/test/java/forge/game/ability/AbilityKeyTest.java @@ -8,19 +8,19 @@ import com.google.common.collect.Maps; public class AbilityKeyTest { - @Test - public void testFromStringWorksForAllKeys() { - for (AbilityKey key : AbilityKey.values()) { - AssertJUnit.assertEquals(key, AbilityKey.fromString(key.toString())); - } - } + @Test + public void testFromStringWorksForAllKeys() { + for (AbilityKey key : AbilityKey.values()) { + AssertJUnit.assertEquals(key, AbilityKey.fromString(key.toString())); + } + } - @Test - public void testCopyingEmptyMapWorks() { - Map map = Maps.newHashMap(); - Map newMap = AbilityKey.newMap(map); + @Test + public void testCopyingEmptyMapWorks() { + Map map = Maps.newHashMap(); + Map newMap = AbilityKey.newMap(map); - // An actual copy should be made. - AssertJUnit.assertNotSame(map, newMap); - } + // An actual copy should be made. + AssertJUnit.assertNotSame(map, newMap); + } } diff --git a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java index 7612c649bb7..5f0fc78f7e3 100644 --- a/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java +++ b/forge-game/src/test/java/forge/game/mana/ManaCostBeingPaidTest.java @@ -12,30 +12,30 @@ import forge.card.mana.ManaCostParser; public class ManaCostBeingPaidTest { - @Test - public void testPayManaViaConvoke() { - runConvokeTest("1 W W", new byte[] { WHITE, COLORLESS, WHITE }, new String[] { "{1}{W}{W}", "{1}{W}", "{W}" }); - runConvokeTest("1 W W", new byte[] { COLORLESS, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); - runConvokeTest("1 W W", new byte[] { GREEN, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); - runConvokeTest("1 W G", new byte[] { GREEN, RED, WHITE }, new String[] { "{1}{W}{G}", "{1}{W}", "{W}" }); - } + @Test + public void testPayManaViaConvoke() { + runConvokeTest("1 W W", new byte[] { WHITE, COLORLESS, WHITE }, new String[] { "{1}{W}{W}", "{1}{W}", "{W}" }); + runConvokeTest("1 W W", new byte[] { COLORLESS, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); + runConvokeTest("1 W W", new byte[] { GREEN, WHITE, WHITE }, new String[] { "{1}{W}{W}", "{W}{W}", "{W}" }); + runConvokeTest("1 W G", new byte[] { GREEN, RED, WHITE }, new String[] { "{1}{W}{G}", "{1}{W}", "{W}" }); + } - private void runConvokeTest(String initialCost, byte[] colorsToPay, String[] expectedRemainder) { + private void runConvokeTest(String initialCost, byte[] colorsToPay, String[] expectedRemainder) { - ManaCostBeingPaid costBeingPaid = createManaCostBeingPaid(initialCost); + ManaCostBeingPaid costBeingPaid = createManaCostBeingPaid(initialCost); - for (int i = 0; i < colorsToPay.length; i++) { - AssertJUnit.assertEquals(expectedRemainder[i], costBeingPaid.toString()); - costBeingPaid.payManaViaConvoke(colorsToPay[i]); - } + for (int i = 0; i < colorsToPay.length; i++) { + AssertJUnit.assertEquals(expectedRemainder[i], costBeingPaid.toString()); + costBeingPaid.payManaViaConvoke(colorsToPay[i]); + } - AssertJUnit.assertEquals("0", costBeingPaid.toString()); - } + AssertJUnit.assertEquals("0", costBeingPaid.toString()); + } - private ManaCostBeingPaid createManaCostBeingPaid(String costString) { - ManaCostParser parsedCostString = new ManaCostParser(costString); - ManaCost manaCost = new ManaCost(parsedCostString); + private ManaCostBeingPaid createManaCostBeingPaid(String costString) { + ManaCostParser parsedCostString = new ManaCostParser(costString); + ManaCost manaCost = new ManaCost(parsedCostString); - return new ManaCostBeingPaid(manaCost); - } + return new ManaCostBeingPaid(manaCost); + } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java index 987c7ee7a10..7b6319f11f4 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/GameSimulationTest.java @@ -23,2375 +23,2375 @@ import forge.game.zone.ZoneType; public class GameSimulationTest extends SimulationTest { - @Test - public void testActivateAbilityTriggers() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Plains", p); - addCard("Plains", p); - addCard("Plains", p); - String heraldCardName = "Herald of Anafenza"; - Card herald = addCard(heraldCardName, p); - herald.setSickness(false); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - AssertJUnit.assertNotNull(outlastSA); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(outlastSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - - Card heraldCopy = findCardWithName(simGame, heraldCardName); - AssertJUnit.assertNotNull(heraldCopy); - AssertJUnit.assertTrue(heraldCopy.isTapped()); - AssertJUnit.assertTrue(heraldCopy.hasCounters()); - AssertJUnit.assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, heraldCopy.getPowerBonusFromCounters()); - - Card warriorToken = findCardWithName(simGame, "Warrior Token"); - AssertJUnit.assertNotNull(warriorToken); - AssertJUnit.assertTrue(warriorToken.isSick()); - AssertJUnit.assertEquals(1, warriorToken.getCurrentPower()); - AssertJUnit.assertEquals(1, warriorToken.getCurrentToughness()); - } - - @Test - public void testStaticAbilities() { - String sliverCardName = "Sidewinder Sliver"; - String heraldCardName = "Herald of Anafenza"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sliver = addCard(sliverCardName, p); - sliver.setSickness(false); - Card herald = addCard(heraldCardName, p); - herald.setSickness(false); - addCard("Plains", p); - addCard("Plains", p); - addCard("Plains", p); - addCard("Spear of Heliod", p); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertEquals(1, sliver.getAmountOfKeyword("Flanking")); - AssertJUnit.assertEquals(2, sliver.getNetPower()); - AssertJUnit.assertEquals(2, sliver.getNetToughness()); - - SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); - AssertJUnit.assertNotNull(outlastSA); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(outlastSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - Card sliverCopy = findCardWithName(simGame, sliverCardName); - AssertJUnit.assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); - AssertJUnit.assertEquals(2, sliver.getNetPower()); - AssertJUnit.assertEquals(2, sliver.getNetToughness()); - } - - @Test - public void testStaticEffectsMonstrous() { - String lionCardName = "Fleecemane Lion"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card lion = addCard(lionCardName, p); - lion.setSickness(false); - lion.setMonstrous(true); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(lion.isMonstrous()); - AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Hexproof")); - AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Indestructible")); - - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card lionCopy = findCardWithName(simGame, lionCardName); - AssertJUnit.assertTrue(lionCopy.isMonstrous()); - AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); - AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); - } - - @Test - public void testEquippedAbilities() { - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card cloak = addCard("Whispersilk Cloak", p); - cloak.attachToEntity(bear); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Unblockable")); - - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card bearCopy = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); - } - - @Test - public void testEnchantedAbilities() { - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card lifelink = addCard("Lifelink", p); - lifelink.attachToEntity(bear); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Lifelink")); - - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - Card bearCopy = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); - } - - @Test - public void testEtbTriggers() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Black Knight", p); - for (int i = 0; i < 5; i++) - addCard("Swamp", p); - - String merchantCardName = "Gray Merchant of Asphodel"; - Card c = addCardToZone(merchantCardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility playMerchantSa = c.getSpellAbilities().get(0); - playMerchantSa.setActivatingPlayer(p); - - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playMerchantSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(24, simGame.getPlayers().get(1).getLife()); - AssertJUnit.assertEquals(16, simGame.getPlayers().get(0).getLife()); - } - - @Test - public void testSimulateUnmorph() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card ripper = createCard("Ruthless Ripper", p); - ripper.turnFaceDownNoUpdate(); - p.getZone(ZoneType.Battlefield).add(ripper); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertEquals(20, game.getPlayers().get(0).getLife()); - - GameSimulator sim = createSimulator(game, p); - Game simGame = sim.getSimulatedGameState(); - - SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); - AssertJUnit.assertNotNull(unmorphSA); - sim.simulateSpellAbility(unmorphSA); - AssertJUnit.assertEquals(18, simGame.getPlayers().get(0).getLife()); - } - - @Test - public void testFindingOwnCard() { - Game game = initAndCreateGame(); - Player p0 = game.getPlayers().get(0); - Player p1 = game.getPlayers().get(1); - addCardToZone("Skull Fracture", p0, ZoneType.Hand); - addCardToZone("Runeclaw Bear", p0, ZoneType.Hand); - Card fractureP1 = addCardToZone("Skull Fracture", p1, ZoneType.Hand); - addCard("Swamp", p1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p1); - Game simGame = sim.getSimulatedGameState(); - - SpellAbility fractureSa = fractureP1.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(fractureSa); - fractureSa.getTargets().add(p0); - sim.simulateSpellAbility(fractureSa); - AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); - AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); - } - - @Test - public void testPlaneswalkerAbilities() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sorin = addCard("Sorin, Solemn Visitor", p); - sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); - List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); - SpellAbility minusTwo = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - AssertJUnit.assertNotNull(minusTwo); - minusTwo.setActivatingPlayer(p); - AssertJUnit.assertTrue(minusTwo.canPlay()); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(minusTwo); - Game simGame = sim.getSimulatedGameState(); - Card vampireToken = findCardWithName(simGame, "Vampire Token"); - AssertJUnit.assertNotNull(vampireToken); - - Player simP = simGame.getPlayers().get(1); - cards = ComputerUtilAbility.getAvailableCards(simGame, simP); - abilities = ComputerUtilAbility.getSpellAbilities(cards, simP); - SpellAbility minusTwoSim = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - AssertJUnit.assertNotNull(minusTwoSim); - minusTwoSim.setActivatingPlayer(simP); - AssertJUnit.assertFalse(minusTwoSim.canPlay()); - AssertJUnit.assertEquals(1, minusTwoSim.getActivationsThisTurn()); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Player copyP = copy.getPlayers().get(1); - cards = ComputerUtilAbility.getAvailableCards(copy, copyP); - abilities = ComputerUtilAbility.getSpellAbilities(cards, copyP); - SpellAbility minusTwoCopy = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); - minusTwoCopy.setActivatingPlayer(copyP); - AssertJUnit.assertFalse(minusTwoCopy.canPlay()); - AssertJUnit.assertEquals(1, minusTwoCopy.getActivationsThisTurn()); - } - - @Test - public void testPlaneswalkerEmblems() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - String bearCardName = "Runeclaw Bear"; - addCard(bearCardName, p); - Card gideon = addCard("Gideon, Ally of Zendikar", p); - gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); - List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); - SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); - AssertJUnit.assertNotNull(minusFour); - minusFour.setActivatingPlayer(p); - AssertJUnit.assertTrue(minusFour.canPlay()); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(minusFour); - Game simGame = sim.getSimulatedGameState(); - Card simBear = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(3, simBear.getNetPower()); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card copyBear = findCardWithName(copy, bearCardName); - AssertJUnit.assertEquals(3, copyBear.getNetPower()); - } - - @Test - public void testManifest() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Ornithopter", p, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); - - SpellAbility unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(p, false), - "Unmanifest"); - AssertJUnit.assertNotNull(unmanifestSA); - AssertJUnit.assertEquals(2, manifestedCreature.getNetPower()); - AssertJUnit.assertFalse(manifestedCreature.hasKeyword("Flying")); - - GameSimulator sim2 = createSimulator(simGame, simGame.getPlayers().get(1)); - Game simGame2 = sim2.getSimulatedGameState(); - manifestedCreature = findCardWithName(simGame2, ""); - unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(simGame2.getPlayers().get(1), false), - "Unmanifest"); - - sim2.simulateSpellAbility(unmanifestSA); - - Card ornithopter = findCardWithName(simGame2, "Ornithopter"); - AssertJUnit.assertEquals(0, ornithopter.getNetPower()); - AssertJUnit.assertTrue(ornithopter.hasKeyword("Flying")); - AssertJUnit.assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); - - GameCopier copier = new GameCopier(simGame2); - Game copy = copier.makeCopy(); - Card ornithopterCopy = findCardWithName(copy, "Ornithopter"); - AssertJUnit.assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); - } - - @Test - public void testManifest2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Plains", p, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card manifestedCreatureCopy = findCardWithName(copy, ""); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); - } - - @Test - public void testManifest3() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Plains", p); - addCard("Plains", p); - Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); - addCardToZone("Dryad Arbor", p, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(manifestSA); - Game simGame = sim.getSimulatedGameState(); - Card manifestedCreature = findCardWithName(simGame, ""); - AssertJUnit.assertNotNull(manifestedCreature); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card manifestedCreatureCopy = findCardWithName(copy, ""); - AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); - } - - @Test - public void testTypeOfPermanentChanging() { - String sarkhanCardName = "Sarkhan, the Dragonspeaker"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card sarkhan = addCard(sarkhanCardName, p); - sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertFalse(sarkhan.isCreature()); - AssertJUnit.assertTrue(sarkhan.isPlaneswalker()); - - SpellAbility becomeDragonSA = findSAWithPrefix(sarkhan, "+1"); - AssertJUnit.assertNotNull(becomeDragonSA); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(becomeDragonSA); - Game simGame = sim.getSimulatedGameState(); - Card sarkhanSim = findCardWithName(simGame, sarkhanCardName); - AssertJUnit.assertTrue(sarkhanSim.isCreature()); - AssertJUnit.assertFalse(sarkhanSim.isPlaneswalker()); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card sarkhanCopy = findCardWithName(copy, sarkhanCardName); - AssertJUnit.assertTrue(sarkhanCopy.isCreature()); - AssertJUnit.assertFalse(sarkhanCopy.isPlaneswalker()); - } - - @Test - public void testDistributeCountersAbility() { - String ajaniCardName = "Ajani, Mentor of Heroes"; - String ornithoperCardName = "Ornithopter"; - String bearCardName = "Runeclaw Bear"; - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard(ornithoperCardName, p); - addCard(bearCardName, p); - Card ajani = addCard(ajaniCardName, p); - ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility sa = findSAWithPrefix(ajani, "+1: Distribute"); - AssertJUnit.assertNotNull(sa); - sa.setActivatingPlayer(p); - - MultiTargetSelector selector = new MultiTargetSelector(sa, null); - while (selector.selectNextTargets()) { - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); - Card thopterSim = findCardWithName(simGame, ornithoperCardName); - Card bearSim = findCardWithName(simGame, bearCardName); - AssertJUnit.assertEquals(3, - thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); - } - } - - @Test - public void testDamagePreventedTrigger() { - String ajaniCardName = "Ajani Steadfast"; - String selflessCardName = "Selfless Squire"; - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - addCard(selflessCardName, p); - addCard("Mountain", p); - Card boltCard = addCardToZone("Lightning Bolt", p, ZoneType.Hand); - SpellAbility boltSA = boltCard.getFirstSpellAbility(); - - Card ajani = addCard(ajaniCardName, p); - ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility sa = findSAWithPrefix(ajani, "-7:"); - AssertJUnit.assertNotNull(sa); - sa.setActivatingPlayer(p); - - GameSimulator sim = createSimulator(game, p); - boltSA.getTargets().add(p); - sim.simulateSpellAbility(sa); - sim.simulateSpellAbility(boltSA); - Game simGame = sim.getSimulatedGameState(); - Card simSelfless = findCardWithName(simGame, selflessCardName); - - // only one damage - AssertJUnit.assertEquals(19, simGame.getPlayers().get(0).getLife()); - - // only triggered once - AssertJUnit.assertTrue(simSelfless.hasCounters()); - AssertJUnit.assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simSelfless.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(2, simSelfless.getPowerBonusFromCounters()); - } - - @Test - public void testChosenColors() { - String bearCardName = "Runeclaw Bear"; - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Card bear = addCard(bearCardName, p); - Card hall = addCard("Hall of Triumph", p); - hall.setChosenColors(Lists.newArrayList("green")); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(3, bear.getNetToughness()); - - GameCopier copier = new GameCopier(game); - Game copy = copier.makeCopy(); - Card bearCopy = findCardWithName(copy, bearCardName); - AssertJUnit.assertEquals(3, bearCopy.getNetToughness()); - } - - @Test - public void testDarkDepthsCopy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - Card depths = addCard("Dark Depths", p); - depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null); - Card thespian = addCard("Thespian's Stage", p); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(depths.hasCounters()); - - SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - AssertJUnit.assertNotNull(sa); - sa.getTargets().add(depths); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); - - String strSimGame = gameStateToString(simGame); - AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); - AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); - AssertJUnit.assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); - } - - @Test - public void testThespianStageSelfCopy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - Card thespian = addCard("Thespian's Stage", p); - AssertJUnit.assertTrue(thespian.isLand()); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbility sa = findSAWithPrefix(thespian, - "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); - AssertJUnit.assertNotNull(sa); - sa.getTargets().add(thespian); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(sa); - Game simGame = sim.getSimulatedGameState(); - Card thespianSim = findCardWithName(simGame, "Thespian's Stage"); - AssertJUnit.assertNotNull(gameStateToString(simGame), thespianSim); - AssertJUnit.assertTrue(thespianSim.isLand()); - } - - @Test - public void testDash() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - String berserkerCardName = "Lightning Berserker"; - Card berserkerCard = addCardToZone(berserkerCardName, p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - SpellAbility dashSA = findSAWithPrefix(berserkerCard, "Dash"); - AssertJUnit.assertNotNull(dashSA); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(dashSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - - Card berserker = findCardWithName(simGame, berserkerCardName); - AssertJUnit.assertNotNull(berserker); - AssertJUnit.assertEquals(1, berserker.getNetPower()); - AssertJUnit.assertEquals(1, berserker.getNetToughness()); - AssertJUnit.assertFalse(berserker.isSick()); - - SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); - AssertJUnit.assertNotNull(pumpSA); - GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); - sim2.simulateSpellAbility(pumpSA); - Game simGame2 = sim2.getSimulatedGameState(); - - Card berserker2 = findCardWithName(simGame2, berserkerCardName); - AssertJUnit.assertNotNull(berserker2); - AssertJUnit.assertEquals(2, berserker2.getNetPower()); - AssertJUnit.assertEquals(1, berserker2.getNetToughness()); - AssertJUnit.assertFalse(berserker2.isSick()); - } - - @Test - public void testTokenAbilities() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - Card callTheScionsCard = addCardToZone("Call the Scions", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - SpellAbility callTheScionsSA = callTheScionsCard.getSpellAbilities().get(0); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(callTheScionsSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - - Card scion = findCardWithName(simGame, "Eldrazi Scion Token"); - AssertJUnit.assertNotNull(scion); - AssertJUnit.assertEquals(1, scion.getNetPower()); - AssertJUnit.assertEquals(1, scion.getNetToughness()); - AssertJUnit.assertTrue(scion.isSick()); - AssertJUnit.assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card scionCopy = findCardWithName(copy, "Eldrazi Scion Token"); - AssertJUnit.assertNotNull(scionCopy); - AssertJUnit.assertEquals(1, scionCopy.getNetPower()); - AssertJUnit.assertEquals(1, scionCopy.getNetToughness()); - AssertJUnit.assertTrue(scionCopy.isSick()); - AssertJUnit.assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); - } - - @Test - public void testMarkedDamage() { - // Marked damage is important, as it's used during the AI declare - // attackers logic - // which affects game state score - since P/T boosts are evaluated - // differently for - // creatures participating in combat. - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - String giantCardName = "Hill Giant"; - Card giant = addCard(giantCardName, p); - addCard("Mountain", p); - Card shockCard = addCardToZone("Shock", p, ZoneType.Hand); - SpellAbility shockSA = shockCard.getFirstSpellAbility(); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertEquals(3, giant.getNetPower()); - AssertJUnit.assertEquals(3, giant.getNetToughness()); - AssertJUnit.assertEquals(0, giant.getDamage()); - - GameSimulator sim = createSimulator(game, p); - shockSA.setTargetCard(giant); - sim.simulateSpellAbility(shockSA); - Game simGame = sim.getSimulatedGameState(); - Card simGiant = findCardWithName(simGame, giantCardName); - AssertJUnit.assertEquals(2, simGiant.getDamage()); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card giantCopy = findCardWithName(copy, giantCardName); - AssertJUnit.assertEquals(2, giantCopy.getDamage()); - } - - @Test - public void testLifelinkDamageSpell() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; - - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } - - Card kalitas = addCard(kalitasName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); - - indestructibility.attachToEntity(pridemate); - - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - - addCard(broodName, p2); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBrood = findCardWithName(simGame, broodName); - - // because it was destroyed - AssertJUnit.assertNull(simBrood); - AssertJUnit.assertNotNull(simPridemate); - - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - AssertJUnit.assertEquals(3, simPridemate.getDamage()); - - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - - // 3 times 3 damage with life gain = 9 + 20 = 29 - AssertJUnit.assertEquals(29, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); - } - - @Test - public void testLifelinkDamageSpellMultiplier() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String giselaName = "Gisela, Blade of Goldnight"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; - - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } - - Card kalitas = addCard(kalitasName, p1); - addCard(pridemateName, p1); - addCard(giselaName, p1); - - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - - addCard(broodName, p2); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simGisela = findCardWithName(simGame, giselaName); - Card simBrood = findCardWithName(simGame, broodName); - - // because it was destroyed - AssertJUnit.assertNull(simBrood); - - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - // 2 of the 3 are prevented - AssertJUnit.assertEquals(1, simPridemate.getDamage()); - AssertJUnit.assertEquals(1, simGisela.getDamage()); - - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - - // 2 times 3 / 2 rounded down = 2 * 1 = 2 - // 2 times 3 * 2 = 12 - AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(14, simGame.getPlayers().get(1).getLife()); - } - - @Test - public void testLifelinkDamageSpellRedirected() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - String kalitasName = "Kalitas, Traitor of Ghet"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String ignitionName = "Chandra's Ignition"; - String broodName = "Brood Monitor"; - String palisadeName = "Palisade Giant"; - - // enough to cast Chandra's Ignition - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } - - Card kalitas = addCard(kalitasName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); - - indestructibility.attachToEntity(pridemate); - - Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); - SpellAbility ignitionSA = ignition.getFirstSpellAbility(); - - addCard(broodName, p2); - addCard(palisadeName, p2); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p1); - ignitionSA.setTargetCard(kalitas); - sim.simulateSpellAbility(ignitionSA); - Game simGame = sim.getSimulatedGameState(); - Card simKalitas = findCardWithName(simGame, kalitasName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBrood = findCardWithName(simGame, broodName); - Card simPalisade = findCardWithName(simGame, palisadeName); - - // not destroyed because damage redirected - AssertJUnit.assertNotNull(simBrood); - AssertJUnit.assertEquals(0, simBrood.getDamage()); - - // destroyed because of to much redirected damage - AssertJUnit.assertNull(simPalisade); - AssertJUnit.assertNotNull(simPridemate); - - AssertJUnit.assertEquals(0, simKalitas.getDamage()); - AssertJUnit.assertEquals(3, simPridemate.getDamage()); - - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - - // 4 times 3 damage with life gain = 12 + 20 = 32 - AssertJUnit.assertEquals(32, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(20, simGame.getPlayers().get(1).getLife()); - } - - @Test - public void testLifelinkDamageSpellMultipleDamage() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; - String coneName = "Cone of Flame"; - - String bearCardName = "Runeclaw Bear"; - String giantCardName = "Hill Giant"; - - String tormentName = "Everlasting Torment"; - String meliraName = "Melira, Sylvok Outcast"; - - // enough to cast Cone of Flame - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p1); - } - - addCard(soulfireName, p1); - addCard(pridemateName, p1); - - Card bearCard = addCard(bearCardName, p2); - Card giantCard = addCard(giantCardName, p2); - - Card cone = addCardToZone(coneName, p1, ZoneType.Hand); - SpellAbility coneSA = cone.getFirstSpellAbility(); - - coneSA.setTargetCard(bearCard); // one damage to bear - coneSA.getSubAbility().setTargetCard(giantCard); // two damage to giant - coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three - // damage - // to - // player - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p1); - - sim.simulateSpellAbility(coneSA); - Game simGame = sim.getSimulatedGameState(); - Card simBear = findCardWithName(simGame, bearCardName); - Card simGiant = findCardWithName(simGame, giantCardName); - Card simPridemate = findCardWithName(simGame, pridemateName); - - // spell deals multiple damages to multiple targets, only one cause of - // lifegain - AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simBear); - AssertJUnit.assertEquals(1, simBear.getDamage()); - - AssertJUnit.assertNotNull(simGiant); - AssertJUnit.assertEquals(2, simGiant.getDamage()); - - // 1 + 2 + 3 lifegain - AssertJUnit.assertEquals(26, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); - - // second pard with Everlasting Torment - addCard(tormentName, p2); - - GameSimulator sim2 = createSimulator(game, p1); - - sim2.simulateSpellAbility(coneSA); - Game simGame2 = sim2.getSimulatedGameState(); - Card simBear2 = findCardWithName(simGame2, bearCardName); - Card simGiant2 = findCardWithName(simGame2, giantCardName); - Card simPridemate2 = findCardWithName(simGame2, pridemateName); - - // no Lifegain because of Everlasting Torment - AssertJUnit.assertNotNull(simPridemate2); - AssertJUnit.assertFalse(simPridemate2.hasCounters()); - AssertJUnit.assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simPridemate2.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simBear2); - AssertJUnit.assertEquals(0, simBear2.getDamage()); - AssertJUnit.assertTrue(simBear2.hasCounters()); - AssertJUnit.assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(-1, simBear2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(-1, simBear2.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simGiant2); - AssertJUnit.assertEquals(0, simGiant2.getDamage()); - AssertJUnit.assertTrue(simGiant2.hasCounters()); - AssertJUnit.assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(-2, simGiant2.getPowerBonusFromCounters()); - - // no life gain - AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); - - // third pard with Melira prevents wither - addCard(meliraName, p2); - - GameSimulator sim3 = createSimulator(game, p1); - - sim3.simulateSpellAbility(coneSA); - Game simGame3 = sim3.getSimulatedGameState(); - Card simBear3 = findCardWithName(simGame3, bearCardName); - Card simGiant3 = findCardWithName(simGame3, giantCardName); - Card simPridemate3 = findCardWithName(simGame3, pridemateName); - - // no Lifegain because of Everlasting Torment - AssertJUnit.assertNotNull(simPridemate3); - AssertJUnit.assertFalse(simPridemate3.hasCounters()); - AssertJUnit.assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simPridemate3.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simBear3); - AssertJUnit.assertEquals(0, simBear3.getDamage()); - AssertJUnit.assertFalse(simBear3.hasCounters()); - AssertJUnit.assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(0, simBear3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simBear3.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simGiant3); - AssertJUnit.assertEquals(0, simGiant3.getDamage()); - AssertJUnit.assertFalse(simGiant3.hasCounters()); - AssertJUnit.assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); - AssertJUnit.assertEquals(0, simGiant3.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(0, simGiant3.getPowerBonusFromCounters()); - - // no life gain - AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); - } - - @Test - public void testTransform() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - addCard("Swamp", p); - addCard("Swamp", p); - String lilianaCardName = "Liliana, Heretical Healer"; - String lilianaPWName = "Liliana, Defiant Necromancer"; - Card lilianaInPlay = addCard(lilianaCardName, p); - Card lilianaInHand = addCardToZone(lilianaCardName, p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertTrue(lilianaInPlay.isCreature()); - AssertJUnit.assertEquals(2, lilianaInPlay.getNetPower()); - AssertJUnit.assertEquals(3, lilianaInPlay.getNetToughness()); - - SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playLiliana); - Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertNull(findCardWithName(simGame, lilianaCardName)); - Card lilianaPW = findCardWithName(simGame, lilianaPWName); - AssertJUnit.assertNotNull(lilianaPW); - AssertJUnit.assertTrue(lilianaPW.isPlaneswalker()); - AssertJUnit.assertEquals(3, lilianaPW.getCurrentLoyalty()); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Card lilianaPWCopy = findCardWithName(copy, lilianaPWName); - AssertJUnit.assertNotNull(lilianaPWCopy); - AssertJUnit.assertTrue(lilianaPWCopy.isPlaneswalker()); - AssertJUnit.assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); - } - - @Test - public void testEnergy() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Island", p); - String turtleCardName = "Thriving Turtle"; - Card turtleCard = addCardToZone(turtleCardName, p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); - - SpellAbility playTurtle = turtleCard.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playTurtle); - Game simGame = sim.getSimulatedGameState(); - Player simP = simGame.getPlayers().get(1); - AssertJUnit.assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); - - GameCopier copier = new GameCopier(simGame); - Game copy = copier.makeCopy(); - Player copyP = copy.getPlayers().get(1); - AssertJUnit.assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); - } - - @Test - public void testFloatingMana() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - addCard("Swamp", p); - Card darkRitualCard = addCardToZone("Dark Ritual", p, ZoneType.Hand); - Card darkConfidantCard = addCardToZone("Dark Confidant", p, ZoneType.Hand); - Card deathriteCard = addCardToZone("Deathrite Shaman", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.getManaPool().isEmpty()); - - SpellAbility playRitual = darkRitualCard.getSpellAbilities().get(0); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(playRitual); - Game simGame = sim.getSimulatedGameState(); - Player simP = simGame.getPlayers().get(1); - AssertJUnit.assertEquals(3, simP.getManaPool().totalMana()); - AssertJUnit.assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); - - Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); - SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); - Card deathriteCard2 = (Card) sim.getGameCopier().find(deathriteCard); - - GameSimulator sim2 = createSimulator(simGame, simP); - sim2.simulateSpellAbility(playDarkConfidant2); - Game sim2Game = sim2.getSimulatedGameState(); - Player sim2P = sim2Game.getPlayers().get(1); - AssertJUnit.assertEquals(1, sim2P.getManaPool().totalMana()); - AssertJUnit.assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); - - Card deathriteCard3 = (Card) sim2.getGameCopier().find(deathriteCard2); - SpellAbility playDeathriteCard3 = deathriteCard3.getSpellAbilities().get(0); - - GameSimulator sim3 = createSimulator(sim2Game, sim2P); - sim3.simulateSpellAbility(playDeathriteCard3); - Game sim3Game = sim3.getSimulatedGameState(); - Player sim3P = sim3Game.getPlayers().get(1); - AssertJUnit.assertEquals(0, sim3P.getManaPool().totalMana()); - AssertJUnit.assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); - } - - @Test - public void testEnKor() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; - - String enKorName = "Spirit en-Kor"; - String bearName = "Runeclaw Bear"; - String shockName = "Shock"; - - addCard("Mountain", p); - - addCard(soulfireName, p); - addCard(pridemateName, p); - - Card shockCard = addCardToZone(shockName, p, ZoneType.Hand); - - Card enKor = addCard(enKorName, p); - - SpellAbility enKorSA = findSAWithPrefix(enKor, "{0}:"); - - Card bear = addCard(bearName, p); - - SpellAbility shockSA = shockCard.getFirstSpellAbility(); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + @Test + public void testActivateAbilityTriggers() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Plains", p); + addCard("Plains", p); + addCard("Plains", p); + String heraldCardName = "Herald of Anafenza"; + Card herald = addCard(heraldCardName, p); + herald.setSickness(false); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); + AssertJUnit.assertNotNull(outlastSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(outlastSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + Card heraldCopy = findCardWithName(simGame, heraldCardName); + AssertJUnit.assertNotNull(heraldCopy); + AssertJUnit.assertTrue(heraldCopy.isTapped()); + AssertJUnit.assertTrue(heraldCopy.hasCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, heraldCopy.getPowerBonusFromCounters()); + + Card warriorToken = findCardWithName(simGame, "Warrior Token"); + AssertJUnit.assertNotNull(warriorToken); + AssertJUnit.assertTrue(warriorToken.isSick()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentPower()); + AssertJUnit.assertEquals(1, warriorToken.getCurrentToughness()); + } + + @Test + public void testStaticAbilities() { + String sliverCardName = "Sidewinder Sliver"; + String heraldCardName = "Herald of Anafenza"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sliver = addCard(sliverCardName, p); + sliver.setSickness(false); + Card herald = addCard(heraldCardName, p); + herald.setSickness(false); + addCard("Plains", p); + addCard("Plains", p); + addCard("Plains", p); + addCard("Spear of Heliod", p); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertEquals(1, sliver.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); + + SpellAbility outlastSA = findSAWithPrefix(herald, "Outlast"); + AssertJUnit.assertNotNull(outlastSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(outlastSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + Card sliverCopy = findCardWithName(simGame, sliverCardName); + AssertJUnit.assertEquals(1, sliverCopy.getAmountOfKeyword("Flanking")); + AssertJUnit.assertEquals(2, sliver.getNetPower()); + AssertJUnit.assertEquals(2, sliver.getNetToughness()); + } + + @Test + public void testStaticEffectsMonstrous() { + String lionCardName = "Fleecemane Lion"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card lion = addCard(lionCardName, p); + lion.setSickness(false); + lion.setMonstrous(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(lion.isMonstrous()); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lion.getAmountOfKeyword("Indestructible")); + + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card lionCopy = findCardWithName(simGame, lionCardName); + AssertJUnit.assertTrue(lionCopy.isMonstrous()); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Hexproof")); + AssertJUnit.assertEquals(1, lionCopy.getAmountOfKeyword("Indestructible")); + } + + @Test + public void testEquippedAbilities() { + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card cloak = addCard("Whispersilk Cloak", p); + cloak.attachToEntity(bear); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Unblockable")); + + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card bearCopy = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Unblockable")); + } + + @Test + public void testEnchantedAbilities() { + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card lifelink = addCard("Lifelink", p); + lifelink.attachToEntity(bear); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(1, bear.getAmountOfKeyword("Lifelink")); + + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + Card bearCopy = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(1, bearCopy.getAmountOfKeyword("Lifelink")); + } + + @Test + public void testEtbTriggers() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Black Knight", p); + for (int i = 0; i < 5; i++) + addCard("Swamp", p); + + String merchantCardName = "Gray Merchant of Asphodel"; + Card c = addCardToZone(merchantCardName, p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility playMerchantSa = c.getSpellAbilities().get(0); + playMerchantSa.setActivatingPlayer(p); + + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playMerchantSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + Game simGame = sim.getSimulatedGameState(); + AssertJUnit.assertEquals(24, simGame.getPlayers().get(1).getLife()); + AssertJUnit.assertEquals(16, simGame.getPlayers().get(0).getLife()); + } + + @Test + public void testSimulateUnmorph() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card ripper = createCard("Ruthless Ripper", p); + ripper.turnFaceDownNoUpdate(); + p.getZone(ZoneType.Battlefield).add(ripper); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertEquals(20, game.getPlayers().get(0).getLife()); + + GameSimulator sim = createSimulator(game, p); + Game simGame = sim.getSimulatedGameState(); + + SpellAbility unmorphSA = findSAWithPrefix(ripper, "Morph — Reveal a black card"); + AssertJUnit.assertNotNull(unmorphSA); + sim.simulateSpellAbility(unmorphSA); + AssertJUnit.assertEquals(18, simGame.getPlayers().get(0).getLife()); + } + + @Test + public void testFindingOwnCard() { + Game game = initAndCreateGame(); + Player p0 = game.getPlayers().get(0); + Player p1 = game.getPlayers().get(1); + addCardToZone("Skull Fracture", p0, ZoneType.Hand); + addCardToZone("Runeclaw Bear", p0, ZoneType.Hand); + Card fractureP1 = addCardToZone("Skull Fracture", p1, ZoneType.Hand); + addCard("Swamp", p1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p1); + Game simGame = sim.getSimulatedGameState(); + + SpellAbility fractureSa = fractureP1.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(fractureSa); + fractureSa.getTargets().add(p0); + sim.simulateSpellAbility(fractureSa); + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getCardsIn(ZoneType.Hand).size()); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Hand).size()); + } + + @Test + public void testPlaneswalkerAbilities() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sorin = addCard("Sorin, Solemn Visitor", p); + sorin.addCounterInternal(CounterEnumType.LOYALTY, 5, p, false, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); + List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); + SpellAbility minusTwo = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + AssertJUnit.assertNotNull(minusTwo); + minusTwo.setActivatingPlayer(p); + AssertJUnit.assertTrue(minusTwo.canPlay()); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(minusTwo); + Game simGame = sim.getSimulatedGameState(); + Card vampireToken = findCardWithName(simGame, "Vampire Token"); + AssertJUnit.assertNotNull(vampireToken); + + Player simP = simGame.getPlayers().get(1); + cards = ComputerUtilAbility.getAvailableCards(simGame, simP); + abilities = ComputerUtilAbility.getSpellAbilities(cards, simP); + SpellAbility minusTwoSim = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + AssertJUnit.assertNotNull(minusTwoSim); + minusTwoSim.setActivatingPlayer(simP); + AssertJUnit.assertFalse(minusTwoSim.canPlay()); + AssertJUnit.assertEquals(1, minusTwoSim.getActivationsThisTurn()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Player copyP = copy.getPlayers().get(1); + cards = ComputerUtilAbility.getAvailableCards(copy, copyP); + abilities = ComputerUtilAbility.getSpellAbilities(cards, copyP); + SpellAbility minusTwoCopy = findSAWithPrefix(abilities, "-2: Create a 2/2 black Vampire"); + minusTwoCopy.setActivatingPlayer(copyP); + AssertJUnit.assertFalse(minusTwoCopy.canPlay()); + AssertJUnit.assertEquals(1, minusTwoCopy.getActivationsThisTurn()); + } + + @Test + public void testPlaneswalkerEmblems() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + String bearCardName = "Runeclaw Bear"; + addCard(bearCardName, p); + Card gideon = addCard("Gideon, Ally of Zendikar", p); + gideon.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + CardCollection cards = ComputerUtilAbility.getAvailableCards(game, p); + List abilities = ComputerUtilAbility.getSpellAbilities(cards, p); + SpellAbility minusFour = findSAWithPrefix(abilities, "-4: You get an emblem"); + AssertJUnit.assertNotNull(minusFour); + minusFour.setActivatingPlayer(p); + AssertJUnit.assertTrue(minusFour.canPlay()); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(minusFour); + Game simGame = sim.getSimulatedGameState(); + Card simBear = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(3, simBear.getNetPower()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card copyBear = findCardWithName(copy, bearCardName); + AssertJUnit.assertEquals(3, copyBear.getNetPower()); + } + + @Test + public void testManifest() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Ornithopter", p, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); + + SpellAbility unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(p, false), + "Unmanifest"); + AssertJUnit.assertNotNull(unmanifestSA); + AssertJUnit.assertEquals(2, manifestedCreature.getNetPower()); + AssertJUnit.assertFalse(manifestedCreature.hasKeyword("Flying")); + + GameSimulator sim2 = createSimulator(simGame, simGame.getPlayers().get(1)); + Game simGame2 = sim2.getSimulatedGameState(); + manifestedCreature = findCardWithName(simGame2, ""); + unmanifestSA = findSAWithPrefix(manifestedCreature.getAllPossibleAbilities(simGame2.getPlayers().get(1), false), + "Unmanifest"); + + sim2.simulateSpellAbility(unmanifestSA); + + Card ornithopter = findCardWithName(simGame2, "Ornithopter"); + AssertJUnit.assertEquals(0, ornithopter.getNetPower()); + AssertJUnit.assertTrue(ornithopter.hasKeyword("Flying")); + AssertJUnit.assertNull(findSAWithPrefix(ornithopter, "Unmanifest")); + + GameCopier copier = new GameCopier(simGame2); + Game copy = copier.makeCopy(); + Card ornithopterCopy = findCardWithName(copy, "Ornithopter"); + AssertJUnit.assertNull(findSAWithPrefix(ornithopterCopy, "Unmanifest")); + } + + @Test + public void testManifest2() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Plains", p, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card manifestedCreatureCopy = findCardWithName(copy, ""); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + } + + @Test + public void testManifest3() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Plains", p); + addCard("Plains", p); + Card soulSummons = addCardToZone("Soul Summons", p, ZoneType.Hand); + addCardToZone("Dryad Arbor", p, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility manifestSA = soulSummons.getSpellAbilities().get(0); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(manifestSA); + Game simGame = sim.getSimulatedGameState(); + Card manifestedCreature = findCardWithName(simGame, ""); + AssertJUnit.assertNotNull(manifestedCreature); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreature, "Unmanifest")); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card manifestedCreatureCopy = findCardWithName(copy, ""); + AssertJUnit.assertNull(findSAWithPrefix(manifestedCreatureCopy, "Unmanifest")); + } + + @Test + public void testTypeOfPermanentChanging() { + String sarkhanCardName = "Sarkhan, the Dragonspeaker"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card sarkhan = addCard(sarkhanCardName, p); + sarkhan.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertFalse(sarkhan.isCreature()); + AssertJUnit.assertTrue(sarkhan.isPlaneswalker()); + + SpellAbility becomeDragonSA = findSAWithPrefix(sarkhan, "+1"); + AssertJUnit.assertNotNull(becomeDragonSA); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(becomeDragonSA); + Game simGame = sim.getSimulatedGameState(); + Card sarkhanSim = findCardWithName(simGame, sarkhanCardName); + AssertJUnit.assertTrue(sarkhanSim.isCreature()); + AssertJUnit.assertFalse(sarkhanSim.isPlaneswalker()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card sarkhanCopy = findCardWithName(copy, sarkhanCardName); + AssertJUnit.assertTrue(sarkhanCopy.isCreature()); + AssertJUnit.assertFalse(sarkhanCopy.isPlaneswalker()); + } + + @Test + public void testDistributeCountersAbility() { + String ajaniCardName = "Ajani, Mentor of Heroes"; + String ornithoperCardName = "Ornithopter"; + String bearCardName = "Runeclaw Bear"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard(ornithoperCardName, p); + addCard(bearCardName, p); + Card ajani = addCard(ajaniCardName, p); + ajani.addCounterInternal(CounterEnumType.LOYALTY, 4, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility sa = findSAWithPrefix(ajani, "+1: Distribute"); + AssertJUnit.assertNotNull(sa); + sa.setActivatingPlayer(p); + + MultiTargetSelector selector = new MultiTargetSelector(sa, null); + while (selector.selectNextTargets()) { + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); + Card thopterSim = findCardWithName(simGame, ornithoperCardName); + Card bearSim = findCardWithName(simGame, bearCardName); + AssertJUnit.assertEquals(3, + thopterSim.getCounters(CounterEnumType.P1P1) + bearSim.getCounters(CounterEnumType.P1P1)); + } + } + + @Test + public void testDamagePreventedTrigger() { + String ajaniCardName = "Ajani Steadfast"; + String selflessCardName = "Selfless Squire"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + addCard(selflessCardName, p); + addCard("Mountain", p); + Card boltCard = addCardToZone("Lightning Bolt", p, ZoneType.Hand); + SpellAbility boltSA = boltCard.getFirstSpellAbility(); + + Card ajani = addCard(ajaniCardName, p); + ajani.addCounterInternal(CounterEnumType.LOYALTY, 8, p, false, null); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility sa = findSAWithPrefix(ajani, "-7:"); + AssertJUnit.assertNotNull(sa); + sa.setActivatingPlayer(p); + + GameSimulator sim = createSimulator(game, p); + boltSA.getTargets().add(p); + sim.simulateSpellAbility(sa); + sim.simulateSpellAbility(boltSA); + Game simGame = sim.getSimulatedGameState(); + Card simSelfless = findCardWithName(simGame, selflessCardName); + + // only one damage + AssertJUnit.assertEquals(19, simGame.getPlayers().get(0).getLife()); + + // only triggered once + AssertJUnit.assertTrue(simSelfless.hasCounters()); + AssertJUnit.assertEquals(2, simSelfless.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simSelfless.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simSelfless.getPowerBonusFromCounters()); + } + + @Test + public void testChosenColors() { + String bearCardName = "Runeclaw Bear"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Card bear = addCard(bearCardName, p); + Card hall = addCard("Hall of Triumph", p); + hall.setChosenColors(Lists.newArrayList("green")); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(3, bear.getNetToughness()); + + GameCopier copier = new GameCopier(game); + Game copy = copier.makeCopy(); + Card bearCopy = findCardWithName(copy, bearCardName); + AssertJUnit.assertEquals(3, bearCopy.getNetToughness()); + } + + @Test + public void testDarkDepthsCopy() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + Card depths = addCard("Dark Depths", p); + depths.addCounterInternal(CounterEnumType.ICE, 10, p, false, null); + Card thespian = addCard("Thespian's Stage", p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(depths.hasCounters()); + + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); + AssertJUnit.assertNotNull(sa); + sa.getTargets().add(depths); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); + + String strSimGame = gameStateToString(simGame); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Dark Depths")); + AssertJUnit.assertNull(strSimGame, findCardWithName(simGame, "Thespian's Stage")); + AssertJUnit.assertNotNull(strSimGame, findCardWithName(simGame, "Marit Lage")); + } + + @Test + public void testThespianStageSelfCopy() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + Card thespian = addCard("Thespian's Stage", p); + AssertJUnit.assertTrue(thespian.isLand()); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbility sa = findSAWithPrefix(thespian, + "{2}, {T}: CARDNAME becomes a copy of target land, except it has this ability."); + AssertJUnit.assertNotNull(sa); + sa.getTargets().add(thespian); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(sa); + Game simGame = sim.getSimulatedGameState(); + Card thespianSim = findCardWithName(simGame, "Thespian's Stage"); + AssertJUnit.assertNotNull(gameStateToString(simGame), thespianSim); + AssertJUnit.assertTrue(thespianSim.isLand()); + } + + @Test + public void testDash() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + String berserkerCardName = "Lightning Berserker"; + Card berserkerCard = addCardToZone(berserkerCardName, p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + SpellAbility dashSA = findSAWithPrefix(berserkerCard, "Dash"); + AssertJUnit.assertNotNull(dashSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(dashSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + Card berserker = findCardWithName(simGame, berserkerCardName); + AssertJUnit.assertNotNull(berserker); + AssertJUnit.assertEquals(1, berserker.getNetPower()); + AssertJUnit.assertEquals(1, berserker.getNetToughness()); + AssertJUnit.assertFalse(berserker.isSick()); + + SpellAbility pumpSA = findSAWithPrefix(berserker, "{R}: CARDNAME gets +1/+0 until end of turn."); + AssertJUnit.assertNotNull(pumpSA); + GameSimulator sim2 = createSimulator(simGame, (Player) sim.getGameCopier().find(p)); + sim2.simulateSpellAbility(pumpSA); + Game simGame2 = sim2.getSimulatedGameState(); + + Card berserker2 = findCardWithName(simGame2, berserkerCardName); + AssertJUnit.assertNotNull(berserker2); + AssertJUnit.assertEquals(2, berserker2.getNetPower()); + AssertJUnit.assertEquals(1, berserker2.getNetToughness()); + AssertJUnit.assertFalse(berserker2.isSick()); + } + + @Test + public void testTokenAbilities() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + Card callTheScionsCard = addCardToZone("Call the Scions", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + SpellAbility callTheScionsSA = callTheScionsCard.getSpellAbilities().get(0); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(callTheScionsSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + Card scion = findCardWithName(simGame, "Eldrazi Scion Token"); + AssertJUnit.assertNotNull(scion); + AssertJUnit.assertEquals(1, scion.getNetPower()); + AssertJUnit.assertEquals(1, scion.getNetToughness()); + AssertJUnit.assertTrue(scion.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scion, "Sacrifice CARDNAME: Add {C}.")); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card scionCopy = findCardWithName(copy, "Eldrazi Scion Token"); + AssertJUnit.assertNotNull(scionCopy); + AssertJUnit.assertEquals(1, scionCopy.getNetPower()); + AssertJUnit.assertEquals(1, scionCopy.getNetToughness()); + AssertJUnit.assertTrue(scionCopy.isSick()); + AssertJUnit.assertNotNull(findSAWithPrefix(scionCopy, "Sacrifice CARDNAME: Add {C}.")); + } + + @Test + public void testMarkedDamage() { + // Marked damage is important, as it's used during the AI declare + // attackers logic + // which affects game state score - since P/T boosts are evaluated + // differently for + // creatures participating in combat. + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + String giantCardName = "Hill Giant"; + Card giant = addCard(giantCardName, p); + addCard("Mountain", p); + Card shockCard = addCardToZone("Shock", p, ZoneType.Hand); + SpellAbility shockSA = shockCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertEquals(3, giant.getNetPower()); + AssertJUnit.assertEquals(3, giant.getNetToughness()); + AssertJUnit.assertEquals(0, giant.getDamage()); + + GameSimulator sim = createSimulator(game, p); + shockSA.setTargetCard(giant); + sim.simulateSpellAbility(shockSA); + Game simGame = sim.getSimulatedGameState(); + Card simGiant = findCardWithName(simGame, giantCardName); + AssertJUnit.assertEquals(2, simGiant.getDamage()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card giantCopy = findCardWithName(copy, giantCardName); + AssertJUnit.assertEquals(2, giantCopy.getDamage()); + } + + @Test + public void testLifelinkDamageSpell() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; + + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } + + Card kalitas = addCard(kalitasName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); + + indestructibility.attachToEntity(pridemate); + + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + + addCard(broodName, p2); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBrood = findCardWithName(simGame, broodName); + + // because it was destroyed + AssertJUnit.assertNull(simBrood); + AssertJUnit.assertNotNull(simPridemate); + + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); + + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + // 3 times 3 damage with life gain = 9 + 20 = 29 + AssertJUnit.assertEquals(29, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); + } + + @Test + public void testLifelinkDamageSpellMultiplier() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String giselaName = "Gisela, Blade of Goldnight"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; + + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } + + Card kalitas = addCard(kalitasName, p1); + addCard(pridemateName, p1); + addCard(giselaName, p1); + + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + + addCard(broodName, p2); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simGisela = findCardWithName(simGame, giselaName); + Card simBrood = findCardWithName(simGame, broodName); + + // because it was destroyed + AssertJUnit.assertNull(simBrood); + + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + // 2 of the 3 are prevented + AssertJUnit.assertEquals(1, simPridemate.getDamage()); + AssertJUnit.assertEquals(1, simGisela.getDamage()); + + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + // 2 times 3 / 2 rounded down = 2 * 1 = 2 + // 2 times 3 * 2 = 12 + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(14, simGame.getPlayers().get(1).getLife()); + } + + @Test + public void testLifelinkDamageSpellRedirected() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String kalitasName = "Kalitas, Traitor of Ghet"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String ignitionName = "Chandra's Ignition"; + String broodName = "Brood Monitor"; + String palisadeName = "Palisade Giant"; + + // enough to cast Chandra's Ignition + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } + + Card kalitas = addCard(kalitasName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); + + indestructibility.attachToEntity(pridemate); + + Card ignition = addCardToZone(ignitionName, p1, ZoneType.Hand); + SpellAbility ignitionSA = ignition.getFirstSpellAbility(); + + addCard(broodName, p2); + addCard(palisadeName, p2); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p1); + ignitionSA.setTargetCard(kalitas); + sim.simulateSpellAbility(ignitionSA); + Game simGame = sim.getSimulatedGameState(); + Card simKalitas = findCardWithName(simGame, kalitasName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBrood = findCardWithName(simGame, broodName); + Card simPalisade = findCardWithName(simGame, palisadeName); + + // not destroyed because damage redirected + AssertJUnit.assertNotNull(simBrood); + AssertJUnit.assertEquals(0, simBrood.getDamage()); + + // destroyed because of to much redirected damage + AssertJUnit.assertNull(simPalisade); + AssertJUnit.assertNotNull(simPridemate); + + AssertJUnit.assertEquals(0, simKalitas.getDamage()); + AssertJUnit.assertEquals(3, simPridemate.getDamage()); + + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + // 4 times 3 damage with life gain = 12 + 20 = 32 + AssertJUnit.assertEquals(32, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(20, simGame.getPlayers().get(1).getLife()); + } + + @Test + public void testLifelinkDamageSpellMultipleDamage() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; + String coneName = "Cone of Flame"; + + String bearCardName = "Runeclaw Bear"; + String giantCardName = "Hill Giant"; + + String tormentName = "Everlasting Torment"; + String meliraName = "Melira, Sylvok Outcast"; + + // enough to cast Cone of Flame + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p1); + } + + addCard(soulfireName, p1); + addCard(pridemateName, p1); + + Card bearCard = addCard(bearCardName, p2); + Card giantCard = addCard(giantCardName, p2); + + Card cone = addCardToZone(coneName, p1, ZoneType.Hand); + SpellAbility coneSA = cone.getFirstSpellAbility(); + + coneSA.setTargetCard(bearCard); // one damage to bear + coneSA.getSubAbility().setTargetCard(giantCard); // two damage to giant + coneSA.getSubAbility().getSubAbility().getTargets().add(p2); // three + // damage + // to + // player + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p1); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p1); + + sim.simulateSpellAbility(coneSA); + Game simGame = sim.getSimulatedGameState(); + Card simBear = findCardWithName(simGame, bearCardName); + Card simGiant = findCardWithName(simGame, giantCardName); + Card simPridemate = findCardWithName(simGame, pridemateName); + + // spell deals multiple damages to multiple targets, only one cause of + // lifegain + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); + + AssertJUnit.assertNotNull(simGiant); + AssertJUnit.assertEquals(2, simGiant.getDamage()); + + // 1 + 2 + 3 lifegain + AssertJUnit.assertEquals(26, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame.getPlayers().get(1).getLife()); + + // second pard with Everlasting Torment + addCard(tormentName, p2); + + GameSimulator sim2 = createSimulator(game, p1); + + sim2.simulateSpellAbility(coneSA); + Game simGame2 = sim2.getSimulatedGameState(); + Card simBear2 = findCardWithName(simGame2, bearCardName); + Card simGiant2 = findCardWithName(simGame2, giantCardName); + Card simPridemate2 = findCardWithName(simGame2, pridemateName); + + // no Lifegain because of Everlasting Torment + AssertJUnit.assertNotNull(simPridemate2); + AssertJUnit.assertFalse(simPridemate2.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate2.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simBear2); + AssertJUnit.assertEquals(0, simBear2.getDamage()); + AssertJUnit.assertTrue(simBear2.hasCounters()); + AssertJUnit.assertEquals(1, simBear2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-1, simBear2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-1, simBear2.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simGiant2); + AssertJUnit.assertEquals(0, simGiant2.getDamage()); + AssertJUnit.assertTrue(simGiant2.hasCounters()); + AssertJUnit.assertEquals(2, simGiant2.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(-2, simGiant2.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(-2, simGiant2.getPowerBonusFromCounters()); + + // no life gain + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); + + // third pard with Melira prevents wither + addCard(meliraName, p2); + + GameSimulator sim3 = createSimulator(game, p1); + + sim3.simulateSpellAbility(coneSA); + Game simGame3 = sim3.getSimulatedGameState(); + Card simBear3 = findCardWithName(simGame3, bearCardName); + Card simGiant3 = findCardWithName(simGame3, giantCardName); + Card simPridemate3 = findCardWithName(simGame3, pridemateName); + + // no Lifegain because of Everlasting Torment + AssertJUnit.assertNotNull(simPridemate3); + AssertJUnit.assertFalse(simPridemate3.hasCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(0, simPridemate3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simPridemate3.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simBear3); + AssertJUnit.assertEquals(0, simBear3.getDamage()); + AssertJUnit.assertFalse(simBear3.hasCounters()); + AssertJUnit.assertEquals(0, simBear3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simBear3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simBear3.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simGiant3); + AssertJUnit.assertEquals(0, simGiant3.getDamage()); + AssertJUnit.assertFalse(simGiant3.hasCounters()); + AssertJUnit.assertEquals(0, simGiant3.getCounters(CounterEnumType.M1M1)); + AssertJUnit.assertEquals(0, simGiant3.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(0, simGiant3.getPowerBonusFromCounters()); + + // no life gain + AssertJUnit.assertEquals(20, simGame2.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(17, simGame2.getPlayers().get(1).getLife()); + } + + @Test + public void testTransform() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + addCard("Swamp", p); + addCard("Swamp", p); + String lilianaCardName = "Liliana, Heretical Healer"; + String lilianaPWName = "Liliana, Defiant Necromancer"; + Card lilianaInPlay = addCard(lilianaCardName, p); + Card lilianaInHand = addCardToZone(lilianaCardName, p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertTrue(lilianaInPlay.isCreature()); + AssertJUnit.assertEquals(2, lilianaInPlay.getNetPower()); + AssertJUnit.assertEquals(3, lilianaInPlay.getNetToughness()); + + SpellAbility playLiliana = lilianaInHand.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playLiliana); + Game simGame = sim.getSimulatedGameState(); + AssertJUnit.assertNull(findCardWithName(simGame, lilianaCardName)); + Card lilianaPW = findCardWithName(simGame, lilianaPWName); + AssertJUnit.assertNotNull(lilianaPW); + AssertJUnit.assertTrue(lilianaPW.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPW.getCurrentLoyalty()); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Card lilianaPWCopy = findCardWithName(copy, lilianaPWName); + AssertJUnit.assertNotNull(lilianaPWCopy); + AssertJUnit.assertTrue(lilianaPWCopy.isPlaneswalker()); + AssertJUnit.assertEquals(3, lilianaPWCopy.getCurrentLoyalty()); + } + + @Test + public void testEnergy() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Island", p); + String turtleCardName = "Thriving Turtle"; + Card turtleCard = addCardToZone(turtleCardName, p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertEquals(0, p.getCounters(CounterEnumType.ENERGY)); + + SpellAbility playTurtle = turtleCard.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playTurtle); + Game simGame = sim.getSimulatedGameState(); + Player simP = simGame.getPlayers().get(1); + AssertJUnit.assertEquals(2, simP.getCounters(CounterEnumType.ENERGY)); + + GameCopier copier = new GameCopier(simGame); + Game copy = copier.makeCopy(); + Player copyP = copy.getPlayers().get(1); + AssertJUnit.assertEquals(2, copyP.getCounters(CounterEnumType.ENERGY)); + } + + @Test + public void testFloatingMana() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + addCard("Swamp", p); + Card darkRitualCard = addCardToZone("Dark Ritual", p, ZoneType.Hand); + Card darkConfidantCard = addCardToZone("Dark Confidant", p, ZoneType.Hand); + Card deathriteCard = addCardToZone("Deathrite Shaman", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.getManaPool().isEmpty()); + + SpellAbility playRitual = darkRitualCard.getSpellAbilities().get(0); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(playRitual); + Game simGame = sim.getSimulatedGameState(); + Player simP = simGame.getPlayers().get(1); + AssertJUnit.assertEquals(3, simP.getManaPool().totalMana()); + AssertJUnit.assertEquals(3, simP.getManaPool().getAmountOfColor(MagicColor.BLACK)); + + Card darkConfidantCard2 = (Card) sim.getGameCopier().find(darkConfidantCard); + SpellAbility playDarkConfidant2 = darkConfidantCard2.getSpellAbilities().get(0); + Card deathriteCard2 = (Card) sim.getGameCopier().find(deathriteCard); + + GameSimulator sim2 = createSimulator(simGame, simP); + sim2.simulateSpellAbility(playDarkConfidant2); + Game sim2Game = sim2.getSimulatedGameState(); + Player sim2P = sim2Game.getPlayers().get(1); + AssertJUnit.assertEquals(1, sim2P.getManaPool().totalMana()); + AssertJUnit.assertEquals(1, sim2P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + + Card deathriteCard3 = (Card) sim2.getGameCopier().find(deathriteCard2); + SpellAbility playDeathriteCard3 = deathriteCard3.getSpellAbilities().get(0); + + GameSimulator sim3 = createSimulator(sim2Game, sim2P); + sim3.simulateSpellAbility(playDeathriteCard3); + Game sim3Game = sim3.getSimulatedGameState(); + Player sim3P = sim3Game.getPlayers().get(1); + AssertJUnit.assertEquals(0, sim3P.getManaPool().totalMana()); + AssertJUnit.assertEquals(0, sim3P.getManaPool().getAmountOfColor(MagicColor.BLACK)); + } + + @Test + public void testEnKor() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; + + String enKorName = "Spirit en-Kor"; + String bearName = "Runeclaw Bear"; + String shockName = "Shock"; + + addCard("Mountain", p); + + addCard(soulfireName, p); + addCard(pridemateName, p); + + Card shockCard = addCardToZone(shockName, p, ZoneType.Hand); + + Card enKor = addCard(enKorName, p); + + SpellAbility enKorSA = findSAWithPrefix(enKor, "{0}:"); + + Card bear = addCard(bearName, p); + + SpellAbility shockSA = shockCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(2, enKor.getNetPower()); - AssertJUnit.assertEquals(2, enKor.getNetToughness()); - AssertJUnit.assertEquals(0, enKor.getDamage()); + AssertJUnit.assertEquals(2, enKor.getNetPower()); + AssertJUnit.assertEquals(2, enKor.getNetToughness()); + AssertJUnit.assertEquals(0, enKor.getDamage()); - AssertJUnit.assertEquals(2, bear.getNetPower()); - AssertJUnit.assertEquals(2, bear.getNetToughness()); - AssertJUnit.assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); - GameSimulator sim = createSimulator(game, p); - enKorSA.setTargetCard(bear); - shockSA.setTargetCard(enKor); - sim.simulateSpellAbility(enKorSA); - sim.simulateSpellAbility(shockSA); - Game simGame = sim.getSimulatedGameState(); - Card simEnKor = findCardWithName(simGame, enKorName); - Card simBear = findCardWithName(simGame, bearName); + GameSimulator sim = createSimulator(game, p); + enKorSA.setTargetCard(bear); + shockSA.setTargetCard(enKor); + sim.simulateSpellAbility(enKorSA); + sim.simulateSpellAbility(shockSA); + Game simGame = sim.getSimulatedGameState(); + Card simEnKor = findCardWithName(simGame, enKorName); + Card simBear = findCardWithName(simGame, bearName); - AssertJUnit.assertNotNull(simEnKor); - AssertJUnit.assertEquals(1, simEnKor.getDamage()); + AssertJUnit.assertNotNull(simEnKor); + AssertJUnit.assertEquals(1, simEnKor.getDamage()); - AssertJUnit.assertNotNull(simBear); - AssertJUnit.assertEquals(1, simBear.getDamage()); + AssertJUnit.assertNotNull(simBear); + AssertJUnit.assertEquals(1, simBear.getDamage()); - Card simPridemate = findCardWithName(simGame, pridemateName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(22, simGame.getPlayers().get(0).getLife()); - } + AssertJUnit.assertEquals(22, simGame.getPlayers().get(0).getLife()); + } - @Test - public void testRazia() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + @Test + public void testRazia() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; - String raziaName = "Razia, Boros Archangel"; - String bearName = "Runeclaw Bear"; - String greetingName = "Alchemist's Greeting"; + String raziaName = "Razia, Boros Archangel"; + String bearName = "Runeclaw Bear"; + String greetingName = "Alchemist's Greeting"; - for (int i = 0; i < 5; ++i) { - addCard("Mountain", p); - } + for (int i = 0; i < 5; ++i) { + addCard("Mountain", p); + } - addCard(soulfireName, p); - addCard(pridemateName, p); + addCard(soulfireName, p); + addCard(pridemateName, p); - Card greetingCard = addCardToZone(greetingName, p, ZoneType.Hand); + Card greetingCard = addCardToZone(greetingName, p, ZoneType.Hand); - Card razia = addCard(raziaName, p); + Card razia = addCard(raziaName, p); - SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); + SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); - Card bear = addCard(bearName, p); + Card bear = addCard(bearName, p); - SpellAbility greetingSA = greetingCard.getFirstSpellAbility(); + SpellAbility greetingSA = greetingCard.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - AssertJUnit.assertEquals(2, bear.getNetPower()); - AssertJUnit.assertEquals(2, bear.getNetToughness()); - AssertJUnit.assertEquals(0, bear.getDamage()); + AssertJUnit.assertEquals(2, bear.getNetPower()); + AssertJUnit.assertEquals(2, bear.getNetToughness()); + AssertJUnit.assertEquals(0, bear.getDamage()); - GameSimulator sim = createSimulator(game, p); - preventSA.setTargetCard(razia); - preventSA.getSubAbility().setTargetCard(bear); - greetingSA.setTargetCard(razia); - sim.simulateSpellAbility(preventSA); - sim.simulateSpellAbility(greetingSA); - Game simGame = sim.getSimulatedGameState(); - Card simRazia = findCardWithName(simGame, raziaName); - Card simBear = findCardWithName(simGame, bearName); + GameSimulator sim = createSimulator(game, p); + preventSA.setTargetCard(razia); + preventSA.getSubAbility().setTargetCard(bear); + greetingSA.setTargetCard(razia); + sim.simulateSpellAbility(preventSA); + sim.simulateSpellAbility(greetingSA); + Game simGame = sim.getSimulatedGameState(); + Card simRazia = findCardWithName(simGame, raziaName); + Card simBear = findCardWithName(simGame, bearName); - AssertJUnit.assertNotNull(simRazia); - AssertJUnit.assertEquals(1, simRazia.getDamage()); + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); - // bear destroyed - AssertJUnit.assertNull(simBear); + // bear destroyed + AssertJUnit.assertNull(simBear); - Card simPridemate = findCardWithName(simGame, pridemateName); + Card simPridemate = findCardWithName(simGame, pridemateName); - // only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + // only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); - } + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); + } - @Test - public void testRazia2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); + @Test + public void testRazia2() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); - String soulfireName = "Soulfire Grand Master"; - String pridemateName = "Ajani's Pridemate"; + String soulfireName = "Soulfire Grand Master"; + String pridemateName = "Ajani's Pridemate"; - String raziaName = "Razia, Boros Archangel"; - String elementalName = "Air Elemental"; - String shockName = "Shock"; + String raziaName = "Razia, Boros Archangel"; + String elementalName = "Air Elemental"; + String shockName = "Shock"; - for (int i = 0; i < 2; ++i) { - addCard("Mountain", p); - } + for (int i = 0; i < 2; ++i) { + addCard("Mountain", p); + } - addCard(soulfireName, p); - addCard(pridemateName, p); + addCard(soulfireName, p); + addCard(pridemateName, p); - Card shockCard1 = addCardToZone(shockName, p, ZoneType.Hand); - Card shockCard2 = addCardToZone(shockName, p, ZoneType.Hand); + Card shockCard1 = addCardToZone(shockName, p, ZoneType.Hand); + Card shockCard2 = addCardToZone(shockName, p, ZoneType.Hand); - Card razia = addCard(raziaName, p); + Card razia = addCard(raziaName, p); - SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); + SpellAbility preventSA = findSAWithPrefix(razia, "{T}:"); - Card elemental = addCard(elementalName, p); + Card elemental = addCard(elementalName, p); - SpellAbility shockSA1 = shockCard1.getFirstSpellAbility(); - SpellAbility shockSA2 = shockCard2.getFirstSpellAbility(); + SpellAbility shockSA1 = shockCard1.getFirstSpellAbility(); + SpellAbility shockSA2 = shockCard2.getFirstSpellAbility(); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals(0, razia.getDamage()); + AssertJUnit.assertEquals(0, razia.getDamage()); - AssertJUnit.assertEquals(4, elemental.getNetPower()); - AssertJUnit.assertEquals(4, elemental.getNetToughness()); - AssertJUnit.assertEquals(0, elemental.getDamage()); + AssertJUnit.assertEquals(4, elemental.getNetPower()); + AssertJUnit.assertEquals(4, elemental.getNetToughness()); + AssertJUnit.assertEquals(0, elemental.getDamage()); - GameSimulator sim = createSimulator(game, p); - preventSA.setTargetCard(razia); - preventSA.getSubAbility().setTargetCard(elemental); - shockSA1.setTargetCard(razia); - shockSA2.setTargetCard(razia); - sim.simulateSpellAbility(preventSA); - sim.simulateSpellAbility(shockSA1); - sim.simulateSpellAbility(shockSA2); - Game simGame = sim.getSimulatedGameState(); - Card simRazia = findCardWithName(simGame, raziaName); - Card simElemental = findCardWithName(simGame, elementalName); - - AssertJUnit.assertNotNull(simRazia); - AssertJUnit.assertEquals(1, simRazia.getDamage()); + GameSimulator sim = createSimulator(game, p); + preventSA.setTargetCard(razia); + preventSA.getSubAbility().setTargetCard(elemental); + shockSA1.setTargetCard(razia); + shockSA2.setTargetCard(razia); + sim.simulateSpellAbility(preventSA); + sim.simulateSpellAbility(shockSA1); + sim.simulateSpellAbility(shockSA2); + Game simGame = sim.getSimulatedGameState(); + Card simRazia = findCardWithName(simGame, raziaName); + Card simElemental = findCardWithName(simGame, elementalName); + + AssertJUnit.assertNotNull(simRazia); + AssertJUnit.assertEquals(1, simRazia.getDamage()); - // elemental not destroyed - AssertJUnit.assertNotNull(simElemental); - AssertJUnit.assertEquals(3, simElemental.getDamage()); - - Card simPridemate = findCardWithName(simGame, pridemateName); - - // only triggered twice - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(2, simPridemate.getPowerBonusFromCounters()); - - AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); - } - - @Test - public void testMassRemovalVsKalitas() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); - - addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); - for (int i = 0; i < 4; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } - - for (int i = 0; i < 2; i++) { - addCardToZone("Aboroth", opp, ZoneType.Battlefield); - } - - Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - - SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - AssertJUnit.assertNotNull(wrathSA); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(wrathSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); - - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(2, numZombies); - } - - @Test - public void testKalitasNumberOfTokens() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); - - addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); - addCardToZone("Anointed Procession", p, ZoneType.Battlefield); - addCardToZone("Swamp", p, ZoneType.Battlefield); - for (int i = 0; i < 4; i++) { - addCardToZone("Mountain", p, ZoneType.Battlefield); - } - - Card goblin = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); - Card goblin2 = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); - - // Fatal Push: should generate 2 tokens - Card fatalPush = addCardToZone("Fatal Push", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility fatalPushSA = fatalPush.getFirstSpellAbility(); - AssertJUnit.assertNotNull(fatalPushSA); - fatalPushSA.setTargetCard(goblin); - - // Electrify: should also generate 2 tokens after the Ixalan rules update - Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); - SpellAbility electrifySA = electrify.getFirstSpellAbility(); - AssertJUnit.assertNotNull(electrifySA); - electrifySA.setTargetCard(goblin2); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(fatalPushSA).value; - AssertJUnit.assertTrue(score > 0); - AssertJUnit.assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); - - score = sim.simulateSpellAbility(electrifySA).value; - AssertJUnit.assertTrue(score > 0); - AssertJUnit.assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); - } - - @Test - public void testPlayerXCount() { - // If playerXCount is operational, then conditions that count something - // about the player (e.g. - // cards in hand, life total) should work, similar to the Bloodghast - // "Haste" condition. - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player opp = game.getPlayers().get(1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - Card bloodghast = addCardToZone("Bloodghast", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - - assert (!bloodghast.hasKeyword("Haste")); - - opp.setLife(5, null); - game.getAction().checkStateEffects(true); - - assert (bloodghast.hasKeyword("Haste")); - } - - @Test - public void testDeathsShadow() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - addCardToZone("Platinum Angel", p, ZoneType.Battlefield); - Card deathsShadow = addCardToZone("Death's Shadow", p, ZoneType.Battlefield); - - p.setLife(1, null); - game.getAction().checkStateEffects(true); - assert (deathsShadow.getNetPower() == 12); - - p.setLife(-1, null); - game.getAction().checkStateEffects(true); - assert (deathsShadow.getNetPower() == 13); // on negative life, should - // always be 13/13 - } - - @Test - public void testBludgeonBrawlLatticeAura() { - // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - // - Aura Equipment - // Creature Auras should stay on - String bearCardName = "Runeclaw Bear"; - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - Card bear = addCard(bearCardName, p); - bear.setSickness(false); - Card lifelink = addCard("Lifelink", p); - lifelink.attachToEntity(bear); - - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertTrue(bear.hasCardAttachment(lifelink)); - - // this adds Artifact Type - addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); - - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertFalse(bear.isEquipped()); - - AssertJUnit.assertTrue(lifelink.isArtifact()); - AssertJUnit.assertFalse(lifelink.isEquipment()); - - // this add Equipment and causes it to fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(bear.isEnchanted()); - AssertJUnit.assertTrue(bear.isEquipped()); - - AssertJUnit.assertTrue(lifelink.isArtifact()); - AssertJUnit.assertTrue(lifelink.isEquipment()); - - // still in battlefield - AssertJUnit.assertTrue(lifelink.isInPlay()); - } - - @Test - public void testBludgeonBrawlLatticeCurse() { - // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment - // - Aura Equipment - // Curses can only attach Player, but Equipment can only attach to Creature so - // it does fall off - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - final String curseName = "Cruel Reality"; - - Card curse = addCard(curseName, p); - curse.attachToEntity(p); - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.isEnchanted()); - AssertJUnit.assertTrue(p.hasCardAttachment(curse)); - - // this adds Artifact Type - addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); - - game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(p.isEnchanted()); - AssertJUnit.assertTrue(curse.isArtifact()); + // elemental not destroyed + AssertJUnit.assertNotNull(simElemental); + AssertJUnit.assertEquals(3, simElemental.getDamage()); + + Card simPridemate = findCardWithName(simGame, pridemateName); + + // only triggered twice + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(2, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(2, simPridemate.getPowerBonusFromCounters()); + + AssertJUnit.assertEquals(24, simGame.getPlayers().get(0).getLife()); + } + + @Test + public void testMassRemovalVsKalitas() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); + + addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); + for (int i = 0; i < 4; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + + for (int i = 0; i < 2; i++) { + addCardToZone("Aboroth", opp, ZoneType.Battlefield); + } + + Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); + AssertJUnit.assertNotNull(wrathSA); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(wrathSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); + + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(2, numZombies); + } + + @Test + public void testKalitasNumberOfTokens() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); + + addCardToZone("Kalitas, Traitor of Ghet", p, ZoneType.Battlefield); + addCardToZone("Anointed Procession", p, ZoneType.Battlefield); + addCardToZone("Swamp", p, ZoneType.Battlefield); + for (int i = 0; i < 4; i++) { + addCardToZone("Mountain", p, ZoneType.Battlefield); + } + + Card goblin = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); + Card goblin2 = addCardToZone("Raging Goblin", opp, ZoneType.Battlefield); + + // Fatal Push: should generate 2 tokens + Card fatalPush = addCardToZone("Fatal Push", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + SpellAbility fatalPushSA = fatalPush.getFirstSpellAbility(); + AssertJUnit.assertNotNull(fatalPushSA); + fatalPushSA.setTargetCard(goblin); + + // Electrify: should also generate 2 tokens after the Ixalan rules update + Card electrify = addCardToZone("Electrify", p, ZoneType.Hand); + SpellAbility electrifySA = electrify.getFirstSpellAbility(); + AssertJUnit.assertNotNull(electrifySA); + electrifySA.setTargetCard(goblin2); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(fatalPushSA).value; + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(2, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + + score = sim.simulateSpellAbility(electrifySA).value; + AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertEquals(4, countCardsWithName(sim.getSimulatedGameState(), "Zombie Token")); + } + + @Test + public void testPlayerXCount() { + // If playerXCount is operational, then conditions that count something + // about the player (e.g. + // cards in hand, life total) should work, similar to the Bloodghast + // "Haste" condition. + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player opp = game.getPlayers().get(1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card bloodghast = addCardToZone("Bloodghast", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + + assert (!bloodghast.hasKeyword("Haste")); + + opp.setLife(5, null); + game.getAction().checkStateEffects(true); + + assert (bloodghast.hasKeyword("Haste")); + } + + @Test + public void testDeathsShadow() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + addCardToZone("Platinum Angel", p, ZoneType.Battlefield); + Card deathsShadow = addCardToZone("Death's Shadow", p, ZoneType.Battlefield); + + p.setLife(1, null); + game.getAction().checkStateEffects(true); + assert (deathsShadow.getNetPower() == 12); + + p.setLife(-1, null); + game.getAction().checkStateEffects(true); + assert (deathsShadow.getNetPower() == 13); // on negative life, should + // always be 13/13 + } + + @Test + public void testBludgeonBrawlLatticeAura() { + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment + // - Aura Equipment + // Creature Auras should stay on + String bearCardName = "Runeclaw Bear"; + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + Card bear = addCard(bearCardName, p); + bear.setSickness(false); + Card lifelink = addCard("Lifelink", p); + lifelink.attachToEntity(bear); + + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.hasCardAttachment(lifelink)); + + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertFalse(bear.isEquipped()); + + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertFalse(lifelink.isEquipment()); + + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(bear.isEnchanted()); + AssertJUnit.assertTrue(bear.isEquipped()); + + AssertJUnit.assertTrue(lifelink.isArtifact()); + AssertJUnit.assertTrue(lifelink.isEquipment()); + + // still in battlefield + AssertJUnit.assertTrue(lifelink.isInPlay()); + } + + @Test + public void testBludgeonBrawlLatticeCurse() { + // Enchantment Aura are with Mycosynth Lattice turned into Artifact Enchantment + // - Aura Equipment + // Curses can only attach Player, but Equipment can only attach to Creature so + // it does fall off + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + final String curseName = "Cruel Reality"; + + Card curse = addCard(curseName, p); + curse.attachToEntity(p); + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(p.hasCardAttachment(curse)); + + // this adds Artifact Type + addCardToZone("Mycosynth Lattice", p, ZoneType.Battlefield); + + game.getAction().checkStateEffects(true); + AssertJUnit.assertTrue(p.isEnchanted()); + AssertJUnit.assertTrue(curse.isArtifact()); - // this add Equipment and causes it to fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); - AssertJUnit.assertFalse(p.isEnchanted()); + // this add Equipment and causes it to fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); + AssertJUnit.assertFalse(p.isEnchanted()); - // not in Battlefield anymore - AssertJUnit.assertFalse(curse.isInPlay()); - AssertJUnit.assertTrue(curse.isInZone(ZoneType.Graveyard)); - } + // not in Battlefield anymore + AssertJUnit.assertFalse(curse.isInPlay()); + AssertJUnit.assertTrue(curse.isInZone(ZoneType.Graveyard)); + } - @Test - public void testBludgeonBrawlFortification() { - // Bludgeon Brawl makes Fortification into Equipment - // that means it can't attach a Land anymore if the Land is no Creature + @Test + public void testBludgeonBrawlFortification() { + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); - Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + Card mountain = addCardToZone("Mountain", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachToEntity(mountain); - game.getAction().checkStateEffects(true); + fortification.attachToEntity(mountain); + game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(fortification.isFortification()); - AssertJUnit.assertFalse(fortification.isEquipment()); + AssertJUnit.assertTrue(fortification.isFortification()); + AssertJUnit.assertFalse(fortification.isEquipment()); - AssertJUnit.assertTrue(mountain.isFortified()); - AssertJUnit.assertTrue(mountain.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(mountain.isFortified()); + AssertJUnit.assertTrue(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); - // adding Brawl will cause the Fortification into Equipment and it to - // fall off - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); + // adding Brawl will cause the Fortification into Equipment and it to + // fall off + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); - AssertJUnit.assertFalse(fortification.isFortification()); - AssertJUnit.assertTrue(fortification.isEquipment()); + AssertJUnit.assertFalse(fortification.isFortification()); + AssertJUnit.assertTrue(fortification.isEquipment()); - AssertJUnit.assertFalse(mountain.hasCardAttachment(fortification)); - AssertJUnit.assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); - } + AssertJUnit.assertFalse(mountain.hasCardAttachment(fortification)); + AssertJUnit.assertFalse(mountain.hasKeyword(Keyword.INDESTRUCTIBLE)); + } - @Test - public void testBludgeonBrawlFortificationDryad() { - // Bludgeon Brawl makes Fortification into Equipment - // that means it can't attach a Land anymore if the Land is no Creature too - // Dryad Arbor is both a Land and a Creature so it stays attached + @Test + public void testBludgeonBrawlFortificationDryad() { + // Bludgeon Brawl makes Fortification into Equipment + // that means it can't attach a Land anymore if the Land is no Creature too + // Dryad Arbor is both a Land and a Creature so it stays attached - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); - Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); + Card dryad = addCardToZone("Dryad Arbor", p, ZoneType.Battlefield); + Card fortification = addCardToZone("Darksteel Garrison", p, ZoneType.Battlefield); - fortification.attachToEntity(dryad); - game.getAction().checkStateEffects(true); + fortification.attachToEntity(dryad); + game.getAction().checkStateEffects(true); - AssertJUnit.assertTrue(dryad.isFortified()); - AssertJUnit.assertFalse(dryad.isEquipped()); + AssertJUnit.assertTrue(dryad.isFortified()); + AssertJUnit.assertFalse(dryad.isEquipped()); - AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); - // adding Brawl will cause the Fortification into Equipment - // because Dryad Arbor is a Creature it stays attached - addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); - game.getAction().checkStateEffects(true); + // adding Brawl will cause the Fortification into Equipment + // because Dryad Arbor is a Creature it stays attached + addCardToZone("Bludgeon Brawl", p, ZoneType.Battlefield); + game.getAction().checkStateEffects(true); - // switched from Fortification to Equipment - AssertJUnit.assertFalse(dryad.isFortified()); - AssertJUnit.assertTrue(dryad.isEquipped()); + // switched from Fortification to Equipment + AssertJUnit.assertFalse(dryad.isFortified()); + AssertJUnit.assertTrue(dryad.isEquipped()); - AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); - AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); - } + AssertJUnit.assertTrue(dryad.hasCardAttachment(fortification)); + AssertJUnit.assertTrue(dryad.hasKeyword(Keyword.INDESTRUCTIBLE)); + } - @Test - public void testRiotEnchantment() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + @Test + public void testRiotEnchantment() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - final String goblinName = "Zhur-Taa Goblin"; + final String goblinName = "Zhur-Taa Goblin"; - addCard("Rhythm of the Wild", p); + addCard("Rhythm of the Wild", p); - Card goblin = addCardToZone(goblinName, p, ZoneType.Hand); + Card goblin = addCardToZone(goblinName, p, ZoneType.Hand); - addCard("Mountain", p); - addCard("Forest", p); + addCard("Mountain", p); + addCard("Forest", p); - SpellAbility goblinSA = goblin.getFirstSpellAbility(); - AssertJUnit.assertNotNull(goblinSA); + SpellAbility goblinSA = goblin.getFirstSpellAbility(); + AssertJUnit.assertNotNull(goblinSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(goblinSA).value; - AssertJUnit.assertTrue(score > 0); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(goblinSA).value; + AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - Card simGoblin = findCardWithName(simGame, goblinName); + Card simGoblin = findCardWithName(simGame, goblinName); - AssertJUnit.assertNotNull(simGoblin); - int effects = simGoblin.getCounters(CounterEnumType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); - AssertJUnit.assertEquals(2, effects); - } + AssertJUnit.assertNotNull(simGoblin); + int effects = simGoblin.getCounters(CounterEnumType.P1P1) + simGoblin.getKeywordMagnitude(Keyword.HASTE); + AssertJUnit.assertEquals(2, effects); + } - @Test - public void testTeysaKarlovXathridNecromancer() { - // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token + @Test + public void testTeysaKarlovXathridNecromancer() { + // Teysa Karlov and Xathrid Necromancer dying at the same time makes 4 token - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("Xathrid Necromancer", p); + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); - for (int i = 0; i < 4; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } + for (int i = 0; i < 4; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } - Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + Card wrathOfGod = addCardToZone("Wrath of God", p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); - AssertJUnit.assertNotNull(wrathSA); + SpellAbility wrathSA = wrathOfGod.getFirstSpellAbility(); + AssertJUnit.assertNotNull(wrathSA); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(wrathSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(wrathSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(4, numZombies); - } + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(4, numZombies); + } - @Test - public void testDoubleTeysaKarlovXathridNecromancer() { - // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer - // trigger 3 times + @Test + public void testDoubleTeysaKarlovXathridNecromancer() { + // Teysa Karlov dieing because of Legendary rule will make Xathrid Necromancer + // trigger 3 times - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("Xathrid Necromancer", p); + addCard("Teysa Karlov", p); + addCard("Xathrid Necromancer", p); - for (int i = 0; i < 3; i++) { - addCard("Plains", p); - } - addCard("Swamp", p); + for (int i = 0; i < 3; i++) { + addCard("Plains", p); + } + addCard("Swamp", p); - Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand); + Card second = addCardToZone("Teysa Karlov", p, ZoneType.Hand); - SpellAbility secondSA = second.getFirstSpellAbility(); + SpellAbility secondSA = second.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(secondSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(secondSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - int numZombies = countCardsWithName(simGame, "Zombie Token"); - AssertJUnit.assertEquals(3, numZombies); - } + int numZombies = countCardsWithName(simGame, "Zombie Token"); + AssertJUnit.assertEquals(3, numZombies); + } - @Test - public void testTeysaKarlovGitrogMonster() { + @Test + public void testTeysaKarlovGitrogMonster() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand); + Card armageddon = addCardToZone("Armageddon", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // Two cards drawn - AssertJUnit.assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // Two cards drawn + AssertJUnit.assertEquals(2, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - @Test - public void testTeysaKarlovGitrogMonsterGitrogDies() { + @Test + public void testTeysaKarlovGitrogMonsterGitrogDies() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card teysa = addCard("Teysa Karlov", p); - addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + Card teysa = addCard("Teysa Karlov", p); + addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - String indestructibilityName = "Indestructibility"; - Card indestructibility = addCard(indestructibilityName, p); + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); - indestructibility.attachToEntity(teysa); + indestructibility.attachToEntity(teysa); - // update Indestructible state - game.getAction().checkStateEffects(true); + // update Indestructible state + game.getAction().checkStateEffects(true); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // One cards drawn - AssertJUnit.assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // One cards drawn + AssertJUnit.assertEquals(0, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - @Test - public void testTeysaKarlovGitrogMonsterTeysaDies() { + @Test + public void testTeysaKarlovGitrogMonsterTeysaDies() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - addCard("Teysa Karlov", p); - Card gitrog = addCard("The Gitrog Monster", p); - addCard("Dryad Arbor", p); + addCard("Teysa Karlov", p); + Card gitrog = addCard("The Gitrog Monster", p); + addCard("Dryad Arbor", p); - String indestructibilityName = "Indestructibility"; - Card indestructibility = addCard(indestructibilityName, p); + String indestructibilityName = "Indestructibility"; + Card indestructibility = addCard(indestructibilityName, p); - indestructibility.attachToEntity(gitrog); + indestructibility.attachToEntity(gitrog); - // update Indestructible state - game.getAction().checkStateEffects(true); + // update Indestructible state + game.getAction().checkStateEffects(true); - for (int i = 0; i < 4; i++) { - addCard("Plains", p); - addCardToZone("Plains", p, ZoneType.Library); - } + for (int i = 0; i < 4; i++) { + addCard("Plains", p); + addCardToZone("Plains", p, ZoneType.Library); + } - Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); + Card armageddon = addCardToZone("Wrath of God", p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); + SpellAbility armageddonSA = armageddon.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(armageddonSA).value; - AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(armageddonSA).value; + AssertJUnit.assertTrue(score > 0); + Game simGame = sim.getSimulatedGameState(); - // One cards drawn - AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); - } + // One cards drawn + AssertJUnit.assertEquals(1, simGame.getPlayers().get(0).getZone(ZoneType.Hand).size()); + } - @Test - public void testCloneTransform() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + @Test + public void testCloneTransform() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - final String outLawName = "Kruin Outlaw"; - final String hillGiantName = "Elite Vanguard"; - final String terrorName = "Terror of Kruin Pass"; + final String outLawName = "Kruin Outlaw"; + final String hillGiantName = "Elite Vanguard"; + final String terrorName = "Terror of Kruin Pass"; - Card outlaw = addCard(outLawName, p2); - Card giant = addCard(hillGiantName, p); + Card outlaw = addCard(outLawName, p2); + Card giant = addCard(hillGiantName, p); - AssertJUnit.assertFalse(outlaw.isCloned()); - AssertJUnit.assertTrue(outlaw.isDoubleFaced()); - AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(outlaw.canTransform(null)); - AssertJUnit.assertFalse(outlaw.isBackSide()); + AssertJUnit.assertFalse(outlaw.isCloned()); + AssertJUnit.assertTrue(outlaw.isDoubleFaced()); + AssertJUnit.assertTrue(outlaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(outlaw.canTransform(null)); + AssertJUnit.assertFalse(outlaw.isBackSide()); - AssertJUnit.assertFalse(giant.isDoubleFaced()); - AssertJUnit.assertFalse(giant.canTransform(null)); + AssertJUnit.assertFalse(giant.isDoubleFaced()); + AssertJUnit.assertFalse(giant.canTransform(null)); - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - addCard("Forest", p); - addCard("Island", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Forest", p); + addCard("Island", p); - Card cytoCard = addCardToZone("Cytoshape", p, ZoneType.Hand); - SpellAbility cytoSA = cytoCard.getFirstSpellAbility(); + Card cytoCard = addCardToZone("Cytoshape", p, ZoneType.Hand); + SpellAbility cytoSA = cytoCard.getFirstSpellAbility(); - Card moonmist = addCardToZone("Moonmist", p, ZoneType.Hand); - SpellAbility moonmistSA = moonmist.getFirstSpellAbility(); + Card moonmist = addCardToZone("Moonmist", p, ZoneType.Hand); + SpellAbility moonmistSA = moonmist.getFirstSpellAbility(); - cytoSA.getTargets().add(outlaw); + cytoSA.getTargets().add(outlaw); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(cytoSA).value; + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(cytoSA).value; - AssertJUnit.assertTrue(score > 0); + AssertJUnit.assertTrue(score > 0); - Game simGame = sim.getSimulatedGameState(); + Game simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); - Card clonedOutLaw = (Card) sim.getGameCopier().find(outlaw); + Card clonedOutLaw = (Card) sim.getGameCopier().find(outlaw); - AssertJUnit.assertTrue(clonedOutLaw.isCloned()); - AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); - AssertJUnit.assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(clonedOutLaw.canTransform(null)); - AssertJUnit.assertFalse(clonedOutLaw.isBackSide()); + AssertJUnit.assertTrue(clonedOutLaw.isCloned()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(clonedOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(clonedOutLaw.canTransform(null)); + AssertJUnit.assertFalse(clonedOutLaw.isBackSide()); - AssertJUnit.assertEquals(clonedOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(clonedOutLaw.getName(), hillGiantName); - AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(clonedOutLaw.isDoubleFaced()); - score = sim.simulateSpellAbility(moonmistSA).value; - AssertJUnit.assertTrue(score > 0); + score = sim.simulateSpellAbility(moonmistSA).value; + AssertJUnit.assertTrue(score > 0); - simGame = sim.getSimulatedGameState(); + simGame = sim.getSimulatedGameState(); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(2, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, terrorName)); - Card transformOutLaw = (Card) sim.getGameCopier().find(outlaw); + Card transformOutLaw = (Card) sim.getGameCopier().find(outlaw); - AssertJUnit.assertTrue(transformOutLaw.isCloned()); - AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); - AssertJUnit.assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); - AssertJUnit.assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertTrue(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertFalse(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - AssertJUnit.assertEquals(transformOutLaw.getName(), hillGiantName); + AssertJUnit.assertEquals(transformOutLaw.getName(), hillGiantName); - // need to clean up the clone state - simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.CLEANUP); + // need to clean up the clone state + simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.CLEANUP); - AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); - AssertJUnit.assertEquals(1, countCardsWithName(simGame, hillGiantName)); - AssertJUnit.assertEquals(1, countCardsWithName(simGame, terrorName)); + AssertJUnit.assertEquals(0, countCardsWithName(simGame, outLawName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, hillGiantName)); + AssertJUnit.assertEquals(1, countCardsWithName(simGame, terrorName)); - AssertJUnit.assertFalse(transformOutLaw.isCloned()); - AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); - AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); - AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); - AssertJUnit.assertTrue(transformOutLaw.isBackSide()); + AssertJUnit.assertFalse(transformOutLaw.isCloned()); + AssertJUnit.assertTrue(transformOutLaw.isDoubleFaced()); + AssertJUnit.assertTrue(transformOutLaw.hasState(CardStateName.Transformed)); + AssertJUnit.assertTrue(transformOutLaw.canTransform(null)); + AssertJUnit.assertTrue(transformOutLaw.isBackSide()); - AssertJUnit.assertEquals(transformOutLaw.getName(), terrorName); - } + AssertJUnit.assertEquals(transformOutLaw.getName(), terrorName); + } - @Test - public void testVolrathsShapeshifter() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + @Test + public void testVolrathsShapeshifter() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - Card volrath = addCard("Volrath's Shapeshifter", p); + Card volrath = addCard("Volrath's Shapeshifter", p); - // 1. Assert that Volrath has the Discard ability - SpellAbility discard = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discard != null && discard.getApi() == ApiType.Discard); + // 1. Assert that Volrath has the Discard ability + SpellAbility discard = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discard != null && discard.getApi() == ApiType.Discard); - // 2. Copy the text from a creature - addCardToZone("Abattoir Ghoul", p, ZoneType.Graveyard); - game.getAction().checkStateEffects(true); + // 2. Copy the text from a creature + addCardToZone("Abattoir Ghoul", p, ZoneType.Graveyard); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals("Abattoir Ghoul", volrath.getName()); - AssertJUnit.assertEquals(3, volrath.getNetPower()); - AssertJUnit.assertEquals(2, volrath.getNetToughness()); - AssertJUnit.assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); + AssertJUnit.assertEquals("Abattoir Ghoul", volrath.getName()); + AssertJUnit.assertEquals(3, volrath.getNetPower()); + AssertJUnit.assertEquals(2, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.hasKeyword(Keyword.FIRST_STRIKE)); - SpellAbility discardAfterCopy = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); + SpellAbility discardAfterCopy = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discardAfterCopy != null && discardAfterCopy.getApi() == ApiType.Discard); - // 3. Revert back to not copying any text - addCardToZone("Plains", p, ZoneType.Graveyard); - game.getAction().checkStateEffects(true); + // 3. Revert back to not copying any text + addCardToZone("Plains", p, ZoneType.Graveyard); + game.getAction().checkStateEffects(true); - AssertJUnit.assertEquals("Volrath's Shapeshifter", volrath.getName()); - AssertJUnit.assertEquals(0, volrath.getNetPower()); - AssertJUnit.assertEquals(1, volrath.getNetToughness()); - AssertJUnit.assertTrue(volrath.getKeywords().isEmpty()); + AssertJUnit.assertEquals("Volrath's Shapeshifter", volrath.getName()); + AssertJUnit.assertEquals(0, volrath.getNetPower()); + AssertJUnit.assertEquals(1, volrath.getNetToughness()); + AssertJUnit.assertTrue(volrath.getKeywords().isEmpty()); - SpellAbility discardAfterRevert = findSAWithPrefix(volrath, "{2}"); - AssertJUnit.assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); - } + SpellAbility discardAfterRevert = findSAWithPrefix(volrath, "{2}"); + AssertJUnit.assertTrue(discardAfterRevert != null && discardAfterRevert.getApi() == ApiType.Discard); + } - @Test - public void testSparkDoubleAndGideon() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + @Test + public void testSparkDoubleAndGideon() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - for (int i = 0; i < 7; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } - for (int i = 0; i < 7; i++) { - addCardToZone("Island", p, ZoneType.Battlefield); - } - - Card gideon = addCardToZone("Gideon Blackblade", p, ZoneType.Hand); - Card sparkDouble = addCardToZone("Spark Double", p, ZoneType.Hand); + for (int i = 0; i < 7; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Island", p, ZoneType.Battlefield); + } + + Card gideon = addCardToZone("Gideon Blackblade", p, ZoneType.Hand); + Card sparkDouble = addCardToZone("Spark Double", p, ZoneType.Hand); - SpellAbility gideonSA = gideon.getFirstSpellAbility(); - SpellAbility sparkDoubleSA = sparkDouble.getFirstSpellAbility(); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(gideonSA); - sim.simulateSpellAbility(sparkDoubleSA); + SpellAbility gideonSA = gideon.getFirstSpellAbility(); + SpellAbility sparkDoubleSA = sparkDouble.getFirstSpellAbility(); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(gideonSA); + sim.simulateSpellAbility(sparkDoubleSA); - Card simSpark = sim.getSimulatedGameState().findById(sparkDouble.getId()); + Card simSpark = sim.getSimulatedGameState().findById(sparkDouble.getId()); - AssertJUnit.assertNotNull(simSpark); - AssertJUnit.assertTrue(simSpark.isInZone(ZoneType.Battlefield)); - AssertJUnit.assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); - } - - @Test - public void testVituGhaziAndCytoshape() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - for (int i = 0; i < 7; i++) { - addCardToZone("Plains", p, ZoneType.Battlefield); - } - for (int i = 0; i < 7; i++) { - addCardToZone("Island", p, ZoneType.Battlefield); - } - for (int i = 0; i < 7; i++) { - addCardToZone("Forest", p, ZoneType.Battlefield); - } - - Card tgtLand = addCardToZone("Wastes", p, ZoneType.Battlefield); - - Card vituGhazi = addCardToZone("Awakening of Vitu-Ghazi", p, ZoneType.Hand); - Card cytoshape = addCardToZone("Cytoshape", p, ZoneType.Hand); - Card goblin = addCardToZone("Raging Goblin", p, ZoneType.Battlefield); - - SpellAbility vituSA = vituGhazi.getFirstSpellAbility(); - vituSA.getTargets().add(tgtLand); - - SpellAbility cytoSA = cytoshape.getFirstSpellAbility(); - cytoSA.getTargets().add(tgtLand); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(vituSA); - sim.simulateSpellAbility(cytoSA); - - Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); - - AssertJUnit.assertNotNull(awakened); - AssertJUnit.assertEquals("Vitu-Ghazi", awakened.getName()); - AssertJUnit.assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertTrue(awakened.hasKeyword(Keyword.HASTE)); - AssertJUnit.assertTrue(awakened.getType().hasSubtype("Goblin")); - } - - @Test - public void testNecroticOozeActivateOnce() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - for (int i = 0; i < 7; i++) { - addCardToZone("Swamp", p, ZoneType.Battlefield); - } - for (int i = 0; i < 7; i++) { - addCardToZone("Forest", p, ZoneType.Battlefield); - } - - addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); - Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); - - SpellAbility oozeSA = ooze.getFirstSpellAbility(); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(oozeSA); - - Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); - - AssertJUnit.assertNotNull(oozeOTB); - - SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); - AssertJUnit.assertNotNull(copiedSA); - AssertJUnit.assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); - } - - @Test - public void testEpochrasite() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - - for (int i = 0; i < 7; i++) { - addCardToZone("Swamp", p, ZoneType.Battlefield); - } + AssertJUnit.assertNotNull(simSpark); + AssertJUnit.assertTrue(simSpark.isInZone(ZoneType.Battlefield)); + AssertJUnit.assertEquals(1, simSpark.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(5, simSpark.getCounters(CounterEnumType.LOYALTY)); + } + + @Test + public void testVituGhaziAndCytoshape() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + for (int i = 0; i < 7; i++) { + addCardToZone("Plains", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Island", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Forest", p, ZoneType.Battlefield); + } + + Card tgtLand = addCardToZone("Wastes", p, ZoneType.Battlefield); + + Card vituGhazi = addCardToZone("Awakening of Vitu-Ghazi", p, ZoneType.Hand); + Card cytoshape = addCardToZone("Cytoshape", p, ZoneType.Hand); + Card goblin = addCardToZone("Raging Goblin", p, ZoneType.Battlefield); + + SpellAbility vituSA = vituGhazi.getFirstSpellAbility(); + vituSA.getTargets().add(tgtLand); + + SpellAbility cytoSA = cytoshape.getFirstSpellAbility(); + cytoSA.getTargets().add(tgtLand); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(vituSA); + sim.simulateSpellAbility(cytoSA); + + Card awakened = findCardWithName(sim.getSimulatedGameState(), "Vitu-Ghazi"); + + AssertJUnit.assertNotNull(awakened); + AssertJUnit.assertEquals("Vitu-Ghazi", awakened.getName()); + AssertJUnit.assertEquals(9, awakened.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertTrue(awakened.hasKeyword(Keyword.HASTE)); + AssertJUnit.assertTrue(awakened.getType().hasSubtype("Goblin")); + } + + @Test + public void testNecroticOozeActivateOnce() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + for (int i = 0; i < 7; i++) { + addCardToZone("Swamp", p, ZoneType.Battlefield); + } + for (int i = 0; i < 7; i++) { + addCardToZone("Forest", p, ZoneType.Battlefield); + } + + addCardToZone("Basking Rootwalla", p, ZoneType.Graveyard); + Card ooze = addCardToZone("Necrotic Ooze", p, ZoneType.Hand); + + SpellAbility oozeSA = ooze.getFirstSpellAbility(); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(oozeSA); + + Card oozeOTB = findCardWithName(sim.getSimulatedGameState(), "Necrotic Ooze"); + + AssertJUnit.assertNotNull(oozeOTB); + + SpellAbility copiedSA = findSAWithPrefix(oozeOTB, "{1}{G}:"); + AssertJUnit.assertNotNull(copiedSA); + AssertJUnit.assertEquals("1", copiedSA.getRestrictions().getLimitToCheck()); + } + + @Test + public void testEpochrasite() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + + for (int i = 0; i < 7; i++) { + addCardToZone("Swamp", p, ZoneType.Battlefield); + } - Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); - Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); + Card epo = addCardToZone("Epochrasite", p, ZoneType.Graveyard); + Card animate = addCardToZone("Animate Dead", p, ZoneType.Hand); - SpellAbility saAnimate = animate.getFirstSpellAbility(); - saAnimate.getTargets().add(epo); + SpellAbility saAnimate = animate.getFirstSpellAbility(); + saAnimate.getTargets().add(epo); - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(saAnimate); - - Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(saAnimate); + + Card epoOTB = findCardWithName(sim.getSimulatedGameState(), "Epochrasite"); - AssertJUnit.assertNotNull(epoOTB); - AssertJUnit.assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); - } - - @SuppressWarnings("unused") - public void broken_testCloneDimir() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - // add enough cards to hand to flip Jushi - for (int i = 0; i < 9; i++) { - addCardToZone("Plains", p, ZoneType.Hand); - addCardToZone("Plains", p, ZoneType.Library); - addCard("Swamp", p); - addCard("Island", p); - } + AssertJUnit.assertNotNull(epoOTB); + AssertJUnit.assertEquals(3, epoOTB.getCounters(CounterEnumType.P1P1)); + } + + @SuppressWarnings("unused") + public void broken_testCloneDimir() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + // add enough cards to hand to flip Jushi + for (int i = 0; i < 9; i++) { + addCardToZone("Plains", p, ZoneType.Hand); + addCardToZone("Plains", p, ZoneType.Library); + addCard("Swamp", p); + addCard("Island", p); + } - Card dimirdg = addCard("Dimir Doppelganger", p); - // so T can be paid - dimirdg.setSickness(false); - SpellAbility saDimirClone = findSAWithPrefix(dimirdg, "{1}{U}{B}"); + Card dimirdg = addCard("Dimir Doppelganger", p); + // so T can be paid + dimirdg.setSickness(false); + SpellAbility saDimirClone = findSAWithPrefix(dimirdg, "{1}{U}{B}"); - AssertJUnit.assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); + AssertJUnit.assertTrue(saDimirClone != null && saDimirClone.getApi() == ApiType.ChangeZone); - Card jushi = addCardToZone("Jushi Apprentice", p, ZoneType.Graveyard); - Card bear = addCardToZone("Runeclaw Bear", p, ZoneType.Graveyard); - Card nezumi = addCardToZone("Nezumi Shortfang", p, ZoneType.Graveyard); + Card jushi = addCardToZone("Jushi Apprentice", p, ZoneType.Graveyard); + Card bear = addCardToZone("Runeclaw Bear", p, ZoneType.Graveyard); + Card nezumi = addCardToZone("Nezumi Shortfang", p, ZoneType.Graveyard); - // Clone Jushi first - saDimirClone.getTargets().add(jushi); - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(saDimirClone).value; - AssertJUnit.assertTrue(score > 0); - - Card dimirdgAfterCopy1 = (Card) sim.getGameCopier().find(dimirdg); - AssertJUnit.assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); - AssertJUnit.assertEquals(1, dimirdgAfterCopy1.getNetPower()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy1.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterCopy1.isFlipCard()); - AssertJUnit.assertFalse(dimirdgAfterCopy1.isFlipped()); - AssertJUnit.assertFalse(dimirdgAfterCopy1.getType().isLegendary()); - - bear = (Card) sim.getGameCopier().find(bear); - - // make new simulator so new SpellAbility is found - Game simGame = sim.getSimulatedGameState(); - sim = createSimulator(simGame, p); - - Player copiedPlayer = (Player) sim.getGameCopier().find(p); - int handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - AssertJUnit.assertEquals(9, handSize); - - SpellAbility draw = findSAWithPrefix(dimirdgAfterCopy1, "{2}{U}"); - score = sim.simulateSpellAbility(draw).value; - AssertJUnit.assertTrue(score > 0); - - copiedPlayer = (Player) sim.getGameCopier().find(p); - handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); - AssertJUnit.assertEquals(10, handSize); - - simGame = sim.getSimulatedGameState(); - - bear = (Card) sim.getGameCopier().find(bear); - - // make new simulator so new SpellAbility is found - simGame = sim.getSimulatedGameState(); - sim = createSimulator(simGame, p); - - // bear = (Card)sim.getGameCopier().find(bear); - - simGame = sim.getSimulatedGameState(); - - Card dimirdgAfterFlip1 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); - - AssertJUnit.assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); - AssertJUnit.assertEquals(2, dimirdgAfterFlip1.getNetPower()); - AssertJUnit.assertEquals(3, dimirdgAfterFlip1.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterFlip1.isFlipped()); - AssertJUnit.assertTrue(dimirdgAfterFlip1.getType().isLegendary()); - - saDimirClone = findSAWithPrefix(dimirdgAfterCopy1, "{1}{U}{B}"); - // Clone Bear first - saDimirClone.resetTargets(); - saDimirClone.getTargets().add(bear); - - score = sim.simulateSpellAbility(saDimirClone).value; - AssertJUnit.assertTrue(score > 0); - - Card dimirdgAfterCopy2 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); - - // System.out.println(sim.getSimulatedGameState().getCardsIn(ZoneType.Battlefield)); - - System.out.println(dimirdgAfterCopy2.getName()); - System.out.println(dimirdgAfterCopy2.getCloneStates()); - System.out.println(dimirdgAfterCopy2.getOriginalState(CardStateName.Original).getName()); - System.out.println(dimirdgAfterCopy2.isFlipCard()); - System.out.println(dimirdgAfterCopy2.isFlipped()); - - AssertJUnit.assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetPower()); - AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetToughness()); - AssertJUnit.assertTrue(dimirdgAfterCopy2.isFlipped()); - AssertJUnit.assertFalse(dimirdgAfterCopy2.getType().isLegendary()); - } - - @Test - public void testStaticMultiPump() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - Card c1 = addCard("Creakwood Liege", p); - Card c2 = addCard("Creakwood Liege", p); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - - // update stats state - game.getAction().checkStateEffects(true); - - AssertJUnit.assertEquals(4, c1.getNetPower()); - AssertJUnit.assertEquals(4, c1.getNetToughness()); - - AssertJUnit.assertEquals(4, c2.getNetPower()); - AssertJUnit.assertEquals(4, c2.getNetToughness()); - } - - @Test - public void testPathtoExileActofTreason() { - Game game = initAndCreateGame(); - Player p0 = game.getPlayers().get(0); - Player p1 = game.getPlayers().get(1); - Card serraAngel = addCardToZone("Serra Angel", p1, ZoneType.Battlefield); - Card actOfTreason = addCardToZone("Act of Treason", p0, ZoneType.Hand); - Card pathToExile = addCardToZone("Path to Exile", p0, ZoneType.Hand); - for (int i = 0; i < 4; i++) { - addCardToZone("Plateau", p0, ZoneType.Battlefield); - } - addCardToZone("Island", p1, ZoneType.Library); - addCardToZone("Forest", p0, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p0); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p0); - Game simGame = sim.getSimulatedGameState(); - - SpellAbility actSA = actOfTreason.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(actSA); - actSA.setActivatingPlayer(p0); - actSA.setTargetCard(serraAngel); - sim.simulateSpellAbility(actSA); - simGame.getAction().checkStateEffects(true); - - SpellAbility pathSA = pathToExile.getSpellAbilities().get(0); - AssertJUnit.assertNotNull(pathSA); - pathSA.setActivatingPlayer(p0); - pathSA.setTargetCard(serraAngel); - sim.simulateSpellAbility(pathSA); - simGame.getAction().checkStateEffects(true); - - int numForest = countCardsWithName(simGame, "Forest"); - AssertJUnit.assertEquals(1, numForest); - AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); - } - - @Test - public void testAmassTrigger() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - String WCname = "Woodland Champion"; - addCard(WCname, p); - for (int i = 0; i < 5; i++) - addCard("Island", p); - - String CardName = "Eternal Skylord"; - Card c = addCardToZone(CardName, p, ZoneType.Hand); - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbility playSa = c.getSpellAbilities().get(0); - playSa.setActivatingPlayer(p); - - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - - Game simGame = sim.getSimulatedGameState(); - - Card simWC = findCardWithName(simGame, WCname); - - AssertJUnit.assertEquals(1, simWC.getPowerBonusFromCounters()); - AssertJUnit.assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); - } - - @Test - public void testEverAfterWithWaywardServant() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - String everAfter = "Ever After"; - String waywardServant = "Wayward Servant"; - String goblin = "Raging Goblin"; - - for (int i = 0; i < 8; i++) - addCard("Swamp", p); - - Card cardEverAfter = addCardToZone(everAfter, p, ZoneType.Hand); - Card cardWaywardServant = addCardToZone(waywardServant, p, ZoneType.Graveyard); - Card cardRagingGoblin = addCardToZone(goblin, p, ZoneType.Graveyard); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbility playSa = cardEverAfter.getSpellAbilities().get(0); - playSa.setActivatingPlayer(p); - playSa.getTargets().add(cardWaywardServant); - playSa.getTargets().add(cardRagingGoblin); - - GameSimulator sim = createSimulator(game, p); - int origScore = sim.getScoreForOrigGame().value; - int score = sim.simulateSpellAbility(playSa).value; - AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); - - Game simGame = sim.getSimulatedGameState(); - - Card simGoblin = findCardWithName(simGame, goblin); - - simGame.getAction().checkStateEffects(true); - simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.MAIN2); - - AssertJUnit.assertEquals(21, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); - AssertJUnit.assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); - } - - @Test - public void testCantBePrevented() { - String polukranosCardName = "Polukranos, Unchained"; - String hydraCardName = "Phyrexian Hydra"; - String leylineCardName = "Leyline of Punishment"; - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - - Card polukranos = addCard(polukranosCardName, p); - polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null); - addCard(hydraCardName, p); - addCard(leylineCardName, p); - for (int i = 0; i < 2; ++i) { - addCard("Mountain", p); - } - Card pyroCard = addCardToZone("Pyroclasm", p, ZoneType.Hand); - SpellAbility pyroSA = pyroCard.getFirstSpellAbility(); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p); - sim.simulateSpellAbility(pyroSA); - Game simGame = sim.getSimulatedGameState(); - Card simPolukranos = findCardWithName(simGame, polukranosCardName); - Card simHydra = findCardWithName(simGame, hydraCardName); - - AssertJUnit.assertTrue(simPolukranos.hasCounters()); - AssertJUnit.assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(2, simPolukranos.getDamage()); - - AssertJUnit.assertFalse(simHydra.hasCounters()); - AssertJUnit.assertEquals(2, simHydra.getDamage()); - } - - @Test - public void testAlphaBrawl() { - Game game = initAndCreateGame(); - Player p1 = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - String nishobaName = "Phantom Nishoba"; - String capridorName = "Stormwild Capridor"; - String pridemateName = "Ajani's Pridemate"; - String indestructibilityName = "Indestructibility"; - String bearName = "Runeclaw Bear"; - String alphaBrawlName = "Alpha Brawl"; - - // enough to cast Alpha Brawl - for (int i = 0; i < 8; ++i) { - addCard("Mountain", p2); - } - - Card nishoba = addCard(nishobaName, p1); - nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null); - addCard(capridorName, p1); - Card pridemate = addCard(pridemateName, p1); - Card indestructibility = addCard(indestructibilityName, p1); - indestructibility.attachToEntity(pridemate); - addCard(bearName, p1); - - Card alphaBrawl = addCardToZone(alphaBrawlName, p2, ZoneType.Hand); - SpellAbility alphaBrawlSA = alphaBrawl.getFirstSpellAbility(); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p2); - game.getAction().checkStateEffects(true); - - GameSimulator sim = createSimulator(game, p2); - alphaBrawlSA.setTargetCard(nishoba); - sim.simulateSpellAbility(alphaBrawlSA); - Game simGame = sim.getSimulatedGameState(); - Card simNishoba = findCardWithName(simGame, nishobaName); - Card simCapridor = findCardWithName(simGame, capridorName); - Card simPridemate = findCardWithName(simGame, pridemateName); - Card simBear = findCardWithName(simGame, bearName); - - // bear is destroyed - AssertJUnit.assertNull(simBear); - - AssertJUnit.assertNotNull(simNishoba); - AssertJUnit.assertTrue(simNishoba.hasCounters()); - // Damage prevented and only 1 +1/+1 counter is removed - AssertJUnit.assertEquals(0, simNishoba.getDamage()); - AssertJUnit.assertTrue(simNishoba.hasCounters()); - AssertJUnit.assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(6, simNishoba.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(6, simNishoba.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simCapridor); - // Damage prevented and that many +1/+1 counters are put - AssertJUnit.assertEquals(0, simCapridor.getDamage()); - AssertJUnit.assertTrue(simCapridor.hasCounters()); - AssertJUnit.assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(7, simCapridor.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(7, simCapridor.getPowerBonusFromCounters()); - - AssertJUnit.assertNotNull(simPridemate); - AssertJUnit.assertEquals(7, simPridemate.getDamage()); - // Life gain only triggered once - AssertJUnit.assertTrue(simPridemate.hasCounters()); - AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); - AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); - AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); - - // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor - // is prevented) - AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); - } - - @Test - public void testGlarecaster() { - String glarecasterName = "Glarecaster"; - - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(0); - Player p2 = game.getPlayers().get(1); - - Card glarecaster = addCard(glarecasterName, p); - // enough to activate Glarecaster and cast Inferno - for (int i = 0; i < 7; ++i) { - addCard("Plains", p); - addCard("Mountain", p); - } - Card infernoCard = addCardToZone("Inferno", p, ZoneType.Hand); - SpellAbility infernoSA = infernoCard.getFirstSpellAbility(); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); - AssertJUnit.assertNotNull(saGlarecaster); - saGlarecaster.getTargets().add(p2); - - GameSimulator sim = createSimulator(game, p); - int score = sim.simulateSpellAbility(saGlarecaster).value; - AssertJUnit.assertTrue(score > 0); - sim.simulateSpellAbility(infernoSA); - Game simGame = sim.getSimulatedGameState(); - Card simGlarecaster = findCardWithName(simGame, glarecasterName); - - AssertJUnit.assertNotNull(simGlarecaster); - AssertJUnit.assertEquals(0, simGlarecaster.getDamage()); - - // 6 * 3 = 18 damage are all dealt to p2 - AssertJUnit.assertEquals(20, simGame.getPlayers().get(0).getLife()); - AssertJUnit.assertEquals(2, simGame.getPlayers().get(1).getLife()); - } + // Clone Jushi first + saDimirClone.getTargets().add(jushi); + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(saDimirClone).value; + AssertJUnit.assertTrue(score > 0); + + Card dimirdgAfterCopy1 = (Card) sim.getGameCopier().find(dimirdg); + AssertJUnit.assertEquals("Jushi Apprentice", dimirdgAfterCopy1.getName()); + AssertJUnit.assertEquals(1, dimirdgAfterCopy1.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy1.isFlipCard()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy1.getType().isLegendary()); + + bear = (Card) sim.getGameCopier().find(bear); + + // make new simulator so new SpellAbility is found + Game simGame = sim.getSimulatedGameState(); + sim = createSimulator(simGame, p); + + Player copiedPlayer = (Player) sim.getGameCopier().find(p); + int handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); + AssertJUnit.assertEquals(9, handSize); + + SpellAbility draw = findSAWithPrefix(dimirdgAfterCopy1, "{2}{U}"); + score = sim.simulateSpellAbility(draw).value; + AssertJUnit.assertTrue(score > 0); + + copiedPlayer = (Player) sim.getGameCopier().find(p); + handSize = copiedPlayer.getCardsIn(ZoneType.Hand).size(); + AssertJUnit.assertEquals(10, handSize); + + simGame = sim.getSimulatedGameState(); + + bear = (Card) sim.getGameCopier().find(bear); + + // make new simulator so new SpellAbility is found + simGame = sim.getSimulatedGameState(); + sim = createSimulator(simGame, p); + + // bear = (Card)sim.getGameCopier().find(bear); + + simGame = sim.getSimulatedGameState(); + + Card dimirdgAfterFlip1 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); + + AssertJUnit.assertEquals("Tomoya the Revealer", dimirdgAfterFlip1.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterFlip1.getNetPower()); + AssertJUnit.assertEquals(3, dimirdgAfterFlip1.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.isFlipped()); + AssertJUnit.assertTrue(dimirdgAfterFlip1.getType().isLegendary()); + + saDimirClone = findSAWithPrefix(dimirdgAfterCopy1, "{1}{U}{B}"); + // Clone Bear first + saDimirClone.resetTargets(); + saDimirClone.getTargets().add(bear); + + score = sim.simulateSpellAbility(saDimirClone).value; + AssertJUnit.assertTrue(score > 0); + + Card dimirdgAfterCopy2 = (Card) sim.getGameCopier().find(dimirdgAfterCopy1); + + // System.out.println(sim.getSimulatedGameState().getCardsIn(ZoneType.Battlefield)); + + System.out.println(dimirdgAfterCopy2.getName()); + System.out.println(dimirdgAfterCopy2.getCloneStates()); + System.out.println(dimirdgAfterCopy2.getOriginalState(CardStateName.Original).getName()); + System.out.println(dimirdgAfterCopy2.isFlipCard()); + System.out.println(dimirdgAfterCopy2.isFlipped()); + + AssertJUnit.assertEquals("Runeclaw Bear", dimirdgAfterCopy2.getName()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetPower()); + AssertJUnit.assertEquals(2, dimirdgAfterCopy2.getNetToughness()); + AssertJUnit.assertTrue(dimirdgAfterCopy2.isFlipped()); + AssertJUnit.assertFalse(dimirdgAfterCopy2.getType().isLegendary()); + } + + @Test + public void testStaticMultiPump() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + Card c1 = addCard("Creakwood Liege", p); + Card c2 = addCard("Creakwood Liege", p); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + + // update stats state + game.getAction().checkStateEffects(true); + + AssertJUnit.assertEquals(4, c1.getNetPower()); + AssertJUnit.assertEquals(4, c1.getNetToughness()); + + AssertJUnit.assertEquals(4, c2.getNetPower()); + AssertJUnit.assertEquals(4, c2.getNetToughness()); + } + + @Test + public void testPathtoExileActofTreason() { + Game game = initAndCreateGame(); + Player p0 = game.getPlayers().get(0); + Player p1 = game.getPlayers().get(1); + Card serraAngel = addCardToZone("Serra Angel", p1, ZoneType.Battlefield); + Card actOfTreason = addCardToZone("Act of Treason", p0, ZoneType.Hand); + Card pathToExile = addCardToZone("Path to Exile", p0, ZoneType.Hand); + for (int i = 0; i < 4; i++) { + addCardToZone("Plateau", p0, ZoneType.Battlefield); + } + addCardToZone("Island", p1, ZoneType.Library); + addCardToZone("Forest", p0, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p0); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p0); + Game simGame = sim.getSimulatedGameState(); + + SpellAbility actSA = actOfTreason.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(actSA); + actSA.setActivatingPlayer(p0); + actSA.setTargetCard(serraAngel); + sim.simulateSpellAbility(actSA); + simGame.getAction().checkStateEffects(true); + + SpellAbility pathSA = pathToExile.getSpellAbilities().get(0); + AssertJUnit.assertNotNull(pathSA); + pathSA.setActivatingPlayer(p0); + pathSA.setTargetCard(serraAngel); + sim.simulateSpellAbility(pathSA); + simGame.getAction().checkStateEffects(true); + + int numForest = countCardsWithName(simGame, "Forest"); + AssertJUnit.assertEquals(1, numForest); + AssertJUnit.assertEquals(0, simGame.getPlayers().get(1).getCardsIn(ZoneType.Battlefield).size()); + } + + @Test + public void testAmassTrigger() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + String WCname = "Woodland Champion"; + addCard(WCname, p); + for (int i = 0; i < 5; i++) + addCard("Island", p); + + String CardName = "Eternal Skylord"; + Card c = addCardToZone(CardName, p, ZoneType.Hand); + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbility playSa = c.getSpellAbilities().get(0); + playSa.setActivatingPlayer(p); + + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + + Game simGame = sim.getSimulatedGameState(); + + Card simWC = findCardWithName(simGame, WCname); + + AssertJUnit.assertEquals(1, simWC.getPowerBonusFromCounters()); + AssertJUnit.assertEquals(3, simGame.getPlayers().get(0).getCreaturesInPlay().size()); + } + + @Test + public void testEverAfterWithWaywardServant() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + String everAfter = "Ever After"; + String waywardServant = "Wayward Servant"; + String goblin = "Raging Goblin"; + + for (int i = 0; i < 8; i++) + addCard("Swamp", p); + + Card cardEverAfter = addCardToZone(everAfter, p, ZoneType.Hand); + Card cardWaywardServant = addCardToZone(waywardServant, p, ZoneType.Graveyard); + Card cardRagingGoblin = addCardToZone(goblin, p, ZoneType.Graveyard); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbility playSa = cardEverAfter.getSpellAbilities().get(0); + playSa.setActivatingPlayer(p); + playSa.getTargets().add(cardWaywardServant); + playSa.getTargets().add(cardRagingGoblin); + + GameSimulator sim = createSimulator(game, p); + int origScore = sim.getScoreForOrigGame().value; + int score = sim.simulateSpellAbility(playSa).value; + AssertJUnit.assertTrue(String.format("score=%d vs. origScore=%d", score, origScore), score > origScore); + + Game simGame = sim.getSimulatedGameState(); + + Card simGoblin = findCardWithName(simGame, goblin); + + simGame.getAction().checkStateEffects(true); + simGame.getPhaseHandler().devAdvanceToPhase(PhaseType.MAIN2); + + AssertJUnit.assertEquals(21, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(true, simGoblin.isRed() && simGoblin.isBlack()); + AssertJUnit.assertEquals(true, simGoblin.getType().hasSubtype("Zombie")); + } + + @Test + public void testCantBePrevented() { + String polukranosCardName = "Polukranos, Unchained"; + String hydraCardName = "Phyrexian Hydra"; + String leylineCardName = "Leyline of Punishment"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + + Card polukranos = addCard(polukranosCardName, p); + polukranos.addCounterInternal(CounterEnumType.P1P1, 6, p, false, null); + addCard(hydraCardName, p); + addCard(leylineCardName, p); + for (int i = 0; i < 2; ++i) { + addCard("Mountain", p); + } + Card pyroCard = addCardToZone("Pyroclasm", p, ZoneType.Hand); + SpellAbility pyroSA = pyroCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p); + sim.simulateSpellAbility(pyroSA); + Game simGame = sim.getSimulatedGameState(); + Card simPolukranos = findCardWithName(simGame, polukranosCardName); + Card simHydra = findCardWithName(simGame, hydraCardName); + + AssertJUnit.assertTrue(simPolukranos.hasCounters()); + AssertJUnit.assertEquals(4, simPolukranos.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(2, simPolukranos.getDamage()); + + AssertJUnit.assertFalse(simHydra.hasCounters()); + AssertJUnit.assertEquals(2, simHydra.getDamage()); + } + + @Test + public void testAlphaBrawl() { + Game game = initAndCreateGame(); + Player p1 = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + String nishobaName = "Phantom Nishoba"; + String capridorName = "Stormwild Capridor"; + String pridemateName = "Ajani's Pridemate"; + String indestructibilityName = "Indestructibility"; + String bearName = "Runeclaw Bear"; + String alphaBrawlName = "Alpha Brawl"; + + // enough to cast Alpha Brawl + for (int i = 0; i < 8; ++i) { + addCard("Mountain", p2); + } + + Card nishoba = addCard(nishobaName, p1); + nishoba.addCounterInternal(CounterEnumType.P1P1, 7, p1, false, null); + addCard(capridorName, p1); + Card pridemate = addCard(pridemateName, p1); + Card indestructibility = addCard(indestructibilityName, p1); + indestructibility.attachToEntity(pridemate); + addCard(bearName, p1); + + Card alphaBrawl = addCardToZone(alphaBrawlName, p2, ZoneType.Hand); + SpellAbility alphaBrawlSA = alphaBrawl.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p2); + game.getAction().checkStateEffects(true); + + GameSimulator sim = createSimulator(game, p2); + alphaBrawlSA.setTargetCard(nishoba); + sim.simulateSpellAbility(alphaBrawlSA); + Game simGame = sim.getSimulatedGameState(); + Card simNishoba = findCardWithName(simGame, nishobaName); + Card simCapridor = findCardWithName(simGame, capridorName); + Card simPridemate = findCardWithName(simGame, pridemateName); + Card simBear = findCardWithName(simGame, bearName); + + // bear is destroyed + AssertJUnit.assertNull(simBear); + + AssertJUnit.assertNotNull(simNishoba); + AssertJUnit.assertTrue(simNishoba.hasCounters()); + // Damage prevented and only 1 +1/+1 counter is removed + AssertJUnit.assertEquals(0, simNishoba.getDamage()); + AssertJUnit.assertTrue(simNishoba.hasCounters()); + AssertJUnit.assertEquals(6, simNishoba.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(6, simNishoba.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(6, simNishoba.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simCapridor); + // Damage prevented and that many +1/+1 counters are put + AssertJUnit.assertEquals(0, simCapridor.getDamage()); + AssertJUnit.assertTrue(simCapridor.hasCounters()); + AssertJUnit.assertEquals(7, simCapridor.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(7, simCapridor.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(7, simCapridor.getPowerBonusFromCounters()); + + AssertJUnit.assertNotNull(simPridemate); + AssertJUnit.assertEquals(7, simPridemate.getDamage()); + // Life gain only triggered once + AssertJUnit.assertTrue(simPridemate.hasCounters()); + AssertJUnit.assertEquals(1, simPridemate.getCounters(CounterEnumType.P1P1)); + AssertJUnit.assertEquals(1, simPridemate.getToughnessBonusFromCounters()); + AssertJUnit.assertEquals(1, simPridemate.getPowerBonusFromCounters()); + + // 2 times 7 damage with life gain = 14 + 20 = 34 (damage to Stormwild Capridor + // is prevented) + AssertJUnit.assertEquals(34, simGame.getPlayers().get(0).getLife()); + } + + @Test + public void testGlarecaster() { + String glarecasterName = "Glarecaster"; + + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(0); + Player p2 = game.getPlayers().get(1); + + Card glarecaster = addCard(glarecasterName, p); + // enough to activate Glarecaster and cast Inferno + for (int i = 0; i < 7; ++i) { + addCard("Plains", p); + addCard("Mountain", p); + } + Card infernoCard = addCardToZone("Inferno", p, ZoneType.Hand); + SpellAbility infernoSA = infernoCard.getFirstSpellAbility(); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbility saGlarecaster = findSAWithPrefix(glarecaster, "{5}{W}"); + AssertJUnit.assertNotNull(saGlarecaster); + saGlarecaster.getTargets().add(p2); + + GameSimulator sim = createSimulator(game, p); + int score = sim.simulateSpellAbility(saGlarecaster).value; + AssertJUnit.assertTrue(score > 0); + sim.simulateSpellAbility(infernoSA); + Game simGame = sim.getSimulatedGameState(); + Card simGlarecaster = findCardWithName(simGame, glarecasterName); + + AssertJUnit.assertNotNull(simGlarecaster); + AssertJUnit.assertEquals(0, simGlarecaster.getDamage()); + + // 6 * 3 = 18 damage are all dealt to p2 + AssertJUnit.assertEquals(20, simGame.getPlayers().get(0).getLife()); + AssertJUnit.assertEquals(2, simGame.getPlayers().get(1).getLife()); + } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java index 520b032675b..73abd646dfe 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SimulationTest.java @@ -31,111 +31,111 @@ import forge.localinstance.properties.ForgePreferences.FPref; import forge.model.FModel; public class SimulationTest { - private static boolean initialized = false; + private static boolean initialized = false; - protected Game initAndCreateGame() { + protected Game initAndCreateGame() { - if (!initialized) { - GuiBase.setInterface(new GuiDesktop()); - FModel.initialize(null, new Function() { - @Override - public Void apply(ForgePreferences preferences) { - preferences.setPref(FPref.LOAD_CARD_SCRIPTS_LAZILY, false); - preferences.setPref(FPref.UI_LANGUAGE, "en-US"); - return null; - } - }); - initialized = true; - } + if (!initialized) { + GuiBase.setInterface(new GuiDesktop()); + FModel.initialize(null, new Function() { + @Override + public Void apply(ForgePreferences preferences) { + preferences.setPref(FPref.LOAD_CARD_SCRIPTS_LAZILY, false); + preferences.setPref(FPref.UI_LANGUAGE, "en-US"); + return null; + } + }); + initialized = true; + } - // need to be done after FModel.initialize, or the Localizer isn't loaded yet - List players = Lists.newArrayList(); - Deck d1 = new Deck(); - players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p2", null))); - Set options = new HashSet<>(); - options.add(AIOption.USE_SIMULATION); - players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p1", options))); - GameRules rules = new GameRules(GameType.Constructed); - Match match = new Match(rules, players, "Test"); - Game game = new Game(players, rules, match); - game.setAge(GameStage.Play); + // need to be done after FModel.initialize, or the Localizer isn't loaded yet + List players = Lists.newArrayList(); + Deck d1 = new Deck(); + players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p2", null))); + Set options = new HashSet<>(); + options.add(AIOption.USE_SIMULATION); + players.add(new RegisteredPlayer(d1).setPlayer(new LobbyPlayerAi("p1", options))); + GameRules rules = new GameRules(GameType.Constructed); + Match match = new Match(rules, players, "Test"); + Game game = new Game(players, rules, match); + game.setAge(GameStage.Play); - return game; - } + return game; + } - protected GameSimulator createSimulator(Game game, Player p) { - return new GameSimulator(new SimulationController(new Score(0)) { - @Override - public boolean shouldRecurse() { - return false; - } - }, game, p, null); - } + protected GameSimulator createSimulator(Game game, Player p) { + return new GameSimulator(new SimulationController(new Score(0)) { + @Override + public boolean shouldRecurse() { + return false; + } + }, game, p, null); + } - protected int countCardsWithName(Game game, String name) { - int i = 0; - for (Card c : game.getCardsIn(ZoneType.Battlefield)) { - if (c.getName().equals(name)) { - i++; - } - } - return i; - } + protected int countCardsWithName(Game game, String name) { + int i = 0; + for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + if (c.getName().equals(name)) { + i++; + } + } + return i; + } - protected Card findCardWithName(Game game, String name) { - for (Card c : game.getCardsIn(ZoneType.Battlefield)) { - if (c.getName().equals(name)) { - return c; - } - } - return null; - } + protected Card findCardWithName(Game game, String name) { + for (Card c : game.getCardsIn(ZoneType.Battlefield)) { + if (c.getName().equals(name)) { + return c; + } + } + return null; + } - protected String gameStateToString(Game game) { - StringBuilder sb = new StringBuilder(); - for (ZoneType zone : ZoneType.values()) { - CardCollectionView cards = game.getCardsIn(zone); - if (!cards.isEmpty()) { - sb.append("Zone ").append(zone.name()).append(":\n"); - for (Card c : game.getCardsIn(zone)) { - sb.append(" ").append(c).append("\n"); - } - } - } - return sb.toString(); - } + protected String gameStateToString(Game game) { + StringBuilder sb = new StringBuilder(); + for (ZoneType zone : ZoneType.values()) { + CardCollectionView cards = game.getCardsIn(zone); + if (!cards.isEmpty()) { + sb.append("Zone ").append(zone.name()).append(":\n"); + for (Card c : game.getCardsIn(zone)) { + sb.append(" ").append(c).append("\n"); + } + } + } + return sb.toString(); + } - protected SpellAbility findSAWithPrefix(Card c, String prefix) { - return findSAWithPrefix(c.getSpellAbilities(), prefix); - } + protected SpellAbility findSAWithPrefix(Card c, String prefix) { + return findSAWithPrefix(c.getSpellAbilities(), prefix); + } - protected SpellAbility findSAWithPrefix(Iterable abilities, String prefix) { - for (SpellAbility sa : abilities) { - if (sa.getDescription().startsWith(prefix)) { - return sa; - } - } - return null; - } + protected SpellAbility findSAWithPrefix(Iterable abilities, String prefix) { + for (SpellAbility sa : abilities) { + if (sa.getDescription().startsWith(prefix)) { + return sa; + } + } + return null; + } - protected Card createCard(String name, Player p) { - IPaperCard paperCard = FModel.getMagicDb().getCommonCards().getCard(name); - if (paperCard == null) { - StaticData.instance().attemptToLoadCard(name); - paperCard = FModel.getMagicDb().getCommonCards().getCard(name); - } - return Card.fromPaperCard(paperCard, p); - } + protected Card createCard(String name, Player p) { + IPaperCard paperCard = FModel.getMagicDb().getCommonCards().getCard(name); + if (paperCard == null) { + StaticData.instance().attemptToLoadCard(name); + paperCard = FModel.getMagicDb().getCommonCards().getCard(name); + } + return Card.fromPaperCard(paperCard, p); + } - protected Card addCardToZone(String name, Player p, ZoneType zone) { - Card c = createCard(name, p); - // card need a new Timestamp otherwise Static Abilities might collide - c.setTimestamp(p.getGame().getNextTimestamp()); - p.getZone(zone).add(c); - return c; - } + protected Card addCardToZone(String name, Player p, ZoneType zone) { + Card c = createCard(name, p); + // card need a new Timestamp otherwise Static Abilities might collide + c.setTimestamp(p.getGame().getNextTimestamp()); + p.getZone(zone).add(c); + return c; + } - protected Card addCard(String name, Player p) { - return addCardToZone(name, p, ZoneType.Battlefield); - } + protected Card addCard(String name, Player p) { + return addCardToZone(name, p, ZoneType.Battlefield); + } } diff --git a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java index c67d7576ee5..df7cef72064 100644 --- a/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java +++ b/forge-gui-desktop/src/test/java/forge/ai/simulation/SpellAbilityPickerSimulationTest.java @@ -15,396 +15,396 @@ import forge.game.spellability.SpellAbility; import forge.game.zone.ZoneType; public class SpellAbilityPickerSimulationTest extends SimulationTest { - @Test - public void testPickingLethalDamage() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - p.setTeam(0); - - addCard("Mountain", p); - addCardToZone("Shock", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - opponent.setTeam(1); - - addCard("Runeclaw Bear", opponent); - opponent.setLife(2, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertNull(sa.getTargetCard()); - AssertJUnit.assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); - } - - @Test - public void testPickingKillingCreature() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCardToZone("Shock", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - Card bearCard = addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals(bearCard, sa.getTargetCard()); - AssertJUnit.assertNull(sa.getTargets().getFirstTargetedPlayer()); - } - - @Test - public void testSequenceStartingWithPlayingLand() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - Card mountain = addCardToZone("Mountain", p, ZoneType.Hand); - addCardToZone("Shock", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - // assertEquals(game.PLAY_LAND_SURROGATE, sa); - AssertJUnit.assertEquals(mountain, sa.getHostCard()); - - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(2, plan.getDecisions().size()); - AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); - AssertJUnit.assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); - AssertJUnit.assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); - } - - @Test - public void testModeSelection() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Plains", p); - addCard("Island", p); - addCard("Swamp", p); - Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected: All creatures get -2/-2 to kill the bear. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", - picker.getPlan().getDecisions().get(0).modesStr); - } - - @Test - public void testModeSelection2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Plains", p); - addCard("Island", p); - addCard("Swamp", p); - Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected: Gain 5 life, since other modes aren't helpful. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); - } - - @Test - public void testMultipleModes() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(20, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected: 2x 1 damage to each creature, 1x 2 damage to each opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - - String dmgCreaturesStr = "Fiery Confluence deals 1 damage to each creature."; - String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; - String expected = "Fiery Confluence -> " + dmgCreaturesStr + " " + dmgCreaturesStr + " " + dmgOppStr; - AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); - } - - @Test - public void testMultipleModes2() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - addCard("Runeclaw Bear", opponent); - opponent.setLife(6, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected: 3x 2 damage to each opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - - String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; - String expected = "Fiery Confluence -> " + dmgOppStr + " " + dmgOppStr + " " + dmgOppStr; - AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); - } - - @Test - public void testMultipleTargets() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - Card spell = addCardToZone("Arc Trail", p, ZoneType.Hand); - - Player opponent = game.getPlayers().get(0); - Card bear = addCard("Runeclaw Bear", opponent); - Card men = addCard("Flying Men", opponent); - opponent.setLife(20, null); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals(bear, sa.getTargetCard()); - AssertJUnit.assertEquals("2", sa.getParam("NumDmg")); - SpellAbility subSa = sa.getSubAbility(); - AssertJUnit.assertEquals(men, subSa.getTargetCard()); - AssertJUnit.assertEquals("1", subSa.getParam("NumDmg")); - } - - @Test - public void testLandSearchForCombo() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Forest", p); - addCard("Thespian's Stage", p); - Card darkDepths = addCard("Dark Depths", p); - - Card cropRotation = addCardToZone("Crop Rotation", p, ZoneType.Hand); - - addCardToZone("Forest", p, ZoneType.Library); - addCardToZone("Urborg, Tomb of Yawgmoth", p, ZoneType.Library); - addCardToZone("Swamp", p, ZoneType.Library); - - darkDepths.setCounters(CounterEnumType.ICE, 10); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - AssertJUnit.assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(cropRotation.getSpellAbilities().get(0), sa); - // Expected: Sac a Forest to get an Urborg. - List choices = picker.getPlan().getDecisions().get(0).choices; - AssertJUnit.assertEquals(2, choices.size()); - AssertJUnit.assertEquals("Forest", choices.get(0)); - AssertJUnit.assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); - // Next, expected to use Thespian's Stage to copy Dark Depths. - Plan.Decision d2 = picker.getPlan().getDecisions().get(1); - String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; - AssertJUnit.assertEquals(expected, d2.saRef.toString()); - AssertJUnit.assertTrue(d2.targets.toString().contains("Dark Depths")); - } - - @Test - public void testPlayRememberedCardsLand() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); - addCardToZone("Lightning Bolt", p, ZoneType.Hand); - // Note: This assumes the top of library is revealed. If the AI is made - // smarter to not assume that, then this test can be updated to have - // something that reveals top of library active - e.g. Lens of Clarity. - addCardToZone("Mountain", p, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected plan: - // 1. Play Abbot. - // 2. Play land exiled by Abbot. - // 3. Play Bolt targeting opponent. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(3, plan.getDecisions().size()); - AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); - AssertJUnit.assertEquals("Lightning Bolt deals 3 damage to any target.", - plan.getDecisions().get(2).saRef.toString()); - } - - @Test - public void testPlayRememberedCardsSpell() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - - addCard("Mountain", p); - addCard("Mountain", p); - addCard("Mountain", p); - Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); - // Note: This assumes the top of library is revealed. If the AI is made - // smarter to not assume that, then this test can be updated to have - // something that reveals top of library active - e.g. Lens of Clarity. - addCardToZone("Lightning Bolt", p, ZoneType.Library); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); - game.getAction().checkStateEffects(true); - - // Expected plan: - // 1. Play Abbot. - // 3. Play Bolt exiled by Abbot. - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); - Plan plan = picker.getPlan(); - AssertJUnit.assertEquals(2, plan.getDecisions().size()); - String saDesc = plan.getDecisions().get(1).saRef.toString(); - AssertJUnit.assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); - } - - @Test - public void testPlayingPumpSpellsAfterBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); - - Card blocker = addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - Card attacker2 = addCard("Dwarven Trader", p); - attacker2.setSickness(false); - addCard("Mountain", p); - addCardToZone("Brute Force", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); - - game.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_BEGIN); - game.getAction().checkStateEffects(true); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); - - game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, p); - Combat combat = new Combat(p); - combat.addAttacker(attacker1, opponent); - combat.addAttacker(attacker2, opponent); - game.getPhaseHandler().setCombat(combat); - game.getAction().checkStateEffects(true); - AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); - - game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_BLOCKERS, p, false); - game.getAction().checkStateEffects(true); - combat.addBlocker(attacker1, blocker); - combat.getBandOfAttacker(attacker1).setBlocked(true); - combat.getBandOfAttacker(attacker2).setBlocked(false); - combat.orderBlockersForDamageAssignment(); - combat.orderAttackersForDamageAssignment(); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); - AssertJUnit.assertEquals(attacker2, sa.getTargetCard()); - } - - @Test - public void testPlayingSorceryPumpSpellsBeforeBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); - - addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - Card attacker2 = addCard("Kird Ape", p); - attacker2.setSickness(false); - addCard("Mountain", p); - Card furor = addCardToZone("Furor of the Bitten", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals(furor.getSpellAbilities().get(0), sa); - AssertJUnit.assertEquals(attacker1, sa.getTargetCard()); - } - - @Test - public void testPlayingRemovalBeforeBlocks() { - Game game = initAndCreateGame(); - Player p = game.getPlayers().get(1); - Player opponent = game.getPlayers().get(0); - opponent.setLife(2, null); - - Card blocker = addCard("Fugitive Wizard", opponent); - Card attacker1 = addCard("Dwarven Trader", p); - attacker1.setSickness(false); - addCard("Swamp", p); - addCard("Swamp", p); - addCardToZone("Doom Blade", p, ZoneType.Hand); - - game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); - game.getAction().checkStateEffects(true); - - SpellAbilityPicker picker = new SpellAbilityPicker(game, p); - SpellAbility sa = picker.chooseSpellAbilityToPlay(null); - AssertJUnit.assertNotNull(sa); - AssertJUnit.assertEquals("Destroy target nonblack creature.", sa.toString()); - AssertJUnit.assertEquals(blocker, sa.getTargetCard()); - } + @Test + public void testPickingLethalDamage() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + p.setTeam(0); + + addCard("Mountain", p); + addCardToZone("Shock", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + opponent.setTeam(1); + + addCard("Runeclaw Bear", opponent); + opponent.setLife(2, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertNull(sa.getTargetCard()); + AssertJUnit.assertEquals(opponent, sa.getTargets().getFirstTargetedPlayer()); + } + + @Test + public void testPickingKillingCreature() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCardToZone("Shock", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + Card bearCard = addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(bearCard, sa.getTargetCard()); + AssertJUnit.assertNull(sa.getTargets().getFirstTargetedPlayer()); + } + + @Test + public void testSequenceStartingWithPlayingLand() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + Card mountain = addCardToZone("Mountain", p, ZoneType.Hand); + addCardToZone("Shock", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + // assertEquals(game.PLAY_LAND_SURROGATE, sa); + AssertJUnit.assertEquals(mountain, sa.getHostCard()); + + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(0).saRef.toString()); + AssertJUnit.assertEquals("Shock deals 2 damage to any target.", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertTrue(plan.getDecisions().get(1).targets.toString().contains("Runeclaw Bear")); + } + + @Test + public void testModeSelection() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Plains", p); + addCard("Island", p); + addCard("Swamp", p); + Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected: All creatures get -2/-2 to kill the bear. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> Target creature gets -2/-2 until end of turn.", + picker.getPlan().getDecisions().get(0).modesStr); + } + + @Test + public void testModeSelection2() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Plains", p); + addCard("Island", p); + addCard("Swamp", p); + Card spell = addCardToZone("Dromar's Charm", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected: Gain 5 life, since other modes aren't helpful. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals("Dromar's Charm -> You gain 5 life.", picker.getPlan().getDecisions().get(0).modesStr); + } + + @Test + public void testMultipleModes() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(20, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected: 2x 1 damage to each creature, 1x 2 damage to each opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + + String dmgCreaturesStr = "Fiery Confluence deals 1 damage to each creature."; + String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; + String expected = "Fiery Confluence -> " + dmgCreaturesStr + " " + dmgCreaturesStr + " " + dmgOppStr; + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + } + + @Test + public void testMultipleModes2() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Fiery Confluence", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + addCard("Runeclaw Bear", opponent); + opponent.setLife(6, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected: 3x 2 damage to each opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + + String dmgOppStr = "Fiery Confluence deals 2 damage to each opponent."; + String expected = "Fiery Confluence -> " + dmgOppStr + " " + dmgOppStr + " " + dmgOppStr; + AssertJUnit.assertEquals(expected, picker.getPlan().getDecisions().get(0).modesStr); + } + + @Test + public void testMultipleTargets() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + Card spell = addCardToZone("Arc Trail", p, ZoneType.Hand); + + Player opponent = game.getPlayers().get(0); + Card bear = addCard("Runeclaw Bear", opponent); + Card men = addCard("Flying Men", opponent); + opponent.setLife(20, null); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(spell.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(bear, sa.getTargetCard()); + AssertJUnit.assertEquals("2", sa.getParam("NumDmg")); + SpellAbility subSa = sa.getSubAbility(); + AssertJUnit.assertEquals(men, subSa.getTargetCard()); + AssertJUnit.assertEquals("1", subSa.getParam("NumDmg")); + } + + @Test + public void testLandSearchForCombo() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Forest", p); + addCard("Thespian's Stage", p); + Card darkDepths = addCard("Dark Depths", p); + + Card cropRotation = addCardToZone("Crop Rotation", p, ZoneType.Hand); + + addCardToZone("Forest", p, ZoneType.Library); + addCardToZone("Urborg, Tomb of Yawgmoth", p, ZoneType.Library); + addCardToZone("Swamp", p, ZoneType.Library); + + darkDepths.setCounters(CounterEnumType.ICE, 10); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + AssertJUnit.assertEquals(10, darkDepths.getCounters(CounterEnumType.ICE)); + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(cropRotation.getSpellAbilities().get(0), sa); + // Expected: Sac a Forest to get an Urborg. + List choices = picker.getPlan().getDecisions().get(0).choices; + AssertJUnit.assertEquals(2, choices.size()); + AssertJUnit.assertEquals("Forest", choices.get(0)); + AssertJUnit.assertEquals("Urborg, Tomb of Yawgmoth", choices.get(1)); + // Next, expected to use Thespian's Stage to copy Dark Depths. + Plan.Decision d2 = picker.getPlan().getDecisions().get(1); + String expected = "{2}, {T}: Thespian's Stage becomes a copy of target land, except it has this ability."; + AssertJUnit.assertEquals(expected, d2.saRef.toString()); + AssertJUnit.assertTrue(d2.targets.toString().contains("Dark Depths")); + } + + @Test + public void testPlayRememberedCardsLand() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); + addCardToZone("Lightning Bolt", p, ZoneType.Hand); + // Note: This assumes the top of library is revealed. If the AI is made + // smarter to not assume that, then this test can be updated to have + // something that reveals top of library active - e.g. Lens of Clarity. + addCardToZone("Mountain", p, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected plan: + // 1. Play Abbot. + // 2. Play land exiled by Abbot. + // 3. Play Bolt targeting opponent. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(3, plan.getDecisions().size()); + AssertJUnit.assertEquals("Play land Mountain", plan.getDecisions().get(1).saRef.toString()); + AssertJUnit.assertEquals("Lightning Bolt deals 3 damage to any target.", + plan.getDecisions().get(2).saRef.toString()); + } + + @Test + public void testPlayRememberedCardsSpell() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + + addCard("Mountain", p); + addCard("Mountain", p); + addCard("Mountain", p); + Card abbot = addCardToZone("Abbot of Keral Keep", p, ZoneType.Hand); + // Note: This assumes the top of library is revealed. If the AI is made + // smarter to not assume that, then this test can be updated to have + // something that reveals top of library active - e.g. Lens of Clarity. + addCardToZone("Lightning Bolt", p, ZoneType.Library); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN2, p); + game.getAction().checkStateEffects(true); + + // Expected plan: + // 1. Play Abbot. + // 3. Play Bolt exiled by Abbot. + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertEquals(abbot.getSpellAbilities().get(0), sa); + Plan plan = picker.getPlan(); + AssertJUnit.assertEquals(2, plan.getDecisions().size()); + String saDesc = plan.getDecisions().get(1).saRef.toString(); + AssertJUnit.assertTrue(saDesc, saDesc.startsWith("Lightning Bolt deals 3 damage to any target.")); + } + + @Test + public void testPlayingPumpSpellsAfterBlocks() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); + + Card blocker = addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + Card attacker2 = addCard("Dwarven Trader", p); + attacker2.setSickness(false); + addCard("Mountain", p); + addCardToZone("Brute Force", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + + game.getPhaseHandler().devAdvanceToPhase(PhaseType.COMBAT_BEGIN); + game.getAction().checkStateEffects(true); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + + game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_ATTACKERS, p); + Combat combat = new Combat(p); + combat.addAttacker(attacker1, opponent); + combat.addAttacker(attacker2, opponent); + game.getPhaseHandler().setCombat(combat); + game.getAction().checkStateEffects(true); + AssertJUnit.assertNull(picker.chooseSpellAbilityToPlay(null)); + + game.getPhaseHandler().devModeSet(PhaseType.COMBAT_DECLARE_BLOCKERS, p, false); + game.getAction().checkStateEffects(true); + combat.addBlocker(attacker1, blocker); + combat.getBandOfAttacker(attacker1).setBlocked(true); + combat.getBandOfAttacker(attacker2).setBlocked(false); + combat.orderBlockersForDamageAssignment(); + combat.orderAttackersForDamageAssignment(); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Target creature gets +3/+3 until end of turn.", sa.toString()); + AssertJUnit.assertEquals(attacker2, sa.getTargetCard()); + } + + @Test + public void testPlayingSorceryPumpSpellsBeforeBlocks() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); + + addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + Card attacker2 = addCard("Kird Ape", p); + attacker2.setSickness(false); + addCard("Mountain", p); + Card furor = addCardToZone("Furor of the Bitten", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals(furor.getSpellAbilities().get(0), sa); + AssertJUnit.assertEquals(attacker1, sa.getTargetCard()); + } + + @Test + public void testPlayingRemovalBeforeBlocks() { + Game game = initAndCreateGame(); + Player p = game.getPlayers().get(1); + Player opponent = game.getPlayers().get(0); + opponent.setLife(2, null); + + Card blocker = addCard("Fugitive Wizard", opponent); + Card attacker1 = addCard("Dwarven Trader", p); + attacker1.setSickness(false); + addCard("Swamp", p); + addCard("Swamp", p); + addCardToZone("Doom Blade", p, ZoneType.Hand); + + game.getPhaseHandler().devModeSet(PhaseType.MAIN1, p); + game.getAction().checkStateEffects(true); + + SpellAbilityPicker picker = new SpellAbilityPicker(game, p); + SpellAbility sa = picker.chooseSpellAbilityToPlay(null); + AssertJUnit.assertNotNull(sa); + AssertJUnit.assertEquals("Destroy target nonblack creature.", sa.toString()); + AssertJUnit.assertEquals(blocker, sa.getTargetCard()); + } } From 90c0672ed59696278ebdfa8710163115bb903546 Mon Sep 17 00:00:00 2001 From: Leandro Doctors Date: Thu, 21 Apr 2022 15:10:20 -0300 Subject: [PATCH 7/7] (Blank commit.)