diff --git a/libcockatrice_filters/libcockatrice/filters/filter_string.cpp b/libcockatrice_filters/libcockatrice/filters/filter_string.cpp index 26415ef38..03ba99a80 100644 --- a/libcockatrice_filters/libcockatrice/filters/filter_string.cpp +++ b/libcockatrice_filters/libcockatrice/filters/filter_string.cpp @@ -20,7 +20,8 @@ SomewhatComplexQueryPart <- [(] QueryPartList [)] / QueryPart QueryPart <- NotQuery / SetQuery / RarityQuery / CMCQuery / FormatQuery / PowerQuery / ToughnessQuery / ColorQuery / TypeQuery / OracleQuery / FieldQuery / GenericQuery NotQuery <- ('NOT' ws/'-') SomewhatComplexQueryPart -SetQuery <- ('e'/'set') ([=:] FlexStringValue) / ('e'/'set') (<[!][=]?> FlexStringValue) / ('e'/'set') SetExpression +SetQuery <- ('e'/'set') SetQueryValue +SetQueryValue <- ([=:] FlexStringValue) / (<[!][=]?> FlexStringValue) / SetExpression OracleQuery <- 'o' [:] MatcherString @@ -103,7 +104,7 @@ static void setupParserRules() const auto matcher = std::any_cast(sv[0]); return [=](const CardData &x) -> bool { return matcher(x->getCardType()); }; }; - search["SetQuery"] = [](const peg::SemanticValues &sv) -> Filter { + search["SetQueryValue"] = [](const peg::SemanticValues &sv) -> Filter { if (sv.choice() == 0) { auto matcher = std::any_cast(sv[0]); return [=](const CardData &x) -> bool { diff --git a/tests/carddatabase/filter_string_test.cpp b/tests/carddatabase/filter_string_test.cpp index 56f33825c..94c59e120 100644 --- a/tests/carddatabase/filter_string_test.cpp +++ b/tests/carddatabase/filter_string_test.cpp @@ -3,6 +3,7 @@ #include "gtest/gtest.h" #include +#include #include #include #include @@ -95,9 +96,18 @@ protected: CardSet::PriorityPrimary); commanderSet = CardSet::newInstance(&controller, "EOC", "Edge of Eternities Commander", "commander", sharedReleaseDate, CardSet::PrioritySecondary); + oldSet = CardSet::newInstance(&controller, "OLD", "Older Set", "expansion", QDate(2020, 1, 1), + CardSet::PriorityPrimary); inBothSets = newCardWithPrintings({{"EOE", mainSet}, {"EOC", commanderSet}}); onlyInCommanderSet = newCardWithPrintings({{"EOC", commanderSet}}); + onlyInOldSet = newCardWithPrintings({{"OLD", oldSet}}); + + // SetExpression resolves set codes to release dates through the global set list. + auto *database = CardDatabaseManager::getInstance(); + database->addSet(mainSet); + database->addSet(commanderSet); + database->addSet(oldSet); } CardInfoPtr newCardWithPrintings(const QList> &printings) @@ -112,8 +122,10 @@ protected: NoopCardSetPriorityController controller; CardSetPtr mainSet; CardSetPtr commanderSet; + CardSetPtr oldSet; CardInfoPtr inBothSets; CardInfoPtr onlyInCommanderSet; + CardInfoPtr onlyInOldSet; }; TEST_F(SetQuery, ExactMatchSeparatesSameDaySets) @@ -138,6 +150,15 @@ TEST_F(SetQuery, NotEqualsMatchesPrintingsOutsideTheSet) EXPECT_TRUE(FilterString("set!EOE").check(onlyInCommanderSet)); } +TEST_F(SetQuery, ComparisonMatchesByReleaseDate) +{ + // OLD (2020) predates EOE/EOC (2026-03-13), so comparison operators still use release dates. + EXPECT_TRUE(FilterString("setEOE").check(onlyInOldSet)); + EXPECT_TRUE(FilterString("set>=EOE").check(inBothSets)); + EXPECT_FALSE(FilterString("set