Index: testing/gmock/test/gmock-generated-matchers_test.cc |
diff --git a/testing/gmock/test/gmock-generated-matchers_test.cc b/testing/gmock/test/gmock-generated-matchers_test.cc |
index 41413055cbd50b7cd60f75172302edbc22bf1dbc..db2ffb2f62fcc14b7af22e6748e96327d7c6bef6 100644 |
--- a/testing/gmock/test/gmock-generated-matchers_test.cc |
+++ b/testing/gmock/test/gmock-generated-matchers_test.cc |
@@ -68,6 +68,7 @@ using testing::Lt; |
using testing::MakeMatcher; |
using testing::Matcher; |
using testing::MatcherInterface; |
+using testing::MatchResultListener; |
using testing::Ne; |
using testing::Not; |
using testing::Pointee; |
@@ -136,6 +137,16 @@ TEST(ArgsTest, AcceptsDecreasingTemplateArgs) { |
EXPECT_THAT(t, Not(Args<2, 1>(Lt()))); |
} |
+// The MATCHER*() macros trigger warning C4100 (unreferenced formal |
+// parameter) in MSVC with -W4. Unfortunately they cannot be fixed in |
+// the macro definition, as the warnings are generated when the macro |
+// is expanded and macro expansion cannot contain #pragma. Therefore |
+// we suppress them here. |
+#ifdef _MSC_VER |
+#pragma warning(push) |
+#pragma warning(disable:4100) |
+#endif |
+ |
MATCHER(SumIsZero, "") { |
return get<0>(arg) + get<1>(arg) + get<2>(arg) == 0; |
} |
@@ -167,9 +178,7 @@ TEST(ArgsTest, CanMatchTupleByReference) { |
// Validates that arg is printed as str. |
MATCHER_P(PrintsAs, str, "") { |
- typedef GMOCK_REMOVE_CONST_(GMOCK_REMOVE_REFERENCE_(arg_type)) RawTuple; |
- return |
- testing::internal::UniversalPrinter<RawTuple>::PrintToString(arg) == str; |
+ return testing::PrintToString(arg) == str; |
} |
TEST(ArgsTest, AcceptsTenTemplateArgs) { |
@@ -207,21 +216,22 @@ class GreaterThanMatcher : public MatcherInterface<int> { |
public: |
explicit GreaterThanMatcher(int rhs) : rhs_(rhs) {} |
- virtual bool Matches(int lhs) const { return lhs > rhs_; } |
- |
virtual void DescribeTo(::std::ostream* os) const { |
*os << "is greater than " << rhs_; |
} |
- virtual void ExplainMatchResultTo(int lhs, ::std::ostream* os) const { |
+ virtual bool MatchAndExplain(int lhs, |
+ MatchResultListener* listener) const { |
const int diff = lhs - rhs_; |
if (diff > 0) { |
- *os << "is " << diff << " more than " << rhs_; |
+ *listener << "is " << diff << " more than " << rhs_; |
} else if (diff == 0) { |
- *os << "is the same as " << rhs_; |
+ *listener << "is the same as " << rhs_; |
} else { |
- *os << "is " << -diff << " less than " << rhs_; |
+ *listener << "is " << -diff << " less than " << rhs_; |
} |
+ |
+ return lhs > rhs_; |
} |
private: |
@@ -553,6 +563,44 @@ TEST(MatcherMacroTest, Works) { |
EXPECT_EQ("", Explain(m, 7)); |
} |
+// Tests explaining match result in a MATCHER* macro. |
+ |
+MATCHER(IsEven2, "is even") { |
+ if ((arg % 2) == 0) { |
+ // Verifies that we can stream to result_listener, a listener |
+ // supplied by the MATCHER macro implicitly. |
+ *result_listener << "OK"; |
+ return true; |
+ } else { |
+ *result_listener << "% 2 == " << (arg % 2); |
+ return false; |
+ } |
+} |
+ |
+MATCHER_P2(EqSumOf, x, y, "") { |
+ if (arg == (x + y)) { |
+ *result_listener << "OK"; |
+ return true; |
+ } else { |
+ // Verifies that we can stream to the underlying stream of |
+ // result_listener. |
+ if (result_listener->stream() != NULL) { |
+ *result_listener->stream() << "diff == " << (x + y - arg); |
+ } |
+ return false; |
+ } |
+} |
+ |
+TEST(MatcherMacroTest, CanExplainMatchResult) { |
+ const Matcher<int> m1 = IsEven2(); |
+ EXPECT_EQ("OK", Explain(m1, 4)); |
+ EXPECT_EQ("% 2 == 1", Explain(m1, 5)); |
+ |
+ const Matcher<int> m2 = EqSumOf(1, 2); |
+ EXPECT_EQ("OK", Explain(m2, 3)); |
+ EXPECT_EQ("diff == -1", Explain(m2, 4)); |
+} |
+ |
// Tests that the description string supplied to MATCHER() must be |
// valid. |
@@ -1052,4 +1100,8 @@ TEST(ContainsTest, WorksForTwoDimensionalNativeArray) { |
EXPECT_THAT(a, Contains(Not(Contains(5)))); |
} |
+#ifdef _MSC_VER |
+#pragma warning(pop) |
+#endif |
+ |
} // namespace |