| OLD | NEW |
| (Empty) |
| 1 // Copyright 2008, Google Inc. | |
| 2 // All rights reserved. | |
| 3 // | |
| 4 // Redistribution and use in source and binary forms, with or without | |
| 5 // modification, are permitted provided that the following conditions are | |
| 6 // met: | |
| 7 // | |
| 8 // * Redistributions of source code must retain the above copyright | |
| 9 // notice, this list of conditions and the following disclaimer. | |
| 10 // * Redistributions in binary form must reproduce the above | |
| 11 // copyright notice, this list of conditions and the following disclaimer | |
| 12 // in the documentation and/or other materials provided with the | |
| 13 // distribution. | |
| 14 // * Neither the name of Google Inc. nor the names of its | |
| 15 // contributors may be used to endorse or promote products derived from | |
| 16 // this software without specific prior written permission. | |
| 17 // | |
| 18 // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | |
| 19 // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | |
| 20 // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | |
| 21 // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | |
| 22 // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | |
| 23 // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | |
| 24 // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | |
| 25 // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | |
| 26 // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | |
| 27 // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | |
| 28 // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | |
| 29 // | |
| 30 // Author: wan@google.com (Zhanyong Wan) | |
| 31 | |
| 32 #include <gmock/gmock-generated-nice-strict.h> | |
| 33 | |
| 34 #include <string> | |
| 35 #include <gmock/gmock.h> | |
| 36 #include <gtest/gtest.h> | |
| 37 #include <gtest/gtest-spi.h> | |
| 38 | |
| 39 // This must not be defined inside the ::testing namespace, or it will | |
| 40 // clash with ::testing::Mock. | |
| 41 class Mock { | |
| 42 public: | |
| 43 Mock() {} | |
| 44 | |
| 45 MOCK_METHOD0(DoThis, void()); | |
| 46 | |
| 47 private: | |
| 48 GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock); | |
| 49 }; | |
| 50 | |
| 51 namespace testing { | |
| 52 namespace gmock_nice_strict_test { | |
| 53 | |
| 54 using testing::internal::string; | |
| 55 using testing::GMOCK_FLAG(verbose); | |
| 56 using testing::HasSubstr; | |
| 57 using testing::NiceMock; | |
| 58 using testing::StrictMock; | |
| 59 | |
| 60 #if GTEST_HAS_STREAM_REDIRECTION_ | |
| 61 using testing::internal::CaptureStdout; | |
| 62 using testing::internal::GetCapturedStdout; | |
| 63 #endif // GTEST_HAS_STREAM_REDIRECTION_ | |
| 64 | |
| 65 // Defines some mock classes needed by the tests. | |
| 66 | |
| 67 class Foo { | |
| 68 public: | |
| 69 virtual ~Foo() {} | |
| 70 | |
| 71 virtual void DoThis() = 0; | |
| 72 virtual int DoThat(bool flag) = 0; | |
| 73 }; | |
| 74 | |
| 75 class MockFoo : public Foo { | |
| 76 public: | |
| 77 MockFoo() {} | |
| 78 void Delete() { delete this; } | |
| 79 | |
| 80 MOCK_METHOD0(DoThis, void()); | |
| 81 MOCK_METHOD1(DoThat, int(bool flag)); | |
| 82 | |
| 83 private: | |
| 84 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo); | |
| 85 }; | |
| 86 | |
| 87 class MockBar { | |
| 88 public: | |
| 89 explicit MockBar(const string& s) : str_(s) {} | |
| 90 | |
| 91 MockBar(char a1, char a2, string a3, string a4, int a5, int a6, | |
| 92 const string& a7, const string& a8, bool a9, bool a10) { | |
| 93 str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) + | |
| 94 static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F'); | |
| 95 } | |
| 96 | |
| 97 virtual ~MockBar() {} | |
| 98 | |
| 99 const string& str() const { return str_; } | |
| 100 | |
| 101 MOCK_METHOD0(This, int()); | |
| 102 MOCK_METHOD2(That, string(int, bool)); | |
| 103 | |
| 104 private: | |
| 105 string str_; | |
| 106 | |
| 107 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar); | |
| 108 }; | |
| 109 | |
| 110 #if GTEST_HAS_STREAM_REDIRECTION_ | |
| 111 | |
| 112 // Tests that a nice mock generates no warning for uninteresting calls. | |
| 113 TEST(NiceMockTest, NoWarningForUninterestingCall) { | |
| 114 NiceMock<MockFoo> nice_foo; | |
| 115 | |
| 116 CaptureStdout(); | |
| 117 nice_foo.DoThis(); | |
| 118 nice_foo.DoThat(true); | |
| 119 EXPECT_STREQ("", GetCapturedStdout().c_str()); | |
| 120 } | |
| 121 | |
| 122 // Tests that a nice mock generates no warning for uninteresting calls | |
| 123 // that delete the mock object. | |
| 124 TEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) { | |
| 125 NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>; | |
| 126 | |
| 127 ON_CALL(*nice_foo, DoThis()) | |
| 128 .WillByDefault(Invoke(nice_foo, &MockFoo::Delete)); | |
| 129 | |
| 130 CaptureStdout(); | |
| 131 nice_foo->DoThis(); | |
| 132 EXPECT_STREQ("", GetCapturedStdout().c_str()); | |
| 133 } | |
| 134 | |
| 135 // Tests that a nice mock generates informational logs for | |
| 136 // uninteresting calls. | |
| 137 TEST(NiceMockTest, InfoForUninterestingCall) { | |
| 138 NiceMock<MockFoo> nice_foo; | |
| 139 | |
| 140 const string saved_flag = GMOCK_FLAG(verbose); | |
| 141 GMOCK_FLAG(verbose) = "info"; | |
| 142 CaptureStdout(); | |
| 143 nice_foo.DoThis(); | |
| 144 EXPECT_THAT(GetCapturedStdout(), | |
| 145 HasSubstr("Uninteresting mock function call")); | |
| 146 | |
| 147 CaptureStdout(); | |
| 148 nice_foo.DoThat(true); | |
| 149 EXPECT_THAT(GetCapturedStdout(), | |
| 150 HasSubstr("Uninteresting mock function call")); | |
| 151 GMOCK_FLAG(verbose) = saved_flag; | |
| 152 } | |
| 153 | |
| 154 #endif // GTEST_HAS_STREAM_REDIRECTION_ | |
| 155 | |
| 156 // Tests that a nice mock allows expected calls. | |
| 157 TEST(NiceMockTest, AllowsExpectedCall) { | |
| 158 NiceMock<MockFoo> nice_foo; | |
| 159 | |
| 160 EXPECT_CALL(nice_foo, DoThis()); | |
| 161 nice_foo.DoThis(); | |
| 162 } | |
| 163 | |
| 164 // Tests that an unexpected call on a nice mock fails. | |
| 165 TEST(NiceMockTest, UnexpectedCallFails) { | |
| 166 NiceMock<MockFoo> nice_foo; | |
| 167 | |
| 168 EXPECT_CALL(nice_foo, DoThis()).Times(0); | |
| 169 EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected"); | |
| 170 } | |
| 171 | |
| 172 // Tests that NiceMock works with a mock class that has a non-default | |
| 173 // constructor. | |
| 174 TEST(NiceMockTest, NonDefaultConstructor) { | |
| 175 NiceMock<MockBar> nice_bar("hi"); | |
| 176 EXPECT_EQ("hi", nice_bar.str()); | |
| 177 | |
| 178 nice_bar.This(); | |
| 179 nice_bar.That(5, true); | |
| 180 } | |
| 181 | |
| 182 // Tests that NiceMock works with a mock class that has a 10-ary | |
| 183 // non-default constructor. | |
| 184 TEST(NiceMockTest, NonDefaultConstructor10) { | |
| 185 NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f', | |
| 186 "g", "h", true, false); | |
| 187 EXPECT_EQ("abcdefghTF", nice_bar.str()); | |
| 188 | |
| 189 nice_bar.This(); | |
| 190 nice_bar.That(5, true); | |
| 191 } | |
| 192 | |
| 193 #if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE | |
| 194 // Tests that NiceMock<Mock> compiles where Mock is a user-defined | |
| 195 // class (as opposed to ::testing::Mock). We had to workaround an | |
| 196 // MSVC 8.0 bug that caused the symbol Mock used in the definition of | |
| 197 // NiceMock to be looked up in the wrong context, and this test | |
| 198 // ensures that our fix works. | |
| 199 // | |
| 200 // We have to skip this test on Symbian and Windows Mobile, as it | |
| 201 // causes the program to crash there, for reasons unclear to us yet. | |
| 202 TEST(NiceMockTest, AcceptsClassNamedMock) { | |
| 203 NiceMock< ::Mock> nice; | |
| 204 EXPECT_CALL(nice, DoThis()); | |
| 205 nice.DoThis(); | |
| 206 } | |
| 207 #endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE | |
| 208 | |
| 209 // Tests that a strict mock allows expected calls. | |
| 210 TEST(StrictMockTest, AllowsExpectedCall) { | |
| 211 StrictMock<MockFoo> strict_foo; | |
| 212 | |
| 213 EXPECT_CALL(strict_foo, DoThis()); | |
| 214 strict_foo.DoThis(); | |
| 215 } | |
| 216 | |
| 217 // Tests that an unexpected call on a strict mock fails. | |
| 218 TEST(StrictMockTest, UnexpectedCallFails) { | |
| 219 StrictMock<MockFoo> strict_foo; | |
| 220 | |
| 221 EXPECT_CALL(strict_foo, DoThis()).Times(0); | |
| 222 EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), | |
| 223 "called more times than expected"); | |
| 224 } | |
| 225 | |
| 226 // Tests that an uninteresting call on a strict mock fails. | |
| 227 TEST(StrictMockTest, UninterestingCallFails) { | |
| 228 StrictMock<MockFoo> strict_foo; | |
| 229 | |
| 230 EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(), | |
| 231 "Uninteresting mock function call"); | |
| 232 } | |
| 233 | |
| 234 // Tests that an uninteresting call on a strict mock fails, even if | |
| 235 // the call deletes the mock object. | |
| 236 TEST(StrictMockTest, UninterestingCallFailsAfterDeath) { | |
| 237 StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>; | |
| 238 | |
| 239 ON_CALL(*strict_foo, DoThis()) | |
| 240 .WillByDefault(Invoke(strict_foo, &MockFoo::Delete)); | |
| 241 | |
| 242 EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(), | |
| 243 "Uninteresting mock function call"); | |
| 244 } | |
| 245 | |
| 246 // Tests that StrictMock works with a mock class that has a | |
| 247 // non-default constructor. | |
| 248 TEST(StrictMockTest, NonDefaultConstructor) { | |
| 249 StrictMock<MockBar> strict_bar("hi"); | |
| 250 EXPECT_EQ("hi", strict_bar.str()); | |
| 251 | |
| 252 EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), | |
| 253 "Uninteresting mock function call"); | |
| 254 } | |
| 255 | |
| 256 // Tests that StrictMock works with a mock class that has a 10-ary | |
| 257 // non-default constructor. | |
| 258 TEST(StrictMockTest, NonDefaultConstructor10) { | |
| 259 StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f', | |
| 260 "g", "h", true, false); | |
| 261 EXPECT_EQ("abcdefghTF", strict_bar.str()); | |
| 262 | |
| 263 EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true), | |
| 264 "Uninteresting mock function call"); | |
| 265 } | |
| 266 | |
| 267 #if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE | |
| 268 // Tests that StrictMock<Mock> compiles where Mock is a user-defined | |
| 269 // class (as opposed to ::testing::Mock). We had to workaround an | |
| 270 // MSVC 8.0 bug that caused the symbol Mock used in the definition of | |
| 271 // StrictMock to be looked up in the wrong context, and this test | |
| 272 // ensures that our fix works. | |
| 273 // | |
| 274 // We have to skip this test on Symbian and Windows Mobile, as it | |
| 275 // causes the program to crash there, for reasons unclear to us yet. | |
| 276 TEST(StrictMockTest, AcceptsClassNamedMock) { | |
| 277 StrictMock< ::Mock> strict; | |
| 278 EXPECT_CALL(strict, DoThis()); | |
| 279 strict.DoThis(); | |
| 280 } | |
| 281 #endif // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE | |
| 282 | |
| 283 } // namespace gmock_nice_strict_test | |
| 284 } // namespace testing | |
| OLD | NEW |