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!
This commit is contained in:
leriomaggio
2021-08-29 01:40:45 +01:00
parent 876a00c101
commit 872fca65a4
3 changed files with 180 additions and 24 deletions

View File

@@ -18,6 +18,7 @@
package forge.card; package forge.card;
import com.google.common.base.Predicate; import com.google.common.base.Predicate;
import com.google.common.base.Predicates;
import com.google.common.collect.*; import com.google.common.collect.*;
import forge.card.CardEdition.CardInSet; import forge.card.CardEdition.CardInSet;
import forge.card.CardEdition.Type; import forge.card.CardEdition.Type;
@@ -561,14 +562,28 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
return this.getCardFromEditions(cardName, this.defaultCardArtPreference); return this.getCardFromEditions(cardName, this.defaultCardArtPreference);
} }
public PaperCard getCardFromEditions(final String cardName, Predicate<PaperCard> filter) {
return this.getCardFromEditions(cardName, this.defaultCardArtPreference, filter);
}
@Override @Override
public PaperCard getCardFromEditions(final String cardName, CardArtPreference artPreference) { public PaperCard getCardFromEditions(final String cardName, CardArtPreference artPreference) {
return getCardFromEditions(cardName, artPreference, IPaperCard.NO_ART_INDEX); return getCardFromEditions(cardName, artPreference, IPaperCard.NO_ART_INDEX);
} }
@Override
public PaperCard getCardFromEditions(final String cardName, CardArtPreference artPreference, Predicate<PaperCard> filter) {
return getCardFromEditions(cardName, artPreference, IPaperCard.NO_ART_INDEX, filter);
}
@Override @Override
public PaperCard getCardFromEditions(final String cardInfo, final CardArtPreference artPreference, int artIndex) { 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<PaperCard> 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){ public PaperCard getCardFromEditionsReleasedBefore(String cardName, Date releaseDate){
return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate); return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate);
} }
@Override
public PaperCard getCardFromEditionsReleasedBefore(String cardName, int artIndex, Date releaseDate){ public PaperCard getCardFromEditionsReleasedBefore(String cardName, int artIndex, Date releaseDate){
return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, artIndex, releaseDate); return this.getCardFromEditionsReleasedBefore(cardName, this.defaultCardArtPreference, artIndex, releaseDate);
} }
@@ -594,16 +607,24 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
} }
@Override @Override
public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate){ public PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate<PaperCard> filter){
return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, true); return this.getCardFromEditionsReleasedBefore(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate, filter);
} }
@Override @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<PaperCard> filter){
return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, true, filter);
}
public PaperCard getCardFromEditionsReleasedAfter(String cardName, Date releaseDate){ public PaperCard getCardFromEditionsReleasedAfter(String cardName, Date releaseDate){
return this.getCardFromEditionsReleasedAfter(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate); return this.getCardFromEditionsReleasedAfter(cardName, this.defaultCardArtPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate);
} }
@Override
public PaperCard getCardFromEditionsReleasedAfter(String cardName, int artIndex, Date releaseDate){ public PaperCard getCardFromEditionsReleasedAfter(String cardName, int artIndex, Date releaseDate){
return this.getCardFromEditionsReleasedAfter(cardName, this.defaultCardArtPreference, artIndex, 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); return this.getCardFromEditionsReleasedAfter(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate);
} }
@Override
public PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate<PaperCard> filter){
return this.getCardFromEditionsReleasedAfter(cardName, artPreference, PaperCard.DEFAULT_ART_INDEX, releaseDate, filter);
}
@Override @Override
public PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate){ 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<PaperCard> filter){
return this.tryToGetCardFromEditions(cardName, artPreference, artIndex, releaseDate, false, filter);
} }
// Override when there is no date // Override when there is no date
private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex){ private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex, Predicate<PaperCard> filter){
return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false); return this.tryToGetCardFromEditions(cardInfo, artPreference, artIndex, null, false, filter);
} }
private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex, private PaperCard tryToGetCardFromEditions(String cardInfo, CardArtPreference artPreference, int artIndex,
Date releaseDate, boolean releasedBeforeFlag){ Date releaseDate, boolean releasedBeforeFlag, Predicate<PaperCard> filter){
if (cardInfo == null) if (cardInfo == null)
return null; return null;
final CardRequest cr = CardRequest.fromString(cardInfo); 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. cr.artIndex = artIndex; // 2nd cond. is to verify that some actual value has been passed in.
List<PaperCard> cards; List<PaperCard> cards;
Predicate<PaperCard> cardQueryFilter;
if (releaseDate != null) { if (releaseDate != null) {
cards = getAllCards(cr.cardName, new Predicate<PaperCard>() { cardQueryFilter = new Predicate<PaperCard>() {
@Override @Override
public boolean apply(PaperCard c) { public boolean apply(PaperCard c) {
if (c.getArtIndex() != cr.artIndex) if (c.getArtIndex() != cr.artIndex)
@@ -648,15 +680,18 @@ public final class CardDb implements ICardDatabase, IDeckGenPool {
else else
return ed.getDate().after(releaseDate); return ed.getDate().after(releaseDate);
} }
}); };
} else // filter candidates based on requested artIndex } else // filter candidates based on requested artIndex
cards = getAllCards(cr.cardName, new Predicate<PaperCard>() { cardQueryFilter = new Predicate<PaperCard>() {
@Override @Override
public boolean apply(PaperCard card) { public boolean apply(PaperCard card) {
return card.getArtIndex() == cr.artIndex; 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 if (cards.size() == 1) // if only one candidate, there much else we should do
return cr.isFoil ? cards.get(0).getFoiled() : cards.get(0); 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<? super PaperCard> isLegal(List<String> allowedSetCodes){
return new PredicateLegalInSets(allowedSetCodes);
}
private class PredicateLegalInSets implements Predicate<PaperCard> {
private final List<String> sets = new ArrayList<>();
public PredicateLegalInSets(final List<String> 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 // This Predicate validates if a card was printed at [rarity], on any of its printings
@Override @Override
public Predicate<? super PaperCard> wasPrintedAtRarity(CardRarity rarity) { public Predicate<? super PaperCard> wasPrintedAtRarity(CardRarity rarity) {

View File

@@ -61,18 +61,18 @@ public interface ICardDatabase extends Iterable<PaperCard> {
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate<PaperCard> filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, Predicate<PaperCard> filter);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex);
PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artiIndex, Predicate<PaperCard> filter); PaperCard getCardFromEditions(String cardName, CardArtPreference artPreference, int artIndex, Predicate<PaperCard> filter);
// 4. Specialised Card Lookup on CardArtPreference Selection and Release Date // 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);
PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate<PaperCard> filter);
PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate); PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate);
PaperCard getCardFromEditionsReleasedBefore(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate<PaperCard> 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);
PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, Date releaseDate, Predicate<PaperCard> filter);
PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate); PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate);
PaperCard getCardFromEditionsReleasedAfter(String cardName, CardArtPreference artPreference, int artIndex, Date releaseDate, Predicate<PaperCard> filter);

View File

@@ -126,7 +126,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
assertNotNull(allCardsInSet); assertNotNull(allCardsInSet);
} }
@Test void testGetAllCardsOfaGivenNameAndLegalInSets(){ @Test void testGetAllCardsOfaGivenNameAndPrintedInSets(){
List<String> allowedSets = new ArrayList<>(Arrays.asList(this.editionsCounterspell)); List<String> allowedSets = new ArrayList<>(Arrays.asList(this.editionsCounterspell));
Predicate<PaperCard> printedInSets = (Predicate<PaperCard>) this.cardDb.wasPrintedInSets(allowedSets); Predicate<PaperCard> printedInSets = (Predicate<PaperCard>) this.cardDb.wasPrintedInSets(allowedSets);
List<PaperCard> allCounterSpellsInSets = this.cardDb.getAllCards(this.cardNameCounterspell, printedInSets); List<PaperCard> allCounterSpellsInSets = this.cardDb.getAllCards(this.cardNameCounterspell, printedInSets);
@@ -138,6 +138,29 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
} }
} }
@Test
public void testGetAllCardsLegalInSets(){
List<String> allowedSets = new ArrayList<>();
allowedSets.add(this.latestArtShivanDragonEdition);
Predicate<PaperCard> legalInSets = (Predicate<PaperCard>) this.cardDb.isLegal(allowedSets);
List<PaperCard> allCardsInSet = this.cardDb.getAllCards(legalInSets);
assertNotNull(allCardsInSet);
for (PaperCard card : allCardsInSet)
assertEquals(card.getEdition(), this.latestArtShivanDragonEdition);
}
@Test void testGetAllCardsOfaGivenNameAndLegalInSets(){
List<String> allowedSets = new ArrayList<>(Arrays.asList(this.editionsCounterspell));
Predicate<PaperCard> legalInSets = (Predicate<PaperCard>) this.cardDb.isLegal(allowedSets);
List<PaperCard> 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 * TEST FOR CARD RETRIEVAL METHODS
@@ -628,7 +651,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
// Passing null preference // Passing null preference
assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); 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); assertNotNull(httCard);
assertEquals(httCard.getName(), cardNameHymnToTourach); assertEquals(httCard.getName(), cardNameHymnToTourach);
assertEquals(httCard.getEdition(), latestArtHymnToTourachEdition); assertEquals(httCard.getEdition(), latestArtHymnToTourachEdition);
@@ -636,7 +659,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
// Changing default value for default card art preference // Changing default value for default card art preference
this.cardDb.setCardArtPreference(false, false); this.cardDb.setCardArtPreference(false, false);
assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS); 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); assertNotNull(httCard);
assertEquals(httCard.getName(), cardNameHymnToTourach); assertEquals(httCard.getName(), cardNameHymnToTourach);
assertEquals(httCard.getEdition(), originalArtHymnToTourachEdition); assertEquals(httCard.getEdition(), originalArtHymnToTourachEdition);
@@ -2071,7 +2094,7 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
assertEquals(islandLatest.getEdition(), "SLD"); assertEquals(islandLatest.getEdition(), "SLD");
assertEquals(islandLatest.getArtIndex(), 12); assertEquals(islandLatest.getArtIndex(), 12);
// PALP // SLD
PaperCard islandOriginal = this.cardDb.getCardFromEditions(cardName, CardDb.CardArtPreference.ORIGINAL_ART_CORE_EXPANSIONS_REPRINT_ONLY, 12); PaperCard islandOriginal = this.cardDb.getCardFromEditions(cardName, CardDb.CardArtPreference.ORIGINAL_ART_CORE_EXPANSIONS_REPRINT_ONLY, 12);
assertNotNull(islandOriginal); assertNotNull(islandOriginal);
assertEquals(islandOriginal.getName(), "Island"); assertEquals(islandOriginal.getName(), "Island");
@@ -2085,6 +2108,85 @@ public class CardDbTestCase extends ForgeCardMockTestCase {
assertEquals(maxArtIndex, 13); assertEquals(maxArtIndex, 13);
} }
@Test
public void testGetCardFromEditionsWithFilteredPool(){
// test initial conditions
assertEquals(this.cardDb.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
// Set Allowed Editions
List<String> allowedSets = new ArrayList<>();
allowedSets.add(this.latestArtShivanDragonEdition);
allowedSets.add(this.originalArtShivanDragonEdition);
Predicate<PaperCard> printedInSetPredicate = (Predicate<PaperCard>) 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<PaperCard>) 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<String> allowedSets = new ArrayList<>();
allowedSets.add(this.latestArtShivanDragonEdition);
allowedSets.add(this.originalArtShivanDragonEdition);
allowedSets.add(this.originalArtShivanDragonEditionReleasedAfterTenthEditionNoPromo);
Predicate<PaperCard> legalInSetFilter = (Predicate<PaperCard>) 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);
}
} }