diff --git a/Mage.Verify/src/main/java/mage/verify/JsonCard.java b/Mage.Verify/src/main/java/mage/verify/JsonCard.java new file mode 100644 index 00000000000..01ea6884710 --- /dev/null +++ b/Mage.Verify/src/main/java/mage/verify/JsonCard.java @@ -0,0 +1,50 @@ +package mage.verify; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +class JsonCard { + + static Map loadAll() throws IOException { + return new ObjectMapper().readValue( + JsonCard.class.getResourceAsStream("AllCards.json"), + new TypeReference>() {}); + } + + public String layout; + public String name; + public List names; // flip cards + public String manaCost; + public int cmc; + public List colors; + public String type; + public List supertypes; + public List types; + public List subtypes; + public String text; + public String power; + public String toughness; + public int loyalty; + public String imageName; + public boolean starter; // only available in boxed sets and not in boosters + public int hand; // vanguard + public int life; // vanguard + + // only available in AllSets.json + public String artist; + public String flavor; + public String id; + public int multiverseid; + public String rarity; + public boolean reserved; + public int[] variations; + public String number; + public String releaseDate; // promos + public String border; + public String watermark; + public boolean timeshifted; +} diff --git a/Mage.Verify/src/main/java/mage/verify/JsonSet.java b/Mage.Verify/src/main/java/mage/verify/JsonSet.java new file mode 100644 index 00000000000..93406447560 --- /dev/null +++ b/Mage.Verify/src/main/java/mage/verify/JsonSet.java @@ -0,0 +1,31 @@ +package mage.verify; + +import com.fasterxml.jackson.core.type.TypeReference; +import com.fasterxml.jackson.databind.ObjectMapper; + +import java.io.IOException; +import java.util.List; +import java.util.Map; + +class JsonSet { + + static Map loadAll() throws IOException { + return new ObjectMapper().readValue( + JsonSet.class.getResourceAsStream("AllSets.json"), + new TypeReference>() {}); + } + + public String name; + public String code; + public String oldCode; + public String gathererCode; + public String magicCardsInfoCode; + public String[] magicRaritiesCodes; + public String releaseDate; + public String border; + public String type; + public List booster; // [String|[String]] + public List cards; + public String block; + public boolean onlineOnly; +} diff --git a/Mage.Verify/src/main/java/mage/verify/MtgJson.java b/Mage.Verify/src/main/java/mage/verify/MtgJson.java new file mode 100644 index 00000000000..930f8e06ba2 --- /dev/null +++ b/Mage.Verify/src/main/java/mage/verify/MtgJson.java @@ -0,0 +1,57 @@ +package mage.verify; + +import java.io.IOException; +import java.text.Normalizer; +import java.util.HashMap; +import java.util.Map; + +public class MtgJson { + + private static class CardHolder { + private static final Map cards; + static { + try { + cards = JsonCard.loadAll(); + addAliases(cards); + } catch (IOException e) { + throw new RuntimeException(e); + } + } + } + + public static JsonCard find(String name) { + return findReference(CardHolder.cards, name); + } + + private static T findReference(Map reference, String name) { + T ref = reference.get(name); + if (ref == null) { + name = name.replaceFirst("\\bA[Ee]", "Æ"); + ref = reference.get(name); + } + if (ref == null) { + name = name.replace("'", "\""); // for Kongming, "Sleeping Dragon" & Pang Tong, "Young Phoenix" + ref = reference.get(name); + } + return ref; + } + + private static void addAliases(Map reference) { + Map aliases = new HashMap<>(); + for (String name : reference.keySet()) { + String unaccented = stripAccents(name); + if (!name.equals(unaccented)) { + aliases.put(name, unaccented); + } + } + for (Map.Entry mapping : aliases.entrySet()) { + reference.put(mapping.getValue(), reference.get(mapping.getKey())); + } + } + + private static String stripAccents(String str) { + String decomposed = Normalizer.normalize(str, Normalizer.Form.NFKD); + return decomposed.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); + } + +} diff --git a/Mage.Verify/src/test/java/mage/verify/CompareWithMtgjsonTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java similarity index 59% rename from Mage.Verify/src/test/java/mage/verify/CompareWithMtgjsonTest.java rename to Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 5f1c8a07a62..e3469fab3c1 100644 --- a/Mage.Verify/src/test/java/mage/verify/CompareWithMtgjsonTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -1,7 +1,5 @@ package mage.verify; -import com.fasterxml.jackson.core.type.TypeReference; -import com.fasterxml.jackson.databind.ObjectMapper; import mage.ObjectColor; import mage.cards.Card; import mage.cards.CardImpl; @@ -17,43 +15,70 @@ import java.nio.charset.StandardCharsets; import java.nio.file.Files; import java.nio.file.NoSuchFileException; import java.nio.file.Paths; -import java.text.Normalizer; import java.util.*; import java.util.regex.Matcher; import java.util.regex.Pattern; -public class CompareWithMtgjsonTest { +public class VerifyCardDataTest { @Test - public void testSets() throws IOException { - Collection sets = Sets.getInstance().values(); + public void verifySets() throws IOException { + Map reference = JsonSet.loadAll(); - Map> reference = new ObjectMapper().readValue( - CompareWithMtgjsonTest.class.getResourceAsStream("AllCards.json"), - new TypeReference>>() {}); - - Map aliases = new HashMap<>(); - for (String name : reference.keySet()) { - String unaccented = stripAccents(name); - if (!name.equals(unaccented)) { - aliases.put(name, unaccented); + for (ExpansionSet set : Sets.getInstance().values()) { + JsonSet ref = reference.get(set.getCode()); + if (ref == null) { + for (JsonSet js : reference.values()) { + if (set.getCode().equals(js.oldCode) || set.getCode().toLowerCase().equals(js.magicCardsInfoCode)) { + ref = js; + break; + } + } + if (ref == null) { + System.out.println("missing reference for " + set); + continue; + } + } + if (!String.format("%tF", set.getReleaseDate()).equals(ref.releaseDate)) { + System.out.printf("%40s %-20s %20tF %20s%n", set, "release date", set.getReleaseDate(), ref.releaseDate); + } + if (set.hasBoosters() != (ref.booster != null)) { + System.out.printf("%40s %-20s %20s %20s%n", set, "has boosters", set.hasBoosters(), ref.booster != null); + } + boolean refHasBasicLands = false; + for (JsonCard card : ref.cards) { + if ("Mountain".equals(card.name)) { + refHasBasicLands = true; + break; + } + } + if (set.hasBasicLands() != refHasBasicLands) { + System.out.printf("%40s %-20s %20s %20s%n", set, "has basic lands", set.hasBasicLands(), refHasBasicLands); } } - for (Map.Entry mapping : aliases.entrySet()) { - reference.put(mapping.getValue(), reference.get(mapping.getKey())); - } + } + public static List allCards() { + Collection sets = Sets.getInstance().values(); + List cards = new ArrayList<>(); for (ExpansionSet set : sets) { for (ExpansionSet.SetCardInfo setInfo : set.getSetCardInfo()) { - Set tokens = findSourceTokens(setInfo.getCardClass()); - Card card = CardImpl.createCard(setInfo.getCardClass(), new CardSetInfo(setInfo.getName(), set.getCode(), - setInfo.getCardNumber(), setInfo.getRarity(), setInfo.getGraphicInfo())); - if (card.isSplitCard()) { - check(reference, ((SplitCard) card).getLeftHalfCard(), null); - check(reference, ((SplitCard) card).getRightHalfCard(), null); - } else { - check(reference, card, tokens); - } + cards.add(CardImpl.createCard(setInfo.getCardClass(), new CardSetInfo(setInfo.getName(), set.getCode(), + setInfo.getCardNumber(), setInfo.getRarity(), setInfo.getGraphicInfo()))); + } + } + return cards; + } + + @Test + public void verifyCards() throws IOException { + for (Card card : allCards()) { + Set tokens = findSourceTokens(card.getClass()); + if (card.isSplitCard()) { + check(((SplitCard) card).getLeftHalfCard(), null); + check(((SplitCard) card).getRightHalfCard(), null); + } else { + check(card, tokens); } } } @@ -76,22 +101,17 @@ public class CompareWithMtgjsonTest { } } - private String stripAccents(String str) { - String decomposed = Normalizer.normalize(str, Normalizer.Form.NFKD); - return decomposed.replaceAll("[\\p{InCombiningDiacriticalMarks}]", ""); - } - - private void check(Map> reference, Card card, Set tokens) { - Map ref = findReference(reference, card.getName()); + private void check(Card card, Set tokens) { + JsonCard ref = MtgJson.find(card.getName()); if (ref == null) { System.out.println("Missing card reference for " + card); return; } checkAll(card, ref); if (tokens != null) { - Map ref2 = null; + JsonCard ref2 = null; if (card.isFlipCard()) { - ref2 = findReference(reference, card.getFlipCardName()); + ref2 = MtgJson.find(card.getFlipCardName()); } for (String token : tokens) { if (!(token.equals(card.getName()) @@ -105,32 +125,18 @@ public class CompareWithMtgjsonTest { } } - private Map findReference(Map> reference, String name) { - Map ref = reference.get(name); - if (ref == null) { - name = name.replaceFirst("\\bA[Ee]", "Æ"); - ref = reference.get(name); - } - if (ref == null) { - name = name.replace("'", "\""); // for Kongming, "Sleeping Dragon" & Pang Tong, "Young Phoenix" - ref = reference.get(name); - } - return ref; + private boolean containsInTypesOrText(JsonCard ref, String token) { + return contains(ref.types, token) + || contains(ref.subtypes, token) + || contains(ref.supertypes, token) + || ref.text.contains(token); } - private boolean containsInTypesOrText(Map ref, String token) { - return contains(ref, "types", token) - || contains(ref, "subtypes", token) - || contains(ref, "supertypes", token) - || ((String) ref.get("text")).contains(token); - } - - private boolean contains(Map ref, String key, String value) { - Collection options = (Collection) ref.get(key); + private boolean contains(Collection options, String value) { return options != null && options.contains(value); } - private void checkAll(Card card, Map ref) { + private void checkAll(Card card, JsonCard ref) { checkCost(card, ref); checkPT(card, ref); checkSubtypes(card, ref); @@ -139,8 +145,8 @@ public class CompareWithMtgjsonTest { checkColors(card, ref); } - private void checkColors(Card card, Map ref) { - Collection expected = (Collection) ref.get("colors"); + private void checkColors(Card card, JsonCard ref) { + Collection expected = ref.colors; ObjectColor color = card.getColor(null); if (expected == null) { expected = Collections.emptyList(); @@ -155,8 +161,8 @@ public class CompareWithMtgjsonTest { } } - private void checkSubtypes(Card card, Map ref) { - Collection expected = (Collection) ref.get("subtypes"); + private void checkSubtypes(Card card, JsonCard ref) { + Collection expected = ref.subtypes; if (expected != null && expected.contains("Urza’s")) { expected = new ArrayList<>(expected); for (ListIterator it = ((List) expected).listIterator(); it.hasNext();) { @@ -170,15 +176,15 @@ public class CompareWithMtgjsonTest { } } - private void checkSupertypes(Card card, Map ref) { - Collection expected = (Collection) ref.get("supertypes"); + private void checkSupertypes(Card card, JsonCard ref) { + Collection expected = ref.supertypes; if (!eqSet(card.getSupertype(), expected)) { System.out.println(card.getSupertype() + " != " + expected + " for " + card); } } - private void checkTypes(Card card, Map ref) { - Collection expected = (Collection) ref.get("types"); + private void checkTypes(Card card, JsonCard ref) { + Collection expected = ref.types; List type = new ArrayList<>(); for (CardType cardType : card.getCardType()) { type.add(cardType.toString()); @@ -195,9 +201,9 @@ public class CompareWithMtgjsonTest { return b != null && a.size() == b.size() && a.containsAll(b); } - private void checkPT(Card card, Map ref) { + private void checkPT(Card card, JsonCard ref) { String pt = card.getPower() + "/" + card.getToughness(); - String expected = ref.get("power") + "/" + ref.get("toughness"); + String expected = ref.power + "/" + ref.toughness; if ("0/0".equals(pt) && ("null/null".equals(expected) || "*/*".equals(expected))) { // ok } else if (!Objects.equals(pt, expected.replace("*", "0"))) { @@ -205,8 +211,8 @@ public class CompareWithMtgjsonTest { } } - private void checkCost(Card card, Map ref) { - String expected = (String) ref.get("manaCost"); + private void checkCost(Card card, JsonCard ref) { + String expected = ref.manaCost; String cost = join(card.getManaCost().getSymbols()); if ("".equals(cost)) { cost = null;