| #ifndef AOS_TESTING_FLATBUFFER_EQ_H_ |
| #define AOS_TESTING_FLATBUFFER_EQ_H_ |
| |
| #include "gmock/gmock.h" |
| |
| #include "aos/flatbuffer_merge.h" |
| #include "aos/flatbuffers.h" |
| #include "aos/json_to_flatbuffer.h" |
| |
| namespace aos::testing { |
| |
| // Use FlatbufferUnwrapped to instantiate this. |
| template <typename T> |
| class FlatbufferUnwrappedMatcher { |
| public: |
| FlatbufferUnwrappedMatcher(::testing::Matcher<const T *> matcher) |
| : matcher_(std::move(matcher)) {} |
| |
| bool MatchAndExplain(const T *t, |
| ::testing::MatchResultListener *listener) const { |
| return matcher_.MatchAndExplain(t, listener); |
| } |
| |
| bool MatchAndExplain(const aos::Flatbuffer<T> &t, |
| ::testing::MatchResultListener *listener) const { |
| return MatchAndExplain(&t.message(), listener); |
| } |
| |
| void DescribeTo(std::ostream *os) const { matcher_.DescribeTo(os); } |
| |
| void DescribeNegationTo(std::ostream *os) const { |
| matcher_.DescribeNegationTo(os); |
| } |
| |
| private: |
| const ::testing::Matcher<const T *> matcher_; |
| }; |
| |
| // Returns a googlemock matcher which will compare a `const T *` or a `const |
| // aos::Flatbuffer<T> &` against another matcher which only handles `const T *`. |
| // This will automatically propagate the nice error messages. |
| // |
| // T must be a flatbuffer table type. |
| template <typename T> |
| inline auto FlatbufferUnwrapped(::testing::Matcher<const T *> matcher) { |
| return ::testing::MakePolymorphicMatcher( |
| FlatbufferUnwrappedMatcher(std::move(matcher))); |
| } |
| |
| // Use FlatbufferEq to instantiate this. |
| template <typename T> |
| class FlatbufferEqMatcher : public ::testing::MatcherInterface<const T *> { |
| public: |
| FlatbufferEqMatcher(aos::FlatbufferVector<T> expected) |
| : expected_(std::move(expected)) {} |
| ~FlatbufferEqMatcher() override = default; |
| |
| bool MatchAndExplain( |
| const T *t, ::testing::MatchResultListener *listener) const override { |
| *listener << "is " << aos::FlatbufferToJson(t); |
| return aos::CompareFlatBuffer(t, &expected_.message()); |
| } |
| |
| void DescribeTo(std::ostream *os) const override { |
| *os << "is equal to " << aos::FlatbufferToJson(&expected_.message()); |
| } |
| |
| void DescribeNegationTo(std::ostream *os) const override { |
| *os << "is not equal to " << aos::FlatbufferToJson(&expected_.message()); |
| } |
| |
| private: |
| const aos::FlatbufferVector<T> expected_; |
| }; |
| |
| // Returns a googlemock matcher which will compare a `const T *` or a `const |
| // aos::Flatbuffer<T> &` against expected. This will automatically give nice |
| // error messages if they don't match. |
| // |
| // T must be a flatbuffer table type. |
| template <typename T> |
| inline auto FlatbufferEq(const aos::NonSizePrefixedFlatbuffer<T> &expected) { |
| return FlatbufferUnwrapped(::testing::MakeMatcher( |
| new FlatbufferEqMatcher(aos::FlatbufferVector<T>(expected)))); |
| } |
| |
| } // namespace aos::testing |
| |
| #endif // AOS_TESTING_FLATBUFFER_EQ_H_ |