summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorvladlosev <vladlosev@8415998a-534a-0410-bf83-d39667b30386>2012-08-14 15:38:49 +0000
committervladlosev <vladlosev@8415998a-534a-0410-bf83-d39667b30386>2012-08-14 15:38:49 +0000
commit917eb00f7d0cc18dbdf6276460d62d450951fafa (patch)
tree8334b7536bfcabc9e184a77b5bb527881bea8aa6
parentc943d060647616b73e9c07a3d4be16be403d68d5 (diff)
downloadgooglemock-917eb00f7d0cc18dbdf6276460d62d450951fafa.tar.gz
Makes gmock's Pointee() work for optional<T> (by Jeffrey Yasskin).
git-svn-id: http://googlemock.googlecode.com/svn/trunk@408 8415998a-534a-0410-bf83-d39667b30386
-rw-r--r--include/gmock/internal/gmock-internal-utils.h2
-rw-r--r--test/gmock-matchers_test.cc32
2 files changed, 33 insertions, 1 deletions
diff --git a/include/gmock/internal/gmock-internal-utils.h b/include/gmock/internal/gmock-internal-utils.h
index 6b6de97..d63fb22 100644
--- a/include/gmock/internal/gmock-internal-utils.h
+++ b/include/gmock/internal/gmock-internal-utils.h
@@ -73,7 +73,7 @@ struct PointeeOf<T*> { typedef T type; }; // NOLINT
// smart pointer, or returns p itself when p is already a raw pointer.
// The following default implementation is for the smart pointer case.
template <typename Pointer>
-inline typename Pointer::element_type* GetRawPointer(const Pointer& p) {
+inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) {
return p.get();
}
// This overloaded version is for the raw pointer case.
diff --git a/test/gmock-matchers_test.cc b/test/gmock-matchers_test.cc
index 35d59fa..6e5d5c3 100644
--- a/test/gmock-matchers_test.cc
+++ b/test/gmock-matchers_test.cc
@@ -2824,6 +2824,38 @@ TEST(PointeeTest, ReferenceToNonConstRawPointer) {
EXPECT_FALSE(m.Matches(p));
}
+// Minimal const-propagating pointer.
+template <typename T>
+class ConstPropagatingPtr {
+ public:
+ typedef T element_type;
+
+ ConstPropagatingPtr() : val_() {}
+ explicit ConstPropagatingPtr(T* t) : val_(t) {}
+ ConstPropagatingPtr(const ConstPropagatingPtr& other) : val_(other.val_) {}
+
+ T* get() { return val_; }
+ T& operator*() { return *val_; }
+ // Most smart pointers return non-const T* and T& from the next methods.
+ const T* get() const { return val_; }
+ const T& operator*() const { return *val_; }
+
+ private:
+ T* val_;
+};
+
+TEST(PointeeTest, WorksWithConstPropagatingPointers) {
+ const Matcher< ConstPropagatingPtr<int> > m = Pointee(Lt(5));
+ int three = 3;
+ const ConstPropagatingPtr<int> co(&three);
+ ConstPropagatingPtr<int> o(&three);
+ EXPECT_TRUE(m.Matches(o));
+ EXPECT_TRUE(m.Matches(co));
+ *o = 6;
+ EXPECT_FALSE(m.Matches(o));
+ EXPECT_FALSE(m.Matches(ConstPropagatingPtr<int>()));
+}
+
TEST(PointeeTest, NeverMatchesNull) {
const Matcher<const char*> m = Pointee(_);
EXPECT_FALSE(m.Matches(NULL));