| OLD | NEW |
| (Empty) |
| 1 // Copyright 2007, 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 // Google Mock - a framework for writing C++ mock classes. | |
| 33 // | |
| 34 // This file tests the built-in cardinalities. | |
| 35 | |
| 36 #include <gmock/gmock.h> | |
| 37 #include <gtest/gtest.h> | |
| 38 #include <gtest/gtest-spi.h> | |
| 39 | |
| 40 namespace { | |
| 41 | |
| 42 using std::stringstream; | |
| 43 using testing::AnyNumber; | |
| 44 using testing::AtLeast; | |
| 45 using testing::AtMost; | |
| 46 using testing::Between; | |
| 47 using testing::Cardinality; | |
| 48 using testing::CardinalityInterface; | |
| 49 using testing::Exactly; | |
| 50 using testing::IsSubstring; | |
| 51 using testing::MakeCardinality; | |
| 52 | |
| 53 class MockFoo { | |
| 54 public: | |
| 55 MockFoo() {} | |
| 56 MOCK_METHOD0(Bar, int()); // NOLINT | |
| 57 | |
| 58 private: | |
| 59 GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo); | |
| 60 }; | |
| 61 | |
| 62 // Tests that Cardinality objects can be default constructed. | |
| 63 TEST(CardinalityTest, IsDefaultConstructable) { | |
| 64 Cardinality c; | |
| 65 } | |
| 66 | |
| 67 // Tests that Cardinality objects are copyable. | |
| 68 TEST(CardinalityTest, IsCopyable) { | |
| 69 // Tests the copy constructor. | |
| 70 Cardinality c = Exactly(1); | |
| 71 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
| 72 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
| 73 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
| 74 | |
| 75 // Tests the assignment operator. | |
| 76 c = Exactly(2); | |
| 77 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
| 78 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 79 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
| 80 } | |
| 81 | |
| 82 TEST(CardinalityTest, IsOverSaturatedByCallCountWorks) { | |
| 83 const Cardinality c = AtMost(5); | |
| 84 EXPECT_FALSE(c.IsOverSaturatedByCallCount(4)); | |
| 85 EXPECT_FALSE(c.IsOverSaturatedByCallCount(5)); | |
| 86 EXPECT_TRUE(c.IsOverSaturatedByCallCount(6)); | |
| 87 } | |
| 88 | |
| 89 // Tests that Cardinality::DescribeActualCallCountTo() creates the | |
| 90 // correct description. | |
| 91 TEST(CardinalityTest, CanDescribeActualCallCount) { | |
| 92 stringstream ss0; | |
| 93 Cardinality::DescribeActualCallCountTo(0, &ss0); | |
| 94 EXPECT_EQ("never called", ss0.str()); | |
| 95 | |
| 96 stringstream ss1; | |
| 97 Cardinality::DescribeActualCallCountTo(1, &ss1); | |
| 98 EXPECT_EQ("called once", ss1.str()); | |
| 99 | |
| 100 stringstream ss2; | |
| 101 Cardinality::DescribeActualCallCountTo(2, &ss2); | |
| 102 EXPECT_EQ("called twice", ss2.str()); | |
| 103 | |
| 104 stringstream ss3; | |
| 105 Cardinality::DescribeActualCallCountTo(3, &ss3); | |
| 106 EXPECT_EQ("called 3 times", ss3.str()); | |
| 107 } | |
| 108 | |
| 109 // Tests AnyNumber() | |
| 110 TEST(AnyNumber, Works) { | |
| 111 const Cardinality c = AnyNumber(); | |
| 112 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 113 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 114 | |
| 115 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
| 116 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
| 117 | |
| 118 EXPECT_TRUE(c.IsSatisfiedByCallCount(9)); | |
| 119 EXPECT_FALSE(c.IsSaturatedByCallCount(9)); | |
| 120 | |
| 121 stringstream ss; | |
| 122 c.DescribeTo(&ss); | |
| 123 EXPECT_PRED_FORMAT2(IsSubstring, "called any number of times", | |
| 124 ss.str()); | |
| 125 } | |
| 126 | |
| 127 TEST(AnyNumberTest, HasCorrectBounds) { | |
| 128 const Cardinality c = AnyNumber(); | |
| 129 EXPECT_EQ(0, c.ConservativeLowerBound()); | |
| 130 EXPECT_EQ(INT_MAX, c.ConservativeUpperBound()); | |
| 131 } | |
| 132 | |
| 133 // Tests AtLeast(n). | |
| 134 | |
| 135 TEST(AtLeastTest, OnNegativeNumber) { | |
| 136 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 137 AtLeast(-1); | |
| 138 }, "The invocation lower bound must be >= 0"); | |
| 139 } | |
| 140 | |
| 141 TEST(AtLeastTest, OnZero) { | |
| 142 const Cardinality c = AtLeast(0); | |
| 143 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 144 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 145 | |
| 146 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
| 147 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
| 148 | |
| 149 stringstream ss; | |
| 150 c.DescribeTo(&ss); | |
| 151 EXPECT_PRED_FORMAT2(IsSubstring, "any number of times", | |
| 152 ss.str()); | |
| 153 } | |
| 154 | |
| 155 TEST(AtLeastTest, OnPositiveNumber) { | |
| 156 const Cardinality c = AtLeast(2); | |
| 157 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
| 158 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 159 | |
| 160 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
| 161 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
| 162 | |
| 163 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 164 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
| 165 | |
| 166 stringstream ss1; | |
| 167 AtLeast(1).DescribeTo(&ss1); | |
| 168 EXPECT_PRED_FORMAT2(IsSubstring, "at least once", | |
| 169 ss1.str()); | |
| 170 | |
| 171 stringstream ss2; | |
| 172 c.DescribeTo(&ss2); | |
| 173 EXPECT_PRED_FORMAT2(IsSubstring, "at least twice", | |
| 174 ss2.str()); | |
| 175 | |
| 176 stringstream ss3; | |
| 177 AtLeast(3).DescribeTo(&ss3); | |
| 178 EXPECT_PRED_FORMAT2(IsSubstring, "at least 3 times", | |
| 179 ss3.str()); | |
| 180 } | |
| 181 | |
| 182 TEST(AtLeastTest, HasCorrectBounds) { | |
| 183 const Cardinality c = AtLeast(2); | |
| 184 EXPECT_EQ(2, c.ConservativeLowerBound()); | |
| 185 EXPECT_EQ(INT_MAX, c.ConservativeUpperBound()); | |
| 186 } | |
| 187 | |
| 188 // Tests AtMost(n). | |
| 189 | |
| 190 TEST(AtMostTest, OnNegativeNumber) { | |
| 191 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 192 AtMost(-1); | |
| 193 }, "The invocation upper bound must be >= 0"); | |
| 194 } | |
| 195 | |
| 196 TEST(AtMostTest, OnZero) { | |
| 197 const Cardinality c = AtMost(0); | |
| 198 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 199 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
| 200 | |
| 201 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
| 202 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
| 203 | |
| 204 stringstream ss; | |
| 205 c.DescribeTo(&ss); | |
| 206 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
| 207 ss.str()); | |
| 208 } | |
| 209 | |
| 210 TEST(AtMostTest, OnPositiveNumber) { | |
| 211 const Cardinality c = AtMost(2); | |
| 212 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 213 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 214 | |
| 215 EXPECT_TRUE(c.IsSatisfiedByCallCount(1)); | |
| 216 EXPECT_FALSE(c.IsSaturatedByCallCount(1)); | |
| 217 | |
| 218 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 219 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
| 220 | |
| 221 stringstream ss1; | |
| 222 AtMost(1).DescribeTo(&ss1); | |
| 223 EXPECT_PRED_FORMAT2(IsSubstring, "called at most once", | |
| 224 ss1.str()); | |
| 225 | |
| 226 stringstream ss2; | |
| 227 c.DescribeTo(&ss2); | |
| 228 EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", | |
| 229 ss2.str()); | |
| 230 | |
| 231 stringstream ss3; | |
| 232 AtMost(3).DescribeTo(&ss3); | |
| 233 EXPECT_PRED_FORMAT2(IsSubstring, "called at most 3 times", | |
| 234 ss3.str()); | |
| 235 } | |
| 236 | |
| 237 TEST(AtMostTest, HasCorrectBounds) { | |
| 238 const Cardinality c = AtMost(2); | |
| 239 EXPECT_EQ(0, c.ConservativeLowerBound()); | |
| 240 EXPECT_EQ(2, c.ConservativeUpperBound()); | |
| 241 } | |
| 242 | |
| 243 // Tests Between(m, n). | |
| 244 | |
| 245 TEST(BetweenTest, OnNegativeStart) { | |
| 246 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 247 Between(-1, 2); | |
| 248 }, "The invocation lower bound must be >= 0, but is actually -1"); | |
| 249 } | |
| 250 | |
| 251 TEST(BetweenTest, OnNegativeEnd) { | |
| 252 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 253 Between(1, -2); | |
| 254 }, "The invocation upper bound must be >= 0, but is actually -2"); | |
| 255 } | |
| 256 | |
| 257 TEST(BetweenTest, OnStartBiggerThanEnd) { | |
| 258 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 259 Between(2, 1); | |
| 260 }, "The invocation upper bound (1) must be >= " | |
| 261 "the invocation lower bound (2)"); | |
| 262 } | |
| 263 | |
| 264 TEST(BetweenTest, OnZeroStartAndZeroEnd) { | |
| 265 const Cardinality c = Between(0, 0); | |
| 266 | |
| 267 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 268 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
| 269 | |
| 270 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
| 271 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
| 272 | |
| 273 stringstream ss; | |
| 274 c.DescribeTo(&ss); | |
| 275 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
| 276 ss.str()); | |
| 277 } | |
| 278 | |
| 279 TEST(BetweenTest, OnZeroStartAndNonZeroEnd) { | |
| 280 const Cardinality c = Between(0, 2); | |
| 281 | |
| 282 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 283 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 284 | |
| 285 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 286 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
| 287 | |
| 288 EXPECT_FALSE(c.IsSatisfiedByCallCount(4)); | |
| 289 EXPECT_TRUE(c.IsSaturatedByCallCount(4)); | |
| 290 | |
| 291 stringstream ss; | |
| 292 c.DescribeTo(&ss); | |
| 293 EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice", | |
| 294 ss.str()); | |
| 295 } | |
| 296 | |
| 297 TEST(BetweenTest, OnSameStartAndEnd) { | |
| 298 const Cardinality c = Between(3, 3); | |
| 299 | |
| 300 EXPECT_FALSE(c.IsSatisfiedByCallCount(2)); | |
| 301 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
| 302 | |
| 303 EXPECT_TRUE(c.IsSatisfiedByCallCount(3)); | |
| 304 EXPECT_TRUE(c.IsSaturatedByCallCount(3)); | |
| 305 | |
| 306 EXPECT_FALSE(c.IsSatisfiedByCallCount(4)); | |
| 307 EXPECT_TRUE(c.IsSaturatedByCallCount(4)); | |
| 308 | |
| 309 stringstream ss; | |
| 310 c.DescribeTo(&ss); | |
| 311 EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", | |
| 312 ss.str()); | |
| 313 } | |
| 314 | |
| 315 TEST(BetweenTest, OnDifferentStartAndEnd) { | |
| 316 const Cardinality c = Between(3, 5); | |
| 317 | |
| 318 EXPECT_FALSE(c.IsSatisfiedByCallCount(2)); | |
| 319 EXPECT_FALSE(c.IsSaturatedByCallCount(2)); | |
| 320 | |
| 321 EXPECT_TRUE(c.IsSatisfiedByCallCount(3)); | |
| 322 EXPECT_FALSE(c.IsSaturatedByCallCount(3)); | |
| 323 | |
| 324 EXPECT_TRUE(c.IsSatisfiedByCallCount(5)); | |
| 325 EXPECT_TRUE(c.IsSaturatedByCallCount(5)); | |
| 326 | |
| 327 EXPECT_FALSE(c.IsSatisfiedByCallCount(6)); | |
| 328 EXPECT_TRUE(c.IsSaturatedByCallCount(6)); | |
| 329 | |
| 330 stringstream ss; | |
| 331 c.DescribeTo(&ss); | |
| 332 EXPECT_PRED_FORMAT2(IsSubstring, "called between 3 and 5 times", | |
| 333 ss.str()); | |
| 334 } | |
| 335 | |
| 336 TEST(BetweenTest, HasCorrectBounds) { | |
| 337 const Cardinality c = Between(3, 5); | |
| 338 EXPECT_EQ(3, c.ConservativeLowerBound()); | |
| 339 EXPECT_EQ(5, c.ConservativeUpperBound()); | |
| 340 } | |
| 341 | |
| 342 // Tests Exactly(n). | |
| 343 | |
| 344 TEST(ExactlyTest, OnNegativeNumber) { | |
| 345 EXPECT_NONFATAL_FAILURE({ // NOLINT | |
| 346 Exactly(-1); | |
| 347 }, "The invocation lower bound must be >= 0"); | |
| 348 } | |
| 349 | |
| 350 TEST(ExactlyTest, OnZero) { | |
| 351 const Cardinality c = Exactly(0); | |
| 352 EXPECT_TRUE(c.IsSatisfiedByCallCount(0)); | |
| 353 EXPECT_TRUE(c.IsSaturatedByCallCount(0)); | |
| 354 | |
| 355 EXPECT_FALSE(c.IsSatisfiedByCallCount(1)); | |
| 356 EXPECT_TRUE(c.IsSaturatedByCallCount(1)); | |
| 357 | |
| 358 stringstream ss; | |
| 359 c.DescribeTo(&ss); | |
| 360 EXPECT_PRED_FORMAT2(IsSubstring, "never called", | |
| 361 ss.str()); | |
| 362 } | |
| 363 | |
| 364 TEST(ExactlyTest, OnPositiveNumber) { | |
| 365 const Cardinality c = Exactly(2); | |
| 366 EXPECT_FALSE(c.IsSatisfiedByCallCount(0)); | |
| 367 EXPECT_FALSE(c.IsSaturatedByCallCount(0)); | |
| 368 | |
| 369 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 370 EXPECT_TRUE(c.IsSaturatedByCallCount(2)); | |
| 371 | |
| 372 stringstream ss1; | |
| 373 Exactly(1).DescribeTo(&ss1); | |
| 374 EXPECT_PRED_FORMAT2(IsSubstring, "called once", | |
| 375 ss1.str()); | |
| 376 | |
| 377 stringstream ss2; | |
| 378 c.DescribeTo(&ss2); | |
| 379 EXPECT_PRED_FORMAT2(IsSubstring, "called twice", | |
| 380 ss2.str()); | |
| 381 | |
| 382 stringstream ss3; | |
| 383 Exactly(3).DescribeTo(&ss3); | |
| 384 EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times", | |
| 385 ss3.str()); | |
| 386 } | |
| 387 | |
| 388 TEST(ExactlyTest, HasCorrectBounds) { | |
| 389 const Cardinality c = Exactly(3); | |
| 390 EXPECT_EQ(3, c.ConservativeLowerBound()); | |
| 391 EXPECT_EQ(3, c.ConservativeUpperBound()); | |
| 392 } | |
| 393 | |
| 394 // Tests that a user can make his own cardinality by implementing | |
| 395 // CardinalityInterface and calling MakeCardinality(). | |
| 396 | |
| 397 class EvenCardinality : public CardinalityInterface { | |
| 398 public: | |
| 399 // Returns true iff call_count calls will satisfy this cardinality. | |
| 400 virtual bool IsSatisfiedByCallCount(int call_count) const { | |
| 401 return (call_count % 2 == 0); | |
| 402 } | |
| 403 | |
| 404 // Returns true iff call_count calls will saturate this cardinality. | |
| 405 virtual bool IsSaturatedByCallCount(int /* call_count */) const { | |
| 406 return false; | |
| 407 } | |
| 408 | |
| 409 // Describes self to an ostream. | |
| 410 virtual void DescribeTo(::std::ostream* ss) const { | |
| 411 *ss << "called even number of times"; | |
| 412 } | |
| 413 }; | |
| 414 | |
| 415 TEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) { | |
| 416 const Cardinality c = MakeCardinality(new EvenCardinality); | |
| 417 | |
| 418 EXPECT_TRUE(c.IsSatisfiedByCallCount(2)); | |
| 419 EXPECT_FALSE(c.IsSatisfiedByCallCount(3)); | |
| 420 | |
| 421 EXPECT_FALSE(c.IsSaturatedByCallCount(10000)); | |
| 422 | |
| 423 stringstream ss; | |
| 424 c.DescribeTo(&ss); | |
| 425 EXPECT_EQ("called even number of times", ss.str()); | |
| 426 } | |
| 427 | |
| 428 } // Unnamed namespace | |
| OLD | NEW |