From d35fb584cdcf4e3eff471c1d72f05dfe6232ca4b Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Thu, 19 Jun 2025 19:48:25 -0700 Subject: [PATCH 01/11] Add check for card naming in rules --- .../src/test/java/mage/verify/VerifyCardDataTest.java | 7 +++++++ 1 file changed, 7 insertions(+) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index c58738dac2f..26946380755 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2404,6 +2404,13 @@ public class VerifyCardDataTest { if (rule.contains("&mdash ")) { fail(card, "rules", "card's rules contains restricted test [&mdash ] instead [—]"); } + if (rule.contains(card.getName()) && !rule.contains("named " + card.getName()) + && !rule.contains(card.getName()+" {")) { + fail(card, "rules", "card's pre-formatted rules contains its name unexpectedly"); + } + if (rule.contains("named {this}")) { + fail(card, "rules", "card's rules contains \"named {this}\", should use card's name"); + } } } From 9263a42f506970b591f3ca04ba85e63464a09978 Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Thu, 19 Jun 2025 19:48:37 -0700 Subject: [PATCH 02/11] add newline to restricted symbols --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 26946380755..22213861c8a 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2386,7 +2386,7 @@ public class VerifyCardDataTest { } } - private static final String[] wrongSymbols = {"’", "“", "”"}; + private static final String[] wrongSymbols = {"’", "“", "”", "\n"}; private void checkWrongSymbolsInRules(Card card) { for (String s : wrongSymbols) { From 6d963d60ef34ae8167e957e6a1f789a89d7383bd Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Thu, 19 Jun 2025 19:57:43 -0700 Subject: [PATCH 03/11] Use regex pattern --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 3 +-- 1 file changed, 1 insertion(+), 2 deletions(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 22213861c8a..2a95bc04b97 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2404,8 +2404,7 @@ public class VerifyCardDataTest { if (rule.contains("&mdash ")) { fail(card, "rules", "card's rules contains restricted test [&mdash ] instead [—]"); } - if (rule.contains(card.getName()) && !rule.contains("named " + card.getName()) - && !rule.contains(card.getName()+" {")) { + if (Pattern.compile("(? Date: Thu, 19 Jun 2025 20:27:45 -0700 Subject: [PATCH 04/11] Only compile regex pattern once per card. --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 2a95bc04b97..347b9949107 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2395,6 +2395,7 @@ public class VerifyCardDataTest { } } + Pattern ruleNameCheck = Pattern.compile("(? Date: Thu, 19 Jun 2025 22:37:02 -0700 Subject: [PATCH 05/11] Prevent failing for cards with the same name as a subtype --- .../src/test/java/mage/verify/VerifyCardDataTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 347b9949107..5d1b23df31f 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2396,6 +2396,7 @@ public class VerifyCardDataTest { } Pattern ruleNameCheck = Pattern.compile("(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward for (String rule : card.getRules()) { for (String s : wrongSymbols) { if (rule.contains(s)) { @@ -2405,8 +2406,8 @@ public class VerifyCardDataTest { if (rule.contains("&mdash ")) { fail(card, "rules", "card's rules contains restricted test [&mdash ] instead [—]"); } - if (ruleNameCheck.matcher(rule).find()) { - fail(card, "rules", "card's pre-formatted rules contains its name unexpectedly"); + if (ruleNameCheck.matcher(rule).find() && !overlapNames.contains(card.getName())) { + fail(card, "rules", "card's pre-formatted rules incorrectly contains its name directly, use {this} instead: "+rule); } if (rule.contains("named {this}")) { fail(card, "rules", "card's rules contains \"named {this}\", should use card's name"); From 9784ba39937c4ac321dedc4299749af8cfc8965b Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Wed, 25 Jun 2025 01:30:42 -0700 Subject: [PATCH 06/11] Ignore "name is" names and the card named Exile --- .../src/test/java/mage/verify/VerifyCardDataTest.java | 5 +++-- 1 file changed, 3 insertions(+), 2 deletions(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index db19500b232..b5dd5f7cf53 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2397,8 +2397,9 @@ public class VerifyCardDataTest { } } - Pattern ruleNameCheck = Pattern.compile("(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward + Pattern ruleNameCheck = Pattern.compile("\b(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward, etc. + overlapNames.add("Exile"); for (String rule : card.getRules()) { for (String s : wrongSymbols) { if (rule.contains(s)) { From 9ad6555fb3fe2fa0ed9dcaddb75e4d0e1ac69c1c Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Sun, 6 Jul 2025 23:57:33 -0700 Subject: [PATCH 07/11] Fix incorrect regex escape --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index b0663ff1c9e..d2492b77449 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2401,7 +2401,7 @@ public class VerifyCardDataTest { } } - Pattern ruleNameCheck = Pattern.compile("\b(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward, etc. overlapNames.add("Exile"); for (String rule : card.getRules()) { From 8c76f9eefbc1644365dbe074757f00a37145dbb0 Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Sun, 6 Jul 2025 23:58:59 -0700 Subject: [PATCH 08/11] Remove full rules text in error message --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index d2492b77449..977db46b077 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2414,7 +2414,7 @@ public class VerifyCardDataTest { fail(card, "rules", "card's rules contains restricted test [&mdash ] instead [—]"); } if (ruleNameCheck.matcher(rule).find() && !overlapNames.contains(card.getName())) { - fail(card, "rules", "card's pre-formatted rules incorrectly contains its name directly, use {this} instead: "+rule); + fail(card, "rules", "card's pre-formatted rules incorrectly contains its name directly, use {this} instead"); } if (rule.contains("named {this}")) { fail(card, "rules", "card's rules contains \"named {this}\", should use card's name"); From 3a2b4349707fd6658a7b39fa2f02e18364dee698 Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Mon, 7 Jul 2025 00:11:18 -0700 Subject: [PATCH 09/11] Add additional name exceptions --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index 977db46b077..bc8ad6f7e01 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2403,7 +2403,7 @@ public class VerifyCardDataTest { Pattern ruleNameCheck = Pattern.compile("\\b(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward, etc. - overlapNames.add("Exile"); + overlapNames.addAll(Arrays.asList("Exile", "Kher Keep", "Kookus")); for (String rule : card.getRules()) { for (String s : wrongSymbols) { if (rule.contains(s)) { From 46f9e0d1bfce301882604650dcfba02a13a68c4f Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Tue, 8 Jul 2025 02:51:02 -0700 Subject: [PATCH 10/11] Add full set of ignored cards for new name check --- Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java | 3 ++- 1 file changed, 2 insertions(+), 1 deletion(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index bc8ad6f7e01..a35bdd83822 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2403,7 +2403,8 @@ public class VerifyCardDataTest { Pattern ruleNameCheck = Pattern.compile("\\b(? overlapNames = Arrays.stream(SubType.class.getEnumConstants()).map(SubType::toString).collect(Collectors.toSet()); // Assembly-Worker, Coward, etc. - overlapNames.addAll(Arrays.asList("Exile", "Kher Keep", "Kookus")); + // TODO: Tibalt, Cosmic Impostor's emblem should refer to the source permanent, even if it has a different name + overlapNames.addAll(Arrays.asList("Exile", "Kher Keep", "Kookus", "Regenerate", "Shield of Kaldra", "Stangg", "Tibalt, Cosmic Impostor")); for (String rule : card.getRules()) { for (String s : wrongSymbols) { if (rule.contains(s)) { From 6cd4269e1111c99e7ad63272f5a13ebd43666fe0 Mon Sep 17 00:00:00 2001 From: Steven Knipe Date: Tue, 8 Jul 2025 03:11:18 -0700 Subject: [PATCH 11/11] Improve fail information, add "name is {this}" check --- .../src/test/java/mage/verify/VerifyCardDataTest.java | 6 +++--- 1 file changed, 3 insertions(+), 3 deletions(-) diff --git a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java index a35bdd83822..77e47f28371 100644 --- a/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java +++ b/Mage.Verify/src/test/java/mage/verify/VerifyCardDataTest.java @@ -2415,10 +2415,10 @@ public class VerifyCardDataTest { fail(card, "rules", "card's rules contains restricted test [&mdash ] instead [—]"); } if (ruleNameCheck.matcher(rule).find() && !overlapNames.contains(card.getName())) { - fail(card, "rules", "card's pre-formatted rules incorrectly contains its name directly, use {this} instead"); + fail(card, "rules", "card's pre-formatted rules incorrectly contains its name directly, probably use {this} instead or add to overlapNames exceptions list"); } - if (rule.contains("named {this}")) { - fail(card, "rules", "card's rules contains \"named {this}\", should use card's name"); + if (rule.contains("named {this}") || rule.contains("name is {this}")) { + fail(card, "rules", "card's rules contains \"named {this}\" or \"name is {this}\", should use card's name directly"); } } }