From 574ea01e084c9a49232a0773b4ead9ef7184abd7 Mon Sep 17 00:00:00 2001 From: lilyhuang-github <112970249+lilyhuang-github@users.noreply.github.com> Date: Sun, 20 Apr 2025 00:08:00 -0400 Subject: [PATCH] update handling of keywords: AND, OR, NOT in card search (#5788) * update hnadling of keywords: AND, OR, NOT in card search * added and * update test * update test * update OR to not be [oO][rR] and just look for OR * keyword testing * adjusted new test * implement test case for cards with keyword in name * implement test case to cards with keyword in name * format * update test case * change test cas * update truth test case * changed test card search from real cards to fake and added cards * Update tests/carddatabase/data/cards.xml Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com> * Update tests/carddatabase/filter_string_test.cpp Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com> * Update tests/carddatabase/filter_string_test.cpp Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com> * update formatting * update cardatabase_test to include +2 cards * update test case +1 set + 1 type --------- Co-authored-by: RickyRister <42636155+RickyRister@users.noreply.github.com> --- cockatrice/src/game/filters/filter_string.cpp | 6 ++--- tests/carddatabase/carddatabase_test.cpp | 6 ++--- tests/carddatabase/data/cards.xml | 26 +++++++++++++++++++ tests/carddatabase/filter_string_test.cpp | 15 ++++++++--- 4 files changed, 43 insertions(+), 10 deletions(-) diff --git a/cockatrice/src/game/filters/filter_string.cpp b/cockatrice/src/game/filters/filter_string.cpp index 7edfb0d41..01a7b6be9 100644 --- a/cockatrice/src/game/filters/filter_string.cpp +++ b/cockatrice/src/game/filters/filter_string.cpp @@ -10,15 +10,15 @@ peg::parser search(R"( Start <- QueryPartList ~ws <- [ ]+ -QueryPartList <- ComplexQueryPart ( ws ("and" ws)? ComplexQueryPart)* ws* +QueryPartList <- ComplexQueryPart ( ws ("AND" ws)? ComplexQueryPart)* ws* -ComplexQueryPart <- SomewhatComplexQueryPart ws $or<[oO][rR]> ws ComplexQueryPart / SomewhatComplexQueryPart +ComplexQueryPart <- SomewhatComplexQueryPart ws "OR" ws ComplexQueryPart / SomewhatComplexQueryPart SomewhatComplexQueryPart <- [(] QueryPartList [)] / QueryPart QueryPart <- NotQuery / SetQuery / RarityQuery / CMCQuery / FormatQuery / PowerQuery / ToughnessQuery / ColorQuery / TypeQuery / OracleQuery / FieldQuery / GenericQuery -NotQuery <- ('not' ws/'-') SomewhatComplexQueryPart +NotQuery <- ('NOT' ws/'-') SomewhatComplexQueryPart SetQuery <- ('e'/'set') [:] FlexStringValue OracleQuery <- 'o' [:] RegexString diff --git a/tests/carddatabase/carddatabase_test.cpp b/tests/carddatabase/carddatabase_test.cpp index 752143f67..4818cd22e 100644 --- a/tests/carddatabase/carddatabase_test.cpp +++ b/tests/carddatabase/carddatabase_test.cpp @@ -18,9 +18,9 @@ TEST(CardDatabaseTest, LoadXml) // load dummy cards and test result db->loadCardDatabases(); - ASSERT_EQ(6, db->getCardList().size()) << "Wrong card count after load"; - ASSERT_EQ(3, db->getSetList().size()) << "Wrong sets count after load"; - ASSERT_EQ(2, db->getAllMainCardTypes().size()) << "Wrong types count after load"; + ASSERT_EQ(8, db->getCardList().size()) << "Wrong card count after load"; + ASSERT_EQ(4, 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"; // ensure the card database is empty after clear() diff --git a/tests/carddatabase/data/cards.xml b/tests/carddatabase/data/cards.xml index 24ede9dff..e687689ec 100644 --- a/tests/carddatabase/data/cards.xml +++ b/tests/carddatabase/data/cards.xml @@ -31,5 +31,31 @@ 4/4 + + Not Dead + Not a Card + 0 + Dead! + + 333 + B + B + 1 + Instant + + + + Truth + Not a Card + 0 + Truth! + + 444 + U + 2U + 2 + Instant + + diff --git a/tests/carddatabase/filter_string_test.cpp b/tests/carddatabase/filter_string_test.cpp index 4fa139514..b29660159 100644 --- a/tests/carddatabase/filter_string_test.cpp +++ b/tests/carddatabase/filter_string_test.cpp @@ -19,11 +19,14 @@ protected: void SetUp() override { cat = CardDatabaseManager::getInstance()->getCardBySimpleName("Cat"); + notDeadAfterAll = CardDatabaseManager::getInstance()->getCardBySimpleName("Not Dead"); + truth = CardDatabaseManager::getInstance()->getCardBySimpleName("Truth"); } - // void TearDown() override {} CardData cat; + CardData notDeadAfterAll; + CardData truth; }; QUERY(Empty, cat, "", true) @@ -31,14 +34,18 @@ QUERY(Typing, cat, "t", true) QUERY(NonMatchingType, cat, "t:kithkin", false) QUERY(MatchingType, cat, "t:creature", true) -QUERY(Not1, cat, "not t:kithkin", true) -QUERY(Not2, cat, "not t:creature", false) +QUERY(Not1, cat, "NOT t:kithkin", true) +QUERY(Not2, cat, "NOT t:creature", false) +QUERY(NonKeyword1, cat, "not t:kithkin", false) +QUERY(NonKeyword2, cat, "t:bat or t:creature", false) +QUERY(NonKeyword3, notDeadAfterAll, "not dead", true) +QUERY(NonKeyword4, truth, "truth or trail", false) QUERY(Case, cat, "t:cReAtUrE", true) QUERY(And, cat, "t:creature t:creature", true) QUERY(And2, cat, "t:creature t:sorcery", false) -QUERY(Or, cat, "t:bat or t:creature", true) +QUERY(Or, cat, "t:bat OR t:creature", true) QUERY(Cmc1, cat, "cmc=2", true) QUERY(Cmc2, cat, "cmc>3", false)