Fix multi-word type matching in card filters (#6060)

* Fix multi-word type matching in card filters

Add phrase matching to StringValue before word-based fallback.
Enables searches like t:"time lord" for multi-word creature types.

* Use existing typedef

* Don't inline lambda

* update filter func

* Update card type FilterString unit tests

* refactor string matcher

* update card db test

* fix sets count in test

* Add regex cache in string matcher

* Update cockatrice/src/game/filters/filter_string.cpp

* Revert "Add regex cache in string matcher"

---------

Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com>
This commit is contained in:
Paul Carroll 2025-08-24 12:37:25 -04:00 committed by GitHub
parent ba794c2b60
commit 5e88a0f0cc
No known key found for this signature in database
GPG key ID: B5690EEEBB952194
4 changed files with 36 additions and 6 deletions

View file

@ -18,8 +18,8 @@ TEST(CardDatabaseTest, LoadXml)
// load dummy cards and test result
db->loadCardDatabases();
ASSERT_EQ(8, db->getCardList().size()) << "Wrong card count after load";
ASSERT_EQ(4, db->getSetList().size()) << "Wrong sets count after load";
ASSERT_EQ(9, db->getCardList().size()) << "Wrong card count after load";
ASSERT_EQ(5, db->getSetList().size()) << "Wrong sets count after load";
ASSERT_EQ(3, db->getAllMainCardTypes().size()) << "Wrong types count after load";
ASSERT_EQ(Ok, db->getLoadStatus()) << "Wrong status after load";

View file

@ -11,7 +11,7 @@
<colors>G</colors>
<manacost>2G</manacost>
<cmc>2</cmc>
<type>Creature</type>
<type>Creature — Cat</type>
<maintype>Creature</maintype>
<pt>3/3</pt>
</prop>
@ -26,7 +26,22 @@
<colors>R</colors>
<manacost>2RR</manacost>
<cmc>4</cmc>
<type>Creature</type>
<type>Creature — Dog</type>
<maintype>Creature</maintype>
<pt>4/4</pt>
</prop>
</card>
<card>
<name>Doctor</name>
<set>WHO</set>
<tablerow>0</tablerow>
<text>Why did wizards introduce two-word creature types</text>
<prop>
<muid>222</muid>
<colors>R</colors>
<manacost>2RR</manacost>
<cmc>4</cmc>
<type>Creature — Human Time Lord Doctor</type>
<maintype>Creature</maintype>
<pt>4/4</pt>
</prop>

View file

@ -21,12 +21,14 @@ protected:
cat = CardDatabaseManager::getInstance()->getCardBySimpleName("Cat");
notDeadAfterAll = CardDatabaseManager::getInstance()->getCardBySimpleName("Not Dead");
truth = CardDatabaseManager::getInstance()->getCardBySimpleName("Truth");
doctor = CardDatabaseManager::getInstance()->getCardBySimpleName("Doctor");
}
// void TearDown() override {}
CardData cat;
CardData notDeadAfterAll;
CardData truth;
CardData doctor;
};
QUERY(Empty, cat, "", true)
@ -34,6 +36,9 @@ QUERY(Typing, cat, "t", true)
QUERY(NonMatchingType, cat, "t:kithkin", false)
QUERY(MatchingType, cat, "t:creature", true)
QUERY(MatchingCreatureType, cat, "t:cat", true)
QUERY(PartialMatchingType, cat, "t:ca", false)
QUERY(MatchingMultiWordType, doctor, "t:\"Time Lord\"", true)
QUERY(Not1, cat, "NOT t:kithkin", true)
QUERY(Not2, cat, "NOT t:creature", false)
QUERY(NonKeyword1, cat, "not t:kithkin", false)