Updates to DeckRecognizer (& tests) by using the new methods from StaticData

(Any reference to CardDb has been dropped, along with corresponding card fetching methods).

Signed-off-by: leriomaggio <valeriomaggio@gmail.com>
This commit is contained in:
leriomaggio
2021-09-14 08:18:24 +01:00
parent 82372ec5ba
commit c732289690
3 changed files with 78 additions and 168 deletions

View File

@@ -17,14 +17,13 @@
*/ */
package forge.deck; package forge.deck;
import com.google.common.base.Predicate;
import com.google.common.collect.Lists; import com.google.common.collect.Lists;
import forge.StaticData; import forge.StaticData;
import forge.card.CardDb;
import forge.card.CardEdition; import forge.card.CardEdition;
import forge.card.CardType; import forge.card.CardType;
import forge.item.IPaperCard; import forge.item.IPaperCard;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.util.TextUtil;
import org.apache.commons.lang3.StringUtils; import org.apache.commons.lang3.StringUtils;
import java.util.*; import java.util.*;
@@ -148,6 +147,34 @@ public class DeckRecognizer {
this.type == TokenType.ILLEGAL_CARD_REQUEST || this.type == TokenType.ILLEGAL_CARD_REQUEST ||
this.type == TokenType.INVALID_CARD_REQUEST ); this.type == TokenType.INVALID_CARD_REQUEST );
} }
public String getKey(){
if (this.isCardToken())
return String.format("%s-%s-%s-%s-%s",
this.card.getName(), this.card.getEdition(),
this.card.getCollectorNumber(),
this.tokenSection.name(), this.getType().name().toLowerCase());
return "";
}
public static class TokenKey {
public String cardName;
public String setCode;
public String collectorNumber;
public String deckSection;
public String typeName;
}
public static TokenKey parseTokenKey(String key){
String[] keyInfo = TextUtil.split(key, '-');
TokenKey tokenKey = new TokenKey();
tokenKey.cardName = keyInfo[0];
tokenKey.setCode = keyInfo[1];
tokenKey.collectorNumber = keyInfo[2];
tokenKey.deckSection = keyInfo[3];
tokenKey.typeName = keyInfo[4];
return tokenKey;
}
} }
// Utility Constants // Utility Constants
@@ -250,17 +277,10 @@ public class DeckRecognizer {
return cardTypesList.toArray(new CharSequence[0]); return cardTypesList.toArray(new CharSequence[0]);
} }
private final CardDb db;
private final CardDb altDb;
private Date releaseDateConstraint = null; private Date releaseDateConstraint = null;
// This two parameters are controlled only via setter methods // This two parameters are controlled only via setter methods
private List<String> allowedSetCodes = null; // as imposed by current format private List<String> allowedSetCodes = null; // as imposed by current format
private DeckFormat deckFormat = null; // private DeckFormat deckFormat = null; //
public DeckRecognizer(CardDb db, CardDb altDb) {
this.db = db;
this.altDb = altDb;
}
public Token recognizeLine(final String rawLine, DeckSection referenceSection) { public Token recognizeLine(final String rawLine, DeckSection referenceSection) {
if (rawLine == null) if (rawLine == null)
@@ -307,6 +327,7 @@ public class DeckRecognizer {
public Token recogniseCardToken(final String text, final DeckSection referenceSection) { public Token recogniseCardToken(final String text, final DeckSection referenceSection) {
String line = text.trim(); String line = text.trim();
Token uknonwnCardToken = null; Token uknonwnCardToken = null;
StaticData data = StaticData.instance();
List<Matcher> cardMatchers = getRegExMatchers(line); List<Matcher> cardMatchers = getRegExMatchers(line);
for (Matcher matcher : cardMatchers) { for (Matcher matcher : cardMatchers) {
String cardName = getRexGroup(matcher, REGRP_CARD); String cardName = getRexGroup(matcher, REGRP_CARD);
@@ -314,16 +335,16 @@ public class DeckRecognizer {
continue; continue;
cardName = cardName.trim(); cardName = cardName.trim();
//Avoid hit the DB - check whether cardName is contained in the DB //Avoid hit the DB - check whether cardName is contained in the DB
CardDb.CardRequest cr = CardDb.CardRequest.fromString(cardName.trim()); // to account for any FOIL request if (!data.isMTGCard(cardName))
if (!foundInCardDb(cr.cardName))
continue; // skip to the next matcher! continue; // skip to the next matcher!
String ccount = getRexGroup(matcher, REGRP_CARDNO); String ccount = getRexGroup(matcher, REGRP_CARDNO);
String setCode = getRexGroup(matcher, REGRP_SET); String setCode = getRexGroup(matcher, REGRP_SET);
String collNo = getRexGroup(matcher, REGRP_COLLNR); String collNo = getRexGroup(matcher, REGRP_COLLNR);
String foilGr = getRexGroup(matcher, REGRP_FOIL_GFISH); String foilGr = getRexGroup(matcher, REGRP_FOIL_GFISH);
String deckSec = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE); String deckSec = getRexGroup(matcher, REGRP_DECK_SEC_XMAGE_STYLE);
boolean isFoil = false;
if (foilGr != null) if (foilGr != null)
cr.isFoil = true; isFoil = true;
int cardCount = ccount != null ? Integer.parseInt(ccount) : 1; int cardCount = ccount != null ? Integer.parseInt(ccount) : 1;
// if any, it will be tried to convert specific collector number to art index (useful for lands). // if any, it will be tried to convert specific collector number to art index (useful for lands).
String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER; String collectorNumber = collNo != null ? collNo : IPaperCard.NO_COLLECTOR_NUMBER;
@@ -346,7 +367,7 @@ public class DeckRecognizer {
// we now name is ok, set is ok - we just need to be sure about collector number (if any) // we now name is ok, set is ok - we just need to be sure about collector number (if any)
// and if that card can be actually found in the requested set. // and if that card can be actually found in the requested set.
// IOW: we should account for wrong request, e.g. Counterspell|FEM - just doesn't exist! // IOW: we should account for wrong request, e.g. Counterspell|FEM - just doesn't exist!
PaperCard pc = this.getCardFromSet(cr.cardName, edition, collectorNumber, artIndex, cr.isFoil); PaperCard pc = data.getCardFromSet(cardName, edition, collectorNumber, artIndex, isFoil);
if (pc != null) { if (pc != null) {
// ok so the card has been found - let's see if there's any restriction on the set // ok so the card has been found - let's see if there's any restriction on the set
if (isIllegalSetInGameFormat(edition.getCode()) || isIllegalCardInDeckFormat(pc)) if (isIllegalSetInGameFormat(edition.getCode()) || isIllegalCardInDeckFormat(pc))
@@ -366,11 +387,12 @@ public class DeckRecognizer {
// unless it is illegal for current format or invalid with selected date. // unless it is illegal for current format or invalid with selected date.
PaperCard pc = null; PaperCard pc = null;
if (hasGameFormatConstraints()) { if (hasGameFormatConstraints()) {
Predicate<PaperCard> filter = (Predicate<PaperCard>) this.db.isLegal(this.allowedSetCodes); pc = data.getCardFromSupportedEditions(cardName, isFoil, this.allowedSetCodes,
pc = this.getCardFromSupportedEditions(cr.cardName, cr.isFoil, filter); this.releaseDateConstraint);
} }
if (pc == null) if (pc == null)
pc = this.getCardFromSupportedEditions(cr.cardName, cr.isFoil, null); pc = data.getCardFromSupportedEditions(cardName, isFoil, null,
this.releaseDateConstraint);
if (pc != null) { if (pc != null) {
if (isIllegalSetInGameFormat(pc.getEdition()) || isIllegalCardInDeckFormat(pc)) if (isIllegalSetInGameFormat(pc.getEdition()) || isIllegalCardInDeckFormat(pc))
@@ -425,10 +447,6 @@ public class DeckRecognizer {
return this.releaseDateConstraint != null && edition.getDate().compareTo(this.releaseDateConstraint) >= 0; return this.releaseDateConstraint != null && edition.getDate().compareTo(this.releaseDateConstraint) >= 0;
} }
private boolean foundInCardDb(String cardName){
return this.db.contains(cardName) || this.altDb.contains(cardName);
}
private List<Matcher> getRegExMatchers(String line) { private List<Matcher> getRegExMatchers(String line) {
List<Matcher> matchers = new ArrayList<>(); List<Matcher> matchers = new ArrayList<>();
Pattern[] patternsWithCollNumber = new Pattern[] { Pattern[] patternsWithCollNumber = new Pattern[] {
@@ -456,50 +474,6 @@ public class DeckRecognizer {
return matchers; return matchers;
} }
private PaperCard getCardFromSet(final String cardName, final CardEdition edition,
final String collectorNumber, final int artIndex,
final boolean isFoil) {
CardDb targetDb = this.db.contains(cardName) ? this.db : this.altDb;
// Try with collector number first
PaperCard result = targetDb.getCardFromSet(cardName, edition, collectorNumber, isFoil);
if (result == null && !collectorNumber.equals(IPaperCard.NO_COLLECTOR_NUMBER)) {
if (artIndex != IPaperCard.NO_ART_INDEX) {
// So here we know cardName exists (checked before invoking this method)
// and also a Collector Number was specified.
// The only case we would reach this point is either due to a wrong edition-card match
// (later resulting in Unknown card - e.g. "Counterspell|FEM") or due to the fact that
// art Index was specified instead of collector number! Let's give it a go with that
// but only if artIndex is not NO_ART_INDEX (e.g. collectorNumber = "*32")
int maxArtForCard = targetDb.getMaxArtIndex(cardName);
if (artIndex <= maxArtForCard) {
// if collNr was "78", it's hardly an artIndex. It was just the wrong collNr for the requested card
result = targetDb.getCardFromSet(cardName, edition, artIndex, isFoil);
}
}
if (result == null){
// Last chance, try without collector number and see if any match is found
result = targetDb.getCardFromSet(cardName, edition, isFoil);
}
}
return result;
}
private PaperCard getCardFromSupportedEditions(final String cardName, boolean isFoil,
Predicate<PaperCard> filter){
String reqInfo = CardDb.CardRequest.compose(cardName, isFoil);
CardDb targetDb = this.db.contains(cardName) ? this.db : this.altDb;
PaperCard result;
if (this.releaseDateConstraint != null) {
result = targetDb.getCardFromEditionsReleasedBefore(reqInfo,
this.releaseDateConstraint, filter);
if (result == null)
result = targetDb.getCardFromEditions(reqInfo, filter);
}
else
result = targetDb.getCardFromEditions(reqInfo, filter);
return result;
}
public Token recogniseNonCardToken(final String text) { public Token recogniseNonCardToken(final String text) {
if (isDeckSectionName(text)) { if (isDeckSectionName(text)) {
String tokenText = nonCardTokenMatch(text); String tokenText = nonCardTokenMatch(text);

View File

@@ -301,10 +301,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
* ============================= * =============================
*/ */
@Test void testMatchNonCardLine(){ @Test void testMatchNonCardLine(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Test Token Types // Test Token Types
Token t = recognizer.recogniseNonCardToken("//Lands"); Token t = recognizer.recogniseNonCardToken("//Lands");
@@ -923,7 +920,6 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(matcher.matches()); assertFalse(matcher.matches());
foilRequest = "4 Aspect of Hydra [BNG] 117 (F)"; foilRequest = "4 Aspect of Hydra [BNG] 117 (F)";
target = DeckRecognizer.CARD_SET_COLLNO_PATTERN;
matcher = target.matcher(foilRequest); matcher = target.matcher(foilRequest);
assertTrue(matcher.matches()); assertTrue(matcher.matches());
assertEquals(matcher.group(DeckRecognizer.REGRP_CARDNO), "4"); assertEquals(matcher.group(DeckRecognizer.REGRP_CARDNO), "4");
@@ -939,7 +935,6 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(matcher.matches()); assertFalse(matcher.matches());
foilRequest = "4 [BNG] Aspect of Hydra 117 (F)"; foilRequest = "4 [BNG] Aspect of Hydra 117 (F)";
target = DeckRecognizer.SET_CARD_COLLNO_PATTERN;
matcher = target.matcher(foilRequest); matcher = target.matcher(foilRequest);
assertTrue(matcher.matches()); assertTrue(matcher.matches());
assertEquals(matcher.group(DeckRecognizer.REGRP_CARDNO), "4"); assertEquals(matcher.group(DeckRecognizer.REGRP_CARDNO), "4");
@@ -979,10 +974,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRecogniseCardToken(){ @Test void testRecogniseCardToken(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "4x Power Sink+ (TMP) 78"; String lineRequest = "4x Power Sink+ (TMP) 78";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1071,7 +1063,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getCollectorNumber(), "78"); assertEquals(tokenCard.getCollectorNumber(), "78");
// Relax Set Preference // Relax Set Preference
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
lineRequest = "4x Power Sink"; lineRequest = "4x Power Sink";
cardToken = recognizer.recogniseCardToken(lineRequest, null); cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1097,10 +1089,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRecognisingCardFromSetUsingAlternateCode(){ @Test void testRecognisingCardFromSetUsingAlternateCode(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "4x Power Sink+ TE 78"; String lineRequest = "4x Power Sink+ TE 78";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1119,10 +1108,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testSingleWordCardNameMatchesCorrectly(){ @Test void testSingleWordCardNameMatchesCorrectly(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "2x Counterspell ICE"; String lineRequest = "2x Counterspell ICE";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1135,7 +1121,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getEdition(), "ICE"); assertEquals(tokenCard.getEdition(), "ICE");
// Remove Set code // Remove Set code
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
lineRequest = "2x Counterspell"; lineRequest = "2x Counterspell";
cardToken = recognizer.recogniseCardToken(lineRequest, null); cardToken = recognizer.recogniseCardToken(lineRequest, null);
assertNotNull(cardToken); assertNotNull(cardToken);
@@ -1149,10 +1135,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testPassingInArtIndexRatherThanCollectorNumber(){ @Test void testPassingInArtIndexRatherThanCollectorNumber(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "20x Mountain MIR 3"; String lineRequest = "20x Mountain MIR 3";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1168,10 +1151,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCollectorNumberIsNotConfusedAsArtIndexInstead(){ @Test void testCollectorNumberIsNotConfusedAsArtIndexInstead(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "2x Auspicious Ancestor MIR 3"; String lineRequest = "2x Auspicious Ancestor MIR 3";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1187,10 +1167,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardRequestWithWrongCollectorNumberStillReturnsTheCardFromSetIfAny(){ @Test void testCardRequestWithWrongCollectorNumberStillReturnsTheCardFromSetIfAny(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String requestLine = "3 Jayemdae Tome (LEB) 231"; // actually found in TappedOut Deck Export String requestLine = "3 Jayemdae Tome (LEB) 231"; // actually found in TappedOut Deck Export
// NOTE: Expected Coll Nr should be 255 // NOTE: Expected Coll Nr should be 255
@@ -1214,10 +1191,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRequestingCardFromTheWrongSetReturnsUnknownCard(){ @Test void testRequestingCardFromTheWrongSetReturnsUnknownCard(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "2x Counterspell FEM"; String lineRequest = "2x Counterspell FEM";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1227,10 +1201,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRequestingCardFromNonExistingSetReturnsUnknownCard(){ @Test void testRequestingCardFromNonExistingSetReturnsUnknownCard(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "2x Counterspell BOU"; String lineRequest = "2x Counterspell BOU";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1241,10 +1212,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRequestingCardWithRestrictionsOnSetsFromGameFormat(){ @Test void testRequestingCardWithRestrictionsOnSetsFromGameFormat(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Setting Fantasy Constructed Game Format: Urza's Block Format // Setting Fantasy Constructed Game Format: Urza's Block Format
List<String> allowedSets = Arrays.asList("USG", "ULG", "UDS", "PUDS", "PULG", "PUSG"); List<String> allowedSets = Arrays.asList("USG", "ULG", "UDS", "PUDS", "PULG", "PUSG");
recognizer.setGameFormatConstraint(allowedSets); recognizer.setGameFormatConstraint(allowedSets);
@@ -1265,10 +1233,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRequestingCardWithRestrictionsOnDeckFormat(){ @Test void testRequestingCardWithRestrictionsOnDeckFormat(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String lineRequest = "Ancestral Recall"; String lineRequest = "Ancestral Recall";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1278,7 +1243,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard ancestralCard = cardToken.getCard(); PaperCard ancestralCard = cardToken.getCard();
assertEquals(cardToken.getNumber(), 1); assertEquals(cardToken.getNumber(), 1);
assertEquals(ancestralCard.getName(), "Ancestral Recall"); assertEquals(ancestralCard.getName(), "Ancestral Recall");
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
assertEquals(ancestralCard.getEdition(), "VMA"); assertEquals(ancestralCard.getEdition(), "VMA");
recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders); recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders);
@@ -1289,12 +1254,9 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRequestingCardWithReleaseDateConstraints(){ @Test void testRequestingCardWithReleaseDateConstraints(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
recognizer.setDateConstraint(2002, 1); recognizer.setDateConstraint(2002, 1);
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "Ancestral Recall"; String lineRequest = "Ancestral Recall";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1304,7 +1266,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard ancestralCard = cardToken.getCard(); PaperCard ancestralCard = cardToken.getCard();
assertEquals(cardToken.getNumber(), 1); assertEquals(cardToken.getNumber(), 1);
assertEquals(ancestralCard.getName(), "Ancestral Recall"); assertEquals(ancestralCard.getName(), "Ancestral Recall");
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
assertEquals(ancestralCard.getEdition(), "2ED"); assertEquals(ancestralCard.getEdition(), "2ED");
// Counterspell editions // Counterspell editions
@@ -1321,12 +1283,9 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testInvalidCardRequestWhenReleaseDateConstraintsAreUp(){ @Test void testInvalidCardRequestWhenReleaseDateConstraintsAreUp(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
// First run without constraint to check that it's a valid request // First run without constraint to check that it's a valid request
String lineRequest = "Counterspell|MH2"; String lineRequest = "Counterspell|MH2";
@@ -1347,13 +1306,10 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardMatchWithDateANDGameFormatConstraints(){ @Test void testCardMatchWithDateANDGameFormatConstraints(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Baseline - no constraints // Baseline - no constraints
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "2x Lightning Dragon"; String lineRequest = "2x Lightning Dragon";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
assertNotNull(cardToken); assertNotNull(cardToken);
@@ -1442,13 +1398,10 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardMatchWithDateANDdeckFormatConstraints(){ @Test void testCardMatchWithDateANDdeckFormatConstraints(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Baseline - no constraints // Baseline - no constraints
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "Flash"; String lineRequest = "Flash";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1490,13 +1443,10 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardMatchWithGameANDdeckFormatConstraints(){ @Test void testCardMatchWithGameANDdeckFormatConstraints(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Baseline - no constraints // Baseline - no constraints
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "Flash"; String lineRequest = "Flash";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1555,13 +1505,10 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardMatchWitDateANDgameANDdeckFormatConstraints(){ @Test void testCardMatchWitDateANDgameANDdeckFormatConstraints(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
// Baseline - no constraints // Baseline - no constraints
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "Flash"; String lineRequest = "Flash";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1670,11 +1617,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardRecognisedMTGGoldfishFormat(){ @Test void testCardRecognisedMTGGoldfishFormat(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards(); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "4 Aspect of Hydra [BNG] (F)"; String lineRequest = "4 Aspect of Hydra [BNG] (F)";
Token cardToken = recognizer.recogniseCardToken(lineRequest, null); Token cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1711,11 +1655,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testCardNameEntryInMarkDownExportFromTappedOut(){ @Test void testCardNameEntryInMarkDownExportFromTappedOut(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards(); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String line = "* 1 [Ancestral Recall](http://tappedout.nethttp://tappedout.net/mtg-card/ancestral-recall/)"; String line = "* 1 [Ancestral Recall](http://tappedout.nethttp://tappedout.net/mtg-card/ancestral-recall/)";
@@ -1769,10 +1710,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testRecognizeCardTokenInXMageFormatRequest(){ @Test void testRecognizeCardTokenInXMageFormatRequest(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
String xmageFormatRequest = "1 [LRW:51] Amoeboid Changeling"; String xmageFormatRequest = "1 [LRW:51] Amoeboid Changeling";
Token xmageCardToken = recognizer.recogniseCardToken(xmageFormatRequest, null); Token xmageCardToken = recognizer.recogniseCardToken(xmageFormatRequest, null);
@@ -1791,12 +1729,9 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
* =================================== * ===================================
*/ */
@Test void testRecognizeLines(){ @Test void testRecognizeLines(){
StaticData magicDb = FModel.getMagicDb(); DeckRecognizer recognizer = new DeckRecognizer();
CardDb db = magicDb.getCommonCards();
CardDb altDb = magicDb.getVariantCards();
DeckRecognizer recognizer = new DeckRecognizer(db, altDb);
assertEquals(db.getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS); assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
String lineRequest = "// MainBoard"; String lineRequest = "// MainBoard";
Token token = recognizer.recognizeLine(lineRequest, null); Token token = recognizer.recognizeLine(lineRequest, null);

View File

@@ -11,7 +11,6 @@ import forge.gui.interfaces.ICheckBox;
import forge.gui.interfaces.IComboBox; import forge.gui.interfaces.IComboBox;
import forge.gui.util.SOptionPane; import forge.gui.util.SOptionPane;
import forge.item.PaperCard; import forge.item.PaperCard;
import forge.model.FModel;
import forge.util.Localizer; import forge.util.Localizer;
public class DeckImportController { public class DeckImportController {
@@ -77,8 +76,7 @@ public class DeckImportController {
public List<DeckRecognizer.Token> parseInput(String input) { public List<DeckRecognizer.Token> parseInput(String input) {
tokens.clear(); tokens.clear();
DeckRecognizer recognizer = new DeckRecognizer(FModel.getMagicDb().getCommonCards(), DeckRecognizer recognizer = new DeckRecognizer();
FModel.getMagicDb().getVariantCards());
if (dateTimeCheck.isSelected()) { if (dateTimeCheck.isSelected()) {
recognizer.setDateConstraint(yearDropdown.getSelectedItem(), monthDropdown.getSelectedIndex()); recognizer.setDateConstraint(yearDropdown.getSelectedItem(), monthDropdown.getSelectedIndex());
} }
@@ -94,7 +92,7 @@ public class DeckImportController {
if (token != null) { if (token != null) {
if (token.getType() == DeckRecognizer.TokenType.DECK_SECTION_NAME) if (token.getType() == DeckRecognizer.TokenType.DECK_SECTION_NAME)
referenceDeckSectionInParsing = DeckSection.valueOf(token.getText()); referenceDeckSectionInParsing = DeckSection.valueOf(token.getText());
else if (token.isCardToken()) { else if (token.getType() == DeckRecognizer.TokenType.LEGAL_CARD_REQUEST) {
DeckSection tokenSection = token.getTokenSection(); DeckSection tokenSection = token.getTokenSection();
if (!tokenSection.equals(referenceDeckSectionInParsing)) { if (!tokenSection.equals(referenceDeckSectionInParsing)) {
DeckRecognizer.Token sectionToken = DeckRecognizer.Token.DeckSection(token.getTokenSection().name()); DeckRecognizer.Token sectionToken = DeckRecognizer.Token.DeckSection(token.getTokenSection().name());
@@ -105,7 +103,10 @@ public class DeckImportController {
referenceDeckSectionInParsing = tokenSection; referenceDeckSectionInParsing = tokenSection;
} }
} }
tokens.add(token); // add found token if (token.getType() == DeckRecognizer.TokenType.DECK_NAME)
tokens.add(0, token); // always add deck name top of the decklist
else
tokens.add(token);
} }
} }