From a615387696a63288da9a186970cc9c777434da3a Mon Sep 17 00:00:00 2001 From: "Timmer, Daan" Date: Sun, 23 Aug 2026 21:11:47 +0000 Subject: [PATCH 1/4] feat: use cucumber/tag-expressions --- cmake/dependencies.cpm.cmake | 35 +-- cucumber_cpp/library/Application.cpp | 6 +- cucumber_cpp/library/CMakeLists.txt | 4 +- cucumber_cpp/library/support/CMakeLists.txt | 2 +- cucumber_cpp/library/support/HookRegistry.cpp | 4 +- cucumber_cpp/library/support/HookRegistry.hpp | 5 +- cucumber_cpp/library/support/Types.hpp | 6 +- .../library/tag_expression/CMakeLists.txt | 25 --- cucumber_cpp/library/tag_expression/Error.cpp | 0 cucumber_cpp/library/tag_expression/Error.hpp | 14 -- cucumber_cpp/library/tag_expression/Model.cpp | 113 ---------- cucumber_cpp/library/tag_expression/Model.hpp | 78 ------- .../library/tag_expression/Parser.cpp | 203 ------------------ .../library/tag_expression/Parser.hpp | 13 -- cucumber_cpp/library/tag_expression/Token.cpp | 20 -- cucumber_cpp/library/tag_expression/Token.hpp | 73 ------- .../tag_expression/test/CMakeLists.txt | 27 --- .../tag_expression/test/TestErrors.cpp | 76 ------- .../tag_expression/test/TestEvaluations.cpp | 99 --------- .../tag_expression/test/TestParsing.cpp | 85 -------- .../library/tag_expression/test/TestToken.cpp | 31 --- 21 files changed, 36 insertions(+), 883 deletions(-) delete mode 100644 cucumber_cpp/library/tag_expression/CMakeLists.txt delete mode 100644 cucumber_cpp/library/tag_expression/Error.cpp delete mode 100644 cucumber_cpp/library/tag_expression/Error.hpp delete mode 100644 cucumber_cpp/library/tag_expression/Model.cpp delete mode 100644 cucumber_cpp/library/tag_expression/Model.hpp delete mode 100644 cucumber_cpp/library/tag_expression/Parser.cpp delete mode 100644 cucumber_cpp/library/tag_expression/Parser.hpp delete mode 100644 cucumber_cpp/library/tag_expression/Token.cpp delete mode 100644 cucumber_cpp/library/tag_expression/Token.hpp delete mode 100644 cucumber_cpp/library/tag_expression/test/CMakeLists.txt delete mode 100644 cucumber_cpp/library/tag_expression/test/TestErrors.cpp delete mode 100644 cucumber_cpp/library/tag_expression/test/TestEvaluations.cpp delete mode 100644 cucumber_cpp/library/tag_expression/test/TestParsing.cpp delete mode 100644 cucumber_cpp/library/tag_expression/test/TestToken.cpp diff --git a/cmake/dependencies.cpm.cmake b/cmake/dependencies.cpm.cmake index 62e8c827..e96095fc 100644 --- a/cmake/dependencies.cpm.cmake +++ b/cmake/dependencies.cpm.cmake @@ -5,30 +5,32 @@ macro(ccr_dependency PREFIX TAG DIGEST) endmacro() # renovate: datasource=github-tags packageName=cpm-cmake/CPM.cmake versioning=semver -ccr_dependency(CPM_DOWNLOAD v0.43.1 456cb6754daaa010d57444d0c8ce6d95ecf006ab) +ccr_dependency(CPM_DOWNLOAD v0.43.1 456cb6754daaa010d57444d0c8ce6d95ecf006ab) set(CPM_DOWNLOAD_SHA256 "1c40fc102ce9625d7de7eb14f541cab30cc3138dca627f0b0ec40293ce6c2934") # renovate: datasource=github-tags packageName=nlohmann/json versioning=semver -ccr_dependency(NLOHMANN_JSON v3.12.0 55f93686c01528224f448c19128836e7df245f72) +ccr_dependency(NLOHMANN_JSON v3.12.0 55f93686c01528224f448c19128836e7df245f72) # renovate: datasource=github-tags packageName=cucumber/messages versioning=semver -ccr_dependency(CUCUMBER_MESSAGES v34.0.0 8cd6cacecd0a657095c93b069c850f51009e0499) +ccr_dependency(CUCUMBER_MESSAGES v34.0.0 8cd6cacecd0a657095c93b069c850f51009e0499) # renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver -ccr_dependency(CUCUMBER_GHERKIN v42.0.0 85b41deb147e18421fe1023a0c496558caccaaa9) +ccr_dependency(CUCUMBER_GHERKIN v42.0.0 85b41deb147e18421fe1023a0c496558caccaaa9) # renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver -ccr_dependency(CUCUMBER_QUERY v1.0.0 2d432352bb6d82c4092ce8b33f280149b1f7fcea) +ccr_dependency(CUCUMBER_QUERY v1.0.0 2d432352bb6d82c4092ce8b33f280149b1f7fcea) +# renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver +ccr_dependency(CUCUMBER_TAG_EXPRESSIONS v1.0.0 2d2e9ac1d84a2e05154fa982a276a04e3d1b3650) # renovate: datasource=github-tags packageName=google/googletest versioning=semver -ccr_dependency(GOOGLE_TEST v1.17.0 52eb8108c5bdec04579160ae17225d66034bd723) +ccr_dependency(GOOGLE_TEST v1.17.0 52eb8108c5bdec04579160ae17225d66034bd723) # renovate: datasource=github-tags packageName=CLIUtils/CLI11 versioning=semver -ccr_dependency(CLI11 v2.6.2 37bb6edc5317e99af72ef48405e65d9ca5218861) +ccr_dependency(CLI11 v2.6.2 37bb6edc5317e99af72ef48405e65d9ca5218861) # renovate: datasource=github-tags packageName=fmtlib/fmt versioning=semver -ccr_dependency(LIBFMT v12.1.0 407c905e45ad75fc29bf0f9bb7c5c2fd3475976f) +ccr_dependency(LIBFMT v12.1.0 407c905e45ad75fc29bf0f9bb7c5c2fd3475976f) # renovate: datasource=github-tags packageName=zeux/pugixml versioning=semver -ccr_dependency(PUGIXML v1.15 ee86beb30e4973f5feffe3ce63bfa4fbadf72f38) +ccr_dependency(PUGIXML v1.15 ee86beb30e4973f5feffe3ce63bfa4fbadf72f38) # renovate: datasource=github-tags packageName=abseil/abseil-cpp -ccr_dependency(ABSEIL_CPP 20250814.2 0cf0a5c9d12cc3783363ab20f11613e69fd04c9a) +ccr_dependency(ABSEIL_CPP 20250814.2 0cf0a5c9d12cc3783363ab20f11613e69fd04c9a) # renovate: datasource=github-tags packageName=google/re2 -ccr_dependency(RE2 2025-08-12 0f6c07eae69151e606acb3d9232750c3442dff23) +ccr_dependency(RE2 2025-08-12 0f6c07eae69151e606acb3d9232750c3442dff23) # renovate: datasource=github-tags packageName=jbeder/yaml-cpp versioning=semver -ccr_dependency(YAML_CPP v0.9.0 56e3bb550c91fd7005566f19c079cb7a503223cf) +ccr_dependency(YAML_CPP v0.9.0 56e3bb550c91fd7005566f19c079cb7a503223cf) if(CCR_FETCH_DEPS) if(NOT COMMAND CPMAddPackage) @@ -100,6 +102,15 @@ if(CCR_FETCH_DEPS) SOURCE_SUBDIR cpp ) + # --------------------------------------------------------------------------- + # cucumber_tag_expressions + # --------------------------------------------------------------------------- + CPMAddPackage( + URI "gh:cucumber/tag-expressions#${CUCUMBER_TAG_EXPRESSIONS_DIGEST}" + NAME cucumber_tag_expressions + SOURCE_SUBDIR cpp + ) + # --------------------------------------------------------------------------- # GoogleTest # --------------------------------------------------------------------------- diff --git a/cucumber_cpp/library/Application.cpp b/cucumber_cpp/library/Application.cpp index 08ff4d86..c5d591f9 100644 --- a/cucumber_cpp/library/Application.cpp +++ b/cucumber_cpp/library/Application.cpp @@ -6,6 +6,7 @@ #include "CLI/Validators.hpp" #include "CLI/impl/App_inl.hpp" #include "cucumber/gherkin/Demangle.hpp" +#include "cucumber/tag-expressions/Parser.hpp" #include "cucumber_cpp/library/Context.hpp" #include "cucumber_cpp/library/Errors.hpp" #include "cucumber_cpp/library/api/Formatters.hpp" @@ -15,7 +16,6 @@ #include "cucumber_cpp/library/plugin/DynamicLibraryManager.hpp" #include "cucumber_cpp/library/support/DefinitionRegistration.hpp" #include "cucumber_cpp/library/support/Types.hpp" -#include "cucumber_cpp/library/tag_expression/Parser.hpp" #include "cucumber_cpp/library/util/Duration.hpp" #include "cucumber_cpp/library/util/Timestamp.hpp" #include "fmt/base.h" @@ -247,7 +247,7 @@ namespace cucumber_cpp::library const auto runOptions = support::RunOptions{ .sources = { .paths = GetFeatureFiles(options), - .tagExpression = tag_expression::Parse(fmt::to_string(fmt::join(options.tags, " "))), + .tagExpression = cucumber::tag_expressions::Parse(fmt::to_string(fmt::join(options.tags, " "))), .ordering = options.ordering, }, .runtime = { @@ -256,7 +256,7 @@ namespace cucumber_cpp::library .failGlobalHookFast = options.failGlobalHookFast, .retry = options.retry, .strict = options.strict, - .retryTagExpression = tag_expression::Parse(fmt::to_string(fmt::join(options.retryTagFilter, " "))), + .retryTagExpression = cucumber::tag_expressions::Parse(fmt::to_string(fmt::join(options.retryTagFilter, " "))), .featureHooks = options.featureHooks, }, }; diff --git a/cucumber_cpp/library/CMakeLists.txt b/cucumber_cpp/library/CMakeLists.txt index 699da1f0..c2a90122 100644 --- a/cucumber_cpp/library/CMakeLists.txt +++ b/cucumber_cpp/library/CMakeLists.txt @@ -22,7 +22,7 @@ target_link_libraries(cucumber_cpp.library PUBLIC cucumber_cpp.library.api cucumber_cpp.library.engine cucumber_cpp.library.plugin - cucumber_cpp.library.tag_expression + cucumber::tag_expressions cucumber_cpp.library.util cucumber_cpp.library.formatter cucumber_cpp.library.support @@ -45,7 +45,7 @@ add_subdirectory(formatter) add_subdirectory(plugin) add_subdirectory(runtime) add_subdirectory(support) -add_subdirectory(tag_expression) +# add_subdirectory(tag_expression) add_subdirectory(util) if (CCR_BUILD_TESTS) diff --git a/cucumber_cpp/library/support/CMakeLists.txt b/cucumber_cpp/library/support/CMakeLists.txt index 22e4318c..df8c9be6 100644 --- a/cucumber_cpp/library/support/CMakeLists.txt +++ b/cucumber_cpp/library/support/CMakeLists.txt @@ -28,7 +28,7 @@ target_link_libraries(cucumber_cpp.library.support PUBLIC GTest::gtest GTest::gmock cucumber_cpp.library.cucumber_expression - cucumber_cpp.library.tag_expression + cucumber::tag_expressions cucumber_cpp.library.util fmt::fmt ) diff --git a/cucumber_cpp/library/support/HookRegistry.cpp b/cucumber_cpp/library/support/HookRegistry.cpp index 2c17d3ea..1d20677f 100644 --- a/cucumber_cpp/library/support/HookRegistry.cpp +++ b/cucumber_cpp/library/support/HookRegistry.cpp @@ -1,9 +1,9 @@ #include "cucumber_cpp/library/support/HookRegistry.hpp" #include "cucumber/gherkin/IdGenerator.hpp" +#include "cucumber/tag-expressions/Parser.hpp" #include "cucumber_cpp/library/support/DefinitionRegistration.hpp" #include "cucumber_cpp/library/support/SupportCodeLibrary.hpp" -#include "cucumber_cpp/library/tag_expression/Parser.hpp" #include "cucumber_cpp/library/util/HookData.hpp" #include "cucumber_cpp/library/util/HookFactory.hpp" #include @@ -47,7 +47,7 @@ namespace cucumber_cpp::library::support .name = name, .sourceLocation = sourceLocation, } - , tagExpression{ tag_expression::Parse(expression.value_or("")) } + , tagExpression{ cucumber::tag_expressions::Parse(expression.value_or("")) } , factory{ factory } {} diff --git a/cucumber_cpp/library/support/HookRegistry.hpp b/cucumber_cpp/library/support/HookRegistry.hpp index 1856e158..0a6935f7 100644 --- a/cucumber_cpp/library/support/HookRegistry.hpp +++ b/cucumber_cpp/library/support/HookRegistry.hpp @@ -2,10 +2,10 @@ #define CUCUMBER_CPP_HOOKREGISTRY_HPP #include "cucumber/gherkin/IdGenerator.hpp" -#include "cucumber_cpp/library/tag_expression/Model.hpp" #include "cucumber_cpp/library/util/HookData.hpp" #include "cucumber_cpp/library/util/HookFactory.hpp" #include +#include #include #include #include @@ -18,7 +18,6 @@ namespace cucumber_cpp::library::support { - struct HookMatch { explicit HookMatch(util::HookFactory factory) @@ -36,7 +35,7 @@ namespace cucumber_cpp::library::support util::HookData data; - std::unique_ptr tagExpression; + std::unique_ptr tagExpression; util::HookFactory factory; }; diff --git a/cucumber_cpp/library/support/Types.hpp b/cucumber_cpp/library/support/Types.hpp index ce90c93b..9d4d29c9 100644 --- a/cucumber_cpp/library/support/Types.hpp +++ b/cucumber_cpp/library/support/Types.hpp @@ -4,8 +4,8 @@ #include "cucumber/messages/GherkinDocument.hpp" #include "cucumber/messages/Location.hpp" #include "cucumber/messages/Pickle.hpp" -#include "cucumber_cpp/library/tag_expression/Model.hpp" #include +#include #include #include #include @@ -26,7 +26,7 @@ namespace cucumber_cpp::library::support struct Sources { std::set> paths{}; - std::unique_ptr tagExpression; + std::unique_ptr tagExpression; Ordering ordering{ Ordering::defined }; } sources; @@ -38,7 +38,7 @@ namespace cucumber_cpp::library::support bool failGlobalHookFast{ false }; std::size_t retry{ 0 }; bool strict{ true }; - std::unique_ptr retryTagExpression{}; + std::unique_ptr retryTagExpression{}; bool featureHooks{ false }; } runtime; diff --git a/cucumber_cpp/library/tag_expression/CMakeLists.txt b/cucumber_cpp/library/tag_expression/CMakeLists.txt deleted file mode 100644 index 3848b4ed..00000000 --- a/cucumber_cpp/library/tag_expression/CMakeLists.txt +++ /dev/null @@ -1,25 +0,0 @@ -add_library(cucumber_cpp.library.tag_expression ${CCR_EXCLUDE_FROM_ALL}) - -target_sources(cucumber_cpp.library.tag_expression PRIVATE - Model.cpp - Model.hpp - Error.cpp - Error.hpp - Parser.cpp - Parser.hpp - Token.cpp - Token.hpp -) - -target_include_directories(cucumber_cpp.library.tag_expression PUBLIC - ../../.. -) - -target_link_libraries(cucumber_cpp.library.tag_expression PUBLIC - cucumber_gherkin_lib - fmt::fmt -) - -if (CCR_BUILD_TESTS) - add_subdirectory(test) -endif() diff --git a/cucumber_cpp/library/tag_expression/Error.cpp b/cucumber_cpp/library/tag_expression/Error.cpp deleted file mode 100644 index e69de29b..00000000 diff --git a/cucumber_cpp/library/tag_expression/Error.hpp b/cucumber_cpp/library/tag_expression/Error.hpp deleted file mode 100644 index 0501cd1f..00000000 --- a/cucumber_cpp/library/tag_expression/Error.hpp +++ /dev/null @@ -1,14 +0,0 @@ -#ifndef TAG_EXPRESSION_ERROR_HPP -#define TAG_EXPRESSION_ERROR_HPP - -#include - -namespace cucumber_cpp::library::tag_expression -{ - struct Error : std::runtime_error - { - using std::runtime_error::runtime_error; - }; -} - -#endif diff --git a/cucumber_cpp/library/tag_expression/Model.cpp b/cucumber_cpp/library/tag_expression/Model.cpp deleted file mode 100644 index 8eadc6a6..00000000 --- a/cucumber_cpp/library/tag_expression/Model.cpp +++ /dev/null @@ -1,113 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Model.hpp" -#include "fmt/format.h" -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - bool TrueExpression::Evaluate(const std::set>& /*tags*/) const - { - return true; - } - - TrueExpression::operator std::string() const - { - return "true"; - } - - LiteralExpression::LiteralExpression(std::string name) - : name{ std::move(name) } - {} - - bool LiteralExpression::Evaluate(const std::set>& tags) const - { - return tags.contains(name); - } - - LiteralExpression::operator std::string() const - { - auto replaceAll = [](std::string& str, std::string_view from, std::string_view to) - { - if (from.empty()) - return; - std::size_t start_pos = 0; - while ((start_pos = str.find(from, start_pos)) != std::string::npos) - { - str.replace(start_pos, from.length(), to); - start_pos += to.length(); - } - }; - - auto copy = name; - - replaceAll(copy, "\\", R"(\\)"); - replaceAll(copy, "(", R"(\()"); - replaceAll(copy, ")", R"(\))"); - - copy = std::regex_replace(copy, std::regex(R"((\s))"), R"(\$&)"); - - return copy; - } - - AndExpression::AndExpression(std::unique_ptr left, std::unique_ptr right) - : left{ std::move(left) } - , right{ std::move(right) } - {} - - bool AndExpression::Evaluate(const std::set>& tags) const - { - return left->Evaluate(tags) && right->Evaluate(tags); - } - - AndExpression::operator std::string() const - { - if (!left || !right) - return ""; - - return fmt::format(R"(( {} and {} ))", static_cast(*left), static_cast(*right)); - } - - OrExpression::OrExpression(std::unique_ptr left, std::unique_ptr right) - : left{ std::move(left) } - , right{ std::move(right) } - {} - - bool OrExpression::Evaluate(const std::set>& tags) const - { - return left->Evaluate(tags) || right->Evaluate(tags); - } - - OrExpression::operator std::string() const - { - if (!left || !right) - return ""; - - return fmt::format(R"(( {} or {} ))", static_cast(*left), static_cast(*right)); - } - - NotExpression::NotExpression(std::unique_ptr operand) - : operand{ std::move(operand) } - {} - - bool NotExpression::Evaluate(const std::set>& tags) const - { - return !operand->Evaluate(tags); - } - - NotExpression::operator std::string() const - { - if (!operand) - return ""; - - if (const auto& ref = *operand; typeid(ref) == typeid(AndExpression) || typeid(ref) == typeid(OrExpression)) - return fmt::format(R"(not {})", static_cast(*operand)); - - return fmt::format(R"(not ( {} ))", static_cast(*operand)); - } -} diff --git a/cucumber_cpp/library/tag_expression/Model.hpp b/cucumber_cpp/library/tag_expression/Model.hpp deleted file mode 100644 index 5ed91974..00000000 --- a/cucumber_cpp/library/tag_expression/Model.hpp +++ /dev/null @@ -1,78 +0,0 @@ -#ifndef TAG_EXPRESSION_MODEL_HPP -#define TAG_EXPRESSION_MODEL_HPP - -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - struct Expression - { - virtual ~Expression() = default; - - [[nodiscard]] virtual bool Evaluate(const std::set>& tags) const = 0; - - virtual explicit operator std::string() const = 0; - }; - - struct TrueExpression : Expression - { - [[nodiscard]] bool Evaluate(const std::set>& tags) const override; - - explicit operator std::string() const override; - }; - - struct LiteralExpression : Expression - { - explicit LiteralExpression(std::string name); - - [[nodiscard]] bool Evaluate(const std::set>& tags) const override; - - explicit operator std::string() const override; - - private: - std::string name; - }; - - struct AndExpression : Expression - { - AndExpression(std::unique_ptr left, std::unique_ptr right); - - [[nodiscard]] bool Evaluate(const std::set>& tags) const override; - - explicit operator std::string() const override; - - private: - std::unique_ptr left; - std::unique_ptr right; - }; - - struct OrExpression : Expression - { - OrExpression(std::unique_ptr left, std::unique_ptr right); - - [[nodiscard]] bool Evaluate(const std::set>& tags) const override; - - explicit operator std::string() const override; - - private: - std::unique_ptr left; - std::unique_ptr right; - }; - - struct NotExpression : Expression - { - explicit NotExpression(std::unique_ptr operand); - - [[nodiscard]] bool Evaluate(const std::set>& tags) const override; - - explicit operator std::string() const override; - - private: - std::unique_ptr operand; - }; -} - -#endif diff --git a/cucumber_cpp/library/tag_expression/Parser.cpp b/cucumber_cpp/library/tag_expression/Parser.cpp deleted file mode 100644 index 7f78b3e0..00000000 --- a/cucumber_cpp/library/tag_expression/Parser.cpp +++ /dev/null @@ -1,203 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Parser.hpp" -#include "cucumber_cpp/library/tag_expression/Error.hpp" -#include "cucumber_cpp/library/tag_expression/Model.hpp" -#include "cucumber_cpp/library/tag_expression/Token.hpp" -#include "fmt/format.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - namespace - { - void EnsureExpectedTokenType(TokenType tokenType, TokenType expected, std::string_view lastPart) - { - if (tokenType != expected) - throw Error(fmt::format(R"(Syntax error. Expected {} after {})", TokenTypeMap().at(expected), lastPart)); - } - - void RequireArgCount(const Token& token, std::deque>& expressions, std::size_t number) - { - if (expressions.size() < number) - { - - std::string expressionsStr{ "" }; - for (const auto& expr : expressions) - { - if (!expressionsStr.empty()) - expressionsStr += ", "; - expressionsStr += static_cast(*expr); - } - - throw Error(fmt::format(R"({}: Too few operands (expressions={{{}}}))", token.keyword, expressionsStr)); - } - } - - template - void PushBinary(const Token& token, std::deque>& expressions) - { - RequireArgCount(token, expressions, 2); - - auto term2 = std::move(expressions.back()); - expressions.pop_back(); - auto term1 = std::move(expressions.back()); - expressions.pop_back(); - - expressions.push_back(std::make_unique(std::move(term1), std::move(term2))); - } - - template - void PushUnary(const Token& token, std::deque>& expressions) - { - RequireArgCount(token, expressions, 1); - - auto term = std::move(expressions.back()); - expressions.pop_back(); - - expressions.push_back(std::make_unique(std::move(term))); - } - - void PushExpression(const Token& token, std::deque>& expressions) - { - if (token == OR) - PushBinary(token, expressions); - else if (token == AND) - PushBinary(token, expressions); - else if (token == NOT) - PushUnary(token, expressions); - else - throw Error(fmt::format("Unexpected token: {}", token.keyword)); - } - - std::vector Tokenize(std::string_view expression) - { - std::vector tokens{}; - auto escaped = false; - std::string token = {}; - - for (char ch : expression) - { - if (escaped) - { - if ((ch != '(' && ch != ')' && ch != '\\') && !std::isspace(ch, std::locale())) - throw Error(fmt::format(R"(Tag expression "{}" could not be parsed because of syntax error: Illegal escape before "{}".)", expression, ch)); - token += ch; - escaped = false; - } - else if (ch == '\\') - escaped = true; - else if (ch == '(' || ch == ')' || std::isspace(ch, std::locale())) - { - if (!token.empty()) - { - tokens.push_back(std::move(token)); - token.clear(); - } - if (ch != ' ') - tokens.push_back(std::string{ ch }); - } - else - token += ch; - } - - if (!token.empty()) - tokens.push_back(std::move(token)); - - return tokens; - } - - const Token* SelectToken(std::string_view expression) - { - if (!TokenMap().contains(expression)) - return nullptr; - - return &TokenMap().at(expression); - } - } - - std::unique_ptr Parse(std::string_view expression) - { - auto tokens = Tokenize(expression); - - if (tokens.empty()) - return std::make_unique(); - - std::stack operations; - std::deque> expressions; - std::string lastPart = "BEGIN"; - auto expectedTokenType = TokenType::operand; - - for (auto index = 0; index < tokens.size(); ++index) - { - const auto& part = tokens[index]; - - if (const auto* token = SelectToken(part); token == nullptr) - { - EnsureExpectedTokenType(TokenType::operand, expectedTokenType, lastPart); - expressions.push_back(std::make_unique(part)); - expectedTokenType = TokenType::operator_; - } - else if (*token == NOT || *token == OPEN_PARENTHESIS) - { - EnsureExpectedTokenType(TokenType::operand, expectedTokenType, lastPart); - operations.push(*token); - expectedTokenType = TokenType::operand; - } - else if (token->IsOperation()) - { - EnsureExpectedTokenType(TokenType::operator_, expectedTokenType, lastPart); - while (!operations.empty() && operations.top().IsOperation() && token->HasLowerPrecedenceThan(operations.top())) - { - auto lastOperation = operations.top(); - operations.pop(); - PushExpression(lastOperation, expressions); - } - operations.push(*token); - expectedTokenType = TokenType::operand; - } - else if (*token == CLOSE_PARENTHESIS) - { - EnsureExpectedTokenType(TokenType::operator_, expectedTokenType, lastPart); - while (!operations.empty() && operations.top() != OPEN_PARENTHESIS) - { - auto lastOperation = operations.top(); - operations.pop(); - PushExpression(lastOperation, expressions); - } - - if (operations.empty()) - throw Error(fmt::format("Missing '(': Too few open-parens in: {}", expression)); - - else if (operations.top() == OPEN_PARENTHESIS) - { - operations.pop(); - expectedTokenType = TokenType::operator_; - } - } - - lastPart = part; - } - - while (!operations.empty()) - { - auto lastOperation = operations.top(); - operations.pop(); - - if (lastOperation == OPEN_PARENTHESIS) - throw Error(fmt::format("Unclosed '(': Too many open-parens in: {}", expression)); - - PushExpression(lastOperation, expressions); - } - - return std::move(expressions.back()); - } - -} diff --git a/cucumber_cpp/library/tag_expression/Parser.hpp b/cucumber_cpp/library/tag_expression/Parser.hpp deleted file mode 100644 index bc31018c..00000000 --- a/cucumber_cpp/library/tag_expression/Parser.hpp +++ /dev/null @@ -1,13 +0,0 @@ -#ifndef TAG_EXPRESSION_PARSER_HPP -#define TAG_EXPRESSION_PARSER_HPP - -#include "cucumber_cpp/library/tag_expression/Model.hpp" -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - std::unique_ptr Parse(std::string_view expression); -} - -#endif diff --git a/cucumber_cpp/library/tag_expression/Token.cpp b/cucumber_cpp/library/tag_expression/Token.cpp deleted file mode 100644 index 837488f4..00000000 --- a/cucumber_cpp/library/tag_expression/Token.cpp +++ /dev/null @@ -1,20 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Token.hpp" - -namespace cucumber_cpp::library::tag_expression -{ - bool Token::IsOperation() const - { - return type == TokenType::operator_; - } - - bool Token::IsUnary() const - { - return *this == NOT; - } - - bool Token::HasLowerPrecedenceThan(const Token& other) const - { - return ((associative.value_or(Associative::right) == Associative::left) && precedence <= other.precedence) || // - ((associative.value_or(Associative::left) == Associative::right) && precedence < other.precedence); - } -} diff --git a/cucumber_cpp/library/tag_expression/Token.hpp b/cucumber_cpp/library/tag_expression/Token.hpp deleted file mode 100644 index a45e22a6..00000000 --- a/cucumber_cpp/library/tag_expression/Token.hpp +++ /dev/null @@ -1,73 +0,0 @@ -#ifndef TAG_EXPRESSION_TOKEN_HPP -#define TAG_EXPRESSION_TOKEN_HPP - -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - enum struct Associative - { - left, - right - }; - - enum struct TokenType - { - operand, - operator_ - }; - - inline const std::map& TokenTypeMap() - { - static std::map map{ - { TokenType::operand, "operand" }, - { TokenType::operator_, "operator" }, - }; - return map; - }; - - struct Token - { - constexpr Token(std::string_view keyword, std::int32_t precedence, std::optional associative, TokenType type = TokenType::operand) - : keyword{ keyword } - , precedence{ precedence } - , associative{ associative } - , type{ type } - {} - - bool IsOperation() const; - bool IsUnary() const; - - bool HasLowerPrecedenceThan(const Token& other) const; - - bool operator==(const Token& other) const = default; - - std::string_view keyword; - std::int32_t precedence; - std::optional associative; - TokenType type; - }; - - static constexpr Token OR{ "or", 0, Associative::left, TokenType::operator_ }; - static constexpr Token AND{ "and", 1, Associative::left, TokenType::operator_ }; - static constexpr Token NOT{ "not", 2, Associative::right, TokenType::operator_ }; - static constexpr Token OPEN_PARENTHESIS{ "(", -2, std::nullopt }; - static constexpr Token CLOSE_PARENTHESIS{ ")", -1, std::nullopt }; - - inline const std::map& TokenMap() - { - static std::map map{ - { OR.keyword, OR }, - { AND.keyword, AND }, - { NOT.keyword, NOT }, - { OPEN_PARENTHESIS.keyword, OPEN_PARENTHESIS }, - { CLOSE_PARENTHESIS.keyword, CLOSE_PARENTHESIS } - }; - return map; - }; -} - -#endif diff --git a/cucumber_cpp/library/tag_expression/test/CMakeLists.txt b/cucumber_cpp/library/tag_expression/test/CMakeLists.txt deleted file mode 100644 index 5a96a299..00000000 --- a/cucumber_cpp/library/tag_expression/test/CMakeLists.txt +++ /dev/null @@ -1,27 +0,0 @@ -add_executable(cucumber_cpp.library.tag_expression.test) -add_test(NAME cucumber_cpp.library.tag_expression.test COMMAND cucumber_cpp.library.tag_expression.test) - -target_link_libraries(cucumber_cpp.library.tag_expression.test PUBLIC - cucumber_cpp.library.tag_expression - fmt::fmt - GTest::gmock - GTest::gmock_main - yaml-cpp::yaml-cpp -) - -target_sources(cucumber_cpp.library.tag_expression.test PRIVATE - TestErrors.cpp - TestEvaluations.cpp - TestParsing.cpp - TestToken.cpp -) - -add_custom_command( - TARGET cucumber_cpp.library.tag_expression.test POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/testdata $/testdata -) - -add_custom_command( - TARGET cucumber_cpp.library.tag_expression.test POST_BUILD - COMMAND ${CMAKE_COMMAND} -E copy_directory ${CMAKE_SOURCE_DIR}/testdata $/../testdata -) diff --git a/cucumber_cpp/library/tag_expression/test/TestErrors.cpp b/cucumber_cpp/library/tag_expression/test/TestErrors.cpp deleted file mode 100644 index 261ce2c8..00000000 --- a/cucumber_cpp/library/tag_expression/test/TestErrors.cpp +++ /dev/null @@ -1,76 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Error.hpp" -#include "cucumber_cpp/library/tag_expression/Parser.hpp" -#include "gmock/gmock.h" -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - struct TestErrors : testing::Test - { - void ExpectError(std::string_view expression, std::string_view error) - { - ASSERT_THROW(try { Parse(expression); } catch (const Error& ex) { - std::cout << "expected: " << error << "\n"; - std::cout << "actual : " << ex.what() << "\n"; - EXPECT_THAT(ex.what(), testing::HasSubstr(error)); - throw; }, Error); - } - }; - - TEST_F(TestErrors, ParseFailsWithUnbalancedParens) - { - ExpectError("( a and b ))", "Missing '(': Too few open-parens"); - ExpectError("( ( a and b )", "Unclosed '(': Too many open-parens"); - } - - TEST_F(TestErrors, ParseFailsWithMissingOperationArgs) - { - ExpectError("a not ( and )", "Syntax error. Expected operator after a"); - } - - TEST_F(TestErrors, ParseFailsWithOnlyOperations) - { - ExpectError("or or", "Syntax error. Expected operand after BEGIN"); - } - - TEST_F(TestErrors, ParseFailsForArgsWithoutOperation) - { - ExpectError("a b", "Syntax error. Expected operator after a"); - } - - TEST_F(TestErrors, ParseFailsForEmptyParensGroups) - { - ExpectError("(())", "Syntax error. Expected operand after ("); - ExpectError("(() ())", "Syntax error. Expected operand after ("); - } - - TEST_F(TestErrors, ParseFailsWithRpnNotation) - { - ExpectError("a b or", "Syntax error. Expected operator after a"); - ExpectError("a and (b not)", "Syntax error. Expected operator after b"); - ExpectError("a and (b c) or", "Syntax error. Expected operator after b"); - } - - TEST_F(TestErrors, ParseFailsAndOperationWithTooFewArgs) - { - ExpectError("a and ", "and: Too few operands"); - ExpectError(" and b", "Syntax error. Expected operand after BEGIN"); - } - - TEST_F(TestErrors, ParseFailsOrOperationWithTooFewArgs) - { - ExpectError("a or ", "or: Too few operands"); - ExpectError(" or b", "Syntax error. Expected operand after BEGIN"); - ExpectError("a and b or ", "or: Too few operands"); - } - - TEST_F(TestErrors, ParseFailsNotOperationWithTooFewArgs) - { - ExpectError("not ", "not: Too few operands"); - ExpectError("not ()", "Syntax error. Expected operand after ("); - ExpectError("not () and b", "Syntax error. Expected operand after ("); - ExpectError("not () or b", "Syntax error. Expected operand after ("); - } - -} diff --git a/cucumber_cpp/library/tag_expression/test/TestEvaluations.cpp b/cucumber_cpp/library/tag_expression/test/TestEvaluations.cpp deleted file mode 100644 index 65dab7f5..00000000 --- a/cucumber_cpp/library/tag_expression/test/TestEvaluations.cpp +++ /dev/null @@ -1,99 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Parser.hpp" -#include "fmt/format.h" -#include "yaml-cpp/node/emit.h" -#include "yaml-cpp/node/node.h" -#include "yaml-cpp/node/parse.h" -#include "yaml-cpp/yaml.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - struct TestEvaluationsFixture : testing::Test - { - }; - - struct TestEvaluations : TestEvaluationsFixture - { - TestEvaluations(std::string_view expression, YAML::Node variables, bool result) - : expression{ expression } - , variables{ variables } - , result{ result } - {} - - void TestBody() override - { - const auto tagExpression = Parse(expression); - ASSERT_THAT(tagExpression, testing::NotNull()); - - std::set> tags; - for (const auto& var : variables) - tags.insert(var.as()); - - EXPECT_THAT(tagExpression->Evaluate(tags), testing::Eq(result)); - } - - private: - std::string expression; - YAML::Node variables; - bool result; - }; - - namespace - { - std::vector> GetTestData(const std::filesystem::path& path) - { - std::vector> testdata; - - if (std::filesystem::is_regular_file(path) && (path.extension() == ".yml" || path.extension() == ".yaml")) - testdata.emplace_back(path.string(), YAML::LoadFile(path.string())); - else - for (const auto& file : std::filesystem::directory_iterator(path)) - if (file.is_regular_file() && (file.path().extension() == ".yml" || file.path().extension() == ".yaml")) - testdata.emplace_back(file.path().string(), YAML::LoadFile(file.path().string())); - - return testdata; - } - - std::vector RegisterMyTests() - { - std::vector tests; - std::filesystem::path testdataPath = "testdata/tag-expression/evaluations.yml"; - - std::size_t lineNumber = 4; - - for (const auto& [file, testdata] : GetTestData(testdataPath)) - { - for (const auto& node : testdata) - { - for (const auto& test : node["tests"]) - { - auto factory = [node = node, test = test]() -> TestEvaluationsFixture* - { - return new TestEvaluations(node["expression"].as(), test["variables"], test["result"].as()); - }; - - auto* testInfo = testing::RegisterTest("TestEvaluations", fmt::format("Test_{}_{}", tests.size(), lineNumber).c_str(), nullptr, nullptr, testdataPath.string().c_str(), lineNumber, factory); - - tests.push_back(testInfo); - - lineNumber += 2; - } - - lineNumber += 2; - } - } - - return tests; - } - } - - auto testEvaluations = RegisterMyTests(); -} diff --git a/cucumber_cpp/library/tag_expression/test/TestParsing.cpp b/cucumber_cpp/library/tag_expression/test/TestParsing.cpp deleted file mode 100644 index 0567a910..00000000 --- a/cucumber_cpp/library/tag_expression/test/TestParsing.cpp +++ /dev/null @@ -1,85 +0,0 @@ -#include "cucumber_cpp/library/tag_expression/Parser.hpp" -#include "fmt/format.h" -#include "yaml-cpp/node/emit.h" -#include "yaml-cpp/node/node.h" -#include "yaml-cpp/node/parse.h" -#include "yaml-cpp/yaml.h" -#include -#include -#include -#include -#include -#include -#include -#include -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - struct TestParsingFixture : testing::Test - { - TestParsingFixture(std::string_view expression, std::string_view formatted) - : expression{ expression } - , formatted{ formatted } - {} - - void TestBody() override - { - const auto tagExpression = Parse(expression); - - ASSERT_THAT(tagExpression, testing::NotNull()); - const auto actualText = static_cast(*tagExpression); - EXPECT_THAT(actualText, testing::StrEq(formatted)); - } - - std::string expression; - std::string formatted; - }; - - namespace - { - std::vector> GetTestData(const std::filesystem::path& path) - { - std::vector> testdata; - - if (std::filesystem::is_regular_file(path) && (path.extension() == ".yml" || path.extension() == ".yaml")) - testdata.emplace_back(path.string(), YAML::LoadFile(path.string())); - else - for (const auto& file : std::filesystem::directory_iterator(path)) - if (file.is_regular_file() && (file.path().extension() == ".yml" || file.path().extension() == ".yaml")) - testdata.emplace_back(file.path().string(), YAML::LoadFile(file.path().string())); - - return testdata; - } - - std::vector RegisterMyTests() - { - std::vector tests; - std::filesystem::path testdataPath = "testdata/tag-expression/parsing.yml"; - - std::size_t lineNumber = 2; - - for (const auto& [file, testdata] : GetTestData(testdataPath)) - { - for (const auto& node : testdata) - { - auto factory = [node = node]() -> TestParsingFixture* - { - return new TestParsingFixture(node["expression"].as(), node["formatted"].as()); - }; - - auto* testInfo = testing::RegisterTest("TestParsing", fmt::format("Test_{}_{}", tests.size(), lineNumber).c_str(), nullptr, nullptr, testdataPath.string().c_str(), lineNumber, factory); - - tests.push_back(testInfo); - - lineNumber += 2; - } - } - - return tests; - } - } - - auto TestParsing = RegisterMyTests(); -} diff --git a/cucumber_cpp/library/tag_expression/test/TestToken.cpp b/cucumber_cpp/library/tag_expression/test/TestToken.cpp deleted file mode 100644 index f186c227..00000000 --- a/cucumber_cpp/library/tag_expression/test/TestToken.cpp +++ /dev/null @@ -1,31 +0,0 @@ - -#include "cucumber_cpp/library/tag_expression/Token.hpp" -#include "gmock/gmock.h" -#include -#include - -namespace cucumber_cpp::library::tag_expression -{ - TEST(TestToken, TestPrecedence) - { - EXPECT_THAT(OR.HasLowerPrecedenceThan(OR), testing::IsTrue()); - EXPECT_THAT(OR.HasLowerPrecedenceThan(AND), testing::IsTrue()); - EXPECT_THAT(OR.HasLowerPrecedenceThan(NOT), testing::IsTrue()); - EXPECT_THAT(AND.HasLowerPrecedenceThan(AND), testing::IsTrue()); - EXPECT_THAT(AND.HasLowerPrecedenceThan(OR), testing::IsFalse()); - EXPECT_THAT(AND.HasLowerPrecedenceThan(NOT), testing::IsTrue()); - EXPECT_THAT(NOT.HasLowerPrecedenceThan(NOT), testing::IsFalse()); - EXPECT_THAT(NOT.HasLowerPrecedenceThan(OR), testing::IsFalse()); - EXPECT_THAT(NOT.HasLowerPrecedenceThan(AND), testing::IsFalse()); - } - - TEST(TestToken, TestPrecedenceWithParenthesis) - { - EXPECT_THAT(OR.HasLowerPrecedenceThan(OPEN_PARENTHESIS), testing::IsFalse()); - EXPECT_THAT(OR.HasLowerPrecedenceThan(CLOSE_PARENTHESIS), testing::IsFalse()); - EXPECT_THAT(AND.HasLowerPrecedenceThan(OPEN_PARENTHESIS), testing::IsFalse()); - EXPECT_THAT(AND.HasLowerPrecedenceThan(CLOSE_PARENTHESIS), testing::IsFalse()); - EXPECT_THAT(NOT.HasLowerPrecedenceThan(OPEN_PARENTHESIS), testing::IsFalse()); - EXPECT_THAT(NOT.HasLowerPrecedenceThan(CLOSE_PARENTHESIS), testing::IsFalse()); - } -} From dddf400fa4fb7ab158d2137f7b1cdfea0fa59e9b Mon Sep 17 00:00:00 2001 From: "Timmer, Daan" Date: Sun, 23 Aug 2026 21:14:26 +0000 Subject: [PATCH 2/4] correct includes --- cucumber_cpp/library/support/HookRegistry.hpp | 2 +- cucumber_cpp/library/support/Types.hpp | 2 +- 2 files changed, 2 insertions(+), 2 deletions(-) diff --git a/cucumber_cpp/library/support/HookRegistry.hpp b/cucumber_cpp/library/support/HookRegistry.hpp index 0a6935f7..72c03778 100644 --- a/cucumber_cpp/library/support/HookRegistry.hpp +++ b/cucumber_cpp/library/support/HookRegistry.hpp @@ -2,10 +2,10 @@ #define CUCUMBER_CPP_HOOKREGISTRY_HPP #include "cucumber/gherkin/IdGenerator.hpp" +#include "cucumber/tag-expressions/Model.hpp" #include "cucumber_cpp/library/util/HookData.hpp" #include "cucumber_cpp/library/util/HookFactory.hpp" #include -#include #include #include #include diff --git a/cucumber_cpp/library/support/Types.hpp b/cucumber_cpp/library/support/Types.hpp index 9d4d29c9..b40a0b19 100644 --- a/cucumber_cpp/library/support/Types.hpp +++ b/cucumber_cpp/library/support/Types.hpp @@ -4,8 +4,8 @@ #include "cucumber/messages/GherkinDocument.hpp" #include "cucumber/messages/Location.hpp" #include "cucumber/messages/Pickle.hpp" +#include "cucumber/tag-expressions/Model.hpp" #include -#include #include #include #include From 5c4b70f45043a5e1734924595b66cec7b0bf0927 Mon Sep 17 00:00:00 2001 From: "Timmer, Daan" Date: Mon, 24 Aug 2026 09:12:54 +0000 Subject: [PATCH 3/4] set correct renovate settings, add version to query and tag-expressiosn and add both to find_package --- cmake/dependencies.cpm.cmake | 16 +++++++++------- 1 file changed, 9 insertions(+), 7 deletions(-) diff --git a/cmake/dependencies.cpm.cmake b/cmake/dependencies.cpm.cmake index e96095fc..52d3f693 100644 --- a/cmake/dependencies.cpm.cmake +++ b/cmake/dependencies.cpm.cmake @@ -13,10 +13,10 @@ ccr_dependency(NLOHMANN_JSON v3.12.0 55f93686c01528224f448c1912883 ccr_dependency(CUCUMBER_MESSAGES v34.0.0 8cd6cacecd0a657095c93b069c850f51009e0499) # renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver ccr_dependency(CUCUMBER_GHERKIN v42.0.0 85b41deb147e18421fe1023a0c496558caccaaa9) -# renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver -ccr_dependency(CUCUMBER_QUERY v1.0.0 2d432352bb6d82c4092ce8b33f280149b1f7fcea) -# renovate: datasource=github-tags packageName=cucumber/gherkin versioning=semver -ccr_dependency(CUCUMBER_TAG_EXPRESSIONS v1.0.0 2d2e9ac1d84a2e05154fa982a276a04e3d1b3650) +# renovate: datasource=github-tags packageName=cucumber/query versioning=semver +ccr_dependency(CUCUMBER_QUERY v1.0.0 2d432352bb6d82c4092ce8b33f280149b1f7fcea) +# renovate: datasource=github-tags packageName=cucumber/tag-expressions versioning=semver +ccr_dependency(CUCUMBER_TAG_EXPRESSIONS v1.0.0 2d2e9ac1d84a2e05154fa982a276a04e3d1b3650) # renovate: datasource=github-tags packageName=google/googletest versioning=semver ccr_dependency(GOOGLE_TEST v1.17.0 52eb8108c5bdec04579160ae17225d66034bd723) # renovate: datasource=github-tags packageName=CLIUtils/CLI11 versioning=semver @@ -88,7 +88,7 @@ if(CCR_FETCH_DEPS) # cucumber_gherkin # --------------------------------------------------------------------------- CPMAddPackage( - URI "gh:cucumber/gherkin#${CUCUMBER_GHERKIN_DIGEST}" + URI "gh:cucumber/gherkin@${CUCUMBER_GHERKIN_VERSION}#${CUCUMBER_GHERKIN_DIGEST}" NAME cucumber_gherkin SOURCE_SUBDIR cpp ) @@ -97,7 +97,7 @@ if(CCR_FETCH_DEPS) # cucumber_query # --------------------------------------------------------------------------- CPMAddPackage( - URI "gh:cucumber/query#${CUCUMBER_QUERY_DIGEST}" + URI "gh:cucumber/query@${CUCUMBER_QUERY_VERSION}#${CUCUMBER_QUERY_DIGEST}" NAME cucumber_query SOURCE_SUBDIR cpp ) @@ -106,7 +106,7 @@ if(CCR_FETCH_DEPS) # cucumber_tag_expressions # --------------------------------------------------------------------------- CPMAddPackage( - URI "gh:cucumber/tag-expressions#${CUCUMBER_TAG_EXPRESSIONS_DIGEST}" + URI "gh:cucumber/tag-expressions@${CUCUMBER_TAG_EXPRESSIONS_VERSION}#${CUCUMBER_TAG_EXPRESSIONS_DIGEST}" NAME cucumber_tag_expressions SOURCE_SUBDIR cpp ) @@ -193,6 +193,8 @@ else() find_package(nlohmann_json ${NLOHMANN_JSON_VERSION} REQUIRED) find_package(cucumber_messages ${CUCUMBER_MESSAGES_VERSION} REQUIRED) find_package(cucumber_gherkin ${CUCUMBER_GHERKIN_VERSION} REQUIRED) + find_package(cucumber_query ${CUCUMBER_QUERY_VERSION} REQUIRED) + find_package(cucumber_tag_expressions ${CUCUMBER_TAG_EXPRESSIONS_VERSION} REQUIRED) find_package(GTest REQUIRED) find_package(pugixml ${PUGIXML_VERSION} REQUIRED) find_package(fmt ${LIBFMT_VERSION} REQUIRED) From 3c414581133ed539d3e69a405cf3fac2575288f6 Mon Sep 17 00:00:00 2001 From: "Timmer, Daan" Date: Mon, 24 Aug 2026 09:31:04 +0000 Subject: [PATCH 4/4] remove commented line --- cucumber_cpp/library/CMakeLists.txt | 15 +++++++-------- 1 file changed, 7 insertions(+), 8 deletions(-) diff --git a/cucumber_cpp/library/CMakeLists.txt b/cucumber_cpp/library/CMakeLists.txt index c2a90122..977e8246 100644 --- a/cucumber_cpp/library/CMakeLists.txt +++ b/cucumber_cpp/library/CMakeLists.txt @@ -16,17 +16,17 @@ target_include_directories(cucumber_cpp.library PUBLIC ) target_link_libraries(cucumber_cpp.library PUBLIC - GTest::gtest - GTest::gmock - cucumber_gherkin_lib + CLI11::CLI11 cucumber_cpp.library.api cucumber_cpp.library.engine - cucumber_cpp.library.plugin - cucumber::tag_expressions - cucumber_cpp.library.util cucumber_cpp.library.formatter + cucumber_cpp.library.plugin cucumber_cpp.library.support - CLI11::CLI11 + cucumber_cpp.library.util + cucumber_gherkin_lib + cucumber::tag_expressions + GTest::gmock + GTest::gtest ) target_compile_options(cucumber_cpp.library @@ -45,7 +45,6 @@ add_subdirectory(formatter) add_subdirectory(plugin) add_subdirectory(runtime) add_subdirectory(support) -# add_subdirectory(tag_expression) add_subdirectory(util) if (CCR_BUILD_TESTS)