OLD | NEW |
1 // Copyright 2008, Google Inc. | 1 // Copyright 2008, Google Inc. |
2 // All rights reserved. | 2 // All rights reserved. |
3 // | 3 // |
4 // Redistribution and use in source and binary forms, with or without | 4 // Redistribution and use in source and binary forms, with or without |
5 // modification, are permitted provided that the following conditions are | 5 // modification, are permitted provided that the following conditions are |
6 // met: | 6 // met: |
7 // | 7 // |
8 // * Redistributions of source code must retain the above copyright | 8 // * Redistributions of source code must retain the above copyright |
9 // notice, this list of conditions and the following disclaimer. | 9 // notice, this list of conditions and the following disclaimer. |
10 // * Redistributions in binary form must reproduce the above | 10 // * Redistributions in binary form must reproduce the above |
(...skipping 18 matching lines...) Expand all Loading... |
29 // | 29 // |
30 // Author: vladl@google.com (Vlad Losev) | 30 // Author: vladl@google.com (Vlad Losev) |
31 | 31 |
32 // Google Mock - a framework for writing C++ mock classes. | 32 // Google Mock - a framework for writing C++ mock classes. |
33 // | 33 // |
34 // This file tests the internal cross-platform support utilities. | 34 // This file tests the internal cross-platform support utilities. |
35 | 35 |
36 #include <gmock/internal/gmock-port.h> | 36 #include <gmock/internal/gmock-port.h> |
37 #include <gtest/gtest.h> | 37 #include <gtest/gtest.h> |
38 | 38 |
39 // This file intentionally contains no test at this moment. | 39 // NOTE: if this file is left without tests for some reason, put a dummy |
| 40 // test here to make references to symbols in the gtest library and avoid |
| 41 // 'undefined symbol' linker errors in gmock_main: |
| 42 // |
| 43 // TEST(DummyTest, Dummy) {} |
| 44 |
| 45 namespace testing { |
| 46 namespace internal { |
| 47 // Needed to avoid name collisions in gmock_all_test.cc. |
| 48 namespace gmock_port_test { |
| 49 |
| 50 class Base { |
| 51 public: |
| 52 // Copy constructor and assignment operator do exactly what we need, so we |
| 53 // use them. |
| 54 Base() : member_(0) {} |
| 55 explicit Base(int n) : member_(n) {} |
| 56 virtual ~Base() {} |
| 57 int member() { return member_; } |
| 58 |
| 59 private: |
| 60 int member_; |
| 61 }; |
| 62 |
| 63 class Derived : public Base { |
| 64 public: |
| 65 explicit Derived(int n) : Base(n) {} |
| 66 }; |
| 67 |
| 68 TEST(ImplicitCastTest, ConvertsPointers) { |
| 69 Derived derived(0); |
| 70 EXPECT_TRUE(&derived == ::testing::internal::implicit_cast<Base*>(&derived)); |
| 71 } |
| 72 |
| 73 TEST(ImplicitCastTest, CanUseInheritance) { |
| 74 Derived derived(1); |
| 75 Base base = ::testing::internal::implicit_cast<Base>(derived); |
| 76 EXPECT_EQ(derived.member(), base.member()); |
| 77 } |
| 78 |
| 79 class Castable { |
| 80 public: |
| 81 Castable(bool* converted) : converted_(converted) {} |
| 82 operator Base() { |
| 83 *converted_ = true; |
| 84 return Base(); |
| 85 } |
| 86 |
| 87 private: |
| 88 bool* converted_; |
| 89 }; |
| 90 |
| 91 TEST(ImplicitCastTest, CanUseNonConstCastOperator) { |
| 92 bool converted = false; |
| 93 Castable castable(&converted); |
| 94 Base base = ::testing::internal::implicit_cast<Base>(castable); |
| 95 EXPECT_TRUE(converted); |
| 96 } |
| 97 |
| 98 class ConstCastable { |
| 99 public: |
| 100 ConstCastable(bool* converted) : converted_(converted) {} |
| 101 operator Base() const { |
| 102 *converted_ = true; |
| 103 return Base(); |
| 104 } |
| 105 |
| 106 private: |
| 107 bool* converted_; |
| 108 }; |
| 109 |
| 110 TEST(ImplicitCastTest, CanUseConstCastOperatorOnConstValues) { |
| 111 bool converted = false; |
| 112 const ConstCastable const_castable(&converted); |
| 113 Base base = ::testing::internal::implicit_cast<Base>(const_castable); |
| 114 EXPECT_TRUE(converted); |
| 115 } |
| 116 |
| 117 class ConstAndNonConstCastable { |
| 118 public: |
| 119 ConstAndNonConstCastable(bool* converted, bool* const_converted) |
| 120 : converted_(converted), const_converted_(const_converted) {} |
| 121 operator Base() { |
| 122 *converted_ = true; |
| 123 return Base(); |
| 124 } |
| 125 operator Base() const { |
| 126 *const_converted_ = true; |
| 127 return Base(); |
| 128 } |
| 129 |
| 130 private: |
| 131 bool* converted_; |
| 132 bool* const_converted_; |
| 133 }; |
| 134 |
| 135 TEST(ImplicitCastTest, CanSelectBetweenConstAndNonConstCasrAppropriately) { |
| 136 bool converted = false; |
| 137 bool const_converted = false; |
| 138 ConstAndNonConstCastable castable(&converted, &const_converted); |
| 139 Base base = ::testing::internal::implicit_cast<Base>(castable); |
| 140 EXPECT_TRUE(converted); |
| 141 EXPECT_FALSE(const_converted); |
| 142 |
| 143 converted = false; |
| 144 const_converted = false; |
| 145 const ConstAndNonConstCastable const_castable(&converted, &const_converted); |
| 146 base = ::testing::internal::implicit_cast<Base>(const_castable); |
| 147 EXPECT_FALSE(converted); |
| 148 EXPECT_TRUE(const_converted); |
| 149 } |
| 150 |
| 151 class To { |
| 152 public: |
| 153 To(bool* converted) { *converted = true; } // NOLINT |
| 154 }; |
| 155 |
| 156 TEST(ImplicitCastTest, CanUseImplicitConstructor) { |
| 157 bool converted = false; |
| 158 To to = ::testing::internal::implicit_cast<To>(&converted); |
| 159 EXPECT_TRUE(converted); |
| 160 } |
| 161 |
| 162 } // namespace gmock_port_test |
| 163 } // namespace internal |
| 164 } // namespace testing |
OLD | NEW |