diff options
author | vladlosev <vladlosev@8415998a-534a-0410-bf83-d39667b30386> | 2012-08-14 15:38:49 +0000 |
---|---|---|
committer | vladlosev <vladlosev@8415998a-534a-0410-bf83-d39667b30386> | 2012-08-14 15:38:49 +0000 |
commit | ada23475e27babd85fb9c13250243f6acfd3ffd8 (patch) | |
tree | 8334b7536bfcabc9e184a77b5bb527881bea8aa6 | |
parent | 2fd619edd3d1ec053f6276debdb513f1122ebcf3 (diff) | |
download | googletest-ada23475e27babd85fb9c13250243f6acfd3ffd8.tar.gz googletest-ada23475e27babd85fb9c13250243f6acfd3ffd8.tar.bz2 googletest-ada23475e27babd85fb9c13250243f6acfd3ffd8.zip |
Makes gmock's Pointee() work for optional<T> (by Jeffrey Yasskin).
-rw-r--r-- | include/gmock/internal/gmock-internal-utils.h | 2 | ||||
-rw-r--r-- | test/gmock-matchers_test.cc | 32 |
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 6b6de970..d63fb223 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 35d59fa8..6e5d5c31 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)); |