DeckRecognizer.Token to include whether request in card list had any set code

This commit adds in a new piece of information to Token in DeckRecognizer to mark whether original card request included or not a set code.
This flag will be only used by actual CardToken and will be leveraged later on by "smart card optimisation option" to be added to DeckImport on desktop too.

Majority of tests in DeckRecognizerTest have been updated to cross-check that no bug has been unintentionally introduced.
This commit is contained in:
leriomaggio
2021-11-02 17:47:30 +00:00
parent 1e9b3579f3
commit 915aa75a99
2 changed files with 114 additions and 22 deletions

View File

@@ -83,23 +83,29 @@ public class DeckRecognizer {
// only used for card tokens
private PaperCard card = null;
private DeckSection tokenSection = null;
// Flag used to mark whether original card request had any specified set code
// This will be used to mark tokens that could be further processed by
// card art optimisation (if enabled)
private boolean cardRequestHasSetCode = true;
public static Token LegalCard(final PaperCard card, final int count,
final DeckSection section) {
return new Token(TokenType.LEGAL_CARD, count, card, section);
final DeckSection section, final boolean cardRequestHasSetCode) {
return new Token(TokenType.LEGAL_CARD, count, card, section, cardRequestHasSetCode);
}
public static Token LimitedCard(final PaperCard card, final int count,
final DeckSection section, final LimitedCardType limitedType){
return new Token(TokenType.LIMITED_CARD, count, card, section, limitedType);
final DeckSection section, final LimitedCardType limitedType,
final boolean cardRequestHasSetCode){
return new Token(TokenType.LIMITED_CARD, count, card, section, limitedType, cardRequestHasSetCode);
}
public static Token NotAllowedCard(final PaperCard card, final int count) {
return new Token(TokenType.CARD_FROM_NOT_ALLOWED_SET, count, card);
public static Token NotAllowedCard(final PaperCard card, final int count, final boolean cardRequestHasSetCode) {
return new Token(TokenType.CARD_FROM_NOT_ALLOWED_SET, count, card, cardRequestHasSetCode);
}
public static Token CardInInvalidSet(final PaperCard card, final int count) {
return new Token(TokenType.CARD_FROM_INVALID_SET, count, card);
public static Token CardInInvalidSet(final PaperCard card, final int count, final boolean cardRequestHasSetCode) {
return new Token(TokenType.CARD_FROM_INVALID_SET, count, card, cardRequestHasSetCode);
}
// WARNING MESSAGES
@@ -154,7 +160,7 @@ public class DeckRecognizer {
return new Token(TokenType.DECK_SECTION_NAME, matchedSection.name());
}
private Token(final TokenType type1, final int count, final PaperCard tokenCard) {
private Token(final TokenType type1, final int count, final PaperCard tokenCard, boolean cardRequestHasSetCode) {
this.number = count;
this.type = type1;
this.text = String.format("%s [%s] #%s",
@@ -162,18 +168,20 @@ public class DeckRecognizer {
this.card = tokenCard;
this.tokenSection = null;
this.limitedCardType = null;
this.cardRequestHasSetCode = cardRequestHasSetCode;
}
private Token(final TokenType type1, final int count, final PaperCard tokenCard,
final DeckSection section) {
this(type1, count, tokenCard);
final DeckSection section, boolean cardRequestHasSetCode) {
this(type1, count, tokenCard, cardRequestHasSetCode);
this.tokenSection = section;
this.limitedCardType = null;
}
private Token(final TokenType type1, final int count, final PaperCard tokenCard,
final DeckSection section, final LimitedCardType limitedCardType1) {
this(type1, count, tokenCard);
final DeckSection section, final LimitedCardType limitedCardType1,
boolean cardRequestHasSetCode) {
this(type1, count, tokenCard, cardRequestHasSetCode);
this.tokenSection = section;
this.limitedCardType = limitedCardType1;
}
@@ -204,6 +212,10 @@ public class DeckRecognizer {
return this.number;
}
public final boolean cardRequestHasNoCode() {
return !(this.cardRequestHasSetCode);
}
public final DeckSection getTokenSection() { return this.tokenSection; }
public void resetTokenSection(DeckSection referenceDeckSection) {
@@ -635,7 +647,8 @@ public class DeckRecognizer {
PaperCard pc = data.getCardFromSet(cardName, edition, collectorNumber, artIndex, isFoil);
if (pc != null)
// ok so the card has been found - let's see if there's any restriction on the set
return checkAndSetCardToken(pc, edition, cardCount, deckSecFromCardLine, currentDeckSection);
return checkAndSetCardToken(pc, edition, cardCount, deckSecFromCardLine,
currentDeckSection, true);
// UNKNOWN card as in the Counterspell|FEM case
return Token.UnknownCard(cardName, setCode, cardCount);
}
@@ -654,7 +667,8 @@ public class DeckRecognizer {
if (pc != null) {
CardEdition edition = StaticData.instance().getCardEdition(pc.getEdition());
return checkAndSetCardToken(pc, edition, cardCount, deckSecFromCardLine, currentDeckSection);
return checkAndSetCardToken(pc, edition, cardCount, deckSecFromCardLine,
currentDeckSection, false);
}
}
return unknownCardToken; // either null or unknown card
@@ -677,25 +691,26 @@ public class DeckRecognizer {
return null;
}
private Token checkAndSetCardToken(PaperCard pc, CardEdition edition, int cardCount,
String deckSecFromCardLine, DeckSection referenceSection) {
private Token checkAndSetCardToken(final PaperCard pc, final CardEdition edition, final int cardCount,
final String deckSecFromCardLine, final DeckSection referenceSection,
final boolean cardRequestHasSetCode) {
// Note: Always Check Allowed Set First to avoid accidentally importing invalid cards
// e.g. Banned Cards from not-allowed sets!
if (IsIllegalInFormat(edition.getCode()))
// Mark as illegal card
return Token.NotAllowedCard(pc, cardCount);
return Token.NotAllowedCard(pc, cardCount, cardRequestHasSetCode);
if (isNotCompliantWithReleaseDateRestrictions(edition))
return Token.CardInInvalidSet(pc, cardCount);
return Token.CardInInvalidSet(pc, cardCount, cardRequestHasSetCode);
DeckSection tokenSection = getTokenSection(deckSecFromCardLine, referenceSection, pc);
if (isBannedInFormat(pc))
return Token.LimitedCard(pc, cardCount, tokenSection, LimitedCardType.BANNED);
return Token.LimitedCard(pc, cardCount, tokenSection, LimitedCardType.BANNED, cardRequestHasSetCode);
if (isRestrictedInFormat(pc, cardCount))
return Token.LimitedCard(pc, cardCount, tokenSection, LimitedCardType.RESTRICTED);
return Token.LimitedCard(pc, cardCount, tokenSection, LimitedCardType.RESTRICTED, cardRequestHasSetCode);
return Token.LegalCard(pc, cardCount, tokenSection);
return Token.LegalCard(pc, cardCount, tokenSection, cardRequestHasSetCode);
}
// This would save tons of time in parsing Input + would also allow to return UnsupportedCardTokens beforehand

View File

@@ -1114,6 +1114,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "4x Power Sink TMP 78";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1125,6 +1126,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertFalse(cardToken.cardRequestHasNoCode());
assertEquals(tokenCard.getCollectorNumber(), "78");
lineRequest = "4x TMP Power Sink 78";
@@ -1138,6 +1140,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "4x TMP Power Sink";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1150,6 +1153,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "4x Power Sink TMP";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1162,6 +1166,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "Power Sink TMP";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1174,6 +1179,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "[TMP] Power Sink";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1186,6 +1192,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
// Relax Set Preference
assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
@@ -1200,6 +1207,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "4x Power Sink+";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1211,6 +1219,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "Power Sink+";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1222,6 +1231,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testSingleWordCardNameMatchesCorrectly(){
@@ -1236,6 +1246,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 2);
assertEquals(tokenCard.getName(), "Counterspell");
assertEquals(tokenCard.getEdition(), "ICE");
assertFalse(cardToken.cardRequestHasNoCode());
// Remove Set code
assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
@@ -1248,6 +1259,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 2);
assertEquals(tokenCard.getName(), "Counterspell");
assertEquals(tokenCard.getEdition(), "MH2");
assertTrue(cardToken.cardRequestHasNoCode());
}
@@ -1271,6 +1283,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "TMP");
assertEquals(tokenCard.getCollectorNumber(), "78");
assertFalse(cardToken.cardRequestHasNoCode());
}
/*==================================
@@ -1402,6 +1415,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getEdition(), "MIR");
assertEquals(tokenCard.getArtIndex(), 3);
assertEquals(tokenCard.getCollectorNumber(), "345");
assertFalse(cardToken.cardRequestHasNoCode());
}
@Test void testCollectorNumberIsNotConfusedAsArtIndexInstead(){
@@ -1418,6 +1432,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getEdition(), "MIR");
assertEquals(tokenCard.getArtIndex(), 1);
assertEquals(tokenCard.getCollectorNumber(), "3");
assertFalse(cardToken.cardRequestHasNoCode());
}
@Test void testCardRequestWithWrongCollectorNumberStillReturnsTheCardFromSetIfAny(){
@@ -1433,6 +1448,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(card.getName(), "Jayemdae Tome");
assertEquals(card.getEdition(), "LEB");
assertEquals(card.getCollectorNumber(), "255");
assertFalse(cardToken.cardRequestHasNoCode());
// No Match - Unknown card
requestLine = "3 Jayemdae Tome (TMP)"; // actually found in TappedOut Deck Export
@@ -1486,6 +1502,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(ancestralCard.getName(), "Ancestral Recall");
assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
assertEquals(ancestralCard.getEdition(), "2ED");
assertTrue(cardToken.cardRequestHasNoCode());
// Counterspell editions
lineRequest = "Counterspell";
@@ -1498,6 +1515,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 1);
assertEquals(counterSpellCard.getName(), "Counterspell");
assertEquals(counterSpellCard.getEdition(), "MMQ");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testInvalidCardRequestWhenReleaseDateConstraintsAreUp(){
@@ -1515,12 +1533,14 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 1);
assertEquals(counterSpellCard.getName(), "Counterspell");
assertEquals(counterSpellCard.getEdition(), "MH2");
assertFalse(cardToken.cardRequestHasNoCode());
recognizer.setDateConstraint(1999, 10);
cardToken = recognizer.recogniseCardToken(lineRequest, null);
assertNotNull(cardToken);
assertEquals(cardToken.getType(), TokenType.CARD_FROM_INVALID_SET);
assertNotNull(cardToken.getCard());
assertFalse(cardToken.cardRequestHasNoCode());
}
/*======================================
@@ -1542,6 +1562,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard tc = cardToken.getCard();
assertEquals(tc.getName(), "Counterspell");
assertEquals(tc.getEdition(), "MH2");
assertTrue(cardToken.cardRequestHasNoCode());
// Setting Original Core
recognizer.setArtPreference(CardDb.CardArtPreference.ORIGINAL_ART_ALL_EDITIONS);
@@ -1555,6 +1576,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Counterspell");
assertEquals(tc.getEdition(), "LEA");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testCardRequestVariesUponChangesInArtPreference(){
@@ -1571,6 +1593,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setArtPreference(CardDb.CardArtPreference.ORIGINAL_ART_CORE_EXPANSIONS_REPRINT_ONLY);
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1582,6 +1605,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertTrue(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "LEA");
assertTrue(cardToken.cardRequestHasNoCode());
// Check that result is persistent - and consistent with change
lineRequest = "Power Sink";
@@ -1594,6 +1618,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(tokenCard.getName(), "Power Sink");
assertFalse(tokenCard.isFoil());
assertEquals(tokenCard.getEdition(), "LEA");
assertTrue(cardToken.cardRequestHasNoCode());
}
/*==============================
@@ -1612,6 +1637,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_NOT_ALLOWED_SET);
assertNotNull(cardToken.getCard());
assertNull(cardToken.getTokenSection());
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "2x Counterspell"; // It does not exist any Counterspell in Urza's block
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1619,6 +1645,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_NOT_ALLOWED_SET);
assertNotNull(cardToken.getCard());
assertNull(cardToken.getTokenSection());
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testRequestingCardWithRestrictionsOnDeckFormat(){
@@ -1634,6 +1661,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(ancestralCard.getName(), "Ancestral Recall");
assertEquals(StaticData.instance().getCommonCards().getCardArtPreference(), CardDb.CardArtPreference.LATEST_ART_ALL_EDITIONS);
assertEquals(ancestralCard.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders);
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1643,6 +1671,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testCardRequestUnderGameConstraints(){
@@ -1668,6 +1697,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Bloodstained Mire");
assertEquals(cardToken.getCard().getEdition(), "ONS");
assertEquals(cardToken.getText(), "Bloodstained Mire [ONS] #313");
assertFalse(cardToken.cardRequestHasNoCode());
String noEditionCardRequest = "4 Bloodstained Mire";
cardToken = recognizer.recogniseCardToken(noEditionCardRequest, null);
@@ -1681,6 +1711,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Bloodstained Mire");
assertEquals(cardToken.getCard().getEdition(), "KTK");
assertEquals(cardToken.getText(), "Bloodstained Mire [KTK] #230");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testGameFormatRestrictionsAlsoWithRestrictedCardList(){
@@ -1712,6 +1743,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Ancestral Recall");
assertEquals(cardToken.getQuantity(), 1);
assertEquals(cardToken.getCard().getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
cardRequest = "4x Ancestral Recall";
cardToken = recognizer.recogniseCardToken(cardRequest, null);
@@ -1723,6 +1755,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Ancestral Recall");
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testSettingPartialConstraintsOnGameFormatsAreStillApplied(){
@@ -1746,6 +1779,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Viashino Sandstalker");
assertEquals(cardToken.getQuantity(), 1);
assertEquals(cardToken.getCard().getEdition(), "MB1");
assertTrue(cardToken.cardRequestHasNoCode());
cardRequest = "4x Viashino Sandstalker";
cardToken = recognizer.recogniseCardToken(cardRequest, null);
@@ -1757,6 +1791,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Viashino Sandstalker");
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getEdition(), "MB1");
assertTrue(cardToken.cardRequestHasNoCode());
// Requesting now what will be a Banned card later in this test
cardRequest = "Squandered Resources";
@@ -1768,6 +1803,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Squandered Resources");
assertEquals(cardToken.getQuantity(), 1);
assertEquals(cardToken.getCard().getEdition(), "VIS");
assertTrue(cardToken.cardRequestHasNoCode());
// == ALLOWED SETS ONLY
recognizer.setGameFormatConstraint(allowedSetCodes, null, null);
@@ -1781,6 +1817,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Viashino Sandstalker");
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getEdition(), "VIS");
assertTrue(cardToken.cardRequestHasNoCode());
// == BANNED CARDS ONLY
recognizer.setGameFormatConstraint(null, bannedCards, null);
@@ -1794,6 +1831,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Viashino Sandstalker");
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getEdition(), "MB1");
assertTrue(cardToken.cardRequestHasNoCode());
cardRequest = "Squandered Resources";
cardToken = recognizer.recogniseCardToken(cardRequest, null);
@@ -1806,6 +1844,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Squandered Resources");
assertEquals(cardToken.getQuantity(), 1);
assertEquals(cardToken.getCard().getEdition(), "VIS");
assertTrue(cardToken.cardRequestHasNoCode());
// ALLOWED SET CODES AND RESTRICTED
recognizer.setGameFormatConstraint(allowedSetCodes, null, restrictedCards);
@@ -1820,6 +1859,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getCard().getName(), "Viashino Sandstalker");
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getEdition(), "VIS");
assertTrue(cardToken.cardRequestHasNoCode());
}
/*======================================
@@ -1840,6 +1880,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard tc = cardToken.getCard();
assertEquals(tc.getName(), "Lightning Dragon");
assertEquals(tc.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setDateConstraint(2000, 0); // Jan 2000
// Setting Fantasy Constructed Game Format: Urza's Block Format (no promo)
@@ -1855,6 +1896,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Lightning Dragon");
assertEquals(tc.getEdition(), "USG");
assertFalse(cardToken.cardRequestHasNoCode());
// Relaxing Constraint on Set
lineRequest = "2x Lightning Dragon";
@@ -1866,6 +1908,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Lightning Dragon");
assertEquals(tc.getEdition(), "USG"); // the latest available within set requested
assertTrue(cardToken.cardRequestHasNoCode());
// Now setting a tighter date constraint
recognizer.setDateConstraint(1998, 0); // Jan 1998
@@ -1875,6 +1918,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_INVALID_SET);
assertEquals(cardToken.getQuantity(), 2);
assertNotNull(cardToken.getCard());
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "2x Lightning Dragon";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1883,6 +1927,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 2);
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getText(), "Lightning Dragon [USG] #202");
assertTrue(cardToken.cardRequestHasNoCode());
// Now relaxing date constraint but removing USG from allowed sets
// VMA release date: 2014-06-16
@@ -1895,6 +1940,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_NOT_ALLOWED_SET);
assertEquals(cardToken.getQuantity(), 2);
assertNotNull(cardToken.getCard());
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "2x Lightning Dragon";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1902,6 +1948,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_NOT_ALLOWED_SET);
assertEquals(cardToken.getQuantity(), 2);
assertNotNull(cardToken.getCard());
assertTrue(cardToken.cardRequestHasNoCode());
// Now relaxing date constraint but removing USG from allowed sets
// VMA release date: 2014-06-16
@@ -1916,6 +1963,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Lightning Dragon");
assertEquals(tc.getEdition(), "VMA");
assertTrue(cardToken.cardRequestHasNoCode());
}
@Test void testCardMatchWithDateANDdeckFormatConstraints(){
@@ -1933,6 +1981,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard tc = cardToken.getCard();
assertEquals(tc.getName(), "Flash");
assertEquals(tc.getEdition(), "A25");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setDateConstraint(2012, 0); // Jan 2012
recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders);
@@ -1946,6 +1995,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "2x Cancel";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1956,6 +2006,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Cancel");
assertEquals(tc.getEdition(), "M12"); // the latest within date constraint
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "2x Cancel|M21";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -1964,6 +2015,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 2);
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getText(), "Cancel [M21] #46");
assertFalse(cardToken.cardRequestHasNoCode());
}
@Test void testCardMatchWithGameANDdeckFormatConstraints(){
@@ -1981,6 +2033,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard tc = cardToken.getCard();
assertEquals(tc.getName(), "Flash");
assertEquals(tc.getEdition(), "A25");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setGameFormatConstraint(Arrays.asList("MIR", "VIS", "WTH"), null, null);
recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders);
@@ -1993,6 +2046,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "2x Femeref Knight";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2003,6 +2057,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Femeref Knight");
assertEquals(tc.getEdition(), "MIR");
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "2x Incinerate";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2013,6 +2068,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
tc = cardToken.getCard();
assertEquals(tc.getName(), "Incinerate");
assertEquals(tc.getEdition(), "MIR");
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "Noble Elephant";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2024,6 +2080,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "Incinerate|ICE";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2032,6 +2089,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getQuantity(), 1);
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getText(), "Incinerate [ICE] #194");
assertFalse(cardToken.cardRequestHasNoCode());
}
@Test void testCardMatchWitDateANDgameANDdeckFormatConstraints(){
@@ -2049,6 +2107,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard tc = cardToken.getCard();
assertEquals(tc.getName(), "Flash");
assertEquals(tc.getEdition(), "A25");
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setGameFormatConstraint(Arrays.asList("MIR", "VIS", "WTH"), null, null);
recognizer.setDeckFormatConstraint(DeckFormat.TinyLeaders);
@@ -2063,6 +2122,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "Ardent Militia";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2073,6 +2133,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getTokenSection(), DeckSection.Main);
assertNotNull(cardToken.getLimitedCardType());
assertEquals(cardToken.getLimitedCardType(), DeckRecognizer.LimitedCardType.BANNED);
assertTrue(cardToken.cardRequestHasNoCode());
lineRequest = "Buried Alive|UMA";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2080,6 +2141,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_NOT_ALLOWED_SET); // illegal in game format
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getText(), "Buried Alive [UMA] #88"); // within set constraints
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "Buried Alive";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2088,6 +2150,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getCard().getName(), "Buried Alive");
assertEquals(cardToken.getCard().getEdition(), "WTH"); // within set constraints
assertTrue(cardToken.cardRequestHasNoCode());
recognizer.setDateConstraint(1997, 2); // March '97 - before WTH
lineRequest = "Buried Alive";
@@ -2096,6 +2159,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(cardToken.getType(), TokenType.CARD_FROM_INVALID_SET);
assertNotNull(cardToken.getCard());
assertEquals(cardToken.getText(), "Buried Alive [WTH] #63");
assertTrue(cardToken.cardRequestHasNoCode());
}
/*==================================
@@ -2166,6 +2230,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(aspectOfHydraCard.getName(), "Aspect of Hydra");
assertEquals(aspectOfHydraCard.getEdition(), "BNG");
assertTrue(aspectOfHydraCard.isFoil());
assertFalse(cardToken.cardRequestHasNoCode());
lineRequest = "18 Forest <254> [THB] (F)";
cardToken = recognizer.recogniseCardToken(lineRequest, null);
@@ -2177,6 +2242,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(forestCard.getName(), "Forest");
assertEquals(forestCard.getEdition(), "THB");
assertTrue(forestCard.isFoil());
assertFalse(cardToken.cardRequestHasNoCode());
}
// === TappedOut Markdown Format
@@ -2258,6 +2324,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(acCard.getName(), "Amoeboid Changeling");
assertEquals(acCard.getEdition(), "LRW");
assertEquals(acCard.getCollectorNumber(), "51");
assertFalse(xmageCardToken.cardRequestHasNoCode());
}
// === Deckstats Commander
@@ -2276,6 +2343,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(soCard.getName(), "Sliver Overlord");
assertEquals(soCard.getEdition(), "SLD");
assertEquals(soCard.getCollectorNumber(), "10");
assertTrue(deckStatsToken.cardRequestHasNoCode());
// Check that deck section is made effective even if we're currently in Main
deckStatsToken = recognizer.recognizeLine(deckstatsCommanderRequest, DeckSection.Main);
@@ -2287,6 +2355,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertNotNull(deckStatsToken.getCard());
soCard = deckStatsToken.getCard();
assertEquals(soCard.getName(), "Sliver Overlord");
assertTrue(deckStatsToken.cardRequestHasNoCode());
}
// === Double-Sided Cards
@@ -2306,6 +2375,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard leftSideCard = cardToken.getCard();
assertEquals(leftSideCard.getName(), leftSideRequest);
assertEquals(cardToken.getQuantity(), 1);
assertTrue(cardToken.cardRequestHasNoCode());
// Check Right side first
cardToken = recognizer.recogniseCardToken(rightSideRequest, null);
@@ -2316,6 +2386,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard rightSideCard = cardToken.getCard();
assertEquals(rightSideCard.getName(), leftSideRequest); // NOTE: this is not a blunder! Back side will result in front side name
assertEquals(cardToken.getQuantity(), 1);
assertTrue(cardToken.cardRequestHasNoCode());
// Check double side
cardToken = recognizer.recogniseCardToken(doubleSideRequest, null);
@@ -2326,6 +2397,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
PaperCard doubleSideCard = cardToken.getCard();
assertEquals(doubleSideCard.getName(), leftSideRequest);
assertEquals(cardToken.getQuantity(), 1);
assertTrue(cardToken.cardRequestHasNoCode());
}
/*=================================
@@ -2928,6 +3000,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertNotNull(token.getCard());
assertNotNull(token.getTokenSection());
assertEquals(token.getTokenSection(), DeckSection.Sideboard);
assertTrue(token.cardRequestHasNoCode());
lineRequest = "SB:Ancestral Recall";
token = recognizer.recognizeLine(lineRequest, null);
@@ -2937,6 +3010,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertNotNull(token.getCard());
assertNotNull(token.getTokenSection());
assertEquals(token.getTokenSection(), DeckSection.Sideboard);
assertTrue(token.cardRequestHasNoCode());
lineRequest = "Ancestral Recall";
token = recognizer.recognizeLine(lineRequest, null);
@@ -2944,6 +3018,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(token.getType(), TokenType.LEGAL_CARD);
assertEquals(token.getText(), "Ancestral Recall [VMA] #1");
assertNotNull(token.getCard());
assertTrue(token.cardRequestHasNoCode());
lineRequest = "* 4 [Counterspell](http://tappedout.nethttp://tappedout.net/mtg-card/counterspell/)";
token = recognizer.recognizeLine(lineRequest, null);
@@ -2952,6 +3027,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertNotNull(token.getText());
assertNotNull(token.getCard());
assertEquals(token.getQuantity(), 4);
assertTrue(token.cardRequestHasNoCode());
lineRequest = "### Instant (14)";
token = recognizer.recognizeLine(lineRequest, null);
@@ -2993,6 +3069,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
Token cardToken = tokens.get(2);
assertTrue(cardToken.isCardToken());
assertNotNull(cardToken.getCard());
assertFalse(cardToken.cardRequestHasNoCode());
assertEquals(cardToken.getQuantity(), 4);
assertEquals(cardToken.getCard().getName(), "Incinerate");
assertEquals(cardToken.getCard().getEdition(), "ICE");