diff options
author | Abseil Team <absl-team@google.com> | 2024-07-15 23:39:22 (GMT) |
---|---|---|
committer | Copybara-Service <copybara-worker@google.com> | 2024-07-15 23:40:10 (GMT) |
commit | 417158b8bca158426cbdc0c547fdd7d9fbd46904 (patch) | |
tree | 0f54c544e638ff7720864b76e7f4623aa8812c23 /googlemock/include/gmock | |
parent | 7321f950dfe0d481b56b1c475e38b681ff34263f (diff) | |
download | googletest-417158b8bca158426cbdc0c547fdd7d9fbd46904.zip googletest-417158b8bca158426cbdc0c547fdd7d9fbd46904.tar.gz googletest-417158b8bca158426cbdc0c547fdd7d9fbd46904.tar.bz2 |
Use matcher's description in AllOf if matcher has no explanation.
PiperOrigin-RevId: 652634229
Change-Id: I5fd7eaef4db3dea3d4142e1fb5fc97e46f654358
Diffstat (limited to 'googlemock/include/gmock')
-rw-r--r-- | googlemock/include/gmock/gmock-matchers.h | 44 |
1 files changed, 29 insertions, 15 deletions
diff --git a/googlemock/include/gmock/gmock-matchers.h b/googlemock/include/gmock/gmock-matchers.h index 063ee6c..3daf617 100644 --- a/googlemock/include/gmock/gmock-matchers.h +++ b/googlemock/include/gmock/gmock-matchers.h @@ -1300,34 +1300,48 @@ class AllOfMatcherImpl : public MatcherInterface<const T&> { bool MatchAndExplain(const T& x, MatchResultListener* listener) const override { - // If either matcher1_ or matcher2_ doesn't match x, we only need - // to explain why one of them fails. + // This method uses matcher's explanation when explaining the result. + // However, if matcher doesn't provide one, this method uses matcher's + // description. std::string all_match_result; - - for (size_t i = 0; i < matchers_.size(); ++i) { + for (const Matcher<T>& matcher : matchers_) { StringMatchResultListener slistener; - if (matchers_[i].MatchAndExplain(x, &slistener)) { - if (all_match_result.empty()) { - all_match_result = slistener.str(); + // Return explanation for first failed matcher. + if (!matcher.MatchAndExplain(x, &slistener)) { + const std::string explanation = slistener.str(); + if (!explanation.empty()) { + *listener << explanation; } else { - std::string result = slistener.str(); - if (!result.empty()) { - all_match_result += ", and "; - all_match_result += result; - } + *listener << "which doesn't match (" << Describe(matcher) << ")"; } - } else { - *listener << slistener.str(); return false; } + // Keep track of explanations in case all matchers succeed. + std::string explanation = slistener.str(); + if (explanation.empty()) { + explanation = Describe(matcher); + } + if (all_match_result.empty()) { + all_match_result = explanation; + } else { + if (!explanation.empty()) { + all_match_result += ", and "; + all_match_result += explanation; + } + } } - // Otherwise we need to explain why *both* of them match. *listener << all_match_result; return true; } private: + // Returns matcher description as a string. + std::string Describe(const Matcher<T>& matcher) const { + StringMatchResultListener listener; + matcher.DescribeTo(listener.stream()); + return listener.str(); + } const std::vector<Matcher<T>> matchers_; }; |