diff --git a/forge-core/src/main/java/forge/deck/DeckRecognizer.java b/forge-core/src/main/java/forge/deck/DeckRecognizer.java index 6fcfb1358a7..da77de7718b 100644 --- a/forge-core/src/main/java/forge/deck/DeckRecognizer.java +++ b/forge-core/src/main/java/forge/deck/DeckRecognizer.java @@ -410,12 +410,12 @@ public class DeckRecognizer { 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 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); 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 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); public static final Pattern SET_CARD_COLLNO_PATTERN = Pattern.compile(REX_FULL_REQUEST_SET_CARD); // 5. (MTGGoldfish mostly) (Amount?, Card Name, , Set) @@ -439,7 +439,7 @@ public class DeckRecognizer { "side", "sideboard", "sb", "main", "card", "mainboard", "avatar", "commander", "schemes", - "conspiracy", "planes", "deck", }; + "conspiracy", "planes", "deck", "dungeon"}; private static CharSequence[] allCardTypes(){ List cardTypesList = new ArrayList<>(); 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 bbe484c8aee..16ba63ea262 100644 --- a/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java +++ b/forge-gui-desktop/src/test/java/forge/deck/DeckRecognizerTest.java @@ -225,8 +225,8 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase { } @Test void testMatchDeckSectionNames(){ - String[] dckSections = new String[] {"Main", "main", "Mainboard", - "Sideboard", "Side", "Schemes", "Avatar", "avatar", "Commander", "Conspiracy", "card", "Planes"}; + String[] dckSections = new String[] {"Main", "main", "Mainboard", "Sideboard", "Side", "Schemes", "Avatar", + "avatar", "Commander", "Conspiracy", "card", "Planes", "Dungeon"}; for (String section : dckSections) assertTrue(DeckRecognizer.isDeckSectionName(section), "Unrecognised Deck Section: " + section); @@ -240,7 +240,7 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase { for (String entry: deckSectionEntriesFoundInMDExportFromTappedOut) assertTrue(DeckRecognizer.isDeckSectionName(entry), "Fail on "+entry); - String[] deckSectionEntriesFoundInDCKFormat = new String[] {"[Main]", "[Sideboard]"}; + String[] deckSectionEntriesFoundInDCKFormat = new String[] {"[Main]", "[Sideboard]", "[Dungeon]"}; for (String entry: deckSectionEntriesFoundInDCKFormat) 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_SET), "TMP"); 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(){ @@ -997,6 +1013,14 @@ public class DeckRecognizerTest extends ForgeCardMockTestCase { assertEquals(matcher.group(DeckRecognizer.REGRP_CARD), "Power Sink"); assertEquals(matcher.group(DeckRecognizer.REGRP_SET), "TMP"); 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(){