From 8a5f2288f9cb4a455cab2ddc090ed2334cae5a34 Mon Sep 17 00:00:00 2001 From: Zach Halpern Date: Thu, 10 Jan 2019 21:27:38 -0500 Subject: [PATCH 1/2] Address crash points of JSON tests --- .../utils/ExportJsonGameplayDataTest.java | 161 +++++++++--------- .../common/CreateTokenTargetEffect.java | 5 + ...nControllersNextUntapStepTargetEffect.java | 13 +- ...romGraveyardToBattlefieldTargetEffect.java | 7 +- .../TapAllTargetPlayerControlsEffect.java | 4 + .../effects/common/TapTargetEffect.java | 4 + .../effects/common/UntapTargetEffect.java | 8 +- .../continuous/GainControlTargetEffect.java | 5 + .../abilities/effects/keyword/EchoEffect.java | 5 + 9 files changed, 125 insertions(+), 87 deletions(-) diff --git a/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java b/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java index 8702b02b2eb..b076f71635e 100644 --- a/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java +++ b/Mage.Tests/src/test/java/org/mage/test/utils/ExportJsonGameplayDataTest.java @@ -13,12 +13,14 @@ import org.apache.log4j.Logger; import org.junit.Ignore; import org.junit.Test; +import java.io.*; +import java.nio.charset.StandardCharsets; import java.util.ArrayList; import java.util.Collection; import java.util.List; /** - * @author JayDi85 + * @author JayDi85 & ZeldaZach */ public class ExportJsonGameplayDataTest { @@ -33,96 +35,103 @@ public class ExportJsonGameplayDataTest { List cards = new ArrayList<>(); Collection sets = Sets.getInstance().values(); for (ExpansionSet set : sets) { - if (!set.getCode().equals("GRN")) { - //continue; - } - for (ExpansionSet.SetCardInfo setInfo : set.getSetCardInfo()) { - if (cards.size() >= 10) { - //break; - } cards.add(CardImpl.createCard(setInfo.getCardClass(), new CardSetInfo(setInfo.getName(), set.getCode(), setInfo.getCardNumber(), setInfo.getRarity(), setInfo.getGraphicInfo()))); } - } - JsonObject res = new JsonObject(); + JsonObject res = new JsonObject(); - for (Card card : cards) { - try { - JsonObject resCard = new JsonObject(); - res.add(card.getName(), resCard); + for (Card card : cards) { + try { + JsonObject resCard = new JsonObject(); + res.add(card.getName(), resCard); - JsonArray resAbilities = new JsonArray(); - resCard.add("abilities", resAbilities); - for (Ability ability : card.getAbilities()) { - JsonObject resAbility = new JsonObject(); - resAbilities.add(resAbility); - - // basic - resAbility.addProperty("cost", ability.getManaCosts().getText()); - resAbility.addProperty("name", ability.toString()); - resAbility.addProperty("class", ability.getClass().getSimpleName()); - //resAbility.addProperty("rule", ability.getRule()); - - // modes - JsonArray resModes = new JsonArray(); - resAbility.add("modes", resModes); - for (Mode mode : ability.getModes().values()) { - JsonObject resMode = new JsonObject(); - resModes.add(resMode); + JsonArray resAbilities = new JsonArray(); + resCard.add("abilities", resAbilities); + for (Ability ability : card.getAbilities()) { + JsonObject resAbility = new JsonObject(); + resAbilities.add(resAbility); // basic - //resMode.addProperty("name", mode.toString()); + resAbility.addProperty("cost", ability.getManaCosts().getText()); + resAbility.addProperty("name", ability.toString()); + resAbility.addProperty("class", ability.getClass().getSimpleName()); + //resAbility.addProperty("rule", ability.getRule()); - // effects - JsonArray resEffects = new JsonArray(); - resMode.add("effects", resEffects); - for (Effect effect : mode.getEffects()) { - JsonObject resEffect = new JsonObject(); - resEffects.add(resEffect); + // modes + JsonArray resModes = new JsonArray(); + resAbility.add("modes", resModes); + for (Mode mode : ability.getModes().values()) { + JsonObject resMode = new JsonObject(); + resModes.add(resMode); - resEffect.addProperty("class", effect.getClass().getSimpleName()); - resEffect.addProperty("outcome", effect.getOutcome().toString()); - resEffect.addProperty("text", effect.getText(mode)); + // basic + //resMode.addProperty("name", mode.toString()); + + // effects + JsonArray resEffects = new JsonArray(); + resMode.add("effects", resEffects); + for (Effect effect : mode.getEffects()) { + JsonObject resEffect = new JsonObject(); + resEffects.add(resEffect); + + resEffect.addProperty("class", effect.getClass().getSimpleName()); + resEffect.addProperty("outcome", effect.getOutcome().toString()); + resEffect.addProperty("text", effect.getText(mode)); + } + if (resEffects.size() == 0) { + resMode.remove("effects"); + } + + // targets + JsonArray resTargets = new JsonArray(); + resMode.add("targets", resTargets); + for (Target target : mode.getTargets()) { + JsonObject resTarget = new JsonObject(); + resTargets.add(resTarget); + + resTarget.addProperty("name", target.getTargetName()); + resTarget.addProperty("class", target.getClass().getSimpleName()); + resTarget.addProperty("min", target.getMinNumberOfTargets()); + resTarget.addProperty("max", target.getMaxNumberOfTargets()); + } + if (resTargets.size() == 0) { + resMode.remove("targets"); + } + + if (resMode.get("effects") == null && resMode.get("targets") == null) { + resModes.remove(resMode); + } } - if (resEffects.size() == 0) { - resMode.remove("effects"); - } - - // targets - JsonArray resTargets = new JsonArray(); - resMode.add("targets", resTargets); - for (Target target : mode.getTargets()) { - JsonObject resTarget = new JsonObject(); - resTargets.add(resTarget); - - resTarget.addProperty("name", target.getTargetName()); - resTarget.addProperty("class", target.getClass().getSimpleName()); - resTarget.addProperty("min", target.getMinNumberOfTargets()); - resTarget.addProperty("max", target.getMaxNumberOfTargets()); - } - if (resTargets.size() == 0) { - resMode.remove("targets"); - } - - if (resMode.get("effects") == null && resMode.get("targets") == null) { - resModes.remove(resMode); + if (resModes.size() == 0) { + resAbility.remove("modes"); } } - if (resModes.size() == 0) { - resAbility.remove("modes"); - } + } catch (Throwable e) { + logger.error("Inner error for " + card.getName() + ": " + e.getMessage(), e); + break; } - } catch (Throwable e) { - logger.error("Inner error for " + card.getName() + ": " + e.getMessage(), e); - break; + } + + Gson gson = new GsonBuilder().setPrettyPrinting().create(); + + String filePath = System.getProperty("user.dir") + "/json/" + set.getCode() + ".json"; + File outputFile = new File(filePath); + final boolean mkdirs = outputFile.getParentFile().mkdirs(); + + try (Writer writer = + new BufferedWriter( + new OutputStreamWriter( + new FileOutputStream(outputFile, false), StandardCharsets.UTF_8 + ) + ) + ) { + writer.write(gson.toJson(res)); + System.out.println("Wrote " + set.getCode() + " to file"); + } catch (Exception e) { + e.printStackTrace(); } } - - Gson gson = new GsonBuilder() - .setPrettyPrinting() - .create(); - System.out.println(gson.toJson(res)); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java index 2d37250007d..f56de68edb2 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java @@ -69,6 +69,11 @@ public class CreateTokenTargetEffect extends OneShotEffect { return staticText; } StringBuilder sb = new StringBuilder(); + + if (mode.getTargets().isEmpty()) { + return ""; + } + sb.append("target ").append(mode.getTargets().get(0).getTargetName()); sb.append(" creates "); if (amount.toString().equals("1")) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java index 49d5651cbf7..41200f26f0f 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/DontUntapInControllersNextUntapStepTargetEffect.java @@ -32,7 +32,6 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR * Attention: This effect won't work with targets controlled by different * controllers If this is needed, the validForTurnNum has to be saved per * controller. - * */ public DontUntapInControllersNextUntapStepTargetEffect() { this(""); @@ -43,10 +42,9 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } /** - * - * @param targetName used as target text for the generated rule text + * @param targetName used as target text for the generated rule text * @param onlyIfControlledByPlayer the effect only works if the permanent is - * controlled by that controller, null = it works for all players + * controlled by that controller, null = it works for all players */ public DontUntapInControllersNextUntapStepTargetEffect(String targetName, UUID onlyIfControlledByPlayer) { this(targetName, false, onlyIfControlledByPlayer); @@ -116,7 +114,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } } } - + if (allHandled) { discard(); } @@ -149,8 +147,7 @@ public class DontUntapInControllersNextUntapStepTargetEffect extends ContinuousR } else return targetName + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } else { - return "target " + (mode == null ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); + return "target " + (mode == null || mode.getTargets().isEmpty() ? "creature" : mode.getTargets().get(0).getTargetName()) + " doesn't untap during its controller's next " + (twoSteps ? "two " : "") + "untap step" + (twoSteps ? "s" : ""); } } - -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java index 9a1190329d1..89253882c3c 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java @@ -65,6 +65,11 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect return staticText; } StringBuilder sb = new StringBuilder(); + + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); sb.append("return "); if (target.getMaxNumberOfTargets() > 1) { @@ -80,4 +85,4 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect sb.append(" under your control"); return sb.toString(); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java index 93647512202..b76a0082d92 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java @@ -51,6 +51,10 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } + + if (mode.getTargets().isEmpty()) { + return ""; + } return "tap all " + filter.toString() + " target " + mode.getTargets().get(0).getTargetName() + " controls"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java index 29d10627a73..91537f95359 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java @@ -54,6 +54,10 @@ public class TapTargetEffect extends OneShotEffect { return "tap " + staticText; } + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); if (target.getMaxNumberOfTargets() > 1) { if (target.getMaxNumberOfTargets() == target.getNumberOfTargets()) { diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index 838996d2b89..a4043355277 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -65,8 +65,12 @@ public class UntapTargetEffect extends OneShotEffect { if (staticText != null && !staticText.isEmpty()) { return staticText; } - Target target = mode.getTargets().get(0); + if (mode.getTargets().isEmpty()) { + return ""; + } + + Target target = mode.getTargets().get(0); StringBuilder sb = new StringBuilder(); sb.append("untap "); if (target.getNumberOfTargets() == 0) { @@ -84,4 +88,4 @@ public class UntapTargetEffect extends OneShotEffect { return sb.toString(); } -} +} \ No newline at end of file diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java index 993134026fa..e7fefa6dc04 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java @@ -112,6 +112,11 @@ public class GainControlTargetEffect extends ContinuousEffectImpl { if (!staticText.isEmpty()) { return staticText; } + + if (mode.getTargets().isEmpty()) { + return ""; + } + Target target = mode.getTargets().get(0); StringBuilder sb = new StringBuilder("gain control of "); if (target.getMaxNumberOfTargets() > 1) { diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java index e2d20da03b4..76c04a4ab5b 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java @@ -80,6 +80,11 @@ public class EchoEffect extends OneShotEffect { @Override public String getText(Mode mode) { StringBuilder sb = new StringBuilder("sacrifice {this} unless you "); + + if (cost == null) { + return ""; + } + String costText = cost.getText(); if (costText.toLowerCase(Locale.ENGLISH).startsWith("discard")) { sb.append(costText.substring(0, 1).toLowerCase(Locale.ENGLISH)); From 163a5e45d3bcf66298a94c992e0c257cc4ea053a Mon Sep 17 00:00:00 2001 From: Zach Halpern Date: Thu, 10 Jan 2019 22:14:29 -0500 Subject: [PATCH 2/2] update wordings so they are not blank --- .../common/CreateTokenTargetEffect.java | 6 +++-- ...romGraveyardToBattlefieldTargetEffect.java | 26 +++++++++---------- .../TapAllTargetPlayerControlsEffect.java | 7 +++-- .../effects/common/TapTargetEffect.java | 2 +- .../effects/common/UntapTargetEffect.java | 2 +- .../continuous/GainControlTargetEffect.java | 2 +- .../abilities/effects/keyword/EchoEffect.java | 3 ++- 7 files changed, 25 insertions(+), 23 deletions(-) diff --git a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java index f56de68edb2..15bc8d25af4 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/CreateTokenTargetEffect.java @@ -71,10 +71,12 @@ public class CreateTokenTargetEffect extends OneShotEffect { StringBuilder sb = new StringBuilder(); if (mode.getTargets().isEmpty()) { - return ""; + sb.append("target player"); + } + else { + sb.append("target ").append(mode.getTargets().get(0).getTargetName()); } - sb.append("target ").append(mode.getTargets().get(0).getTargetName()); sb.append(" creates "); if (amount.toString().equals("1")) { sb.append("a "); diff --git a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java index 89253882c3c..363c97fc4a8 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/ReturnFromGraveyardToBattlefieldTargetEffect.java @@ -67,20 +67,20 @@ public class ReturnFromGraveyardToBattlefieldTargetEffect extends OneShotEffect StringBuilder sb = new StringBuilder(); if (mode.getTargets().isEmpty()) { - return ""; - } - - Target target = mode.getTargets().get(0); - sb.append("return "); - if (target.getMaxNumberOfTargets() > 1) { - if (target.getMaxNumberOfTargets() != target.getNumberOfTargets()) { - sb.append("up to "); + sb.append("return target creature to the battlefield"); + } else { + Target target = mode.getTargets().get(0); + sb.append("return "); + if (target.getMaxNumberOfTargets() > 1) { + if (target.getMaxNumberOfTargets() != target.getNumberOfTargets()) { + sb.append("up to "); + } + sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' '); + } + sb.append("target ").append(mode.getTargets().get(0).getTargetName()).append(" to the battlefield"); + if (tapped) { + sb.append(" tapped"); } - sb.append(CardUtil.numberToText(target.getMaxNumberOfTargets())).append(' '); - } - sb.append("target ").append(mode.getTargets().get(0).getTargetName()).append(" to the battlefield"); - if (tapped) { - sb.append(" tapped"); } sb.append(" under your control"); return sb.toString(); diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java index b76a0082d92..cc531c79454 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapAllTargetPlayerControlsEffect.java @@ -52,9 +52,8 @@ public class TapAllTargetPlayerControlsEffect extends OneShotEffect { return staticText; } - if (mode.getTargets().isEmpty()) { - return ""; - } - return "tap all " + filter.toString() + " target " + mode.getTargets().get(0).getTargetName() + " controls"; + return "tap all " + filter.toString() + " target " + + (mode.getTargets().size() == 0 ? "player" : mode.getTargets().get(0).getTargetName()) + + " controls"; } } diff --git a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java index 91537f95359..e3aa5c5c56b 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/TapTargetEffect.java @@ -55,7 +55,7 @@ public class TapTargetEffect extends OneShotEffect { } if (mode.getTargets().isEmpty()) { - return ""; + return "tap target permanent"; } Target target = mode.getTargets().get(0); diff --git a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java index a4043355277..d474f15cc81 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/UntapTargetEffect.java @@ -67,7 +67,7 @@ public class UntapTargetEffect extends OneShotEffect { } if (mode.getTargets().isEmpty()) { - return ""; + return "untap target permanent"; } Target target = mode.getTargets().get(0); diff --git a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java index e7fefa6dc04..8e4d51164b1 100644 --- a/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/common/continuous/GainControlTargetEffect.java @@ -114,7 +114,7 @@ public class GainControlTargetEffect extends ContinuousEffectImpl { } if (mode.getTargets().isEmpty()) { - return ""; + return "gain control of target permanent"; } Target target = mode.getTargets().get(0); diff --git a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java index 76c04a4ab5b..15978c837b3 100644 --- a/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java +++ b/Mage/src/main/java/mage/abilities/effects/keyword/EchoEffect.java @@ -82,7 +82,8 @@ public class EchoEffect extends OneShotEffect { StringBuilder sb = new StringBuilder("sacrifice {this} unless you "); if (cost == null) { - return ""; + sb.append("pay this permanent's mana cost"); + return sb.toString(); } String costText = cost.getText();