113481Sgiacomo.travaglini@arm.com// Copyright 2007, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com// Google Mock - a framework for writing C++ mock classes.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// This file tests the built-in cardinalities.
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h"
3713481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3813481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h"
3913481Sgiacomo.travaglini@arm.com
4013481Sgiacomo.travaglini@arm.comnamespace {
4113481Sgiacomo.travaglini@arm.com
4213481Sgiacomo.travaglini@arm.comusing std::stringstream;
4313481Sgiacomo.travaglini@arm.comusing testing::AnyNumber;
4413481Sgiacomo.travaglini@arm.comusing testing::AtLeast;
4513481Sgiacomo.travaglini@arm.comusing testing::AtMost;
4613481Sgiacomo.travaglini@arm.comusing testing::Between;
4713481Sgiacomo.travaglini@arm.comusing testing::Cardinality;
4813481Sgiacomo.travaglini@arm.comusing testing::CardinalityInterface;
4913481Sgiacomo.travaglini@arm.comusing testing::Exactly;
5013481Sgiacomo.travaglini@arm.comusing testing::IsSubstring;
5113481Sgiacomo.travaglini@arm.comusing testing::MakeCardinality;
5213481Sgiacomo.travaglini@arm.com
5313481Sgiacomo.travaglini@arm.comclass MockFoo {
5413481Sgiacomo.travaglini@arm.com public:
5513481Sgiacomo.travaglini@arm.com  MockFoo() {}
5613481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(Bar, int());  // NOLINT
5713481Sgiacomo.travaglini@arm.com
5813481Sgiacomo.travaglini@arm.com private:
5913481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
6013481Sgiacomo.travaglini@arm.com};
6113481Sgiacomo.travaglini@arm.com
6213481Sgiacomo.travaglini@arm.com// Tests that Cardinality objects can be default constructed.
6313481Sgiacomo.travaglini@arm.comTEST(CardinalityTest, IsDefaultConstructable) {
6413481Sgiacomo.travaglini@arm.com  Cardinality c;
6513481Sgiacomo.travaglini@arm.com}
6613481Sgiacomo.travaglini@arm.com
6713481Sgiacomo.travaglini@arm.com// Tests that Cardinality objects are copyable.
6813481Sgiacomo.travaglini@arm.comTEST(CardinalityTest, IsCopyable) {
6913481Sgiacomo.travaglini@arm.com  // Tests the copy constructor.
7013481Sgiacomo.travaglini@arm.com  Cardinality c = Exactly(1);
7113481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
7213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
7313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(1));
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com  // Tests the assignment operator.
7613481Sgiacomo.travaglini@arm.com  c = Exactly(2);
7713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
7813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
7913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(2));
8013481Sgiacomo.travaglini@arm.com}
8113481Sgiacomo.travaglini@arm.com
8213481Sgiacomo.travaglini@arm.comTEST(CardinalityTest, IsOverSaturatedByCallCountWorks) {
8313481Sgiacomo.travaglini@arm.com  const Cardinality c = AtMost(5);
8413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsOverSaturatedByCallCount(4));
8513481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsOverSaturatedByCallCount(5));
8613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsOverSaturatedByCallCount(6));
8713481Sgiacomo.travaglini@arm.com}
8813481Sgiacomo.travaglini@arm.com
8913481Sgiacomo.travaglini@arm.com// Tests that Cardinality::DescribeActualCallCountTo() creates the
9013481Sgiacomo.travaglini@arm.com// correct description.
9113481Sgiacomo.travaglini@arm.comTEST(CardinalityTest, CanDescribeActualCallCount) {
9213481Sgiacomo.travaglini@arm.com  stringstream ss0;
9313481Sgiacomo.travaglini@arm.com  Cardinality::DescribeActualCallCountTo(0, &ss0);
9413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("never called", ss0.str());
9513481Sgiacomo.travaglini@arm.com
9613481Sgiacomo.travaglini@arm.com  stringstream ss1;
9713481Sgiacomo.travaglini@arm.com  Cardinality::DescribeActualCallCountTo(1, &ss1);
9813481Sgiacomo.travaglini@arm.com  EXPECT_EQ("called once", ss1.str());
9913481Sgiacomo.travaglini@arm.com
10013481Sgiacomo.travaglini@arm.com  stringstream ss2;
10113481Sgiacomo.travaglini@arm.com  Cardinality::DescribeActualCallCountTo(2, &ss2);
10213481Sgiacomo.travaglini@arm.com  EXPECT_EQ("called twice", ss2.str());
10313481Sgiacomo.travaglini@arm.com
10413481Sgiacomo.travaglini@arm.com  stringstream ss3;
10513481Sgiacomo.travaglini@arm.com  Cardinality::DescribeActualCallCountTo(3, &ss3);
10613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("called 3 times", ss3.str());
10713481Sgiacomo.travaglini@arm.com}
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com// Tests AnyNumber()
11013481Sgiacomo.travaglini@arm.comTEST(AnyNumber, Works) {
11113481Sgiacomo.travaglini@arm.com  const Cardinality c = AnyNumber();
11213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
11313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
11613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(1));
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(9));
11913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(9));
12013481Sgiacomo.travaglini@arm.com
12113481Sgiacomo.travaglini@arm.com  stringstream ss;
12213481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
12313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called any number of times",
12413481Sgiacomo.travaglini@arm.com                      ss.str());
12513481Sgiacomo.travaglini@arm.com}
12613481Sgiacomo.travaglini@arm.com
12713481Sgiacomo.travaglini@arm.comTEST(AnyNumberTest, HasCorrectBounds) {
12813481Sgiacomo.travaglini@arm.com  const Cardinality c = AnyNumber();
12913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, c.ConservativeLowerBound());
13013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
13113481Sgiacomo.travaglini@arm.com}
13213481Sgiacomo.travaglini@arm.com
13313481Sgiacomo.travaglini@arm.com// Tests AtLeast(n).
13413481Sgiacomo.travaglini@arm.com
13513481Sgiacomo.travaglini@arm.comTEST(AtLeastTest, OnNegativeNumber) {
13613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
13713481Sgiacomo.travaglini@arm.com    AtLeast(-1);
13813481Sgiacomo.travaglini@arm.com  }, "The invocation lower bound must be >= 0");
13913481Sgiacomo.travaglini@arm.com}
14013481Sgiacomo.travaglini@arm.com
14113481Sgiacomo.travaglini@arm.comTEST(AtLeastTest, OnZero) {
14213481Sgiacomo.travaglini@arm.com  const Cardinality c = AtLeast(0);
14313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
14413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
14513481Sgiacomo.travaglini@arm.com
14613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
14713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(1));
14813481Sgiacomo.travaglini@arm.com
14913481Sgiacomo.travaglini@arm.com  stringstream ss;
15013481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
15113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "any number of times",
15213481Sgiacomo.travaglini@arm.com                      ss.str());
15313481Sgiacomo.travaglini@arm.com}
15413481Sgiacomo.travaglini@arm.com
15513481Sgiacomo.travaglini@arm.comTEST(AtLeastTest, OnPositiveNumber) {
15613481Sgiacomo.travaglini@arm.com  const Cardinality c = AtLeast(2);
15713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
15813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
15913481Sgiacomo.travaglini@arm.com
16013481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
16113481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(1));
16213481Sgiacomo.travaglini@arm.com
16313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
16413481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(2));
16513481Sgiacomo.travaglini@arm.com
16613481Sgiacomo.travaglini@arm.com  stringstream ss1;
16713481Sgiacomo.travaglini@arm.com  AtLeast(1).DescribeTo(&ss1);
16813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "at least once",
16913481Sgiacomo.travaglini@arm.com                      ss1.str());
17013481Sgiacomo.travaglini@arm.com
17113481Sgiacomo.travaglini@arm.com  stringstream ss2;
17213481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss2);
17313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "at least twice",
17413481Sgiacomo.travaglini@arm.com                      ss2.str());
17513481Sgiacomo.travaglini@arm.com
17613481Sgiacomo.travaglini@arm.com  stringstream ss3;
17713481Sgiacomo.travaglini@arm.com  AtLeast(3).DescribeTo(&ss3);
17813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "at least 3 times",
17913481Sgiacomo.travaglini@arm.com                      ss3.str());
18013481Sgiacomo.travaglini@arm.com}
18113481Sgiacomo.travaglini@arm.com
18213481Sgiacomo.travaglini@arm.comTEST(AtLeastTest, HasCorrectBounds) {
18313481Sgiacomo.travaglini@arm.com  const Cardinality c = AtLeast(2);
18413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, c.ConservativeLowerBound());
18513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(INT_MAX, c.ConservativeUpperBound());
18613481Sgiacomo.travaglini@arm.com}
18713481Sgiacomo.travaglini@arm.com
18813481Sgiacomo.travaglini@arm.com// Tests AtMost(n).
18913481Sgiacomo.travaglini@arm.com
19013481Sgiacomo.travaglini@arm.comTEST(AtMostTest, OnNegativeNumber) {
19113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
19213481Sgiacomo.travaglini@arm.com    AtMost(-1);
19313481Sgiacomo.travaglini@arm.com  }, "The invocation upper bound must be >= 0");
19413481Sgiacomo.travaglini@arm.com}
19513481Sgiacomo.travaglini@arm.com
19613481Sgiacomo.travaglini@arm.comTEST(AtMostTest, OnZero) {
19713481Sgiacomo.travaglini@arm.com  const Cardinality c = AtMost(0);
19813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
19913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(0));
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
20213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(1));
20313481Sgiacomo.travaglini@arm.com
20413481Sgiacomo.travaglini@arm.com  stringstream ss;
20513481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
20613481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "never called",
20713481Sgiacomo.travaglini@arm.com                      ss.str());
20813481Sgiacomo.travaglini@arm.com}
20913481Sgiacomo.travaglini@arm.com
21013481Sgiacomo.travaglini@arm.comTEST(AtMostTest, OnPositiveNumber) {
21113481Sgiacomo.travaglini@arm.com  const Cardinality c = AtMost(2);
21213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
21313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(1));
21613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(1));
21713481Sgiacomo.travaglini@arm.com
21813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
21913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(2));
22013481Sgiacomo.travaglini@arm.com
22113481Sgiacomo.travaglini@arm.com  stringstream ss1;
22213481Sgiacomo.travaglini@arm.com  AtMost(1).DescribeTo(&ss1);
22313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called at most once",
22413481Sgiacomo.travaglini@arm.com                      ss1.str());
22513481Sgiacomo.travaglini@arm.com
22613481Sgiacomo.travaglini@arm.com  stringstream ss2;
22713481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss2);
22813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice",
22913481Sgiacomo.travaglini@arm.com                      ss2.str());
23013481Sgiacomo.travaglini@arm.com
23113481Sgiacomo.travaglini@arm.com  stringstream ss3;
23213481Sgiacomo.travaglini@arm.com  AtMost(3).DescribeTo(&ss3);
23313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called at most 3 times",
23413481Sgiacomo.travaglini@arm.com                      ss3.str());
23513481Sgiacomo.travaglini@arm.com}
23613481Sgiacomo.travaglini@arm.com
23713481Sgiacomo.travaglini@arm.comTEST(AtMostTest, HasCorrectBounds) {
23813481Sgiacomo.travaglini@arm.com  const Cardinality c = AtMost(2);
23913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, c.ConservativeLowerBound());
24013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, c.ConservativeUpperBound());
24113481Sgiacomo.travaglini@arm.com}
24213481Sgiacomo.travaglini@arm.com
24313481Sgiacomo.travaglini@arm.com// Tests Between(m, n).
24413481Sgiacomo.travaglini@arm.com
24513481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnNegativeStart) {
24613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
24713481Sgiacomo.travaglini@arm.com    Between(-1, 2);
24813481Sgiacomo.travaglini@arm.com  }, "The invocation lower bound must be >= 0, but is actually -1");
24913481Sgiacomo.travaglini@arm.com}
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnNegativeEnd) {
25213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
25313481Sgiacomo.travaglini@arm.com    Between(1, -2);
25413481Sgiacomo.travaglini@arm.com  }, "The invocation upper bound must be >= 0, but is actually -2");
25513481Sgiacomo.travaglini@arm.com}
25613481Sgiacomo.travaglini@arm.com
25713481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnStartBiggerThanEnd) {
25813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
25913481Sgiacomo.travaglini@arm.com    Between(2, 1);
26013481Sgiacomo.travaglini@arm.com  }, "The invocation upper bound (1) must be >= "
26113481Sgiacomo.travaglini@arm.com     "the invocation lower bound (2)");
26213481Sgiacomo.travaglini@arm.com}
26313481Sgiacomo.travaglini@arm.com
26413481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnZeroStartAndZeroEnd) {
26513481Sgiacomo.travaglini@arm.com  const Cardinality c = Between(0, 0);
26613481Sgiacomo.travaglini@arm.com
26713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
26813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(0));
26913481Sgiacomo.travaglini@arm.com
27013481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
27113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(1));
27213481Sgiacomo.travaglini@arm.com
27313481Sgiacomo.travaglini@arm.com  stringstream ss;
27413481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
27513481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "never called",
27613481Sgiacomo.travaglini@arm.com                      ss.str());
27713481Sgiacomo.travaglini@arm.com}
27813481Sgiacomo.travaglini@arm.com
27913481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnZeroStartAndNonZeroEnd) {
28013481Sgiacomo.travaglini@arm.com  const Cardinality c = Between(0, 2);
28113481Sgiacomo.travaglini@arm.com
28213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
28313481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
28413481Sgiacomo.travaglini@arm.com
28513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
28613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(2));
28713481Sgiacomo.travaglini@arm.com
28813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
28913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(4));
29013481Sgiacomo.travaglini@arm.com
29113481Sgiacomo.travaglini@arm.com  stringstream ss;
29213481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
29313481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called at most twice",
29413481Sgiacomo.travaglini@arm.com                      ss.str());
29513481Sgiacomo.travaglini@arm.com}
29613481Sgiacomo.travaglini@arm.com
29713481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnSameStartAndEnd) {
29813481Sgiacomo.travaglini@arm.com  const Cardinality c = Between(3, 3);
29913481Sgiacomo.travaglini@arm.com
30013481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
30113481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(2));
30213481Sgiacomo.travaglini@arm.com
30313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
30413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(3));
30513481Sgiacomo.travaglini@arm.com
30613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(4));
30713481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(4));
30813481Sgiacomo.travaglini@arm.com
30913481Sgiacomo.travaglini@arm.com  stringstream ss;
31013481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
31113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times",
31213481Sgiacomo.travaglini@arm.com                      ss.str());
31313481Sgiacomo.travaglini@arm.com}
31413481Sgiacomo.travaglini@arm.com
31513481Sgiacomo.travaglini@arm.comTEST(BetweenTest, OnDifferentStartAndEnd) {
31613481Sgiacomo.travaglini@arm.com  const Cardinality c = Between(3, 5);
31713481Sgiacomo.travaglini@arm.com
31813481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(2));
31913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(2));
32013481Sgiacomo.travaglini@arm.com
32113481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(3));
32213481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(3));
32313481Sgiacomo.travaglini@arm.com
32413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(5));
32513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(5));
32613481Sgiacomo.travaglini@arm.com
32713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(6));
32813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(6));
32913481Sgiacomo.travaglini@arm.com
33013481Sgiacomo.travaglini@arm.com  stringstream ss;
33113481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
33213481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called between 3 and 5 times",
33313481Sgiacomo.travaglini@arm.com                      ss.str());
33413481Sgiacomo.travaglini@arm.com}
33513481Sgiacomo.travaglini@arm.com
33613481Sgiacomo.travaglini@arm.comTEST(BetweenTest, HasCorrectBounds) {
33713481Sgiacomo.travaglini@arm.com  const Cardinality c = Between(3, 5);
33813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, c.ConservativeLowerBound());
33913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(5, c.ConservativeUpperBound());
34013481Sgiacomo.travaglini@arm.com}
34113481Sgiacomo.travaglini@arm.com
34213481Sgiacomo.travaglini@arm.com// Tests Exactly(n).
34313481Sgiacomo.travaglini@arm.com
34413481Sgiacomo.travaglini@arm.comTEST(ExactlyTest, OnNegativeNumber) {
34513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
34613481Sgiacomo.travaglini@arm.com    Exactly(-1);
34713481Sgiacomo.travaglini@arm.com  }, "The invocation lower bound must be >= 0");
34813481Sgiacomo.travaglini@arm.com}
34913481Sgiacomo.travaglini@arm.com
35013481Sgiacomo.travaglini@arm.comTEST(ExactlyTest, OnZero) {
35113481Sgiacomo.travaglini@arm.com  const Cardinality c = Exactly(0);
35213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(0));
35313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(0));
35413481Sgiacomo.travaglini@arm.com
35513481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(1));
35613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(1));
35713481Sgiacomo.travaglini@arm.com
35813481Sgiacomo.travaglini@arm.com  stringstream ss;
35913481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
36013481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "never called",
36113481Sgiacomo.travaglini@arm.com                      ss.str());
36213481Sgiacomo.travaglini@arm.com}
36313481Sgiacomo.travaglini@arm.com
36413481Sgiacomo.travaglini@arm.comTEST(ExactlyTest, OnPositiveNumber) {
36513481Sgiacomo.travaglini@arm.com  const Cardinality c = Exactly(2);
36613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(0));
36713481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(0));
36813481Sgiacomo.travaglini@arm.com
36913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
37013481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSaturatedByCallCount(2));
37113481Sgiacomo.travaglini@arm.com
37213481Sgiacomo.travaglini@arm.com  stringstream ss1;
37313481Sgiacomo.travaglini@arm.com  Exactly(1).DescribeTo(&ss1);
37413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called once",
37513481Sgiacomo.travaglini@arm.com                      ss1.str());
37613481Sgiacomo.travaglini@arm.com
37713481Sgiacomo.travaglini@arm.com  stringstream ss2;
37813481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss2);
37913481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called twice",
38013481Sgiacomo.travaglini@arm.com                      ss2.str());
38113481Sgiacomo.travaglini@arm.com
38213481Sgiacomo.travaglini@arm.com  stringstream ss3;
38313481Sgiacomo.travaglini@arm.com  Exactly(3).DescribeTo(&ss3);
38413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "called 3 times",
38513481Sgiacomo.travaglini@arm.com                      ss3.str());
38613481Sgiacomo.travaglini@arm.com}
38713481Sgiacomo.travaglini@arm.com
38813481Sgiacomo.travaglini@arm.comTEST(ExactlyTest, HasCorrectBounds) {
38913481Sgiacomo.travaglini@arm.com  const Cardinality c = Exactly(3);
39013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, c.ConservativeLowerBound());
39113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, c.ConservativeUpperBound());
39213481Sgiacomo.travaglini@arm.com}
39313481Sgiacomo.travaglini@arm.com
39413481Sgiacomo.travaglini@arm.com// Tests that a user can make his own cardinality by implementing
39513481Sgiacomo.travaglini@arm.com// CardinalityInterface and calling MakeCardinality().
39613481Sgiacomo.travaglini@arm.com
39713481Sgiacomo.travaglini@arm.comclass EvenCardinality : public CardinalityInterface {
39813481Sgiacomo.travaglini@arm.com public:
39913481Sgiacomo.travaglini@arm.com  // Returns true iff call_count calls will satisfy this cardinality.
40013481Sgiacomo.travaglini@arm.com  virtual bool IsSatisfiedByCallCount(int call_count) const {
40113481Sgiacomo.travaglini@arm.com    return (call_count % 2 == 0);
40213481Sgiacomo.travaglini@arm.com  }
40313481Sgiacomo.travaglini@arm.com
40413481Sgiacomo.travaglini@arm.com  // Returns true iff call_count calls will saturate this cardinality.
40513481Sgiacomo.travaglini@arm.com  virtual bool IsSaturatedByCallCount(int /* call_count */) const {
40613481Sgiacomo.travaglini@arm.com    return false;
40713481Sgiacomo.travaglini@arm.com  }
40813481Sgiacomo.travaglini@arm.com
40913481Sgiacomo.travaglini@arm.com  // Describes self to an ostream.
41013481Sgiacomo.travaglini@arm.com  virtual void DescribeTo(::std::ostream* ss) const {
41113481Sgiacomo.travaglini@arm.com    *ss << "called even number of times";
41213481Sgiacomo.travaglini@arm.com  }
41313481Sgiacomo.travaglini@arm.com};
41413481Sgiacomo.travaglini@arm.com
41513481Sgiacomo.travaglini@arm.comTEST(MakeCardinalityTest, ConstructsCardinalityFromInterface) {
41613481Sgiacomo.travaglini@arm.com  const Cardinality c = MakeCardinality(new EvenCardinality);
41713481Sgiacomo.travaglini@arm.com
41813481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(c.IsSatisfiedByCallCount(2));
41913481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSatisfiedByCallCount(3));
42013481Sgiacomo.travaglini@arm.com
42113481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(c.IsSaturatedByCallCount(10000));
42213481Sgiacomo.travaglini@arm.com
42313481Sgiacomo.travaglini@arm.com  stringstream ss;
42413481Sgiacomo.travaglini@arm.com  c.DescribeTo(&ss);
42513481Sgiacomo.travaglini@arm.com  EXPECT_EQ("called even number of times", ss.str());
42613481Sgiacomo.travaglini@arm.com}
42713481Sgiacomo.travaglini@arm.com
42813481Sgiacomo.travaglini@arm.com}  // Unnamed namespace
429