Home | History | Annotate | Download | only in test
      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 (at) 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
    429