Index: testing/gmock/test/gmock-port_test.cc |
diff --git a/testing/gmock/test/gmock-port_test.cc b/testing/gmock/test/gmock-port_test.cc |
index 9a64ec33e0f424dfc8b171d10918619bb9077e3a..054313b7e7d52d6e99768c07f693ebfbd1cac0a7 100644 |
--- a/testing/gmock/test/gmock-port_test.cc |
+++ b/testing/gmock/test/gmock-port_test.cc |
@@ -36,4 +36,129 @@ |
#include <gmock/internal/gmock-port.h> |
#include <gtest/gtest.h> |
-// This file intentionally contains no test at this moment. |
+// NOTE: if this file is left without tests for some reason, put a dummy |
+// test here to make references to symbols in the gtest library and avoid |
+// 'undefined symbol' linker errors in gmock_main: |
+// |
+// TEST(DummyTest, Dummy) {} |
+ |
+namespace testing { |
+namespace internal { |
+// Needed to avoid name collisions in gmock_all_test.cc. |
+namespace gmock_port_test { |
+ |
+class Base { |
+ public: |
+ // Copy constructor and assignment operator do exactly what we need, so we |
+ // use them. |
+ Base() : member_(0) {} |
+ explicit Base(int n) : member_(n) {} |
+ virtual ~Base() {} |
+ int member() { return member_; } |
+ |
+ private: |
+ int member_; |
+}; |
+ |
+class Derived : public Base { |
+ public: |
+ explicit Derived(int n) : Base(n) {} |
+}; |
+ |
+TEST(ImplicitCastTest, ConvertsPointers) { |
+ Derived derived(0); |
+ EXPECT_TRUE(&derived == ::testing::internal::implicit_cast<Base*>(&derived)); |
+} |
+ |
+TEST(ImplicitCastTest, CanUseInheritance) { |
+ Derived derived(1); |
+ Base base = ::testing::internal::implicit_cast<Base>(derived); |
+ EXPECT_EQ(derived.member(), base.member()); |
+} |
+ |
+class Castable { |
+ public: |
+ Castable(bool* converted) : converted_(converted) {} |
+ operator Base() { |
+ *converted_ = true; |
+ return Base(); |
+ } |
+ |
+ private: |
+ bool* converted_; |
+}; |
+ |
+TEST(ImplicitCastTest, CanUseNonConstCastOperator) { |
+ bool converted = false; |
+ Castable castable(&converted); |
+ Base base = ::testing::internal::implicit_cast<Base>(castable); |
+ EXPECT_TRUE(converted); |
+} |
+ |
+class ConstCastable { |
+ public: |
+ ConstCastable(bool* converted) : converted_(converted) {} |
+ operator Base() const { |
+ *converted_ = true; |
+ return Base(); |
+ } |
+ |
+ private: |
+ bool* converted_; |
+}; |
+ |
+TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) { |
+ bool converted = false; |
+ const ConstCastable const_castable(&converted); |
+ Base base = ::testing::internal::implicit_cast<Base>(const_castable); |
+ EXPECT_TRUE(converted); |
+} |
+ |
+class ConstAndNonConstCastable { |
+ public: |
+ ConstAndNonConstCastable(bool* converted, bool* const_converted) |
+ : converted_(converted), const_converted_(const_converted) {} |
+ operator Base() { |
+ *converted_ = true; |
+ return Base(); |
+ } |
+ operator Base() const { |
+ *const_converted_ = true; |
+ return Base(); |
+ } |
+ |
+ private: |
+ bool* converted_; |
+ bool* const_converted_; |
+}; |
+ |
+TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) { |
+ bool converted = false; |
+ bool const_converted = false; |
+ ConstAndNonConstCastable castable(&converted, &const_converted); |
+ Base base = ::testing::internal::implicit_cast<Base>(castable); |
+ EXPECT_TRUE(converted); |
+ EXPECT_FALSE(const_converted); |
+ |
+ converted = false; |
+ const_converted = false; |
+ const ConstAndNonConstCastable const_castable(&converted, &const_converted); |
+ base = ::testing::internal::implicit_cast<Base>(const_castable); |
+ EXPECT_FALSE(converted); |
+ EXPECT_TRUE(const_converted); |
+} |
+ |
+class To { |
+ public: |
+ To(bool* converted) { *converted = true; } // NOLINT |
+}; |
+ |
+TEST(ImplicitCastTest, CanUseImplicitConstructor) { |
+ bool converted = false; |
+ To to = ::testing::internal::implicit_cast<To>(&converted); |
+ EXPECT_TRUE(converted); |
+} |
+ |
+} // namespace gmock_port_test |
+} // namespace internal |
+} // namespace testing |