From 872fca65a43f83b0f4cca9dc88a69135f794fd79 Mon Sep 17 00:00:00 2001 From: leriomaggio Date: Sun, 29 Aug 2021 01:40:45 +0100 Subject: [PATCH] Extended CardDB API (w/ Tests) adding a Predicate filter for getCardFromEditions series The getCardFromEditions series now include new variants (also for released before/after) accepting an extra filter to be passed used as an extra filter for returned cards! --- .../src/main/java/forge/card/CardDb.java | 84 ++++++++++--- .../main/java/forge/card/ICardDatabase.java | 10 +- .../test/java/forge/card/CardDbTestCase.java | 110 +++++++++++++++++- 3 files changed, 180 insertions(+), 24 deletions(-) diff --git a/forge-core/src/main/java/forge/card/CardDb.java b/forge-core/src/main/java/forge/card/CardDb.java index b0a390a896e..07b64e18ca4 100644 --- a/forge-core/src/main/java/forge/card/CardDb.java +++ b/forge-core/src/main/java/forge/card/CardDb.java @@ -18,6 +18,7 @@ package forge.card; import com.google.common.base.Predicate; +import com.google.common.base.Predicates; import com.google.common.collect.*; import forge.card.CardEdition.CardInSet; import forge.card.CardEdition.Type; @@ -561,14 +562,28 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return this.getCardFromEditions(cardName, this.defaultCardArtPreference); } + public PaperCard getCardFromEditions(final String cardName, Predicate filter) { + return this.getCardFromEditions(cardName, this.defaultCardArtPreference, filter); + } + @Override public PaperCard getCardFromEditions(final String cardName, CardArtPreference artPreference) { return getCardFromEditions(cardName, artPreference, IPaperCard.NO_ART_INDEX); } + @Override + public PaperCard getCardFromEditions(final String cardName, CardArtPreference artPreference, Predicate filter) { + return getCardFromEditions(cardName, artPreference, IPaperCard.NO_ART_INDEX, filter); + } + @Override public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex) { - return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex); + return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null); + } + + @Override + public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex, Predicate filter) { + return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, filter); } /* @@ -578,12 +593,10 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { * =============================================== */ - @Override public PaperCard getCardFromEditionsReleasedBefore(String cardName, Date releaseDate){ return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate); } - @Override public PaperCard getCardFromEditionsReleasedBefore(String cardName, int artIndex, Date releaseDate){ return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, artIndex, releaseDate); } @@ -594,16 +607,24 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } @Override - public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate){ - return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, true); + public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate filter){ + return this.getCardFromEditionsReleasedBefore(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate, filter); } @Override + public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate){ + return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, true, null); + } + + @Override + public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate filter){ + return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, true, filter); + } + public PaperCard getCardFromEditionsReleasedAfter(String cardName, Date releaseDate){ return this.getCardFromEditionsReleasedAfter(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate); } - @Override public PaperCard getCardFromEditionsReleasedAfter(String cardName, int artIndex, Date releaseDate){ return this.getCardFromEditionsReleasedAfter(cardName, this.defaultCardArtPreference, artIndex, releaseDate); } @@ -613,18 +634,28 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { return this.getCardFromEditionsReleasedAfter(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate); } + @Override + public PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate filter){ + return this.getCardFromEditionsReleasedAfter(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate, filter); + } + @Override public PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate){ - return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, false); + return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, false, null); + } + + @Override + public PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate filter){ + return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, false, filter); } // Override when there is no date - private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex){ - return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false); + private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex, Predicate filter){ + return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false, filter); } private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex, - Date releaseDate, boolean releasedBeforeFlag){ + Date releaseDate, boolean releasedBeforeFlag, Predicate filter){ if (cardInfo == null) return null; final CardRequest cr = CardRequest.fromString(cardInfo); @@ -635,8 +666,9 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { cr.artIndex = artIndex; // 2nd cond. is to verify that some actual value has been passed in. List cards; + Predicate cardQueryFilter; if (releaseDate != null) { - cards = getAllCards(cr.cardName, new Predicate() { + cardQueryFilter = new Predicate() { @Override public boolean apply(PaperCard c) { if (c.getArtIndex() != cr.artIndex) @@ -648,15 +680,18 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { else return ed.getDate().after(releaseDate); } - }); + }; } else // filter candidates based on requested artIndex - cards = getAllCards(cr.cardName, new Predicate() { + cardQueryFilter = new Predicate() { @Override public boolean apply(PaperCard card) { return card.getArtIndex() == cr.artIndex; } - }); - + }; + if (filter != null) + cardQueryFilter = Predicates.and(cardQueryFilter, filter); + cards = getAllCards(cr.cardName, cardQueryFilter); + // Note: No need to check whether "cards" is empty; the next for loop will validate condition at L699 if (cards.size() == 1) // if only one candidate, there much else we should do return cr.isFoil ? cards.get(0).getFoiled() : cards.get(0); @@ -906,6 +941,25 @@ public final class CardDb implements ICardDatabase, IDeckGenPool { } } + // This Predicate validates if a card is legal in a given format (identified by the list of allowed sets) + @Override + public Predicate isLegal(List allowedSetCodes){ + return new PredicateLegalInSets(allowedSetCodes); + } + + private class PredicateLegalInSets implements Predicate { + private final List sets = new ArrayList<>(); + + public PredicateLegalInSets(final List allowedSets){ + this.sets.addAll(allowedSets); + } + @Override + public boolean apply(final PaperCard card){ + if (card == null) return false; + return this.sets.contains(card.getEdition()); + } + } + // This Predicate validates if a card was printed at [rarity], on any of its printings @Override public Predicate wasPrintedAtRarity(CardRarity rarity) { diff --git a/forge-core/src/main/java/forge/card/ICardDatabase.java b/forge-core/src/main/java/forge/card/ICardDatabase.java index ada9ae80a5b..4618e78f83f 100644 --- a/forge-core/src/main/java/forge/card/ICardDatabase.java +++ b/forge-core/src/main/java/forge/card/ICardDatabase.java @@ -61,18 +61,18 @@ public interface ICardDatabase extends Iterable { PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex); - PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artiIndex, Predicate filter); + PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Predicate filter); // 4. Specialised Card Lookup on CardArtPreference Selection and Release Date - PaperCard getCardFromEditionsReleasedBefore(String cardName, Date releaseDate); - PaperCard getCardFromEditionsReleasedBefore(String cardName, int artIndex, Date releaseDate); PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate); + PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate filter); PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate); + PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate filter); - PaperCard getCardFromEditionsReleasedAfter(String cardName, Date releaseDate); - PaperCard getCardFromEditionsReleasedAfter(String cardName, int artIndex, Date releaseDate); PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, Date releaseDate); + PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate filter); PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate); + PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate filter); diff --git a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java index e2bd0bdff47..4b41747716d 100644 --- a/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java +++ b/forge-gui-desktop/src/test/java/forge/card/CardDbTestCase.java @@ -126,7 +126,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase { assertNotNull(allCardsInSet); } - @Test void testGetAllCardsOfaGivenNameAndLegalInSets(){ + @Test void testGetAllCardsOfaGivenNameAndPrintedInSets(){ List allowedSets = new ArrayList<>(Arrays.asList(this.editionsCounterspell)); Predicate printedInSets = (Predicate) this.cardDb.wasPrintedInSets(allowedSets); List allCounterSpellsInSets = this.cardDb.getAllCards(this.cardNameCounterspell, printedInSets); @@ -138,6 +138,29 @@ public class CardDbTestCase extends ForgeCardMockTestCase { } } + @Test + public void testGetAllCardsLegalInSets(){ + List allowedSets = new ArrayList<>(); + allowedSets.add(this.latestArtShivanDragonEdition); + Predicate legalInSets = (Predicate) this.cardDb.isLegal(allowedSets); + List allCardsInSet = this.cardDb.getAllCards(legalInSets); + assertNotNull(allCardsInSet); + for (PaperCard card : allCardsInSet) + assertEquals(card.getEdition(), this.latestArtShivanDragonEdition); + } + + @Test void testGetAllCardsOfaGivenNameAndLegalInSets(){ + List allowedSets = new ArrayList<>(Arrays.asList(this.editionsCounterspell)); + Predicate legalInSets = (Predicate) this.cardDb.isLegal(allowedSets); + List allCounterSpellsInSets = this.cardDb.getAllCards(this.cardNameCounterspell, legalInSets); + assertNotNull(allCounterSpellsInSets); + assertTrue(allCounterSpellsInSets.size() > 0); + assertTrue(allCounterSpellsInSets.size() > 1); + for (PaperCard card : allCounterSpellsInSets) { + assertEquals(card.getName(), this.cardNameCounterspell); + assertTrue(allowedSets.contains(card.getEdition())); + } + } /* * TEST FOR CARD RETRIEVAL METHODS @@ -628,7 +651,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase { // Passing null preference assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); - PaperCard httCard = this.cardDb.getCardFromEditions(cardNameHymnToTourach, null); + PaperCard httCard = this.cardDb.getCardFromEditions(cardNameHymnToTourach, null, null); assertNotNull(httCard); assertEquals(httCard.getName(), cardNameHymnToTourach); assertEquals(httCard.getEdition(), latestArtHymnToTourachEdition); @@ -636,7 +659,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase { // Changing default value for default card art preference this.cardDb.setCardArtPreference(false, false); assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS); - httCard = this.cardDb.getCardFromEditions(cardNameHymnToTourach, null); + httCard = this.cardDb.getCardFromEditions(cardNameHymnToTourach, null, null); assertNotNull(httCard); assertEquals(httCard.getName(), cardNameHymnToTourach); assertEquals(httCard.getEdition(), originalArtHymnToTourachEdition); @@ -2071,7 +2094,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase { assertEquals(islandLatest.getEdition(), "SLD"); assertEquals(islandLatest.getArtIndex(), 12); - // PALP + // SLD PaperCard islandOriginal = this.cardDb.getCardFromEditions(cardName, CardDb.CardArtPreference.ORIGINAL_ART_CORE_EXPANSIONS_REPRINT_ONLY, 12); assertNotNull(islandOriginal); assertEquals(islandOriginal.getName(), "Island"); @@ -2085,6 +2108,85 @@ public class CardDbTestCase extends ForgeCardMockTestCase { assertEquals(maxArtIndex, 13); } + @Test + public void testGetCardFromEditionsWithFilteredPool(){ + // test initial conditions + assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); + + // Set Allowed Editions + List allowedSets = new ArrayList<>(); + allowedSets.add(this.latestArtShivanDragonEdition); + allowedSets.add(this.originalArtShivanDragonEdition); + Predicate printedInSetPredicate = (Predicate) this.cardDb.wasPrintedInSets(allowedSets); + PaperCard shivanDragonCard = this.cardDb.getCardFromEditions(this.cardNameShivanDragon, printedInSetPredicate); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), this.cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), this.latestArtShivanDragonEdition); + + // Use Original Art Preference Now + shivanDragonCard = this.cardDb.getCardFromEditions(this.cardNameShivanDragon, CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS, printedInSetPredicate); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), this.cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), this.originalArtShivanDragonEdition); + + // Testing null cards + allowedSets.clear(); + allowedSets.add(this.originalArtHymnToTourachEdition); // FEM - it does not exist a shivan in FEM + printedInSetPredicate = (Predicate) this.cardDb.wasPrintedInSets(allowedSets); + shivanDragonCard = this.cardDb.getCardFromEditions(this.cardNameShivanDragon, printedInSetPredicate); + assertNull(shivanDragonCard); + } + + @Test + public void testGetCardsFromEditionsReleasedBeforeDateWithFilter(){ + // test initial conditions + assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); + + Date afterTenthEdition = null; + try { + SimpleDateFormat format = new SimpleDateFormat("yyyy-MM-dd"); + afterTenthEdition = format.parse(releasedAfterTenthEditionDate); + } catch (ParseException e) { + e.printStackTrace(); + fail(); + } + + // Set Allowed Editions + List allowedSets = new ArrayList<>(); + allowedSets.add(this.latestArtShivanDragonEdition); + allowedSets.add(this.originalArtShivanDragonEdition); + allowedSets.add(this.originalArtShivanDragonEditionReleasedAfterTenthEditionNoPromo); + Predicate legalInSetFilter = (Predicate) this.cardDb.isLegal(allowedSets); + PaperCard shivanDragonCard = this.cardDb.getCardFromEditionsReleasedAfter(this.cardNameShivanDragon, CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS, + afterTenthEdition, legalInSetFilter); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), latestArtShivanDragonEdition); + + // Original Art Should be excluded by date filter + shivanDragonCard = this.cardDb.getCardFromEditionsReleasedAfter(this.cardNameShivanDragon, CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS, + afterTenthEdition, legalInSetFilter); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), originalArtShivanDragonEditionReleasedAfterTenthEditionNoPromo); + + // == Try same but with Released Before + shivanDragonCard = this.cardDb.getCardFromEditionsReleasedBefore(this.cardNameShivanDragon, CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS, + afterTenthEdition, legalInSetFilter); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), originalArtShivanDragonEdition); + + // Original Art Should be excluded by date filter + shivanDragonCard = this.cardDb.getCardFromEditionsReleasedBefore(this.cardNameShivanDragon, CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS, + afterTenthEdition, legalInSetFilter); + assertNotNull(shivanDragonCard); + assertEquals(shivanDragonCard.getName(), cardNameShivanDragon); + assertEquals(shivanDragonCard.getEdition(), originalArtShivanDragonEdition); + + } + + }