diff --git a/include/mimic++/adapters/gtest.hpp b/include/mimic++/adapters/gtest.hpp index 73264304d..181ecf72b 100644 --- a/include/mimic++/adapters/gtest.hpp +++ b/include/mimic++/adapters/gtest.hpp @@ -68,4 +68,54 @@ namespace mimicpp::detail::gtest inline const ReporterInstaller installer{}; } +template + requires requires + { + typename Matcher::is_gtest_matcher; + requires std::is_void_v; + } +struct mimicpp::custom::matcher_traits +{ + template + [[nodiscard]] + static constexpr bool matches(const Matcher& matcher, const T& value) + requires requires{ { matcher.MatchAndExplain(value, nullptr) } -> std::convertible_to; } + { + return matcher.MatchAndExplain(value, nullptr); + } + + [[nodiscard]] + static constexpr StringViewT describe(const Matcher& matcher) + requires requires{ { matcher.Desc() } -> std::convertible_to; } + { + return matcher.Desc(); + } +}; + + +template +struct mimicpp::custom::matcher_traits<::testing::PolymorphicMatcher> +{ + using MatcherT = ::testing::PolymorphicMatcher; + + template + [[nodiscard]] + static constexpr bool matches(const MatcherT& matcher, const Value& value) + { + return matcher + .impl() + .MatchAndExplain(value, nullptr); + } + + [[nodiscard]] + static constexpr StringT describe(const MatcherT& matcher) + { + StringStreamT out{}; + matcher + .impl() + .DescribeTo(&out); + return std::move(out).str(); + } +}; + #endif diff --git a/test/adapter-tests/gtest/main.cpp b/test/adapter-tests/gtest/main.cpp index d2695fb89..40ed4f2d6 100644 --- a/test/adapter-tests/gtest/main.cpp +++ b/test/adapter-tests/gtest/main.cpp @@ -6,7 +6,8 @@ #include "mimic++/Mock.hpp" #include "mimic++/adapters/gtest.hpp" -#include "gtest/gtest-spi.h" +#include +#include namespace { @@ -112,3 +113,30 @@ TEST( EXPECT_ANY_THROW(mimicpp::detail::gtest::send_fail("Test")), "Test"); } + +TEST( + GTestMatcher, + ComparisonMatcher +) +{ + static_assert( + mimicpp::matcher_for< + decltype(::testing::Ge(42)), + const int&>); + + mimicpp::Mock mock{}; + + SCOPED_EXP mock.expect_call(::testing::Ge(42)); + mock(1337); +} + +TEST( + GTestMatcher, + GenericMatcher +) +{ + static_assert( + mimicpp::matcher_for< + decltype(::testing::ContainsRegex("Hello, \\d")), + const std::string&>); +}