summaryrefslogtreecommitdiffstats
path: root/googlemock/include/gmock
diff options
context:
space:
mode:
authorAbseil Team <absl-team@google.com>2024-07-15 23:39:22 (GMT)
committerCopybara-Service <copybara-worker@google.com>2024-07-15 23:40:10 (GMT)
commit417158b8bca158426cbdc0c547fdd7d9fbd46904 (patch)
tree0f54c544e638ff7720864b76e7f4623aa8812c23 /googlemock/include/gmock
parent7321f950dfe0d481b56b1c475e38b681ff34263f (diff)
downloadgoogletest-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.h44
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_;
};