Recognise new Dungeon DeckSection Placeholder, and improved support to .dec files

.Dec files have collector nr//art-index as separated by a Pipe.
RegExps with collector numbers have been extended to further support decks in this format (with simply copy & paste the listing).
Tests updated/added to verify the new regexp & behaviour.
This commit is contained in:
leriomaggio
2021-10-23 21:45:04 +02:00
parent ed19bf0a22
commit 9f97b34a3a
2 changed files with 30 additions and 6 deletions

View File

@@ -410,12 +410,12 @@ public class DeckRecognizer {
public static final Pattern SET_CARD_PATTERN = Pattern.compile(REX_SET_CARD_REQUEST); public static final Pattern SET_CARD_PATTERN = Pattern.compile(REX_SET_CARD_REQUEST);
// 3. Full-Request (Amount?, CardName, Set, Collector Number|Art Index) - MTGArena Format // 3. Full-Request (Amount?, CardName, Set, Collector Number|Art Index) - MTGArena Format
public static final String REX_FULL_REQUEST_CARD_SET = String.format( public static final String REX_FULL_REQUEST_CARD_SET = String.format(
"(%s\\s*:\\s*)?(%s\\s)?\\s*%s\\s*(\\||\\(|\\[|\\{|\\s)%s(\\s|\\)|\\]|\\})?\\s+%s\\s*%s\\s*", "(%s\\s*:\\s*)?(%s\\s)?\\s*%s\\s*(\\||\\(|\\[|\\{|\\s)%s(\\s|\\)|\\]|\\})?(\\s+|\\|\\s*)%s\\s*%s\\s*",
REX_DECKSEC_XMAGE, REX_CARD_COUNT, REX_CARD_NAME, REX_SET_CODE, REX_COLL_NUMBER, REX_FOIL_MTGGOLDFISH); REX_DECKSEC_XMAGE, REX_CARD_COUNT, REX_CARD_NAME, REX_SET_CODE, REX_COLL_NUMBER, REX_FOIL_MTGGOLDFISH);
public static final Pattern CARD_SET_COLLNO_PATTERN = Pattern.compile(REX_FULL_REQUEST_CARD_SET); public static final Pattern CARD_SET_COLLNO_PATTERN = Pattern.compile(REX_FULL_REQUEST_CARD_SET);
// 4. Full-Request (Amount?, Set, CardName, Collector Number|Art Index) - Alternative for flexibility // 4. Full-Request (Amount?, Set, CardName, Collector Number|Art Index) - Alternative for flexibility
public static final String REX_FULL_REQUEST_SET_CARD = String.format( public static final String REX_FULL_REQUEST_SET_CARD = String.format(
"^(%s\\s*:\\s*)?(%s\\s)?\\s*(\\(|\\[|\\{)?%s(\\s+|\\)|\\]|\\}|\\|)\\s*%s\\s+%s\\s*%s$", "^(%s\\s*:\\s*)?(%s\\s)?\\s*(\\(|\\[|\\{)?%s(\\s+|\\)|\\]|\\}|\\|)\\s*%s(\\s+|\\|\\s*)%s\\s*%s$",
REX_DECKSEC_XMAGE, REX_CARD_COUNT, REX_SET_CODE, REX_CARD_NAME, REX_COLL_NUMBER, REX_FOIL_MTGGOLDFISH); REX_DECKSEC_XMAGE, REX_CARD_COUNT, REX_SET_CODE, REX_CARD_NAME, REX_COLL_NUMBER, REX_FOIL_MTGGOLDFISH);
public static final Pattern SET_CARD_COLLNO_PATTERN = Pattern.compile(REX_FULL_REQUEST_SET_CARD); public static final Pattern SET_CARD_COLLNO_PATTERN = Pattern.compile(REX_FULL_REQUEST_SET_CARD);
// 5. (MTGGoldfish mostly) (Amount?, Card Name, <Collector Number>, Set) // 5. (MTGGoldfish mostly) (Amount?, Card Name, <Collector Number>, Set)
@@ -439,7 +439,7 @@ public class DeckRecognizer {
"side", "sideboard", "sb", "side", "sideboard", "sb",
"main", "card", "mainboard", "main", "card", "mainboard",
"avatar", "commander", "schemes", "avatar", "commander", "schemes",
"conspiracy", "planes", "deck", }; "conspiracy", "planes", "deck", "dungeon"};
private static CharSequence[] allCardTypes(){ private static CharSequence[] allCardTypes(){
List<String> cardTypesList = new ArrayList<>(); List<String> cardTypesList = new ArrayList<>();

View File

@@ -225,8 +225,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
} }
@Test void testMatchDeckSectionNames(){ @Test void testMatchDeckSectionNames(){
String[] dckSections = new String[] {"Main", "main", "Mainboard", String[] dckSections = new String[] {"Main", "main", "Mainboard", "Sideboard", "Side", "Schemes", "Avatar",
"Sideboard", "Side", "Schemes", "Avatar", "avatar", "Commander", "Conspiracy", "card", "Planes"}; "avatar", "Commander", "Conspiracy", "card", "Planes", "Dungeon"};
for (String section : dckSections) for (String section : dckSections)
assertTrue(DeckRecognizer.isDeckSectionName(section), "Unrecognised Deck Section: " + section); assertTrue(DeckRecognizer.isDeckSectionName(section), "Unrecognised Deck Section: " + section);
@@ -240,7 +240,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
for (String entry: deckSectionEntriesFoundInMDExportFromTappedOut) for (String entry: deckSectionEntriesFoundInMDExportFromTappedOut)
assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry); assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry);
String[] deckSectionEntriesFoundInDCKFormat = new String[] {"[Main]", "[Sideboard]"}; String[] deckSectionEntriesFoundInDCKFormat = new String[] {"[Main]", "[Sideboard]", "[Dungeon]"};
for (String entry: deckSectionEntriesFoundInDCKFormat) for (String entry: deckSectionEntriesFoundInDCKFormat)
assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry); assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry);
} }
@@ -906,6 +906,22 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink "); // TRIM assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink "); // TRIM
assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP"); assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP");
assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78"); assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78");
validRequest = "Power Sink (TMP)|78"; // Pipe to separate collector number (as in .Dec files)
matcher = DeckRecognizer.CARD_SET_COLLNO_PATTERN.matcher(validRequest);
assertTrue(matcher.matches());
assertNull(matcher.group(DeckRecognizer.REGRP_CARDNO));
assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink "); // TRIM
assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP");
assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78");
validRequest = "Power Sink|TMP|78"; // .Dec file export entry format
matcher = DeckRecognizer.CARD_SET_COLLNO_PATTERN.matcher(validRequest);
assertTrue(matcher.matches());
assertNull(matcher.group(DeckRecognizer.REGRP_CARDNO));
assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink"); // TRIM
assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP");
assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78");
} }
@Test void testInvalidMatchFullCardSetRequest(){ @Test void testInvalidMatchFullCardSetRequest(){
@@ -997,6 +1013,14 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase {
assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink"); assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink");
assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP"); assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP");
assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78"); assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78");
validRequest = "(TMP} Power Sink|78"; // Pipe to separate collector number as in .Dec format
matcher = DeckRecognizer.SET_CARD_COLLNO_PATTERN.matcher(validRequest);
assertTrue(matcher.matches());
assertNull(matcher.group(DeckRecognizer.REGRP_CARDNO));
assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink");
assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP");
assertEquals(matcher.group(DeckRecognizer.REGRP_COLLNR), "78");
} }
@Test void testInvalidMatchFullSetCardRequest(){ @Test void testInvalidMatchFullSetCardRequest(){