summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2011-04-14 19:37:06 +0000
committerzhanyong.wan <zhanyong.wan@8415998a-534a-0410-bf83-d39667b30386>2011-04-14 19:37:06 +0000
commite655032e9bab0f26ed23c64b47f780f1d4f157d2 (patch)
tree4b1f0d5319d0f31df63166329cc734fb73b30377
parent85a22c8a8af474cf72e28cfa6f29acc074248ec4 (diff)
downloadgooglemock-e655032e9bab0f26ed23c64b47f780f1d4f157d2.tar.gz
simplifies TrulyMatcher and adds a test for it
git-svn-id: http://googlemock.googlecode.com/svn/trunk@383 8415998a-534a-0410-bf83-d39667b30386
-rw-r--r--include/gmock/gmock-matchers.h18
-rw-r--r--test/gmock-matchers_test.cc23
2 files changed, 32 insertions, 9 deletions
diff --git a/include/gmock/gmock-matchers.h b/include/gmock/gmock-matchers.h
index b92450c..c21fa51 100644
--- a/include/gmock/gmock-matchers.h
+++ b/include/gmock/gmock-matchers.h
@@ -1392,15 +1392,15 @@ class TrulyMatcher {
template <typename T>
bool MatchAndExplain(T& x, // NOLINT
MatchResultListener* /* listener */) const {
-#ifdef _MSC_VER
- // MSVC warns about converting a value into bool (warning 4800).
-# pragma warning(push) // Saves the current warning state.
-# pragma warning(disable:4800) // Temporarily disables warning 4800.
-#endif
- return predicate_(x);
-#ifdef _MSC_VER
-# pragma warning(pop) // Restores the warning state.
-#endif
+ // Without the if-statement, MSVC sometimes warns about converting
+ // a value to bool (warning 4800).
+ //
+ // We cannot write 'return !!predicate_(x);' as that doesn't work
+ // when predicate_(x) returns a class convertible to bool but
+ // having no operator!().
+ if (predicate_(x))
+ return true;
+ return false;
}
void DescribeTo(::std::ostream* os) const {
diff --git a/test/gmock-matchers_test.cc b/test/gmock-matchers_test.cc
index 6f93fbd..9ad62c4 100644
--- a/test/gmock-matchers_test.cc
+++ b/test/gmock-matchers_test.cc
@@ -2256,6 +2256,29 @@ TEST(TrulyTest, CanBeUsedWithFunctor) {
EXPECT_FALSE(m.Matches(4));
}
+// A class that can be implicitly converted to bool.
+class ConvertibleToBool {
+ public:
+ explicit ConvertibleToBool(int number) : number_(number) {}
+ operator bool() const { return number_ != 0; }
+
+ private:
+ int number_;
+};
+
+ConvertibleToBool IsNotZero(int number) {
+ return ConvertibleToBool(number);
+}
+
+// Tests that the predicate used in Truly() may return a class that's
+// implicitly convertible to bool, even when the class has no
+// operator!().
+TEST(TrulyTest, PredicateCanReturnAClassConvertibleToBool) {
+ Matcher<int> m = Truly(IsNotZero);
+ EXPECT_TRUE(m.Matches(1));
+ EXPECT_FALSE(m.Matches(0));
+}
+
// Tests that Truly(predicate) can describe itself properly.
TEST(TrulyTest, CanDescribeSelf) {
Matcher<double> m = Truly(IsPositive);