Googletest export
The gmock matchers have a concept of MatchAndExpain; where the details of the
matching are written to a "result listener". A matcher can avoid creating
expensive debug info by checking result_listener->IsInterested(); but,
unfortunately, the default matcher code (called from EXPECT_THAT) is always
"interested".
This change implements EXPECT_THAT matching to first run the matcher in a "not
interested" mode; and then run it a second time ("interested") only if the
match fails.
PiperOrigin-RevId: 224929783
This commit is contained in:
committed by
Gennadiy Civil
parent
695cf7c962
commit
06bb8d4d6d
@@ -1296,14 +1296,24 @@ class PredicateFormatterFromMatcher {
|
||||
// We don't write MatcherCast<const T&> either, as that allows
|
||||
// potentially unsafe downcasting of the matcher argument.
|
||||
const Matcher<const T&> matcher = SafeMatcherCast<const T&>(matcher_);
|
||||
StringMatchResultListener listener;
|
||||
if (MatchPrintAndExplain(x, matcher, &listener))
|
||||
|
||||
// The expected path here is that the matcher should match (i.e. that most
|
||||
// tests pass) so optimize for this case.
|
||||
if (matcher.Matches(x)) {
|
||||
return AssertionSuccess();
|
||||
}
|
||||
|
||||
::std::stringstream ss;
|
||||
ss << "Value of: " << value_text << "\n"
|
||||
<< "Expected: ";
|
||||
matcher.DescribeTo(&ss);
|
||||
|
||||
// Rerun the matcher to "PrintAndExain" the failure.
|
||||
StringMatchResultListener listener;
|
||||
if (MatchPrintAndExplain(x, matcher, &listener)) {
|
||||
ss << "\n The matcher failed on the initial attempt; but passed when "
|
||||
"rerun to generate the explanation.";
|
||||
}
|
||||
ss << "\n Actual: " << listener.str();
|
||||
return AssertionFailure() << ss.str();
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user