diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index da77de7718b..8c24233f1e9 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -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 diff --git a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java index 16ba63ea262..1fcb09dbc03 100644 --- a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java +++ b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java @@ -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");