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 spec builder syntax.
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com#include "gmock/gmock-spec-builders.h"
3713481Sgiacomo.travaglini@arm.com
3813481Sgiacomo.travaglini@arm.com#include <ostream>  // NOLINT
3913481Sgiacomo.travaglini@arm.com#include <sstream>
4013481Sgiacomo.travaglini@arm.com#include <string>
4113481Sgiacomo.travaglini@arm.com
4213481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h"
4313481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h"
4413481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
4513481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h"
4613481Sgiacomo.travaglini@arm.com#include "gtest/internal/gtest-port.h"
4713481Sgiacomo.travaglini@arm.com
4813481Sgiacomo.travaglini@arm.comnamespace testing {
4913481Sgiacomo.travaglini@arm.comnamespace internal {
5013481Sgiacomo.travaglini@arm.com
5113481Sgiacomo.travaglini@arm.com// Helper class for testing the Expectation class template.
5213481Sgiacomo.travaglini@arm.comclass ExpectationTester {
5313481Sgiacomo.travaglini@arm.com public:
5413481Sgiacomo.travaglini@arm.com  // Sets the call count of the given expectation to the given number.
5513481Sgiacomo.travaglini@arm.com  void SetCallCount(int n, ExpectationBase* exp) {
5613481Sgiacomo.travaglini@arm.com    exp->call_count_ = n;
5713481Sgiacomo.travaglini@arm.com  }
5813481Sgiacomo.travaglini@arm.com};
5913481Sgiacomo.travaglini@arm.com
6013481Sgiacomo.travaglini@arm.com}  // namespace internal
6113481Sgiacomo.travaglini@arm.com}  // namespace testing
6213481Sgiacomo.travaglini@arm.com
6313481Sgiacomo.travaglini@arm.comnamespace {
6413481Sgiacomo.travaglini@arm.com
6513481Sgiacomo.travaglini@arm.comusing testing::_;
6613481Sgiacomo.travaglini@arm.comusing testing::AnyNumber;
6713481Sgiacomo.travaglini@arm.comusing testing::AtLeast;
6813481Sgiacomo.travaglini@arm.comusing testing::AtMost;
6913481Sgiacomo.travaglini@arm.comusing testing::Between;
7013481Sgiacomo.travaglini@arm.comusing testing::Cardinality;
7113481Sgiacomo.travaglini@arm.comusing testing::CardinalityInterface;
7213481Sgiacomo.travaglini@arm.comusing testing::ContainsRegex;
7313481Sgiacomo.travaglini@arm.comusing testing::Const;
7413481Sgiacomo.travaglini@arm.comusing testing::DoAll;
7513481Sgiacomo.travaglini@arm.comusing testing::DoDefault;
7613481Sgiacomo.travaglini@arm.comusing testing::Eq;
7713481Sgiacomo.travaglini@arm.comusing testing::Expectation;
7813481Sgiacomo.travaglini@arm.comusing testing::ExpectationSet;
7913481Sgiacomo.travaglini@arm.comusing testing::GMOCK_FLAG(verbose);
8013481Sgiacomo.travaglini@arm.comusing testing::Gt;
8113481Sgiacomo.travaglini@arm.comusing testing::InSequence;
8213481Sgiacomo.travaglini@arm.comusing testing::Invoke;
8313481Sgiacomo.travaglini@arm.comusing testing::InvokeWithoutArgs;
8413481Sgiacomo.travaglini@arm.comusing testing::IsNotSubstring;
8513481Sgiacomo.travaglini@arm.comusing testing::IsSubstring;
8613481Sgiacomo.travaglini@arm.comusing testing::Lt;
8713481Sgiacomo.travaglini@arm.comusing testing::Message;
8813481Sgiacomo.travaglini@arm.comusing testing::Mock;
8913481Sgiacomo.travaglini@arm.comusing testing::NaggyMock;
9013481Sgiacomo.travaglini@arm.comusing testing::Ne;
9113481Sgiacomo.travaglini@arm.comusing testing::Return;
9213481Sgiacomo.travaglini@arm.comusing testing::Sequence;
9313481Sgiacomo.travaglini@arm.comusing testing::SetArgPointee;
9413481Sgiacomo.travaglini@arm.comusing testing::internal::ExpectationTester;
9513481Sgiacomo.travaglini@arm.comusing testing::internal::FormatFileLocation;
9613481Sgiacomo.travaglini@arm.comusing testing::internal::kErrorVerbosity;
9713481Sgiacomo.travaglini@arm.comusing testing::internal::kInfoVerbosity;
9813481Sgiacomo.travaglini@arm.comusing testing::internal::kWarningVerbosity;
9913481Sgiacomo.travaglini@arm.comusing testing::internal::linked_ptr;
10013481Sgiacomo.travaglini@arm.comusing testing::internal::string;
10113481Sgiacomo.travaglini@arm.com
10213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
10313481Sgiacomo.travaglini@arm.comusing testing::HasSubstr;
10413481Sgiacomo.travaglini@arm.comusing testing::internal::CaptureStdout;
10513481Sgiacomo.travaglini@arm.comusing testing::internal::GetCapturedStdout;
10613481Sgiacomo.travaglini@arm.com#endif
10713481Sgiacomo.travaglini@arm.com
10813481Sgiacomo.travaglini@arm.comclass Incomplete;
10913481Sgiacomo.travaglini@arm.com
11013481Sgiacomo.travaglini@arm.comclass MockIncomplete {
11113481Sgiacomo.travaglini@arm.com public:
11213481Sgiacomo.travaglini@arm.com  // This line verifies that a mock method can take a by-reference
11313481Sgiacomo.travaglini@arm.com  // argument of an incomplete type.
11413481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(ByRefFunc, void(const Incomplete& x));
11513481Sgiacomo.travaglini@arm.com};
11613481Sgiacomo.travaglini@arm.com
11713481Sgiacomo.travaglini@arm.com// Tells Google Mock how to print a value of type Incomplete.
11813481Sgiacomo.travaglini@arm.comvoid PrintTo(const Incomplete& x, ::std::ostream* os);
11913481Sgiacomo.travaglini@arm.com
12013481Sgiacomo.travaglini@arm.comTEST(MockMethodTest, CanInstantiateWithIncompleteArgType) {
12113481Sgiacomo.travaglini@arm.com  // Even though this mock class contains a mock method that takes
12213481Sgiacomo.travaglini@arm.com  // by-reference an argument whose type is incomplete, we can still
12313481Sgiacomo.travaglini@arm.com  // use the mock, as long as Google Mock knows how to print the
12413481Sgiacomo.travaglini@arm.com  // argument.
12513481Sgiacomo.travaglini@arm.com  MockIncomplete incomplete;
12613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(incomplete, ByRefFunc(_))
12713481Sgiacomo.travaglini@arm.com      .Times(AnyNumber());
12813481Sgiacomo.travaglini@arm.com}
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com// The definition of the printer for the argument type doesn't have to
13113481Sgiacomo.travaglini@arm.com// be visible where the mock is used.
13213481Sgiacomo.travaglini@arm.comvoid PrintTo(const Incomplete& /* x */, ::std::ostream* os) {
13313481Sgiacomo.travaglini@arm.com  *os << "incomplete";
13413481Sgiacomo.travaglini@arm.com}
13513481Sgiacomo.travaglini@arm.com
13613481Sgiacomo.travaglini@arm.comclass Result {};
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.com// A type that's not default constructible.
13913481Sgiacomo.travaglini@arm.comclass NonDefaultConstructible {
14013481Sgiacomo.travaglini@arm.com public:
14113481Sgiacomo.travaglini@arm.com  explicit NonDefaultConstructible(int /* dummy */) {}
14213481Sgiacomo.travaglini@arm.com};
14313481Sgiacomo.travaglini@arm.com
14413481Sgiacomo.travaglini@arm.comclass MockA {
14513481Sgiacomo.travaglini@arm.com public:
14613481Sgiacomo.travaglini@arm.com  MockA() {}
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(DoA, void(int n));
14913481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(ReturnResult, Result(int n));
15013481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(ReturnNonDefaultConstructible, NonDefaultConstructible());
15113481Sgiacomo.travaglini@arm.com  MOCK_METHOD2(Binary, bool(int x, int y));
15213481Sgiacomo.travaglini@arm.com  MOCK_METHOD2(ReturnInt, int(int x, int y));
15313481Sgiacomo.travaglini@arm.com
15413481Sgiacomo.travaglini@arm.com private:
15513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockA);
15613481Sgiacomo.travaglini@arm.com};
15713481Sgiacomo.travaglini@arm.com
15813481Sgiacomo.travaglini@arm.comclass MockB {
15913481Sgiacomo.travaglini@arm.com public:
16013481Sgiacomo.travaglini@arm.com  MockB() {}
16113481Sgiacomo.travaglini@arm.com
16213481Sgiacomo.travaglini@arm.com  MOCK_CONST_METHOD0(DoB, int());  // NOLINT
16313481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(DoB, int(int n));  // NOLINT
16413481Sgiacomo.travaglini@arm.com
16513481Sgiacomo.travaglini@arm.com private:
16613481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
16713481Sgiacomo.travaglini@arm.com};
16813481Sgiacomo.travaglini@arm.com
16913481Sgiacomo.travaglini@arm.comclass ReferenceHoldingMock {
17013481Sgiacomo.travaglini@arm.com public:
17113481Sgiacomo.travaglini@arm.com  ReferenceHoldingMock() {}
17213481Sgiacomo.travaglini@arm.com
17313481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(AcceptReference, void(linked_ptr<MockA>*));
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.com private:
17613481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(ReferenceHoldingMock);
17713481Sgiacomo.travaglini@arm.com};
17813481Sgiacomo.travaglini@arm.com
17913481Sgiacomo.travaglini@arm.com// Tests that EXPECT_CALL and ON_CALL compile in a presence of macro
18013481Sgiacomo.travaglini@arm.com// redefining a mock method name. This could happen, for example, when
18113481Sgiacomo.travaglini@arm.com// the tested code #includes Win32 API headers which define many APIs
18213481Sgiacomo.travaglini@arm.com// as macros, e.g. #define TextOut TextOutW.
18313481Sgiacomo.travaglini@arm.com
18413481Sgiacomo.travaglini@arm.com#define Method MethodW
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.comclass CC {
18713481Sgiacomo.travaglini@arm.com public:
18813481Sgiacomo.travaglini@arm.com  virtual ~CC() {}
18913481Sgiacomo.travaglini@arm.com  virtual int Method() = 0;
19013481Sgiacomo.travaglini@arm.com};
19113481Sgiacomo.travaglini@arm.comclass MockCC : public CC {
19213481Sgiacomo.travaglini@arm.com public:
19313481Sgiacomo.travaglini@arm.com  MockCC() {}
19413481Sgiacomo.travaglini@arm.com
19513481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(Method, int());
19613481Sgiacomo.travaglini@arm.com
19713481Sgiacomo.travaglini@arm.com private:
19813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockCC);
19913481Sgiacomo.travaglini@arm.com};
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com// Tests that a method with expanded name compiles.
20213481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
20313481Sgiacomo.travaglini@arm.com  MockCC cc;
20413481Sgiacomo.travaglini@arm.com  ON_CALL(cc, Method());
20513481Sgiacomo.travaglini@arm.com}
20613481Sgiacomo.travaglini@arm.com
20713481Sgiacomo.travaglini@arm.com// Tests that the method with expanded name not only compiles but runs
20813481Sgiacomo.travaglini@arm.com// and returns a correct value, too.
20913481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
21013481Sgiacomo.travaglini@arm.com  MockCC cc;
21113481Sgiacomo.travaglini@arm.com  ON_CALL(cc, Method()).WillByDefault(Return(42));
21213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(42, cc.Method());
21313481Sgiacomo.travaglini@arm.com}
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com// Tests that a method with expanded name compiles.
21613481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
21713481Sgiacomo.travaglini@arm.com  MockCC cc;
21813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(cc, Method());
21913481Sgiacomo.travaglini@arm.com  cc.Method();
22013481Sgiacomo.travaglini@arm.com}
22113481Sgiacomo.travaglini@arm.com
22213481Sgiacomo.travaglini@arm.com// Tests that it works, too.
22313481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
22413481Sgiacomo.travaglini@arm.com  MockCC cc;
22513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(cc, Method()).WillOnce(Return(42));
22613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(42, cc.Method());
22713481Sgiacomo.travaglini@arm.com}
22813481Sgiacomo.travaglini@arm.com
22913481Sgiacomo.travaglini@arm.com#undef Method  // Done with macro redefinition tests.
23013481Sgiacomo.travaglini@arm.com
23113481Sgiacomo.travaglini@arm.com// Tests that ON_CALL evaluates its arguments exactly once as promised
23213481Sgiacomo.travaglini@arm.com// by Google Mock.
23313481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, EvaluatesFirstArgumentOnce) {
23413481Sgiacomo.travaglini@arm.com  MockA a;
23513481Sgiacomo.travaglini@arm.com  MockA* pa = &a;
23613481Sgiacomo.travaglini@arm.com
23713481Sgiacomo.travaglini@arm.com  ON_CALL(*pa++, DoA(_));
23813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(&a + 1, pa);
23913481Sgiacomo.travaglini@arm.com}
24013481Sgiacomo.travaglini@arm.com
24113481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, EvaluatesSecondArgumentOnce) {
24213481Sgiacomo.travaglini@arm.com  MockA a;
24313481Sgiacomo.travaglini@arm.com  int n = 0;
24413481Sgiacomo.travaglini@arm.com
24513481Sgiacomo.travaglini@arm.com  ON_CALL(a, DoA(n++));
24613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, n);
24713481Sgiacomo.travaglini@arm.com}
24813481Sgiacomo.travaglini@arm.com
24913481Sgiacomo.travaglini@arm.com// Tests that the syntax of ON_CALL() is enforced at run time.
25013481Sgiacomo.travaglini@arm.com
25113481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, WithIsOptional) {
25213481Sgiacomo.travaglini@arm.com  MockA a;
25313481Sgiacomo.travaglini@arm.com
25413481Sgiacomo.travaglini@arm.com  ON_CALL(a, DoA(5))
25513481Sgiacomo.travaglini@arm.com      .WillByDefault(Return());
25613481Sgiacomo.travaglini@arm.com  ON_CALL(a, DoA(_))
25713481Sgiacomo.travaglini@arm.com      .With(_)
25813481Sgiacomo.travaglini@arm.com      .WillByDefault(Return());
25913481Sgiacomo.travaglini@arm.com}
26013481Sgiacomo.travaglini@arm.com
26113481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, WithCanAppearAtMostOnce) {
26213481Sgiacomo.travaglini@arm.com  MockA a;
26313481Sgiacomo.travaglini@arm.com
26413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
26513481Sgiacomo.travaglini@arm.com    ON_CALL(a, ReturnResult(_))
26613481Sgiacomo.travaglini@arm.com        .With(_)
26713481Sgiacomo.travaglini@arm.com        .With(_)
26813481Sgiacomo.travaglini@arm.com        .WillByDefault(Return(Result()));
26913481Sgiacomo.travaglini@arm.com  }, ".With() cannot appear more than once in an ON_CALL()");
27013481Sgiacomo.travaglini@arm.com}
27113481Sgiacomo.travaglini@arm.com
27213481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, WillByDefaultIsMandatory) {
27313481Sgiacomo.travaglini@arm.com  MockA a;
27413481Sgiacomo.travaglini@arm.com
27513481Sgiacomo.travaglini@arm.com  EXPECT_DEATH_IF_SUPPORTED({
27613481Sgiacomo.travaglini@arm.com    ON_CALL(a, DoA(5));
27713481Sgiacomo.travaglini@arm.com    a.DoA(5);
27813481Sgiacomo.travaglini@arm.com  }, "");
27913481Sgiacomo.travaglini@arm.com}
28013481Sgiacomo.travaglini@arm.com
28113481Sgiacomo.travaglini@arm.comTEST(OnCallSyntaxTest, WillByDefaultCanAppearAtMostOnce) {
28213481Sgiacomo.travaglini@arm.com  MockA a;
28313481Sgiacomo.travaglini@arm.com
28413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
28513481Sgiacomo.travaglini@arm.com    ON_CALL(a, DoA(5))
28613481Sgiacomo.travaglini@arm.com        .WillByDefault(Return())
28713481Sgiacomo.travaglini@arm.com        .WillByDefault(Return());
28813481Sgiacomo.travaglini@arm.com  }, ".WillByDefault() must appear exactly once in an ON_CALL()");
28913481Sgiacomo.travaglini@arm.com}
29013481Sgiacomo.travaglini@arm.com
29113481Sgiacomo.travaglini@arm.com// Tests that EXPECT_CALL evaluates its arguments exactly once as
29213481Sgiacomo.travaglini@arm.com// promised by Google Mock.
29313481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, EvaluatesFirstArgumentOnce) {
29413481Sgiacomo.travaglini@arm.com  MockA a;
29513481Sgiacomo.travaglini@arm.com  MockA* pa = &a;
29613481Sgiacomo.travaglini@arm.com
29713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*pa++, DoA(_));
29813481Sgiacomo.travaglini@arm.com  a.DoA(0);
29913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(&a + 1, pa);
30013481Sgiacomo.travaglini@arm.com}
30113481Sgiacomo.travaglini@arm.com
30213481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, EvaluatesSecondArgumentOnce) {
30313481Sgiacomo.travaglini@arm.com  MockA a;
30413481Sgiacomo.travaglini@arm.com  int n = 0;
30513481Sgiacomo.travaglini@arm.com
30613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(n++));
30713481Sgiacomo.travaglini@arm.com  a.DoA(0);
30813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, n);
30913481Sgiacomo.travaglini@arm.com}
31013481Sgiacomo.travaglini@arm.com
31113481Sgiacomo.travaglini@arm.com// Tests that the syntax of EXPECT_CALL() is enforced at run time.
31213481Sgiacomo.travaglini@arm.com
31313481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WithIsOptional) {
31413481Sgiacomo.travaglini@arm.com  MockA a;
31513481Sgiacomo.travaglini@arm.com
31613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(5))
31713481Sgiacomo.travaglini@arm.com      .Times(0);
31813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(6))
31913481Sgiacomo.travaglini@arm.com      .With(_)
32013481Sgiacomo.travaglini@arm.com      .Times(0);
32113481Sgiacomo.travaglini@arm.com}
32213481Sgiacomo.travaglini@arm.com
32313481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WithCanAppearAtMostOnce) {
32413481Sgiacomo.travaglini@arm.com  MockA a;
32513481Sgiacomo.travaglini@arm.com
32613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
32713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(6))
32813481Sgiacomo.travaglini@arm.com        .With(_)
32913481Sgiacomo.travaglini@arm.com        .With(_);
33013481Sgiacomo.travaglini@arm.com  }, ".With() cannot appear more than once in an EXPECT_CALL()");
33113481Sgiacomo.travaglini@arm.com
33213481Sgiacomo.travaglini@arm.com  a.DoA(6);
33313481Sgiacomo.travaglini@arm.com}
33413481Sgiacomo.travaglini@arm.com
33513481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WithMustBeFirstClause) {
33613481Sgiacomo.travaglini@arm.com  MockA a;
33713481Sgiacomo.travaglini@arm.com
33813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
33913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
34013481Sgiacomo.travaglini@arm.com        .Times(1)
34113481Sgiacomo.travaglini@arm.com        .With(_);
34213481Sgiacomo.travaglini@arm.com  }, ".With() must be the first clause in an EXPECT_CALL()");
34313481Sgiacomo.travaglini@arm.com
34413481Sgiacomo.travaglini@arm.com  a.DoA(1);
34513481Sgiacomo.travaglini@arm.com
34613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
34713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(2))
34813481Sgiacomo.travaglini@arm.com        .WillOnce(Return())
34913481Sgiacomo.travaglini@arm.com        .With(_);
35013481Sgiacomo.travaglini@arm.com  }, ".With() must be the first clause in an EXPECT_CALL()");
35113481Sgiacomo.travaglini@arm.com
35213481Sgiacomo.travaglini@arm.com  a.DoA(2);
35313481Sgiacomo.travaglini@arm.com}
35413481Sgiacomo.travaglini@arm.com
35513481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, TimesCanBeInferred) {
35613481Sgiacomo.travaglini@arm.com  MockA a;
35713481Sgiacomo.travaglini@arm.com
35813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
35913481Sgiacomo.travaglini@arm.com      .WillOnce(Return());
36013481Sgiacomo.travaglini@arm.com
36113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
36213481Sgiacomo.travaglini@arm.com      .WillOnce(Return())
36313481Sgiacomo.travaglini@arm.com      .WillRepeatedly(Return());
36413481Sgiacomo.travaglini@arm.com
36513481Sgiacomo.travaglini@arm.com  a.DoA(1);
36613481Sgiacomo.travaglini@arm.com  a.DoA(2);
36713481Sgiacomo.travaglini@arm.com  a.DoA(2);
36813481Sgiacomo.travaglini@arm.com}
36913481Sgiacomo.travaglini@arm.com
37013481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, TimesCanAppearAtMostOnce) {
37113481Sgiacomo.travaglini@arm.com  MockA a;
37213481Sgiacomo.travaglini@arm.com
37313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
37413481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
37513481Sgiacomo.travaglini@arm.com        .Times(1)
37613481Sgiacomo.travaglini@arm.com        .Times(2);
37713481Sgiacomo.travaglini@arm.com  }, ".Times() cannot appear more than once in an EXPECT_CALL()");
37813481Sgiacomo.travaglini@arm.com
37913481Sgiacomo.travaglini@arm.com  a.DoA(1);
38013481Sgiacomo.travaglini@arm.com  a.DoA(1);
38113481Sgiacomo.travaglini@arm.com}
38213481Sgiacomo.travaglini@arm.com
38313481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, TimesMustBeBeforeInSequence) {
38413481Sgiacomo.travaglini@arm.com  MockA a;
38513481Sgiacomo.travaglini@arm.com  Sequence s;
38613481Sgiacomo.travaglini@arm.com
38713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
38813481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
38913481Sgiacomo.travaglini@arm.com        .InSequence(s)
39013481Sgiacomo.travaglini@arm.com        .Times(1);
39113481Sgiacomo.travaglini@arm.com  }, ".Times() cannot appear after ");
39213481Sgiacomo.travaglini@arm.com
39313481Sgiacomo.travaglini@arm.com  a.DoA(1);
39413481Sgiacomo.travaglini@arm.com}
39513481Sgiacomo.travaglini@arm.com
39613481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, InSequenceIsOptional) {
39713481Sgiacomo.travaglini@arm.com  MockA a;
39813481Sgiacomo.travaglini@arm.com  Sequence s;
39913481Sgiacomo.travaglini@arm.com
40013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1));
40113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
40213481Sgiacomo.travaglini@arm.com      .InSequence(s);
40313481Sgiacomo.travaglini@arm.com
40413481Sgiacomo.travaglini@arm.com  a.DoA(1);
40513481Sgiacomo.travaglini@arm.com  a.DoA(2);
40613481Sgiacomo.travaglini@arm.com}
40713481Sgiacomo.travaglini@arm.com
40813481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, InSequenceCanAppearMultipleTimes) {
40913481Sgiacomo.travaglini@arm.com  MockA a;
41013481Sgiacomo.travaglini@arm.com  Sequence s1, s2;
41113481Sgiacomo.travaglini@arm.com
41213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
41313481Sgiacomo.travaglini@arm.com      .InSequence(s1, s2)
41413481Sgiacomo.travaglini@arm.com      .InSequence(s1);
41513481Sgiacomo.travaglini@arm.com
41613481Sgiacomo.travaglini@arm.com  a.DoA(1);
41713481Sgiacomo.travaglini@arm.com}
41813481Sgiacomo.travaglini@arm.com
41913481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeAfter) {
42013481Sgiacomo.travaglini@arm.com  MockA a;
42113481Sgiacomo.travaglini@arm.com  Sequence s;
42213481Sgiacomo.travaglini@arm.com
42313481Sgiacomo.travaglini@arm.com  Expectation e = EXPECT_CALL(a, DoA(1))
42413481Sgiacomo.travaglini@arm.com      .Times(AnyNumber());
42513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
42613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(2))
42713481Sgiacomo.travaglini@arm.com        .After(e)
42813481Sgiacomo.travaglini@arm.com        .InSequence(s);
42913481Sgiacomo.travaglini@arm.com  }, ".InSequence() cannot appear after ");
43013481Sgiacomo.travaglini@arm.com
43113481Sgiacomo.travaglini@arm.com  a.DoA(2);
43213481Sgiacomo.travaglini@arm.com}
43313481Sgiacomo.travaglini@arm.com
43413481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeWillOnce) {
43513481Sgiacomo.travaglini@arm.com  MockA a;
43613481Sgiacomo.travaglini@arm.com  Sequence s;
43713481Sgiacomo.travaglini@arm.com
43813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
43913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
44013481Sgiacomo.travaglini@arm.com        .WillOnce(Return())
44113481Sgiacomo.travaglini@arm.com        .InSequence(s);
44213481Sgiacomo.travaglini@arm.com  }, ".InSequence() cannot appear after ");
44313481Sgiacomo.travaglini@arm.com
44413481Sgiacomo.travaglini@arm.com  a.DoA(1);
44513481Sgiacomo.travaglini@arm.com}
44613481Sgiacomo.travaglini@arm.com
44713481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, AfterMustBeBeforeWillOnce) {
44813481Sgiacomo.travaglini@arm.com  MockA a;
44913481Sgiacomo.travaglini@arm.com
45013481Sgiacomo.travaglini@arm.com  Expectation e = EXPECT_CALL(a, DoA(1));
45113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
45213481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(2))
45313481Sgiacomo.travaglini@arm.com        .WillOnce(Return())
45413481Sgiacomo.travaglini@arm.com        .After(e);
45513481Sgiacomo.travaglini@arm.com  }, ".After() cannot appear after ");
45613481Sgiacomo.travaglini@arm.com
45713481Sgiacomo.travaglini@arm.com  a.DoA(1);
45813481Sgiacomo.travaglini@arm.com  a.DoA(2);
45913481Sgiacomo.travaglini@arm.com}
46013481Sgiacomo.travaglini@arm.com
46113481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillIsOptional) {
46213481Sgiacomo.travaglini@arm.com  MockA a;
46313481Sgiacomo.travaglini@arm.com
46413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1));
46513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
46613481Sgiacomo.travaglini@arm.com      .WillOnce(Return());
46713481Sgiacomo.travaglini@arm.com
46813481Sgiacomo.travaglini@arm.com  a.DoA(1);
46913481Sgiacomo.travaglini@arm.com  a.DoA(2);
47013481Sgiacomo.travaglini@arm.com}
47113481Sgiacomo.travaglini@arm.com
47213481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillCanAppearMultipleTimes) {
47313481Sgiacomo.travaglini@arm.com  MockA a;
47413481Sgiacomo.travaglini@arm.com
47513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
47613481Sgiacomo.travaglini@arm.com      .Times(AnyNumber())
47713481Sgiacomo.travaglini@arm.com      .WillOnce(Return())
47813481Sgiacomo.travaglini@arm.com      .WillOnce(Return())
47913481Sgiacomo.travaglini@arm.com      .WillOnce(Return());
48013481Sgiacomo.travaglini@arm.com}
48113481Sgiacomo.travaglini@arm.com
48213481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillMustBeBeforeWillRepeatedly) {
48313481Sgiacomo.travaglini@arm.com  MockA a;
48413481Sgiacomo.travaglini@arm.com
48513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
48613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
48713481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return())
48813481Sgiacomo.travaglini@arm.com        .WillOnce(Return());
48913481Sgiacomo.travaglini@arm.com  }, ".WillOnce() cannot appear after ");
49013481Sgiacomo.travaglini@arm.com
49113481Sgiacomo.travaglini@arm.com  a.DoA(1);
49213481Sgiacomo.travaglini@arm.com}
49313481Sgiacomo.travaglini@arm.com
49413481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillRepeatedlyIsOptional) {
49513481Sgiacomo.travaglini@arm.com  MockA a;
49613481Sgiacomo.travaglini@arm.com
49713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
49813481Sgiacomo.travaglini@arm.com      .WillOnce(Return());
49913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
50013481Sgiacomo.travaglini@arm.com      .WillOnce(Return())
50113481Sgiacomo.travaglini@arm.com      .WillRepeatedly(Return());
50213481Sgiacomo.travaglini@arm.com
50313481Sgiacomo.travaglini@arm.com  a.DoA(1);
50413481Sgiacomo.travaglini@arm.com  a.DoA(2);
50513481Sgiacomo.travaglini@arm.com  a.DoA(2);
50613481Sgiacomo.travaglini@arm.com}
50713481Sgiacomo.travaglini@arm.com
50813481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillRepeatedlyCannotAppearMultipleTimes) {
50913481Sgiacomo.travaglini@arm.com  MockA a;
51013481Sgiacomo.travaglini@arm.com
51113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
51213481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
51313481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return())
51413481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return());
51513481Sgiacomo.travaglini@arm.com  }, ".WillRepeatedly() cannot appear more than once in an "
51613481Sgiacomo.travaglini@arm.com     "EXPECT_CALL()");
51713481Sgiacomo.travaglini@arm.com}
51813481Sgiacomo.travaglini@arm.com
51913481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WillRepeatedlyMustBeBeforeRetiresOnSaturation) {
52013481Sgiacomo.travaglini@arm.com  MockA a;
52113481Sgiacomo.travaglini@arm.com
52213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
52313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
52413481Sgiacomo.travaglini@arm.com        .RetiresOnSaturation()
52513481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return());
52613481Sgiacomo.travaglini@arm.com  }, ".WillRepeatedly() cannot appear after ");
52713481Sgiacomo.travaglini@arm.com}
52813481Sgiacomo.travaglini@arm.com
52913481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, RetiresOnSaturationIsOptional) {
53013481Sgiacomo.travaglini@arm.com  MockA a;
53113481Sgiacomo.travaglini@arm.com
53213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1));
53313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
53413481Sgiacomo.travaglini@arm.com      .RetiresOnSaturation();
53513481Sgiacomo.travaglini@arm.com
53613481Sgiacomo.travaglini@arm.com  a.DoA(1);
53713481Sgiacomo.travaglini@arm.com  a.DoA(1);
53813481Sgiacomo.travaglini@arm.com}
53913481Sgiacomo.travaglini@arm.com
54013481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, RetiresOnSaturationCannotAppearMultipleTimes) {
54113481Sgiacomo.travaglini@arm.com  MockA a;
54213481Sgiacomo.travaglini@arm.com
54313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
54413481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1))
54513481Sgiacomo.travaglini@arm.com        .RetiresOnSaturation()
54613481Sgiacomo.travaglini@arm.com        .RetiresOnSaturation();
54713481Sgiacomo.travaglini@arm.com  }, ".RetiresOnSaturation() cannot appear more than once");
54813481Sgiacomo.travaglini@arm.com
54913481Sgiacomo.travaglini@arm.com  a.DoA(1);
55013481Sgiacomo.travaglini@arm.com}
55113481Sgiacomo.travaglini@arm.com
55213481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, DefaultCardinalityIsOnce) {
55313481Sgiacomo.travaglini@arm.com  {
55413481Sgiacomo.travaglini@arm.com    MockA a;
55513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
55613481Sgiacomo.travaglini@arm.com    a.DoA(1);
55713481Sgiacomo.travaglini@arm.com  }
55813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
55913481Sgiacomo.travaglini@arm.com    MockA a;
56013481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
56113481Sgiacomo.travaglini@arm.com  }, "to be called once");
56213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
56313481Sgiacomo.travaglini@arm.com    MockA a;
56413481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
56513481Sgiacomo.travaglini@arm.com    a.DoA(1);
56613481Sgiacomo.travaglini@arm.com    a.DoA(1);
56713481Sgiacomo.travaglini@arm.com  }, "to be called once");
56813481Sgiacomo.travaglini@arm.com}
56913481Sgiacomo.travaglini@arm.com
57013481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
57113481Sgiacomo.travaglini@arm.com
57213481Sgiacomo.travaglini@arm.com// Tests that Google Mock doesn't print a warning when the number of
57313481Sgiacomo.travaglini@arm.com// WillOnce() is adequate.
57413481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, DoesNotWarnOnAdequateActionCount) {
57513481Sgiacomo.travaglini@arm.com  CaptureStdout();
57613481Sgiacomo.travaglini@arm.com  {
57713481Sgiacomo.travaglini@arm.com    MockB b;
57813481Sgiacomo.travaglini@arm.com
57913481Sgiacomo.travaglini@arm.com    // It's always fine to omit WillOnce() entirely.
58013481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
58113481Sgiacomo.travaglini@arm.com        .Times(0);
58213481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(1))
58313481Sgiacomo.travaglini@arm.com        .Times(AtMost(1));
58413481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(2))
58513481Sgiacomo.travaglini@arm.com        .Times(1)
58613481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(1));
58713481Sgiacomo.travaglini@arm.com
58813481Sgiacomo.travaglini@arm.com    // It's fine for the number of WillOnce()s to equal the upper bound.
58913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(3))
59013481Sgiacomo.travaglini@arm.com        .Times(Between(1, 2))
59113481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
59213481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2));
59313481Sgiacomo.travaglini@arm.com
59413481Sgiacomo.travaglini@arm.com    // It's fine for the number of WillOnce()s to be smaller than the
59513481Sgiacomo.travaglini@arm.com    // upper bound when there is a WillRepeatedly().
59613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(4))
59713481Sgiacomo.travaglini@arm.com        .Times(AtMost(3))
59813481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
59913481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
60013481Sgiacomo.travaglini@arm.com
60113481Sgiacomo.travaglini@arm.com    // Satisfies the above expectations.
60213481Sgiacomo.travaglini@arm.com    b.DoB(2);
60313481Sgiacomo.travaglini@arm.com    b.DoB(3);
60413481Sgiacomo.travaglini@arm.com  }
60513481Sgiacomo.travaglini@arm.com  EXPECT_STREQ("", GetCapturedStdout().c_str());
60613481Sgiacomo.travaglini@arm.com}
60713481Sgiacomo.travaglini@arm.com
60813481Sgiacomo.travaglini@arm.com// Tests that Google Mock warns on having too many actions in an
60913481Sgiacomo.travaglini@arm.com// expectation compared to its cardinality.
61013481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WarnsOnTooManyActions) {
61113481Sgiacomo.travaglini@arm.com  CaptureStdout();
61213481Sgiacomo.travaglini@arm.com  {
61313481Sgiacomo.travaglini@arm.com    MockB b;
61413481Sgiacomo.travaglini@arm.com
61513481Sgiacomo.travaglini@arm.com    // Warns when the number of WillOnce()s is larger than the upper bound.
61613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
61713481Sgiacomo.travaglini@arm.com        .Times(0)
61813481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1));  // #1
61913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
62013481Sgiacomo.travaglini@arm.com        .Times(AtMost(1))
62113481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
62213481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2));  // #2
62313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(1))
62413481Sgiacomo.travaglini@arm.com        .Times(1)
62513481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
62613481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2))
62713481Sgiacomo.travaglini@arm.com        .RetiresOnSaturation();  // #3
62813481Sgiacomo.travaglini@arm.com
62913481Sgiacomo.travaglini@arm.com    // Warns when the number of WillOnce()s equals the upper bound and
63013481Sgiacomo.travaglini@arm.com    // there is a WillRepeatedly().
63113481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
63213481Sgiacomo.travaglini@arm.com        .Times(0)
63313481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(1));  // #4
63413481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(2))
63513481Sgiacomo.travaglini@arm.com        .Times(1)
63613481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
63713481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));  // #5
63813481Sgiacomo.travaglini@arm.com
63913481Sgiacomo.travaglini@arm.com    // Satisfies the above expectations.
64013481Sgiacomo.travaglini@arm.com    b.DoB(1);
64113481Sgiacomo.travaglini@arm.com    b.DoB(2);
64213481Sgiacomo.travaglini@arm.com  }
64313481Sgiacomo.travaglini@arm.com  const std::string output = GetCapturedStdout();
64413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
64513481Sgiacomo.travaglini@arm.com      IsSubstring,
64613481Sgiacomo.travaglini@arm.com      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
64713481Sgiacomo.travaglini@arm.com      "Expected to be never called, but has 1 WillOnce().",
64813481Sgiacomo.travaglini@arm.com      output);  // #1
64913481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
65013481Sgiacomo.travaglini@arm.com      IsSubstring,
65113481Sgiacomo.travaglini@arm.com      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
65213481Sgiacomo.travaglini@arm.com      "Expected to be called at most once, "
65313481Sgiacomo.travaglini@arm.com      "but has 2 WillOnce()s.",
65413481Sgiacomo.travaglini@arm.com      output);  // #2
65513481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
65613481Sgiacomo.travaglini@arm.com      IsSubstring,
65713481Sgiacomo.travaglini@arm.com      "Too many actions specified in EXPECT_CALL(b, DoB(1))...\n"
65813481Sgiacomo.travaglini@arm.com      "Expected to be called once, but has 2 WillOnce()s.",
65913481Sgiacomo.travaglini@arm.com      output);  // #3
66013481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
66113481Sgiacomo.travaglini@arm.com      IsSubstring,
66213481Sgiacomo.travaglini@arm.com      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
66313481Sgiacomo.travaglini@arm.com      "Expected to be never called, but has 0 WillOnce()s "
66413481Sgiacomo.travaglini@arm.com      "and a WillRepeatedly().",
66513481Sgiacomo.travaglini@arm.com      output);  // #4
66613481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
66713481Sgiacomo.travaglini@arm.com      IsSubstring,
66813481Sgiacomo.travaglini@arm.com      "Too many actions specified in EXPECT_CALL(b, DoB(2))...\n"
66913481Sgiacomo.travaglini@arm.com      "Expected to be called once, but has 1 WillOnce() "
67013481Sgiacomo.travaglini@arm.com      "and a WillRepeatedly().",
67113481Sgiacomo.travaglini@arm.com      output);  // #5
67213481Sgiacomo.travaglini@arm.com}
67313481Sgiacomo.travaglini@arm.com
67413481Sgiacomo.travaglini@arm.com// Tests that Google Mock warns on having too few actions in an
67513481Sgiacomo.travaglini@arm.com// expectation compared to its cardinality.
67613481Sgiacomo.travaglini@arm.comTEST(ExpectCallSyntaxTest, WarnsOnTooFewActions) {
67713481Sgiacomo.travaglini@arm.com  MockB b;
67813481Sgiacomo.travaglini@arm.com
67913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
68013481Sgiacomo.travaglini@arm.com      .Times(Between(2, 3))
68113481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
68213481Sgiacomo.travaglini@arm.com
68313481Sgiacomo.travaglini@arm.com  CaptureStdout();
68413481Sgiacomo.travaglini@arm.com  b.DoB();
68513481Sgiacomo.travaglini@arm.com  const std::string output = GetCapturedStdout();
68613481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
68713481Sgiacomo.travaglini@arm.com      IsSubstring,
68813481Sgiacomo.travaglini@arm.com      "Too few actions specified in EXPECT_CALL(b, DoB())...\n"
68913481Sgiacomo.travaglini@arm.com      "Expected to be called between 2 and 3 times, "
69013481Sgiacomo.travaglini@arm.com      "but has only 1 WillOnce().",
69113481Sgiacomo.travaglini@arm.com      output);
69213481Sgiacomo.travaglini@arm.com  b.DoB();
69313481Sgiacomo.travaglini@arm.com}
69413481Sgiacomo.travaglini@arm.com
69513481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STREAM_REDIRECTION
69613481Sgiacomo.travaglini@arm.com
69713481Sgiacomo.travaglini@arm.com// Tests the semantics of ON_CALL().
69813481Sgiacomo.travaglini@arm.com
69913481Sgiacomo.travaglini@arm.com// Tests that the built-in default action is taken when no ON_CALL()
70013481Sgiacomo.travaglini@arm.com// is specified.
70113481Sgiacomo.travaglini@arm.comTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCall) {
70213481Sgiacomo.travaglini@arm.com  MockB b;
70313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB());
70413481Sgiacomo.travaglini@arm.com
70513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
70613481Sgiacomo.travaglini@arm.com}
70713481Sgiacomo.travaglini@arm.com
70813481Sgiacomo.travaglini@arm.com// Tests that the built-in default action is taken when no ON_CALL()
70913481Sgiacomo.travaglini@arm.com// matches the invocation.
71013481Sgiacomo.travaglini@arm.comTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCallMatches) {
71113481Sgiacomo.travaglini@arm.com  MockB b;
71213481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(1))
71313481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
71413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_));
71513481Sgiacomo.travaglini@arm.com
71613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(2));
71713481Sgiacomo.travaglini@arm.com}
71813481Sgiacomo.travaglini@arm.com
71913481Sgiacomo.travaglini@arm.com// Tests that the last matching ON_CALL() action is taken.
72013481Sgiacomo.travaglini@arm.comTEST(OnCallTest, PicksLastMatchingOnCall) {
72113481Sgiacomo.travaglini@arm.com  MockB b;
72213481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
72313481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(3));
72413481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(2))
72513481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(2));
72613481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(1))
72713481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
72813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_));
72913481Sgiacomo.travaglini@arm.com
73013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b.DoB(2));
73113481Sgiacomo.travaglini@arm.com}
73213481Sgiacomo.travaglini@arm.com
73313481Sgiacomo.travaglini@arm.com// Tests the semantics of EXPECT_CALL().
73413481Sgiacomo.travaglini@arm.com
73513481Sgiacomo.travaglini@arm.com// Tests that any call is allowed when no EXPECT_CALL() is specified.
73613481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, AllowsAnyCallWhenNoSpec) {
73713481Sgiacomo.travaglini@arm.com  MockB b;
73813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB());
73913481Sgiacomo.travaglini@arm.com  // There is no expectation on DoB(int).
74013481Sgiacomo.travaglini@arm.com
74113481Sgiacomo.travaglini@arm.com  b.DoB();
74213481Sgiacomo.travaglini@arm.com
74313481Sgiacomo.travaglini@arm.com  // DoB(int) can be called any number of times.
74413481Sgiacomo.travaglini@arm.com  b.DoB(1);
74513481Sgiacomo.travaglini@arm.com  b.DoB(2);
74613481Sgiacomo.travaglini@arm.com}
74713481Sgiacomo.travaglini@arm.com
74813481Sgiacomo.travaglini@arm.com// Tests that the last matching EXPECT_CALL() fires.
74913481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, PicksLastMatchingExpectCall) {
75013481Sgiacomo.travaglini@arm.com  MockB b;
75113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
75213481Sgiacomo.travaglini@arm.com      .WillRepeatedly(Return(2));
75313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(1))
75413481Sgiacomo.travaglini@arm.com      .WillRepeatedly(Return(1));
75513481Sgiacomo.travaglini@arm.com
75613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b.DoB(1));
75713481Sgiacomo.travaglini@arm.com}
75813481Sgiacomo.travaglini@arm.com
75913481Sgiacomo.travaglini@arm.com// Tests lower-bound violation.
76013481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, CatchesTooFewCalls) {
76113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
76213481Sgiacomo.travaglini@arm.com    MockB b;
76313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB(5))
76413481Sgiacomo.travaglini@arm.com        .Times(AtLeast(2));
76513481Sgiacomo.travaglini@arm.com
76613481Sgiacomo.travaglini@arm.com    b.DoB(5);
76713481Sgiacomo.travaglini@arm.com  }, "Actual function call count doesn't match EXPECT_CALL(b, DoB(5))...\n"
76813481Sgiacomo.travaglini@arm.com     "         Expected: to be called at least twice\n"
76913481Sgiacomo.travaglini@arm.com     "           Actual: called once - unsatisfied and active");
77013481Sgiacomo.travaglini@arm.com}
77113481Sgiacomo.travaglini@arm.com
77213481Sgiacomo.travaglini@arm.com// Tests that the cardinality can be inferred when no Times(...) is
77313481Sgiacomo.travaglini@arm.com// specified.
77413481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, InfersCardinalityWhenThereIsNoWillRepeatedly) {
77513481Sgiacomo.travaglini@arm.com  {
77613481Sgiacomo.travaglini@arm.com    MockB b;
77713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
77813481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
77913481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2));
78013481Sgiacomo.travaglini@arm.com
78113481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, b.DoB());
78213481Sgiacomo.travaglini@arm.com    EXPECT_EQ(2, b.DoB());
78313481Sgiacomo.travaglini@arm.com  }
78413481Sgiacomo.travaglini@arm.com
78513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
78613481Sgiacomo.travaglini@arm.com    MockB b;
78713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
78813481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
78913481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2));
79013481Sgiacomo.travaglini@arm.com
79113481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, b.DoB());
79213481Sgiacomo.travaglini@arm.com  }, "to be called twice");
79313481Sgiacomo.travaglini@arm.com
79413481Sgiacomo.travaglini@arm.com  {  // NOLINT
79513481Sgiacomo.travaglini@arm.com    MockB b;
79613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
79713481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
79813481Sgiacomo.travaglini@arm.com        .WillOnce(Return(2));
79913481Sgiacomo.travaglini@arm.com
80013481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, b.DoB());
80113481Sgiacomo.travaglini@arm.com    EXPECT_EQ(2, b.DoB());
80213481Sgiacomo.travaglini@arm.com    EXPECT_NONFATAL_FAILURE(b.DoB(), "to be called twice");
80313481Sgiacomo.travaglini@arm.com  }
80413481Sgiacomo.travaglini@arm.com}
80513481Sgiacomo.travaglini@arm.com
80613481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {
80713481Sgiacomo.travaglini@arm.com  {
80813481Sgiacomo.travaglini@arm.com    MockB b;
80913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
81013481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
81113481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
81213481Sgiacomo.travaglini@arm.com
81313481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, b.DoB());
81413481Sgiacomo.travaglini@arm.com  }
81513481Sgiacomo.travaglini@arm.com
81613481Sgiacomo.travaglini@arm.com  {  // NOLINT
81713481Sgiacomo.travaglini@arm.com    MockB b;
81813481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
81913481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
82013481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
82113481Sgiacomo.travaglini@arm.com
82213481Sgiacomo.travaglini@arm.com    EXPECT_EQ(1, b.DoB());
82313481Sgiacomo.travaglini@arm.com    EXPECT_EQ(2, b.DoB());
82413481Sgiacomo.travaglini@arm.com    EXPECT_EQ(2, b.DoB());
82513481Sgiacomo.travaglini@arm.com  }
82613481Sgiacomo.travaglini@arm.com
82713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
82813481Sgiacomo.travaglini@arm.com    MockB b;
82913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
83013481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1))
83113481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
83213481Sgiacomo.travaglini@arm.com  }, "to be called at least once");
83313481Sgiacomo.travaglini@arm.com}
83413481Sgiacomo.travaglini@arm.com
83513481Sgiacomo.travaglini@arm.com// Tests that the n-th action is taken for the n-th matching
83613481Sgiacomo.travaglini@arm.com// invocation.
83713481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, NthMatchTakesNthAction) {
83813481Sgiacomo.travaglini@arm.com  MockB b;
83913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
84013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
84113481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2))
84213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(3));
84313481Sgiacomo.travaglini@arm.com
84413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b.DoB());
84513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b.DoB());
84613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, b.DoB());
84713481Sgiacomo.travaglini@arm.com}
84813481Sgiacomo.travaglini@arm.com
84913481Sgiacomo.travaglini@arm.com// Tests that the WillRepeatedly() action is taken when the WillOnce(...)
85013481Sgiacomo.travaglini@arm.com// list is exhausted.
85113481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, TakesRepeatedActionWhenWillListIsExhausted) {
85213481Sgiacomo.travaglini@arm.com  MockB b;
85313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
85413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
85513481Sgiacomo.travaglini@arm.com      .WillRepeatedly(Return(2));
85613481Sgiacomo.travaglini@arm.com
85713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b.DoB());
85813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b.DoB());
85913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b.DoB());
86013481Sgiacomo.travaglini@arm.com}
86113481Sgiacomo.travaglini@arm.com
86213481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
86313481Sgiacomo.travaglini@arm.com
86413481Sgiacomo.travaglini@arm.com// Tests that the default action is taken when the WillOnce(...) list is
86513481Sgiacomo.travaglini@arm.com// exhausted and there is no WillRepeatedly().
86613481Sgiacomo.travaglini@arm.comTEST(ExpectCallTest, TakesDefaultActionWhenWillListIsExhausted) {
86713481Sgiacomo.travaglini@arm.com  MockB b;
86813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
86913481Sgiacomo.travaglini@arm.com      .Times(1);
87013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
87113481Sgiacomo.travaglini@arm.com      .Times(AnyNumber())
87213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1))
87313481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
87413481Sgiacomo.travaglini@arm.com
87513481Sgiacomo.travaglini@arm.com  CaptureStdout();
87613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));  // Shouldn't generate a warning as the
87713481Sgiacomo.travaglini@arm.com                           // expectation has no action clause at all.
87813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b.DoB());
87913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b.DoB());
88013481Sgiacomo.travaglini@arm.com  const std::string output1 = GetCapturedStdout();
88113481Sgiacomo.travaglini@arm.com  EXPECT_STREQ("", output1.c_str());
88213481Sgiacomo.travaglini@arm.com
88313481Sgiacomo.travaglini@arm.com  CaptureStdout();
88413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
88513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
88613481Sgiacomo.travaglini@arm.com  const std::string output2 = GetCapturedStdout();
88713481Sgiacomo.travaglini@arm.com  EXPECT_THAT(output2.c_str(),
88813481Sgiacomo.travaglini@arm.com              HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
88913481Sgiacomo.travaglini@arm.com                        "Called 3 times, but only 2 WillOnce()s are specified"
89013481Sgiacomo.travaglini@arm.com                        " - returning default value."));
89113481Sgiacomo.travaglini@arm.com  EXPECT_THAT(output2.c_str(),
89213481Sgiacomo.travaglini@arm.com              HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
89313481Sgiacomo.travaglini@arm.com                        "Called 4 times, but only 2 WillOnce()s are specified"
89413481Sgiacomo.travaglini@arm.com                        " - returning default value."));
89513481Sgiacomo.travaglini@arm.com}
89613481Sgiacomo.travaglini@arm.com
89713481Sgiacomo.travaglini@arm.comTEST(FunctionMockerMessageTest, ReportsExpectCallLocationForExhausedActions) {
89813481Sgiacomo.travaglini@arm.com  MockB b;
89913481Sgiacomo.travaglini@arm.com  std::string expect_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
90013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB()).Times(AnyNumber()).WillOnce(Return(1));
90113481Sgiacomo.travaglini@arm.com
90213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b.DoB());
90313481Sgiacomo.travaglini@arm.com
90413481Sgiacomo.travaglini@arm.com  CaptureStdout();
90513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
90613481Sgiacomo.travaglini@arm.com  const std::string output = GetCapturedStdout();
90713481Sgiacomo.travaglini@arm.com  // The warning message should contain the call location.
90813481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, expect_call_location, output);
90913481Sgiacomo.travaglini@arm.com}
91013481Sgiacomo.travaglini@arm.com
91113481Sgiacomo.travaglini@arm.comTEST(FunctionMockerMessageTest,
91213481Sgiacomo.travaglini@arm.com     ReportsDefaultActionLocationOfUninterestingCallsForNaggyMock) {
91313481Sgiacomo.travaglini@arm.com  std::string on_call_location;
91413481Sgiacomo.travaglini@arm.com  CaptureStdout();
91513481Sgiacomo.travaglini@arm.com  {
91613481Sgiacomo.travaglini@arm.com    NaggyMock<MockB> b;
91713481Sgiacomo.travaglini@arm.com    on_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
91813481Sgiacomo.travaglini@arm.com    ON_CALL(b, DoB(_)).WillByDefault(Return(0));
91913481Sgiacomo.travaglini@arm.com    b.DoB(0);
92013481Sgiacomo.travaglini@arm.com  }
92113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, on_call_location, GetCapturedStdout());
92213481Sgiacomo.travaglini@arm.com}
92313481Sgiacomo.travaglini@arm.com
92413481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STREAM_REDIRECTION
92513481Sgiacomo.travaglini@arm.com
92613481Sgiacomo.travaglini@arm.com// Tests that an uninteresting call performs the default action.
92713481Sgiacomo.travaglini@arm.comTEST(UninterestingCallTest, DoesDefaultAction) {
92813481Sgiacomo.travaglini@arm.com  // When there is an ON_CALL() statement, the action specified by it
92913481Sgiacomo.travaglini@arm.com  // should be taken.
93013481Sgiacomo.travaglini@arm.com  MockA a;
93113481Sgiacomo.travaglini@arm.com  ON_CALL(a, Binary(_, _))
93213481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(true));
93313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a.Binary(1, 2));
93413481Sgiacomo.travaglini@arm.com
93513481Sgiacomo.travaglini@arm.com  // When there is no ON_CALL(), the default value for the return type
93613481Sgiacomo.travaglini@arm.com  // should be returned.
93713481Sgiacomo.travaglini@arm.com  MockB b;
93813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
93913481Sgiacomo.travaglini@arm.com}
94013481Sgiacomo.travaglini@arm.com
94113481Sgiacomo.travaglini@arm.com// Tests that an unexpected call performs the default action.
94213481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, DoesDefaultAction) {
94313481Sgiacomo.travaglini@arm.com  // When there is an ON_CALL() statement, the action specified by it
94413481Sgiacomo.travaglini@arm.com  // should be taken.
94513481Sgiacomo.travaglini@arm.com  MockA a;
94613481Sgiacomo.travaglini@arm.com  ON_CALL(a, Binary(_, _))
94713481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(true));
94813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, Binary(0, 0));
94913481Sgiacomo.travaglini@arm.com  a.Binary(0, 0);
95013481Sgiacomo.travaglini@arm.com  bool result = false;
95113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(result = a.Binary(1, 2),
95213481Sgiacomo.travaglini@arm.com                          "Unexpected mock function call");
95313481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(result);
95413481Sgiacomo.travaglini@arm.com
95513481Sgiacomo.travaglini@arm.com  // When there is no ON_CALL(), the default value for the return type
95613481Sgiacomo.travaglini@arm.com  // should be returned.
95713481Sgiacomo.travaglini@arm.com  MockB b;
95813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(0))
95913481Sgiacomo.travaglini@arm.com      .Times(0);
96013481Sgiacomo.travaglini@arm.com  int n = -1;
96113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(n = b.DoB(1),
96213481Sgiacomo.travaglini@arm.com                          "Unexpected mock function call");
96313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, n);
96413481Sgiacomo.travaglini@arm.com}
96513481Sgiacomo.travaglini@arm.com
96613481Sgiacomo.travaglini@arm.com// Tests that when an unexpected void function generates the right
96713481Sgiacomo.travaglini@arm.com// failure message.
96813481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, GeneratesFailureForVoidFunction) {
96913481Sgiacomo.travaglini@arm.com  // First, tests the message when there is only one EXPECT_CALL().
97013481Sgiacomo.travaglini@arm.com  MockA a1;
97113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a1, DoA(1));
97213481Sgiacomo.travaglini@arm.com  a1.DoA(1);
97313481Sgiacomo.travaglini@arm.com  // Ideally we should match the failure message against a regex, but
97413481Sgiacomo.travaglini@arm.com  // EXPECT_NONFATAL_FAILURE doesn't support that, so we test for
97513481Sgiacomo.travaglini@arm.com  // multiple sub-strings instead.
97613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
97713481Sgiacomo.travaglini@arm.com      a1.DoA(9),
97813481Sgiacomo.travaglini@arm.com      "Unexpected mock function call - returning directly.\n"
97913481Sgiacomo.travaglini@arm.com      "    Function call: DoA(9)\n"
98013481Sgiacomo.travaglini@arm.com      "Google Mock tried the following 1 expectation, but it didn't match:");
98113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
98213481Sgiacomo.travaglini@arm.com      a1.DoA(9),
98313481Sgiacomo.travaglini@arm.com      "  Expected arg #0: is equal to 1\n"
98413481Sgiacomo.travaglini@arm.com      "           Actual: 9\n"
98513481Sgiacomo.travaglini@arm.com      "         Expected: to be called once\n"
98613481Sgiacomo.travaglini@arm.com      "           Actual: called once - saturated and active");
98713481Sgiacomo.travaglini@arm.com
98813481Sgiacomo.travaglini@arm.com  // Next, tests the message when there are more than one EXPECT_CALL().
98913481Sgiacomo.travaglini@arm.com  MockA a2;
99013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a2, DoA(1));
99113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a2, DoA(3));
99213481Sgiacomo.travaglini@arm.com  a2.DoA(1);
99313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
99413481Sgiacomo.travaglini@arm.com      a2.DoA(2),
99513481Sgiacomo.travaglini@arm.com      "Unexpected mock function call - returning directly.\n"
99613481Sgiacomo.travaglini@arm.com      "    Function call: DoA(2)\n"
99713481Sgiacomo.travaglini@arm.com      "Google Mock tried the following 2 expectations, but none matched:");
99813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
99913481Sgiacomo.travaglini@arm.com      a2.DoA(2),
100013481Sgiacomo.travaglini@arm.com      "tried expectation #0: EXPECT_CALL(a2, DoA(1))...\n"
100113481Sgiacomo.travaglini@arm.com      "  Expected arg #0: is equal to 1\n"
100213481Sgiacomo.travaglini@arm.com      "           Actual: 2\n"
100313481Sgiacomo.travaglini@arm.com      "         Expected: to be called once\n"
100413481Sgiacomo.travaglini@arm.com      "           Actual: called once - saturated and active");
100513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
100613481Sgiacomo.travaglini@arm.com      a2.DoA(2),
100713481Sgiacomo.travaglini@arm.com      "tried expectation #1: EXPECT_CALL(a2, DoA(3))...\n"
100813481Sgiacomo.travaglini@arm.com      "  Expected arg #0: is equal to 3\n"
100913481Sgiacomo.travaglini@arm.com      "           Actual: 2\n"
101013481Sgiacomo.travaglini@arm.com      "         Expected: to be called once\n"
101113481Sgiacomo.travaglini@arm.com      "           Actual: never called - unsatisfied and active");
101213481Sgiacomo.travaglini@arm.com  a2.DoA(3);
101313481Sgiacomo.travaglini@arm.com}
101413481Sgiacomo.travaglini@arm.com
101513481Sgiacomo.travaglini@arm.com// Tests that an unexpected non-void function generates the right
101613481Sgiacomo.travaglini@arm.com// failure message.
101713481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, GeneartesFailureForNonVoidFunction) {
101813481Sgiacomo.travaglini@arm.com  MockB b1;
101913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b1, DoB(1));
102013481Sgiacomo.travaglini@arm.com  b1.DoB(1);
102113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
102213481Sgiacomo.travaglini@arm.com      b1.DoB(2),
102313481Sgiacomo.travaglini@arm.com      "Unexpected mock function call - returning default value.\n"
102413481Sgiacomo.travaglini@arm.com      "    Function call: DoB(2)\n"
102513481Sgiacomo.travaglini@arm.com      "          Returns: 0\n"
102613481Sgiacomo.travaglini@arm.com      "Google Mock tried the following 1 expectation, but it didn't match:");
102713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
102813481Sgiacomo.travaglini@arm.com      b1.DoB(2),
102913481Sgiacomo.travaglini@arm.com      "  Expected arg #0: is equal to 1\n"
103013481Sgiacomo.travaglini@arm.com      "           Actual: 2\n"
103113481Sgiacomo.travaglini@arm.com      "         Expected: to be called once\n"
103213481Sgiacomo.travaglini@arm.com      "           Actual: called once - saturated and active");
103313481Sgiacomo.travaglini@arm.com}
103413481Sgiacomo.travaglini@arm.com
103513481Sgiacomo.travaglini@arm.com// Tests that Google Mock explains that an retired expectation doesn't
103613481Sgiacomo.travaglini@arm.com// match the call.
103713481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, RetiredExpectation) {
103813481Sgiacomo.travaglini@arm.com  MockB b;
103913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(1))
104013481Sgiacomo.travaglini@arm.com      .RetiresOnSaturation();
104113481Sgiacomo.travaglini@arm.com
104213481Sgiacomo.travaglini@arm.com  b.DoB(1);
104313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
104413481Sgiacomo.travaglini@arm.com      b.DoB(1),
104513481Sgiacomo.travaglini@arm.com      "         Expected: the expectation is active\n"
104613481Sgiacomo.travaglini@arm.com      "           Actual: it is retired");
104713481Sgiacomo.travaglini@arm.com}
104813481Sgiacomo.travaglini@arm.com
104913481Sgiacomo.travaglini@arm.com// Tests that Google Mock explains that an expectation that doesn't
105013481Sgiacomo.travaglini@arm.com// match the arguments doesn't match the call.
105113481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, UnmatchedArguments) {
105213481Sgiacomo.travaglini@arm.com  MockB b;
105313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(1));
105413481Sgiacomo.travaglini@arm.com
105513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
105613481Sgiacomo.travaglini@arm.com      b.DoB(2),
105713481Sgiacomo.travaglini@arm.com      "  Expected arg #0: is equal to 1\n"
105813481Sgiacomo.travaglini@arm.com      "           Actual: 2\n");
105913481Sgiacomo.travaglini@arm.com  b.DoB(1);
106013481Sgiacomo.travaglini@arm.com}
106113481Sgiacomo.travaglini@arm.com
106213481Sgiacomo.travaglini@arm.com// Tests that Google Mock explains that an expectation with
106313481Sgiacomo.travaglini@arm.com// unsatisfied pre-requisites doesn't match the call.
106413481Sgiacomo.travaglini@arm.comTEST(UnexpectedCallTest, UnsatisifiedPrerequisites) {
106513481Sgiacomo.travaglini@arm.com  Sequence s1, s2;
106613481Sgiacomo.travaglini@arm.com  MockB b;
106713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(1))
106813481Sgiacomo.travaglini@arm.com      .InSequence(s1);
106913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(2))
107013481Sgiacomo.travaglini@arm.com      .Times(AnyNumber())
107113481Sgiacomo.travaglini@arm.com      .InSequence(s1);
107213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(3))
107313481Sgiacomo.travaglini@arm.com      .InSequence(s2);
107413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(4))
107513481Sgiacomo.travaglini@arm.com      .InSequence(s1, s2);
107613481Sgiacomo.travaglini@arm.com
107713481Sgiacomo.travaglini@arm.com  ::testing::TestPartResultArray failures;
107813481Sgiacomo.travaglini@arm.com  {
107913481Sgiacomo.travaglini@arm.com    ::testing::ScopedFakeTestPartResultReporter reporter(&failures);
108013481Sgiacomo.travaglini@arm.com    b.DoB(4);
108113481Sgiacomo.travaglini@arm.com    // Now 'failures' contains the Google Test failures generated by
108213481Sgiacomo.travaglini@arm.com    // the above statement.
108313481Sgiacomo.travaglini@arm.com  }
108413481Sgiacomo.travaglini@arm.com
108513481Sgiacomo.travaglini@arm.com  // There should be one non-fatal failure.
108613481Sgiacomo.travaglini@arm.com  ASSERT_EQ(1, failures.size());
108713481Sgiacomo.travaglini@arm.com  const ::testing::TestPartResult& r = failures.GetTestPartResult(0);
108813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(::testing::TestPartResult::kNonFatalFailure, r.type());
108913481Sgiacomo.travaglini@arm.com
109013481Sgiacomo.travaglini@arm.com  // Verifies that the failure message contains the two unsatisfied
109113481Sgiacomo.travaglini@arm.com  // pre-requisites but not the satisfied one.
109213481Sgiacomo.travaglini@arm.com#if GTEST_USES_PCRE
109313481Sgiacomo.travaglini@arm.com  EXPECT_THAT(r.message(), ContainsRegex(
109413481Sgiacomo.travaglini@arm.com      // PCRE has trouble using (.|\n) to match any character, but
109513481Sgiacomo.travaglini@arm.com      // supports the (?s) prefix for using . to match any character.
109613481Sgiacomo.travaglini@arm.com      "(?s)the following immediate pre-requisites are not satisfied:\n"
109713481Sgiacomo.travaglini@arm.com      ".*: pre-requisite #0\n"
109813481Sgiacomo.travaglini@arm.com      ".*: pre-requisite #1"));
109913481Sgiacomo.travaglini@arm.com#elif GTEST_USES_POSIX_RE
110013481Sgiacomo.travaglini@arm.com  EXPECT_THAT(r.message(), ContainsRegex(
110113481Sgiacomo.travaglini@arm.com      // POSIX RE doesn't understand the (?s) prefix, but has no trouble
110213481Sgiacomo.travaglini@arm.com      // with (.|\n).
110313481Sgiacomo.travaglini@arm.com      "the following immediate pre-requisites are not satisfied:\n"
110413481Sgiacomo.travaglini@arm.com      "(.|\n)*: pre-requisite #0\n"
110513481Sgiacomo.travaglini@arm.com      "(.|\n)*: pre-requisite #1"));
110613481Sgiacomo.travaglini@arm.com#else
110713481Sgiacomo.travaglini@arm.com  // We can only use Google Test's own simple regex.
110813481Sgiacomo.travaglini@arm.com  EXPECT_THAT(r.message(), ContainsRegex(
110913481Sgiacomo.travaglini@arm.com      "the following immediate pre-requisites are not satisfied:"));
111013481Sgiacomo.travaglini@arm.com  EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #0"));
111113481Sgiacomo.travaglini@arm.com  EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #1"));
111213481Sgiacomo.travaglini@arm.com#endif  // GTEST_USES_PCRE
111313481Sgiacomo.travaglini@arm.com
111413481Sgiacomo.travaglini@arm.com  b.DoB(1);
111513481Sgiacomo.travaglini@arm.com  b.DoB(3);
111613481Sgiacomo.travaglini@arm.com  b.DoB(4);
111713481Sgiacomo.travaglini@arm.com}
111813481Sgiacomo.travaglini@arm.com
111913481Sgiacomo.travaglini@arm.comTEST(UndefinedReturnValueTest,
112013481Sgiacomo.travaglini@arm.com     ReturnValueIsMandatoryWhenNotDefaultConstructible) {
112113481Sgiacomo.travaglini@arm.com  MockA a;
112213481Sgiacomo.travaglini@arm.com  // TODO(wan@google.com): We should really verify the output message,
112313481Sgiacomo.travaglini@arm.com  // but we cannot yet due to that EXPECT_DEATH only captures stderr
112413481Sgiacomo.travaglini@arm.com  // while Google Mock logs to stdout.
112513481Sgiacomo.travaglini@arm.com#if GTEST_HAS_EXCEPTIONS
112613481Sgiacomo.travaglini@arm.com  EXPECT_ANY_THROW(a.ReturnNonDefaultConstructible());
112713481Sgiacomo.travaglini@arm.com#else
112813481Sgiacomo.travaglini@arm.com  EXPECT_DEATH_IF_SUPPORTED(a.ReturnNonDefaultConstructible(), "");
112913481Sgiacomo.travaglini@arm.com#endif
113013481Sgiacomo.travaglini@arm.com}
113113481Sgiacomo.travaglini@arm.com
113213481Sgiacomo.travaglini@arm.com// Tests that an excessive call (one whose arguments match the
113313481Sgiacomo.travaglini@arm.com// matchers but is called too many times) performs the default action.
113413481Sgiacomo.travaglini@arm.comTEST(ExcessiveCallTest, DoesDefaultAction) {
113513481Sgiacomo.travaglini@arm.com  // When there is an ON_CALL() statement, the action specified by it
113613481Sgiacomo.travaglini@arm.com  // should be taken.
113713481Sgiacomo.travaglini@arm.com  MockA a;
113813481Sgiacomo.travaglini@arm.com  ON_CALL(a, Binary(_, _))
113913481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(true));
114013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, Binary(0, 0));
114113481Sgiacomo.travaglini@arm.com  a.Binary(0, 0);
114213481Sgiacomo.travaglini@arm.com  bool result = false;
114313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(result = a.Binary(0, 0),
114413481Sgiacomo.travaglini@arm.com                          "Mock function called more times than expected");
114513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(result);
114613481Sgiacomo.travaglini@arm.com
114713481Sgiacomo.travaglini@arm.com  // When there is no ON_CALL(), the default value for the return type
114813481Sgiacomo.travaglini@arm.com  // should be returned.
114913481Sgiacomo.travaglini@arm.com  MockB b;
115013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(0))
115113481Sgiacomo.travaglini@arm.com      .Times(0);
115213481Sgiacomo.travaglini@arm.com  int n = -1;
115313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(n = b.DoB(0),
115413481Sgiacomo.travaglini@arm.com                          "Mock function called more times than expected");
115513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, n);
115613481Sgiacomo.travaglini@arm.com}
115713481Sgiacomo.travaglini@arm.com
115813481Sgiacomo.travaglini@arm.com// Tests that when a void function is called too many times,
115913481Sgiacomo.travaglini@arm.com// the failure message contains the argument values.
116013481Sgiacomo.travaglini@arm.comTEST(ExcessiveCallTest, GeneratesFailureForVoidFunction) {
116113481Sgiacomo.travaglini@arm.com  MockA a;
116213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(_))
116313481Sgiacomo.travaglini@arm.com      .Times(0);
116413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
116513481Sgiacomo.travaglini@arm.com      a.DoA(9),
116613481Sgiacomo.travaglini@arm.com      "Mock function called more times than expected - returning directly.\n"
116713481Sgiacomo.travaglini@arm.com      "    Function call: DoA(9)\n"
116813481Sgiacomo.travaglini@arm.com      "         Expected: to be never called\n"
116913481Sgiacomo.travaglini@arm.com      "           Actual: called once - over-saturated and active");
117013481Sgiacomo.travaglini@arm.com}
117113481Sgiacomo.travaglini@arm.com
117213481Sgiacomo.travaglini@arm.com// Tests that when a non-void function is called too many times, the
117313481Sgiacomo.travaglini@arm.com// failure message contains the argument values and the return value.
117413481Sgiacomo.travaglini@arm.comTEST(ExcessiveCallTest, GeneratesFailureForNonVoidFunction) {
117513481Sgiacomo.travaglini@arm.com  MockB b;
117613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_));
117713481Sgiacomo.travaglini@arm.com  b.DoB(1);
117813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(
117913481Sgiacomo.travaglini@arm.com      b.DoB(2),
118013481Sgiacomo.travaglini@arm.com      "Mock function called more times than expected - "
118113481Sgiacomo.travaglini@arm.com      "returning default value.\n"
118213481Sgiacomo.travaglini@arm.com      "    Function call: DoB(2)\n"
118313481Sgiacomo.travaglini@arm.com      "          Returns: 0\n"
118413481Sgiacomo.travaglini@arm.com      "         Expected: to be called once\n"
118513481Sgiacomo.travaglini@arm.com      "           Actual: called twice - over-saturated and active");
118613481Sgiacomo.travaglini@arm.com}
118713481Sgiacomo.travaglini@arm.com
118813481Sgiacomo.travaglini@arm.com// Tests using sequences.
118913481Sgiacomo.travaglini@arm.com
119013481Sgiacomo.travaglini@arm.comTEST(InSequenceTest, AllExpectationInScopeAreInSequence) {
119113481Sgiacomo.travaglini@arm.com  MockA a;
119213481Sgiacomo.travaglini@arm.com  {
119313481Sgiacomo.travaglini@arm.com    InSequence dummy;
119413481Sgiacomo.travaglini@arm.com
119513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
119613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(2));
119713481Sgiacomo.travaglini@arm.com  }
119813481Sgiacomo.travaglini@arm.com
119913481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
120013481Sgiacomo.travaglini@arm.com    a.DoA(2);
120113481Sgiacomo.travaglini@arm.com  }, "Unexpected mock function call");
120213481Sgiacomo.travaglini@arm.com
120313481Sgiacomo.travaglini@arm.com  a.DoA(1);
120413481Sgiacomo.travaglini@arm.com  a.DoA(2);
120513481Sgiacomo.travaglini@arm.com}
120613481Sgiacomo.travaglini@arm.com
120713481Sgiacomo.travaglini@arm.comTEST(InSequenceTest, NestedInSequence) {
120813481Sgiacomo.travaglini@arm.com  MockA a;
120913481Sgiacomo.travaglini@arm.com  {
121013481Sgiacomo.travaglini@arm.com    InSequence dummy;
121113481Sgiacomo.travaglini@arm.com
121213481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
121313481Sgiacomo.travaglini@arm.com    {
121413481Sgiacomo.travaglini@arm.com      InSequence dummy2;
121513481Sgiacomo.travaglini@arm.com
121613481Sgiacomo.travaglini@arm.com      EXPECT_CALL(a, DoA(2));
121713481Sgiacomo.travaglini@arm.com      EXPECT_CALL(a, DoA(3));
121813481Sgiacomo.travaglini@arm.com    }
121913481Sgiacomo.travaglini@arm.com  }
122013481Sgiacomo.travaglini@arm.com
122113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
122213481Sgiacomo.travaglini@arm.com    a.DoA(1);
122313481Sgiacomo.travaglini@arm.com    a.DoA(3);
122413481Sgiacomo.travaglini@arm.com  }, "Unexpected mock function call");
122513481Sgiacomo.travaglini@arm.com
122613481Sgiacomo.travaglini@arm.com  a.DoA(2);
122713481Sgiacomo.travaglini@arm.com  a.DoA(3);
122813481Sgiacomo.travaglini@arm.com}
122913481Sgiacomo.travaglini@arm.com
123013481Sgiacomo.travaglini@arm.comTEST(InSequenceTest, ExpectationsOutOfScopeAreNotAffected) {
123113481Sgiacomo.travaglini@arm.com  MockA a;
123213481Sgiacomo.travaglini@arm.com  {
123313481Sgiacomo.travaglini@arm.com    InSequence dummy;
123413481Sgiacomo.travaglini@arm.com
123513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
123613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(2));
123713481Sgiacomo.travaglini@arm.com  }
123813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(3));
123913481Sgiacomo.travaglini@arm.com
124013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({  // NOLINT
124113481Sgiacomo.travaglini@arm.com    a.DoA(2);
124213481Sgiacomo.travaglini@arm.com  }, "Unexpected mock function call");
124313481Sgiacomo.travaglini@arm.com
124413481Sgiacomo.travaglini@arm.com  a.DoA(3);
124513481Sgiacomo.travaglini@arm.com  a.DoA(1);
124613481Sgiacomo.travaglini@arm.com  a.DoA(2);
124713481Sgiacomo.travaglini@arm.com}
124813481Sgiacomo.travaglini@arm.com
124913481Sgiacomo.travaglini@arm.com// Tests that any order is allowed when no sequence is used.
125013481Sgiacomo.travaglini@arm.comTEST(SequenceTest, AnyOrderIsOkByDefault) {
125113481Sgiacomo.travaglini@arm.com  {
125213481Sgiacomo.travaglini@arm.com    MockA a;
125313481Sgiacomo.travaglini@arm.com    MockB b;
125413481Sgiacomo.travaglini@arm.com
125513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
125613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
125713481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
125813481Sgiacomo.travaglini@arm.com
125913481Sgiacomo.travaglini@arm.com    a.DoA(1);
126013481Sgiacomo.travaglini@arm.com    b.DoB();
126113481Sgiacomo.travaglini@arm.com  }
126213481Sgiacomo.travaglini@arm.com
126313481Sgiacomo.travaglini@arm.com  {  // NOLINT
126413481Sgiacomo.travaglini@arm.com    MockA a;
126513481Sgiacomo.travaglini@arm.com    MockB b;
126613481Sgiacomo.travaglini@arm.com
126713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(1));
126813481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b, DoB())
126913481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
127013481Sgiacomo.travaglini@arm.com
127113481Sgiacomo.travaglini@arm.com    b.DoB();
127213481Sgiacomo.travaglini@arm.com    a.DoA(1);
127313481Sgiacomo.travaglini@arm.com  }
127413481Sgiacomo.travaglini@arm.com}
127513481Sgiacomo.travaglini@arm.com
127613481Sgiacomo.travaglini@arm.com// Tests that the calls must be in strict order when a complete order
127713481Sgiacomo.travaglini@arm.com// is specified.
127813481Sgiacomo.travaglini@arm.comTEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo1) {
127913481Sgiacomo.travaglini@arm.com  MockA a;
128013481Sgiacomo.travaglini@arm.com  ON_CALL(a, ReturnResult(_))
128113481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(Result()));
128213481Sgiacomo.travaglini@arm.com
128313481Sgiacomo.travaglini@arm.com  Sequence s;
128413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(1))
128513481Sgiacomo.travaglini@arm.com      .InSequence(s);
128613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(2))
128713481Sgiacomo.travaglini@arm.com      .InSequence(s);
128813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(3))
128913481Sgiacomo.travaglini@arm.com      .InSequence(s);
129013481Sgiacomo.travaglini@arm.com
129113481Sgiacomo.travaglini@arm.com  a.ReturnResult(1);
129213481Sgiacomo.travaglini@arm.com
129313481Sgiacomo.travaglini@arm.com  // May only be called after a.ReturnResult(2).
129413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
129513481Sgiacomo.travaglini@arm.com
129613481Sgiacomo.travaglini@arm.com  a.ReturnResult(2);
129713481Sgiacomo.travaglini@arm.com  a.ReturnResult(3);
129813481Sgiacomo.travaglini@arm.com}
129913481Sgiacomo.travaglini@arm.com
130013481Sgiacomo.travaglini@arm.com// Tests that the calls must be in strict order when a complete order
130113481Sgiacomo.travaglini@arm.com// is specified.
130213481Sgiacomo.travaglini@arm.comTEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo2) {
130313481Sgiacomo.travaglini@arm.com  MockA a;
130413481Sgiacomo.travaglini@arm.com  ON_CALL(a, ReturnResult(_))
130513481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(Result()));
130613481Sgiacomo.travaglini@arm.com
130713481Sgiacomo.travaglini@arm.com  Sequence s;
130813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(1))
130913481Sgiacomo.travaglini@arm.com      .InSequence(s);
131013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(2))
131113481Sgiacomo.travaglini@arm.com      .InSequence(s);
131213481Sgiacomo.travaglini@arm.com
131313481Sgiacomo.travaglini@arm.com  // May only be called after a.ReturnResult(1).
131413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.ReturnResult(2), "Unexpected mock function call");
131513481Sgiacomo.travaglini@arm.com
131613481Sgiacomo.travaglini@arm.com  a.ReturnResult(1);
131713481Sgiacomo.travaglini@arm.com  a.ReturnResult(2);
131813481Sgiacomo.travaglini@arm.com}
131913481Sgiacomo.travaglini@arm.com
132013481Sgiacomo.travaglini@arm.com// Tests specifying a DAG using multiple sequences.
132113481Sgiacomo.travaglini@arm.comclass PartialOrderTest : public testing::Test {
132213481Sgiacomo.travaglini@arm.com protected:
132313481Sgiacomo.travaglini@arm.com  PartialOrderTest() {
132413481Sgiacomo.travaglini@arm.com    ON_CALL(a_, ReturnResult(_))
132513481Sgiacomo.travaglini@arm.com        .WillByDefault(Return(Result()));
132613481Sgiacomo.travaglini@arm.com
132713481Sgiacomo.travaglini@arm.com    // Specifies this partial ordering:
132813481Sgiacomo.travaglini@arm.com    //
132913481Sgiacomo.travaglini@arm.com    // a.ReturnResult(1) ==>
133013481Sgiacomo.travaglini@arm.com    //                       a.ReturnResult(2) * n  ==>  a.ReturnResult(3)
133113481Sgiacomo.travaglini@arm.com    // b.DoB() * 2       ==>
133213481Sgiacomo.travaglini@arm.com    Sequence x, y;
133313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a_, ReturnResult(1))
133413481Sgiacomo.travaglini@arm.com        .InSequence(x);
133513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(b_, DoB())
133613481Sgiacomo.travaglini@arm.com        .Times(2)
133713481Sgiacomo.travaglini@arm.com        .InSequence(y);
133813481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a_, ReturnResult(2))
133913481Sgiacomo.travaglini@arm.com        .Times(AnyNumber())
134013481Sgiacomo.travaglini@arm.com        .InSequence(x, y);
134113481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a_, ReturnResult(3))
134213481Sgiacomo.travaglini@arm.com        .InSequence(x);
134313481Sgiacomo.travaglini@arm.com  }
134413481Sgiacomo.travaglini@arm.com
134513481Sgiacomo.travaglini@arm.com  MockA a_;
134613481Sgiacomo.travaglini@arm.com  MockB b_;
134713481Sgiacomo.travaglini@arm.com};
134813481Sgiacomo.travaglini@arm.com
134913481Sgiacomo.travaglini@arm.comTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag1) {
135013481Sgiacomo.travaglini@arm.com  a_.ReturnResult(1);
135113481Sgiacomo.travaglini@arm.com  b_.DoB();
135213481Sgiacomo.travaglini@arm.com
135313481Sgiacomo.travaglini@arm.com  // May only be called after the second DoB().
135413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
135513481Sgiacomo.travaglini@arm.com
135613481Sgiacomo.travaglini@arm.com  b_.DoB();
135713481Sgiacomo.travaglini@arm.com  a_.ReturnResult(3);
135813481Sgiacomo.travaglini@arm.com}
135913481Sgiacomo.travaglini@arm.com
136013481Sgiacomo.travaglini@arm.comTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag2) {
136113481Sgiacomo.travaglini@arm.com  // May only be called after ReturnResult(1).
136213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
136313481Sgiacomo.travaglini@arm.com
136413481Sgiacomo.travaglini@arm.com  a_.ReturnResult(1);
136513481Sgiacomo.travaglini@arm.com  b_.DoB();
136613481Sgiacomo.travaglini@arm.com  b_.DoB();
136713481Sgiacomo.travaglini@arm.com  a_.ReturnResult(3);
136813481Sgiacomo.travaglini@arm.com}
136913481Sgiacomo.travaglini@arm.com
137013481Sgiacomo.travaglini@arm.comTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag3) {
137113481Sgiacomo.travaglini@arm.com  // May only be called last.
137213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(3), "Unexpected mock function call");
137313481Sgiacomo.travaglini@arm.com
137413481Sgiacomo.travaglini@arm.com  a_.ReturnResult(1);
137513481Sgiacomo.travaglini@arm.com  b_.DoB();
137613481Sgiacomo.travaglini@arm.com  b_.DoB();
137713481Sgiacomo.travaglini@arm.com  a_.ReturnResult(3);
137813481Sgiacomo.travaglini@arm.com}
137913481Sgiacomo.travaglini@arm.com
138013481Sgiacomo.travaglini@arm.comTEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag4) {
138113481Sgiacomo.travaglini@arm.com  a_.ReturnResult(1);
138213481Sgiacomo.travaglini@arm.com  b_.DoB();
138313481Sgiacomo.travaglini@arm.com  b_.DoB();
138413481Sgiacomo.travaglini@arm.com  a_.ReturnResult(3);
138513481Sgiacomo.travaglini@arm.com
138613481Sgiacomo.travaglini@arm.com  // May only be called before ReturnResult(3).
138713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
138813481Sgiacomo.travaglini@arm.com}
138913481Sgiacomo.travaglini@arm.com
139013481Sgiacomo.travaglini@arm.comTEST(SequenceTest, Retirement) {
139113481Sgiacomo.travaglini@arm.com  MockA a;
139213481Sgiacomo.travaglini@arm.com  Sequence s;
139313481Sgiacomo.travaglini@arm.com
139413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
139513481Sgiacomo.travaglini@arm.com      .InSequence(s);
139613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(_))
139713481Sgiacomo.travaglini@arm.com      .InSequence(s)
139813481Sgiacomo.travaglini@arm.com      .RetiresOnSaturation();
139913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
140013481Sgiacomo.travaglini@arm.com      .InSequence(s);
140113481Sgiacomo.travaglini@arm.com
140213481Sgiacomo.travaglini@arm.com  a.DoA(1);
140313481Sgiacomo.travaglini@arm.com  a.DoA(2);
140413481Sgiacomo.travaglini@arm.com  a.DoA(1);
140513481Sgiacomo.travaglini@arm.com}
140613481Sgiacomo.travaglini@arm.com
140713481Sgiacomo.travaglini@arm.com// Tests Expectation.
140813481Sgiacomo.travaglini@arm.com
140913481Sgiacomo.travaglini@arm.comTEST(ExpectationTest, ConstrutorsWork) {
141013481Sgiacomo.travaglini@arm.com  MockA a;
141113481Sgiacomo.travaglini@arm.com  Expectation e1;  // Default ctor.
141213481Sgiacomo.travaglini@arm.com
141313481Sgiacomo.travaglini@arm.com  // Ctor from various forms of EXPECT_CALL.
141413481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(2));
141513481Sgiacomo.travaglini@arm.com  Expectation e3 = EXPECT_CALL(a, DoA(3)).With(_);
141613481Sgiacomo.travaglini@arm.com  {
141713481Sgiacomo.travaglini@arm.com    Sequence s;
141813481Sgiacomo.travaglini@arm.com    Expectation e4 = EXPECT_CALL(a, DoA(4)).Times(1);
141913481Sgiacomo.travaglini@arm.com    Expectation e5 = EXPECT_CALL(a, DoA(5)).InSequence(s);
142013481Sgiacomo.travaglini@arm.com  }
142113481Sgiacomo.travaglini@arm.com  Expectation e6 = EXPECT_CALL(a, DoA(6)).After(e2);
142213481Sgiacomo.travaglini@arm.com  Expectation e7 = EXPECT_CALL(a, DoA(7)).WillOnce(Return());
142313481Sgiacomo.travaglini@arm.com  Expectation e8 = EXPECT_CALL(a, DoA(8)).WillRepeatedly(Return());
142413481Sgiacomo.travaglini@arm.com  Expectation e9 = EXPECT_CALL(a, DoA(9)).RetiresOnSaturation();
142513481Sgiacomo.travaglini@arm.com
142613481Sgiacomo.travaglini@arm.com  Expectation e10 = e2;  // Copy ctor.
142713481Sgiacomo.travaglini@arm.com
142813481Sgiacomo.travaglini@arm.com  EXPECT_THAT(e1, Ne(e2));
142913481Sgiacomo.travaglini@arm.com  EXPECT_THAT(e2, Eq(e10));
143013481Sgiacomo.travaglini@arm.com
143113481Sgiacomo.travaglini@arm.com  a.DoA(2);
143213481Sgiacomo.travaglini@arm.com  a.DoA(3);
143313481Sgiacomo.travaglini@arm.com  a.DoA(4);
143413481Sgiacomo.travaglini@arm.com  a.DoA(5);
143513481Sgiacomo.travaglini@arm.com  a.DoA(6);
143613481Sgiacomo.travaglini@arm.com  a.DoA(7);
143713481Sgiacomo.travaglini@arm.com  a.DoA(8);
143813481Sgiacomo.travaglini@arm.com  a.DoA(9);
143913481Sgiacomo.travaglini@arm.com}
144013481Sgiacomo.travaglini@arm.com
144113481Sgiacomo.travaglini@arm.comTEST(ExpectationTest, AssignmentWorks) {
144213481Sgiacomo.travaglini@arm.com  MockA a;
144313481Sgiacomo.travaglini@arm.com  Expectation e1;
144413481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(1));
144513481Sgiacomo.travaglini@arm.com
144613481Sgiacomo.travaglini@arm.com  EXPECT_THAT(e1, Ne(e2));
144713481Sgiacomo.travaglini@arm.com
144813481Sgiacomo.travaglini@arm.com  e1 = e2;
144913481Sgiacomo.travaglini@arm.com  EXPECT_THAT(e1, Eq(e2));
145013481Sgiacomo.travaglini@arm.com
145113481Sgiacomo.travaglini@arm.com  a.DoA(1);
145213481Sgiacomo.travaglini@arm.com}
145313481Sgiacomo.travaglini@arm.com
145413481Sgiacomo.travaglini@arm.com// Tests ExpectationSet.
145513481Sgiacomo.travaglini@arm.com
145613481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, MemberTypesAreCorrect) {
145713481Sgiacomo.travaglini@arm.com  ::testing::StaticAssertTypeEq<Expectation, ExpectationSet::value_type>();
145813481Sgiacomo.travaglini@arm.com}
145913481Sgiacomo.travaglini@arm.com
146013481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, ConstructorsWork) {
146113481Sgiacomo.travaglini@arm.com  MockA a;
146213481Sgiacomo.travaglini@arm.com
146313481Sgiacomo.travaglini@arm.com  Expectation e1;
146413481Sgiacomo.travaglini@arm.com  const Expectation e2;
146513481Sgiacomo.travaglini@arm.com  ExpectationSet es1;  // Default ctor.
146613481Sgiacomo.travaglini@arm.com  ExpectationSet es2 = EXPECT_CALL(a, DoA(1));  // Ctor from EXPECT_CALL.
146713481Sgiacomo.travaglini@arm.com  ExpectationSet es3 = e1;  // Ctor from Expectation.
146813481Sgiacomo.travaglini@arm.com  ExpectationSet es4(e1);   // Ctor from Expectation; alternative syntax.
146913481Sgiacomo.travaglini@arm.com  ExpectationSet es5 = e2;  // Ctor from const Expectation.
147013481Sgiacomo.travaglini@arm.com  ExpectationSet es6(e2);   // Ctor from const Expectation; alternative syntax.
147113481Sgiacomo.travaglini@arm.com  ExpectationSet es7 = es2;  // Copy ctor.
147213481Sgiacomo.travaglini@arm.com
147313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, es1.size());
147413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es2.size());
147513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es3.size());
147613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es4.size());
147713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es5.size());
147813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es6.size());
147913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es7.size());
148013481Sgiacomo.travaglini@arm.com
148113481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es3, Ne(es2));
148213481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es4, Eq(es3));
148313481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es5, Eq(es4));
148413481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es6, Eq(es5));
148513481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es7, Eq(es2));
148613481Sgiacomo.travaglini@arm.com  a.DoA(1);
148713481Sgiacomo.travaglini@arm.com}
148813481Sgiacomo.travaglini@arm.com
148913481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, AssignmentWorks) {
149013481Sgiacomo.travaglini@arm.com  ExpectationSet es1;
149113481Sgiacomo.travaglini@arm.com  ExpectationSet es2 = Expectation();
149213481Sgiacomo.travaglini@arm.com
149313481Sgiacomo.travaglini@arm.com  es1 = es2;
149413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es1.size());
149513481Sgiacomo.travaglini@arm.com  EXPECT_THAT(*(es1.begin()), Eq(Expectation()));
149613481Sgiacomo.travaglini@arm.com  EXPECT_THAT(es1, Eq(es2));
149713481Sgiacomo.travaglini@arm.com}
149813481Sgiacomo.travaglini@arm.com
149913481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, InsertionWorks) {
150013481Sgiacomo.travaglini@arm.com  ExpectationSet es1;
150113481Sgiacomo.travaglini@arm.com  Expectation e1;
150213481Sgiacomo.travaglini@arm.com  es1 += e1;
150313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es1.size());
150413481Sgiacomo.travaglini@arm.com  EXPECT_THAT(*(es1.begin()), Eq(e1));
150513481Sgiacomo.travaglini@arm.com
150613481Sgiacomo.travaglini@arm.com  MockA a;
150713481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(1));
150813481Sgiacomo.travaglini@arm.com  es1 += e2;
150913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, es1.size());
151013481Sgiacomo.travaglini@arm.com
151113481Sgiacomo.travaglini@arm.com  ExpectationSet::const_iterator it1 = es1.begin();
151213481Sgiacomo.travaglini@arm.com  ExpectationSet::const_iterator it2 = it1;
151313481Sgiacomo.travaglini@arm.com  ++it2;
151413481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(*it1 == e1 || *it2 == e1);  // e1 must be in the set.
151513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(*it1 == e2 || *it2 == e2);  // e2 must be in the set too.
151613481Sgiacomo.travaglini@arm.com  a.DoA(1);
151713481Sgiacomo.travaglini@arm.com}
151813481Sgiacomo.travaglini@arm.com
151913481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, SizeWorks) {
152013481Sgiacomo.travaglini@arm.com  ExpectationSet es;
152113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, es.size());
152213481Sgiacomo.travaglini@arm.com
152313481Sgiacomo.travaglini@arm.com  es += Expectation();
152413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, es.size());
152513481Sgiacomo.travaglini@arm.com
152613481Sgiacomo.travaglini@arm.com  MockA a;
152713481Sgiacomo.travaglini@arm.com  es += EXPECT_CALL(a, DoA(1));
152813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, es.size());
152913481Sgiacomo.travaglini@arm.com
153013481Sgiacomo.travaglini@arm.com  a.DoA(1);
153113481Sgiacomo.travaglini@arm.com}
153213481Sgiacomo.travaglini@arm.com
153313481Sgiacomo.travaglini@arm.comTEST(ExpectationSetTest, IsEnumerable) {
153413481Sgiacomo.travaglini@arm.com  ExpectationSet es;
153513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(es.begin() == es.end());
153613481Sgiacomo.travaglini@arm.com
153713481Sgiacomo.travaglini@arm.com  es += Expectation();
153813481Sgiacomo.travaglini@arm.com  ExpectationSet::const_iterator it = es.begin();
153913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(it != es.end());
154013481Sgiacomo.travaglini@arm.com  EXPECT_THAT(*it, Eq(Expectation()));
154113481Sgiacomo.travaglini@arm.com  ++it;
154213481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(it== es.end());
154313481Sgiacomo.travaglini@arm.com}
154413481Sgiacomo.travaglini@arm.com
154513481Sgiacomo.travaglini@arm.com// Tests the .After() clause.
154613481Sgiacomo.travaglini@arm.com
154713481Sgiacomo.travaglini@arm.comTEST(AfterTest, SucceedsWhenPartialOrderIsSatisfied) {
154813481Sgiacomo.travaglini@arm.com  MockA a;
154913481Sgiacomo.travaglini@arm.com  ExpectationSet es;
155013481Sgiacomo.travaglini@arm.com  es += EXPECT_CALL(a, DoA(1));
155113481Sgiacomo.travaglini@arm.com  es += EXPECT_CALL(a, DoA(2));
155213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(3))
155313481Sgiacomo.travaglini@arm.com      .After(es);
155413481Sgiacomo.travaglini@arm.com
155513481Sgiacomo.travaglini@arm.com  a.DoA(1);
155613481Sgiacomo.travaglini@arm.com  a.DoA(2);
155713481Sgiacomo.travaglini@arm.com  a.DoA(3);
155813481Sgiacomo.travaglini@arm.com}
155913481Sgiacomo.travaglini@arm.com
156013481Sgiacomo.travaglini@arm.comTEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {
156113481Sgiacomo.travaglini@arm.com  MockA a;
156213481Sgiacomo.travaglini@arm.com  MockB b;
156313481Sgiacomo.travaglini@arm.com  // The following also verifies that const Expectation objects work
156413481Sgiacomo.travaglini@arm.com  // too.  Do not remove the const modifiers.
156513481Sgiacomo.travaglini@arm.com  const Expectation e1 = EXPECT_CALL(a, DoA(1));
156613481Sgiacomo.travaglini@arm.com  const Expectation e2 = EXPECT_CALL(b, DoB())
156713481Sgiacomo.travaglini@arm.com      .Times(2)
156813481Sgiacomo.travaglini@arm.com      .After(e1);
156913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2)).After(e2);
157013481Sgiacomo.travaglini@arm.com
157113481Sgiacomo.travaglini@arm.com  a.DoA(1);
157213481Sgiacomo.travaglini@arm.com  b.DoB();
157313481Sgiacomo.travaglini@arm.com  b.DoB();
157413481Sgiacomo.travaglini@arm.com  a.DoA(2);
157513481Sgiacomo.travaglini@arm.com}
157613481Sgiacomo.travaglini@arm.com
157713481Sgiacomo.travaglini@arm.com// Calls must be in strict order when specified so using .After().
157813481Sgiacomo.travaglini@arm.comTEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo1) {
157913481Sgiacomo.travaglini@arm.com  MockA a;
158013481Sgiacomo.travaglini@arm.com  MockB b;
158113481Sgiacomo.travaglini@arm.com
158213481Sgiacomo.travaglini@arm.com  // Define ordering:
158313481Sgiacomo.travaglini@arm.com  //   a.DoA(1) ==> b.DoB() ==> a.DoA(2)
158413481Sgiacomo.travaglini@arm.com  Expectation e1 = EXPECT_CALL(a, DoA(1));
158513481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(b, DoB())
158613481Sgiacomo.travaglini@arm.com      .After(e1);
158713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
158813481Sgiacomo.travaglini@arm.com      .After(e2);
158913481Sgiacomo.travaglini@arm.com
159013481Sgiacomo.travaglini@arm.com  a.DoA(1);
159113481Sgiacomo.travaglini@arm.com
159213481Sgiacomo.travaglini@arm.com  // May only be called after DoB().
159313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call");
159413481Sgiacomo.travaglini@arm.com
159513481Sgiacomo.travaglini@arm.com  b.DoB();
159613481Sgiacomo.travaglini@arm.com  a.DoA(2);
159713481Sgiacomo.travaglini@arm.com}
159813481Sgiacomo.travaglini@arm.com
159913481Sgiacomo.travaglini@arm.com// Calls must be in strict order when specified so using .After().
160013481Sgiacomo.travaglini@arm.comTEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo2) {
160113481Sgiacomo.travaglini@arm.com  MockA a;
160213481Sgiacomo.travaglini@arm.com  MockB b;
160313481Sgiacomo.travaglini@arm.com
160413481Sgiacomo.travaglini@arm.com  // Define ordering:
160513481Sgiacomo.travaglini@arm.com  //   a.DoA(1) ==> b.DoB() * 2 ==> a.DoA(2)
160613481Sgiacomo.travaglini@arm.com  Expectation e1 = EXPECT_CALL(a, DoA(1));
160713481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(b, DoB())
160813481Sgiacomo.travaglini@arm.com      .Times(2)
160913481Sgiacomo.travaglini@arm.com      .After(e1);
161013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2))
161113481Sgiacomo.travaglini@arm.com      .After(e2);
161213481Sgiacomo.travaglini@arm.com
161313481Sgiacomo.travaglini@arm.com  a.DoA(1);
161413481Sgiacomo.travaglini@arm.com  b.DoB();
161513481Sgiacomo.travaglini@arm.com
161613481Sgiacomo.travaglini@arm.com  // May only be called after the second DoB().
161713481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call");
161813481Sgiacomo.travaglini@arm.com
161913481Sgiacomo.travaglini@arm.com  b.DoB();
162013481Sgiacomo.travaglini@arm.com  a.DoA(2);
162113481Sgiacomo.travaglini@arm.com}
162213481Sgiacomo.travaglini@arm.com
162313481Sgiacomo.travaglini@arm.com// Calls must satisfy the partial order when specified so.
162413481Sgiacomo.travaglini@arm.comTEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
162513481Sgiacomo.travaglini@arm.com  MockA a;
162613481Sgiacomo.travaglini@arm.com  ON_CALL(a, ReturnResult(_))
162713481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(Result()));
162813481Sgiacomo.travaglini@arm.com
162913481Sgiacomo.travaglini@arm.com  // Define ordering:
163013481Sgiacomo.travaglini@arm.com  //   a.DoA(1) ==>
163113481Sgiacomo.travaglini@arm.com  //   a.DoA(2) ==> a.ReturnResult(3)
163213481Sgiacomo.travaglini@arm.com  Expectation e = EXPECT_CALL(a, DoA(1));
163313481Sgiacomo.travaglini@arm.com  const ExpectationSet es = EXPECT_CALL(a, DoA(2));
163413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(3))
163513481Sgiacomo.travaglini@arm.com      .After(e, es);
163613481Sgiacomo.travaglini@arm.com
163713481Sgiacomo.travaglini@arm.com  // May only be called last.
163813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
163913481Sgiacomo.travaglini@arm.com
164013481Sgiacomo.travaglini@arm.com  a.DoA(2);
164113481Sgiacomo.travaglini@arm.com  a.DoA(1);
164213481Sgiacomo.travaglini@arm.com  a.ReturnResult(3);
164313481Sgiacomo.travaglini@arm.com}
164413481Sgiacomo.travaglini@arm.com
164513481Sgiacomo.travaglini@arm.com// Calls must satisfy the partial order when specified so.
164613481Sgiacomo.travaglini@arm.comTEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo2) {
164713481Sgiacomo.travaglini@arm.com  MockA a;
164813481Sgiacomo.travaglini@arm.com
164913481Sgiacomo.travaglini@arm.com  // Define ordering:
165013481Sgiacomo.travaglini@arm.com  //   a.DoA(1) ==>
165113481Sgiacomo.travaglini@arm.com  //   a.DoA(2) ==> a.DoA(3)
165213481Sgiacomo.travaglini@arm.com  Expectation e = EXPECT_CALL(a, DoA(1));
165313481Sgiacomo.travaglini@arm.com  const ExpectationSet es = EXPECT_CALL(a, DoA(2));
165413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(3))
165513481Sgiacomo.travaglini@arm.com      .After(e, es);
165613481Sgiacomo.travaglini@arm.com
165713481Sgiacomo.travaglini@arm.com  a.DoA(2);
165813481Sgiacomo.travaglini@arm.com
165913481Sgiacomo.travaglini@arm.com  // May only be called last.
166013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call");
166113481Sgiacomo.travaglini@arm.com
166213481Sgiacomo.travaglini@arm.com  a.DoA(1);
166313481Sgiacomo.travaglini@arm.com  a.DoA(3);
166413481Sgiacomo.travaglini@arm.com}
166513481Sgiacomo.travaglini@arm.com
166613481Sgiacomo.travaglini@arm.com// .After() can be combined with .InSequence().
166713481Sgiacomo.travaglini@arm.comTEST(AfterTest, CanBeUsedWithInSequence) {
166813481Sgiacomo.travaglini@arm.com  MockA a;
166913481Sgiacomo.travaglini@arm.com  Sequence s;
167013481Sgiacomo.travaglini@arm.com  Expectation e = EXPECT_CALL(a, DoA(1));
167113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(2)).InSequence(s);
167213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(3))
167313481Sgiacomo.travaglini@arm.com      .InSequence(s)
167413481Sgiacomo.travaglini@arm.com      .After(e);
167513481Sgiacomo.travaglini@arm.com
167613481Sgiacomo.travaglini@arm.com  a.DoA(1);
167713481Sgiacomo.travaglini@arm.com
167813481Sgiacomo.travaglini@arm.com  // May only be after DoA(2).
167913481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call");
168013481Sgiacomo.travaglini@arm.com
168113481Sgiacomo.travaglini@arm.com  a.DoA(2);
168213481Sgiacomo.travaglini@arm.com  a.DoA(3);
168313481Sgiacomo.travaglini@arm.com}
168413481Sgiacomo.travaglini@arm.com
168513481Sgiacomo.travaglini@arm.com// .After() can be called multiple times.
168613481Sgiacomo.travaglini@arm.comTEST(AfterTest, CanBeCalledManyTimes) {
168713481Sgiacomo.travaglini@arm.com  MockA a;
168813481Sgiacomo.travaglini@arm.com  Expectation e1 = EXPECT_CALL(a, DoA(1));
168913481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(2));
169013481Sgiacomo.travaglini@arm.com  Expectation e3 = EXPECT_CALL(a, DoA(3));
169113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(4))
169213481Sgiacomo.travaglini@arm.com      .After(e1)
169313481Sgiacomo.travaglini@arm.com      .After(e2)
169413481Sgiacomo.travaglini@arm.com      .After(e3);
169513481Sgiacomo.travaglini@arm.com
169613481Sgiacomo.travaglini@arm.com  a.DoA(3);
169713481Sgiacomo.travaglini@arm.com  a.DoA(1);
169813481Sgiacomo.travaglini@arm.com  a.DoA(2);
169913481Sgiacomo.travaglini@arm.com  a.DoA(4);
170013481Sgiacomo.travaglini@arm.com}
170113481Sgiacomo.travaglini@arm.com
170213481Sgiacomo.travaglini@arm.com// .After() accepts up to 5 arguments.
170313481Sgiacomo.travaglini@arm.comTEST(AfterTest, AcceptsUpToFiveArguments) {
170413481Sgiacomo.travaglini@arm.com  MockA a;
170513481Sgiacomo.travaglini@arm.com  Expectation e1 = EXPECT_CALL(a, DoA(1));
170613481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(2));
170713481Sgiacomo.travaglini@arm.com  Expectation e3 = EXPECT_CALL(a, DoA(3));
170813481Sgiacomo.travaglini@arm.com  ExpectationSet es1 = EXPECT_CALL(a, DoA(4));
170913481Sgiacomo.travaglini@arm.com  ExpectationSet es2 = EXPECT_CALL(a, DoA(5));
171013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(6))
171113481Sgiacomo.travaglini@arm.com      .After(e1, e2, e3, es1, es2);
171213481Sgiacomo.travaglini@arm.com
171313481Sgiacomo.travaglini@arm.com  a.DoA(5);
171413481Sgiacomo.travaglini@arm.com  a.DoA(2);
171513481Sgiacomo.travaglini@arm.com  a.DoA(4);
171613481Sgiacomo.travaglini@arm.com  a.DoA(1);
171713481Sgiacomo.travaglini@arm.com  a.DoA(3);
171813481Sgiacomo.travaglini@arm.com  a.DoA(6);
171913481Sgiacomo.travaglini@arm.com}
172013481Sgiacomo.travaglini@arm.com
172113481Sgiacomo.travaglini@arm.com// .After() allows input to contain duplicated Expectations.
172213481Sgiacomo.travaglini@arm.comTEST(AfterTest, AcceptsDuplicatedInput) {
172313481Sgiacomo.travaglini@arm.com  MockA a;
172413481Sgiacomo.travaglini@arm.com  ON_CALL(a, ReturnResult(_))
172513481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(Result()));
172613481Sgiacomo.travaglini@arm.com
172713481Sgiacomo.travaglini@arm.com  // Define ordering:
172813481Sgiacomo.travaglini@arm.com  //   DoA(1) ==>
172913481Sgiacomo.travaglini@arm.com  //   DoA(2) ==> ReturnResult(3)
173013481Sgiacomo.travaglini@arm.com  Expectation e1 = EXPECT_CALL(a, DoA(1));
173113481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(2));
173213481Sgiacomo.travaglini@arm.com  ExpectationSet es;
173313481Sgiacomo.travaglini@arm.com  es += e1;
173413481Sgiacomo.travaglini@arm.com  es += e2;
173513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, ReturnResult(3))
173613481Sgiacomo.travaglini@arm.com      .After(e1, e2, es, e1);
173713481Sgiacomo.travaglini@arm.com
173813481Sgiacomo.travaglini@arm.com  a.DoA(1);
173913481Sgiacomo.travaglini@arm.com
174013481Sgiacomo.travaglini@arm.com  // May only be after DoA(2).
174113481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
174213481Sgiacomo.travaglini@arm.com
174313481Sgiacomo.travaglini@arm.com  a.DoA(2);
174413481Sgiacomo.travaglini@arm.com  a.ReturnResult(3);
174513481Sgiacomo.travaglini@arm.com}
174613481Sgiacomo.travaglini@arm.com
174713481Sgiacomo.travaglini@arm.com// An Expectation added to an ExpectationSet after it has been used in
174813481Sgiacomo.travaglini@arm.com// an .After() has no effect.
174913481Sgiacomo.travaglini@arm.comTEST(AfterTest, ChangesToExpectationSetHaveNoEffectAfterwards) {
175013481Sgiacomo.travaglini@arm.com  MockA a;
175113481Sgiacomo.travaglini@arm.com  ExpectationSet es1 = EXPECT_CALL(a, DoA(1));
175213481Sgiacomo.travaglini@arm.com  Expectation e2 = EXPECT_CALL(a, DoA(2));
175313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(3))
175413481Sgiacomo.travaglini@arm.com      .After(es1);
175513481Sgiacomo.travaglini@arm.com  es1 += e2;
175613481Sgiacomo.travaglini@arm.com
175713481Sgiacomo.travaglini@arm.com  a.DoA(1);
175813481Sgiacomo.travaglini@arm.com  a.DoA(3);
175913481Sgiacomo.travaglini@arm.com  a.DoA(2);
176013481Sgiacomo.travaglini@arm.com}
176113481Sgiacomo.travaglini@arm.com
176213481Sgiacomo.travaglini@arm.com// Tests that Google Mock correctly handles calls to mock functions
176313481Sgiacomo.travaglini@arm.com// after a mock object owning one of their pre-requisites has died.
176413481Sgiacomo.travaglini@arm.com
176513481Sgiacomo.travaglini@arm.com// Tests that calls that satisfy the original spec are successful.
176613481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, Success1) {
176713481Sgiacomo.travaglini@arm.com  MockB* const b1 = new MockB;
176813481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
176913481Sgiacomo.travaglini@arm.com  MockB* const b2 = new MockB;
177013481Sgiacomo.travaglini@arm.com
177113481Sgiacomo.travaglini@arm.com  {
177213481Sgiacomo.travaglini@arm.com    InSequence dummy;
177313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b1, DoB(_))
177413481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1));
177513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*a, Binary(_, _))
177613481Sgiacomo.travaglini@arm.com        .Times(AnyNumber())
177713481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(true));
177813481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b2, DoB(_))
177913481Sgiacomo.travaglini@arm.com        .Times(AnyNumber())
178013481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
178113481Sgiacomo.travaglini@arm.com  }
178213481Sgiacomo.travaglini@arm.com
178313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b1->DoB(1));
178413481Sgiacomo.travaglini@arm.com  delete b1;
178513481Sgiacomo.travaglini@arm.com  // a's pre-requisite has died.
178613481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a->Binary(0, 1));
178713481Sgiacomo.travaglini@arm.com  delete b2;
178813481Sgiacomo.travaglini@arm.com  // a's successor has died.
178913481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a->Binary(1, 2));
179013481Sgiacomo.travaglini@arm.com  delete a;
179113481Sgiacomo.travaglini@arm.com}
179213481Sgiacomo.travaglini@arm.com
179313481Sgiacomo.travaglini@arm.com// Tests that calls that satisfy the original spec are successful.
179413481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, Success2) {
179513481Sgiacomo.travaglini@arm.com  MockB* const b1 = new MockB;
179613481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
179713481Sgiacomo.travaglini@arm.com  MockB* const b2 = new MockB;
179813481Sgiacomo.travaglini@arm.com
179913481Sgiacomo.travaglini@arm.com  {
180013481Sgiacomo.travaglini@arm.com    InSequence dummy;
180113481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b1, DoB(_))
180213481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1));
180313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*a, Binary(_, _))
180413481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
180513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b2, DoB(_))
180613481Sgiacomo.travaglini@arm.com        .Times(AnyNumber())
180713481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
180813481Sgiacomo.travaglini@arm.com  }
180913481Sgiacomo.travaglini@arm.com
181013481Sgiacomo.travaglini@arm.com  delete a;  // a is trivially satisfied.
181113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b1->DoB(1));
181213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b2->DoB(2));
181313481Sgiacomo.travaglini@arm.com  delete b1;
181413481Sgiacomo.travaglini@arm.com  delete b2;
181513481Sgiacomo.travaglini@arm.com}
181613481Sgiacomo.travaglini@arm.com
181713481Sgiacomo.travaglini@arm.com// Tests that it's OK to delete a mock object itself in its action.
181813481Sgiacomo.travaglini@arm.com
181913481Sgiacomo.travaglini@arm.com// Suppresses warning on unreferenced formal parameter in MSVC with
182013481Sgiacomo.travaglini@arm.com// -W4.
182113481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
182213481Sgiacomo.travaglini@arm.com# pragma warning(push)
182313481Sgiacomo.travaglini@arm.com# pragma warning(disable:4100)
182413481Sgiacomo.travaglini@arm.com#endif
182513481Sgiacomo.travaglini@arm.com
182613481Sgiacomo.travaglini@arm.comACTION_P(Delete, ptr) { delete ptr; }
182713481Sgiacomo.travaglini@arm.com
182813481Sgiacomo.travaglini@arm.com#ifdef _MSC_VER
182913481Sgiacomo.travaglini@arm.com# pragma warning(pop)
183013481Sgiacomo.travaglini@arm.com#endif
183113481Sgiacomo.travaglini@arm.com
183213481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {
183313481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
183413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(_)).WillOnce(Delete(a));
183513481Sgiacomo.travaglini@arm.com  a->DoA(42);  // This will cause a to be deleted.
183613481Sgiacomo.travaglini@arm.com}
183713481Sgiacomo.travaglini@arm.com
183813481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningValue) {
183913481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
184013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, ReturnResult(_))
184113481Sgiacomo.travaglini@arm.com      .WillOnce(DoAll(Delete(a), Return(Result())));
184213481Sgiacomo.travaglini@arm.com  a->ReturnResult(42);  // This will cause a to be deleted.
184313481Sgiacomo.travaglini@arm.com}
184413481Sgiacomo.travaglini@arm.com
184513481Sgiacomo.travaglini@arm.com// Tests that calls that violate the original spec yield failures.
184613481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, Failure1) {
184713481Sgiacomo.travaglini@arm.com  MockB* const b1 = new MockB;
184813481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
184913481Sgiacomo.travaglini@arm.com  MockB* const b2 = new MockB;
185013481Sgiacomo.travaglini@arm.com
185113481Sgiacomo.travaglini@arm.com  {
185213481Sgiacomo.travaglini@arm.com    InSequence dummy;
185313481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b1, DoB(_))
185413481Sgiacomo.travaglini@arm.com        .WillOnce(Return(1));
185513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*a, Binary(_, _))
185613481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
185713481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b2, DoB(_))
185813481Sgiacomo.travaglini@arm.com        .Times(AnyNumber())
185913481Sgiacomo.travaglini@arm.com        .WillRepeatedly(Return(2));
186013481Sgiacomo.travaglini@arm.com  }
186113481Sgiacomo.travaglini@arm.com
186213481Sgiacomo.travaglini@arm.com  delete a;  // a is trivially satisfied.
186313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE({
186413481Sgiacomo.travaglini@arm.com    b2->DoB(2);
186513481Sgiacomo.travaglini@arm.com  }, "Unexpected mock function call");
186613481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b1->DoB(1));
186713481Sgiacomo.travaglini@arm.com  delete b1;
186813481Sgiacomo.travaglini@arm.com  delete b2;
186913481Sgiacomo.travaglini@arm.com}
187013481Sgiacomo.travaglini@arm.com
187113481Sgiacomo.travaglini@arm.com// Tests that calls that violate the original spec yield failures.
187213481Sgiacomo.travaglini@arm.comTEST(DeletingMockEarlyTest, Failure2) {
187313481Sgiacomo.travaglini@arm.com  MockB* const b1 = new MockB;
187413481Sgiacomo.travaglini@arm.com  MockA* const a = new MockA;
187513481Sgiacomo.travaglini@arm.com  MockB* const b2 = new MockB;
187613481Sgiacomo.travaglini@arm.com
187713481Sgiacomo.travaglini@arm.com  {
187813481Sgiacomo.travaglini@arm.com    InSequence dummy;
187913481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b1, DoB(_));
188013481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*a, Binary(_, _))
188113481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
188213481Sgiacomo.travaglini@arm.com    EXPECT_CALL(*b2, DoB(_))
188313481Sgiacomo.travaglini@arm.com        .Times(AnyNumber());
188413481Sgiacomo.travaglini@arm.com  }
188513481Sgiacomo.travaglini@arm.com
188613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(delete b1,
188713481Sgiacomo.travaglini@arm.com                          "Actual: never called");
188813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a->Binary(0, 1),
188913481Sgiacomo.travaglini@arm.com                          "Unexpected mock function call");
189013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(b2->DoB(1),
189113481Sgiacomo.travaglini@arm.com                          "Unexpected mock function call");
189213481Sgiacomo.travaglini@arm.com  delete a;
189313481Sgiacomo.travaglini@arm.com  delete b2;
189413481Sgiacomo.travaglini@arm.com}
189513481Sgiacomo.travaglini@arm.com
189613481Sgiacomo.travaglini@arm.comclass EvenNumberCardinality : public CardinalityInterface {
189713481Sgiacomo.travaglini@arm.com public:
189813481Sgiacomo.travaglini@arm.com  // Returns true iff call_count calls will satisfy this cardinality.
189913481Sgiacomo.travaglini@arm.com  virtual bool IsSatisfiedByCallCount(int call_count) const {
190013481Sgiacomo.travaglini@arm.com    return call_count % 2 == 0;
190113481Sgiacomo.travaglini@arm.com  }
190213481Sgiacomo.travaglini@arm.com
190313481Sgiacomo.travaglini@arm.com  // Returns true iff call_count calls will saturate this cardinality.
190413481Sgiacomo.travaglini@arm.com  virtual bool IsSaturatedByCallCount(int /* call_count */) const {
190513481Sgiacomo.travaglini@arm.com    return false;
190613481Sgiacomo.travaglini@arm.com  }
190713481Sgiacomo.travaglini@arm.com
190813481Sgiacomo.travaglini@arm.com  // Describes self to an ostream.
190913481Sgiacomo.travaglini@arm.com  virtual void DescribeTo(::std::ostream* os) const {
191013481Sgiacomo.travaglini@arm.com    *os << "called even number of times";
191113481Sgiacomo.travaglini@arm.com  }
191213481Sgiacomo.travaglini@arm.com};
191313481Sgiacomo.travaglini@arm.com
191413481Sgiacomo.travaglini@arm.comCardinality EvenNumber() {
191513481Sgiacomo.travaglini@arm.com  return Cardinality(new EvenNumberCardinality);
191613481Sgiacomo.travaglini@arm.com}
191713481Sgiacomo.travaglini@arm.com
191813481Sgiacomo.travaglini@arm.comTEST(ExpectationBaseTest,
191913481Sgiacomo.travaglini@arm.com     AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality) {
192013481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
192113481Sgiacomo.travaglini@arm.com  Sequence s;
192213481Sgiacomo.travaglini@arm.com
192313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(1))
192413481Sgiacomo.travaglini@arm.com      .Times(EvenNumber())
192513481Sgiacomo.travaglini@arm.com      .InSequence(s);
192613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(2))
192713481Sgiacomo.travaglini@arm.com      .Times(AnyNumber())
192813481Sgiacomo.travaglini@arm.com      .InSequence(s);
192913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(3))
193013481Sgiacomo.travaglini@arm.com      .Times(AnyNumber());
193113481Sgiacomo.travaglini@arm.com
193213481Sgiacomo.travaglini@arm.com  a->DoA(3);
193313481Sgiacomo.travaglini@arm.com  a->DoA(1);
193413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(a->DoA(2), "Unexpected mock function call");
193513481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(delete a, "to be called even number of times");
193613481Sgiacomo.travaglini@arm.com}
193713481Sgiacomo.travaglini@arm.com
193813481Sgiacomo.travaglini@arm.com// The following tests verify the message generated when a mock
193913481Sgiacomo.travaglini@arm.com// function is called.
194013481Sgiacomo.travaglini@arm.com
194113481Sgiacomo.travaglini@arm.comstruct Printable {
194213481Sgiacomo.travaglini@arm.com};
194313481Sgiacomo.travaglini@arm.com
194413481Sgiacomo.travaglini@arm.cominline void operator<<(::std::ostream& os, const Printable&) {
194513481Sgiacomo.travaglini@arm.com  os << "Printable";
194613481Sgiacomo.travaglini@arm.com}
194713481Sgiacomo.travaglini@arm.com
194813481Sgiacomo.travaglini@arm.comstruct Unprintable {
194913481Sgiacomo.travaglini@arm.com  Unprintable() : value(0) {}
195013481Sgiacomo.travaglini@arm.com  int value;
195113481Sgiacomo.travaglini@arm.com};
195213481Sgiacomo.travaglini@arm.com
195313481Sgiacomo.travaglini@arm.comclass MockC {
195413481Sgiacomo.travaglini@arm.com public:
195513481Sgiacomo.travaglini@arm.com  MockC() {}
195613481Sgiacomo.travaglini@arm.com
195713481Sgiacomo.travaglini@arm.com  MOCK_METHOD6(VoidMethod, void(bool cond, int n, string s, void* p,
195813481Sgiacomo.travaglini@arm.com                                const Printable& x, Unprintable y));
195913481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(NonVoidMethod, int());  // NOLINT
196013481Sgiacomo.travaglini@arm.com
196113481Sgiacomo.travaglini@arm.com private:
196213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockC);
196313481Sgiacomo.travaglini@arm.com};
196413481Sgiacomo.travaglini@arm.com
196513481Sgiacomo.travaglini@arm.comclass VerboseFlagPreservingFixture : public testing::Test {
196613481Sgiacomo.travaglini@arm.com protected:
196713481Sgiacomo.travaglini@arm.com  VerboseFlagPreservingFixture()
196813481Sgiacomo.travaglini@arm.com      : saved_verbose_flag_(GMOCK_FLAG(verbose)) {}
196913481Sgiacomo.travaglini@arm.com
197013481Sgiacomo.travaglini@arm.com  ~VerboseFlagPreservingFixture() { GMOCK_FLAG(verbose) = saved_verbose_flag_; }
197113481Sgiacomo.travaglini@arm.com
197213481Sgiacomo.travaglini@arm.com private:
197313481Sgiacomo.travaglini@arm.com  const string saved_verbose_flag_;
197413481Sgiacomo.travaglini@arm.com
197513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(VerboseFlagPreservingFixture);
197613481Sgiacomo.travaglini@arm.com};
197713481Sgiacomo.travaglini@arm.com
197813481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
197913481Sgiacomo.travaglini@arm.com
198013481Sgiacomo.travaglini@arm.com// Tests that an uninteresting mock function call on a naggy mock
198113481Sgiacomo.travaglini@arm.com// generates a warning without the stack trace when
198213481Sgiacomo.travaglini@arm.com// --gmock_verbose=warning is specified.
198313481Sgiacomo.travaglini@arm.comTEST(FunctionCallMessageTest,
198413481Sgiacomo.travaglini@arm.com     UninterestingCallOnNaggyMockGeneratesNoStackTraceWhenVerboseWarning) {
198513481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kWarningVerbosity;
198613481Sgiacomo.travaglini@arm.com  NaggyMock<MockC> c;
198713481Sgiacomo.travaglini@arm.com  CaptureStdout();
198813481Sgiacomo.travaglini@arm.com  c.VoidMethod(false, 5, "Hi", NULL, Printable(), Unprintable());
198913481Sgiacomo.travaglini@arm.com  const std::string output = GetCapturedStdout();
199013481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
199113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsNotSubstring, "Stack trace:", output);
199213481Sgiacomo.travaglini@arm.com}
199313481Sgiacomo.travaglini@arm.com
199413481Sgiacomo.travaglini@arm.com// Tests that an uninteresting mock function call on a naggy mock
199513481Sgiacomo.travaglini@arm.com// generates a warning containing the stack trace when
199613481Sgiacomo.travaglini@arm.com// --gmock_verbose=info is specified.
199713481Sgiacomo.travaglini@arm.comTEST(FunctionCallMessageTest,
199813481Sgiacomo.travaglini@arm.com     UninterestingCallOnNaggyMockGeneratesFyiWithStackTraceWhenVerboseInfo) {
199913481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kInfoVerbosity;
200013481Sgiacomo.travaglini@arm.com  NaggyMock<MockC> c;
200113481Sgiacomo.travaglini@arm.com  CaptureStdout();
200213481Sgiacomo.travaglini@arm.com  c.VoidMethod(false, 5, "Hi", NULL, Printable(), Unprintable());
200313481Sgiacomo.travaglini@arm.com  const std::string output = GetCapturedStdout();
200413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
200513481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "Stack trace:", output);
200613481Sgiacomo.travaglini@arm.com
200713481Sgiacomo.travaglini@arm.com# ifndef NDEBUG
200813481Sgiacomo.travaglini@arm.com
200913481Sgiacomo.travaglini@arm.com  // We check the stack trace content in dbg-mode only, as opt-mode
201013481Sgiacomo.travaglini@arm.com  // may inline the call we are interested in seeing.
201113481Sgiacomo.travaglini@arm.com
201213481Sgiacomo.travaglini@arm.com  // Verifies that a void mock function's name appears in the stack
201313481Sgiacomo.travaglini@arm.com  // trace.
201413481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "VoidMethod(", output);
201513481Sgiacomo.travaglini@arm.com
201613481Sgiacomo.travaglini@arm.com  // Verifies that a non-void mock function's name appears in the
201713481Sgiacomo.travaglini@arm.com  // stack trace.
201813481Sgiacomo.travaglini@arm.com  CaptureStdout();
201913481Sgiacomo.travaglini@arm.com  c.NonVoidMethod();
202013481Sgiacomo.travaglini@arm.com  const std::string output2 = GetCapturedStdout();
202113481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(IsSubstring, "NonVoidMethod(", output2);
202213481Sgiacomo.travaglini@arm.com
202313481Sgiacomo.travaglini@arm.com# endif  // NDEBUG
202413481Sgiacomo.travaglini@arm.com}
202513481Sgiacomo.travaglini@arm.com
202613481Sgiacomo.travaglini@arm.com// Tests that an uninteresting mock function call on a naggy mock
202713481Sgiacomo.travaglini@arm.com// causes the function arguments and return value to be printed.
202813481Sgiacomo.travaglini@arm.comTEST(FunctionCallMessageTest,
202913481Sgiacomo.travaglini@arm.com     UninterestingCallOnNaggyMockPrintsArgumentsAndReturnValue) {
203013481Sgiacomo.travaglini@arm.com  // A non-void mock function.
203113481Sgiacomo.travaglini@arm.com  NaggyMock<MockB> b;
203213481Sgiacomo.travaglini@arm.com  CaptureStdout();
203313481Sgiacomo.travaglini@arm.com  b.DoB();
203413481Sgiacomo.travaglini@arm.com  const std::string output1 = GetCapturedStdout();
203513481Sgiacomo.travaglini@arm.com  EXPECT_PRED_FORMAT2(
203613481Sgiacomo.travaglini@arm.com      IsSubstring,
203713481Sgiacomo.travaglini@arm.com      "Uninteresting mock function call - returning default value.\n"
203813481Sgiacomo.travaglini@arm.com      "    Function call: DoB()\n"
203913481Sgiacomo.travaglini@arm.com      "          Returns: 0\n", output1.c_str());
204013481Sgiacomo.travaglini@arm.com  // Makes sure the return value is printed.
204113481Sgiacomo.travaglini@arm.com
204213481Sgiacomo.travaglini@arm.com  // A void mock function.
204313481Sgiacomo.travaglini@arm.com  NaggyMock<MockC> c;
204413481Sgiacomo.travaglini@arm.com  CaptureStdout();
204513481Sgiacomo.travaglini@arm.com  c.VoidMethod(false, 5, "Hi", NULL, Printable(), Unprintable());
204613481Sgiacomo.travaglini@arm.com  const std::string output2 = GetCapturedStdout();
204713481Sgiacomo.travaglini@arm.com  EXPECT_THAT(output2.c_str(),
204813481Sgiacomo.travaglini@arm.com              ContainsRegex(
204913481Sgiacomo.travaglini@arm.com                  "Uninteresting mock function call - returning directly\\.\n"
205013481Sgiacomo.travaglini@arm.com                  "    Function call: VoidMethod"
205113481Sgiacomo.travaglini@arm.com                  "\\(false, 5, \"Hi\", NULL, @.+ "
205213481Sgiacomo.travaglini@arm.com                  "Printable, 4-byte object <00-00 00-00>\\)"));
205313481Sgiacomo.travaglini@arm.com  // A void function has no return value to print.
205413481Sgiacomo.travaglini@arm.com}
205513481Sgiacomo.travaglini@arm.com
205613481Sgiacomo.travaglini@arm.com// Tests how the --gmock_verbose flag affects Google Mock's output.
205713481Sgiacomo.travaglini@arm.com
205813481Sgiacomo.travaglini@arm.comclass GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
205913481Sgiacomo.travaglini@arm.com public:
206013481Sgiacomo.travaglini@arm.com  // Verifies that the given Google Mock output is correct.  (When
206113481Sgiacomo.travaglini@arm.com  // should_print is true, the output should match the given regex and
206213481Sgiacomo.travaglini@arm.com  // contain the given function name in the stack trace.  When it's
206313481Sgiacomo.travaglini@arm.com  // false, the output should be empty.)
206413481Sgiacomo.travaglini@arm.com  void VerifyOutput(const std::string& output, bool should_print,
206513481Sgiacomo.travaglini@arm.com                    const string& expected_substring,
206613481Sgiacomo.travaglini@arm.com                    const string& function_name) {
206713481Sgiacomo.travaglini@arm.com    if (should_print) {
206813481Sgiacomo.travaglini@arm.com      EXPECT_THAT(output.c_str(), HasSubstr(expected_substring));
206913481Sgiacomo.travaglini@arm.com# ifndef NDEBUG
207013481Sgiacomo.travaglini@arm.com      // We check the stack trace content in dbg-mode only, as opt-mode
207113481Sgiacomo.travaglini@arm.com      // may inline the call we are interested in seeing.
207213481Sgiacomo.travaglini@arm.com      EXPECT_THAT(output.c_str(), HasSubstr(function_name));
207313481Sgiacomo.travaglini@arm.com# else
207413481Sgiacomo.travaglini@arm.com      // Suppresses 'unused function parameter' warnings.
207513481Sgiacomo.travaglini@arm.com      static_cast<void>(function_name);
207613481Sgiacomo.travaglini@arm.com# endif  // NDEBUG
207713481Sgiacomo.travaglini@arm.com    } else {
207813481Sgiacomo.travaglini@arm.com      EXPECT_STREQ("", output.c_str());
207913481Sgiacomo.travaglini@arm.com    }
208013481Sgiacomo.travaglini@arm.com  }
208113481Sgiacomo.travaglini@arm.com
208213481Sgiacomo.travaglini@arm.com  // Tests how the flag affects expected calls.
208313481Sgiacomo.travaglini@arm.com  void TestExpectedCall(bool should_print) {
208413481Sgiacomo.travaglini@arm.com    MockA a;
208513481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, DoA(5));
208613481Sgiacomo.travaglini@arm.com    EXPECT_CALL(a, Binary(_, 1))
208713481Sgiacomo.travaglini@arm.com        .WillOnce(Return(true));
208813481Sgiacomo.travaglini@arm.com
208913481Sgiacomo.travaglini@arm.com    // A void-returning function.
209013481Sgiacomo.travaglini@arm.com    CaptureStdout();
209113481Sgiacomo.travaglini@arm.com    a.DoA(5);
209213481Sgiacomo.travaglini@arm.com    VerifyOutput(
209313481Sgiacomo.travaglini@arm.com        GetCapturedStdout(),
209413481Sgiacomo.travaglini@arm.com        should_print,
209513481Sgiacomo.travaglini@arm.com        "Mock function call matches EXPECT_CALL(a, DoA(5))...\n"
209613481Sgiacomo.travaglini@arm.com        "    Function call: DoA(5)\n"
209713481Sgiacomo.travaglini@arm.com        "Stack trace:\n",
209813481Sgiacomo.travaglini@arm.com        "DoA");
209913481Sgiacomo.travaglini@arm.com
210013481Sgiacomo.travaglini@arm.com    // A non-void-returning function.
210113481Sgiacomo.travaglini@arm.com    CaptureStdout();
210213481Sgiacomo.travaglini@arm.com    a.Binary(2, 1);
210313481Sgiacomo.travaglini@arm.com    VerifyOutput(
210413481Sgiacomo.travaglini@arm.com        GetCapturedStdout(),
210513481Sgiacomo.travaglini@arm.com        should_print,
210613481Sgiacomo.travaglini@arm.com        "Mock function call matches EXPECT_CALL(a, Binary(_, 1))...\n"
210713481Sgiacomo.travaglini@arm.com        "    Function call: Binary(2, 1)\n"
210813481Sgiacomo.travaglini@arm.com        "          Returns: true\n"
210913481Sgiacomo.travaglini@arm.com        "Stack trace:\n",
211013481Sgiacomo.travaglini@arm.com        "Binary");
211113481Sgiacomo.travaglini@arm.com  }
211213481Sgiacomo.travaglini@arm.com
211313481Sgiacomo.travaglini@arm.com  // Tests how the flag affects uninteresting calls on a naggy mock.
211413481Sgiacomo.travaglini@arm.com  void TestUninterestingCallOnNaggyMock(bool should_print) {
211513481Sgiacomo.travaglini@arm.com    NaggyMock<MockA> a;
211613481Sgiacomo.travaglini@arm.com    const string note =
211713481Sgiacomo.travaglini@arm.com        "NOTE: You can safely ignore the above warning unless this "
211813481Sgiacomo.travaglini@arm.com        "call should not happen.  Do not suppress it by blindly adding "
211913481Sgiacomo.travaglini@arm.com        "an EXPECT_CALL() if you don't mean to enforce the call.  "
212013481Sgiacomo.travaglini@arm.com        "See https://github.com/google/googletest/blob/master/googlemock/docs/CookBook.md#"
212113481Sgiacomo.travaglini@arm.com        "knowing-when-to-expect for details.";
212213481Sgiacomo.travaglini@arm.com
212313481Sgiacomo.travaglini@arm.com    // A void-returning function.
212413481Sgiacomo.travaglini@arm.com    CaptureStdout();
212513481Sgiacomo.travaglini@arm.com    a.DoA(5);
212613481Sgiacomo.travaglini@arm.com    VerifyOutput(
212713481Sgiacomo.travaglini@arm.com        GetCapturedStdout(),
212813481Sgiacomo.travaglini@arm.com        should_print,
212913481Sgiacomo.travaglini@arm.com        "\nGMOCK WARNING:\n"
213013481Sgiacomo.travaglini@arm.com        "Uninteresting mock function call - returning directly.\n"
213113481Sgiacomo.travaglini@arm.com        "    Function call: DoA(5)\n" +
213213481Sgiacomo.travaglini@arm.com        note,
213313481Sgiacomo.travaglini@arm.com        "DoA");
213413481Sgiacomo.travaglini@arm.com
213513481Sgiacomo.travaglini@arm.com    // A non-void-returning function.
213613481Sgiacomo.travaglini@arm.com    CaptureStdout();
213713481Sgiacomo.travaglini@arm.com    a.Binary(2, 1);
213813481Sgiacomo.travaglini@arm.com    VerifyOutput(
213913481Sgiacomo.travaglini@arm.com        GetCapturedStdout(),
214013481Sgiacomo.travaglini@arm.com        should_print,
214113481Sgiacomo.travaglini@arm.com        "\nGMOCK WARNING:\n"
214213481Sgiacomo.travaglini@arm.com        "Uninteresting mock function call - returning default value.\n"
214313481Sgiacomo.travaglini@arm.com        "    Function call: Binary(2, 1)\n"
214413481Sgiacomo.travaglini@arm.com        "          Returns: false\n" +
214513481Sgiacomo.travaglini@arm.com        note,
214613481Sgiacomo.travaglini@arm.com        "Binary");
214713481Sgiacomo.travaglini@arm.com  }
214813481Sgiacomo.travaglini@arm.com};
214913481Sgiacomo.travaglini@arm.com
215013481Sgiacomo.travaglini@arm.com// Tests that --gmock_verbose=info causes both expected and
215113481Sgiacomo.travaglini@arm.com// uninteresting calls to be reported.
215213481Sgiacomo.travaglini@arm.comTEST_F(GMockVerboseFlagTest, Info) {
215313481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kInfoVerbosity;
215413481Sgiacomo.travaglini@arm.com  TestExpectedCall(true);
215513481Sgiacomo.travaglini@arm.com  TestUninterestingCallOnNaggyMock(true);
215613481Sgiacomo.travaglini@arm.com}
215713481Sgiacomo.travaglini@arm.com
215813481Sgiacomo.travaglini@arm.com// Tests that --gmock_verbose=warning causes uninteresting calls to be
215913481Sgiacomo.travaglini@arm.com// reported.
216013481Sgiacomo.travaglini@arm.comTEST_F(GMockVerboseFlagTest, Warning) {
216113481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kWarningVerbosity;
216213481Sgiacomo.travaglini@arm.com  TestExpectedCall(false);
216313481Sgiacomo.travaglini@arm.com  TestUninterestingCallOnNaggyMock(true);
216413481Sgiacomo.travaglini@arm.com}
216513481Sgiacomo.travaglini@arm.com
216613481Sgiacomo.travaglini@arm.com// Tests that --gmock_verbose=warning causes neither expected nor
216713481Sgiacomo.travaglini@arm.com// uninteresting calls to be reported.
216813481Sgiacomo.travaglini@arm.comTEST_F(GMockVerboseFlagTest, Error) {
216913481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kErrorVerbosity;
217013481Sgiacomo.travaglini@arm.com  TestExpectedCall(false);
217113481Sgiacomo.travaglini@arm.com  TestUninterestingCallOnNaggyMock(false);
217213481Sgiacomo.travaglini@arm.com}
217313481Sgiacomo.travaglini@arm.com
217413481Sgiacomo.travaglini@arm.com// Tests that --gmock_verbose=SOME_INVALID_VALUE has the same effect
217513481Sgiacomo.travaglini@arm.com// as --gmock_verbose=warning.
217613481Sgiacomo.travaglini@arm.comTEST_F(GMockVerboseFlagTest, InvalidFlagIsTreatedAsWarning) {
217713481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "invalid";  // Treated as "warning".
217813481Sgiacomo.travaglini@arm.com  TestExpectedCall(false);
217913481Sgiacomo.travaglini@arm.com  TestUninterestingCallOnNaggyMock(true);
218013481Sgiacomo.travaglini@arm.com}
218113481Sgiacomo.travaglini@arm.com
218213481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STREAM_REDIRECTION
218313481Sgiacomo.travaglini@arm.com
218413481Sgiacomo.travaglini@arm.com// A helper class that generates a failure when printed.  We use it to
218513481Sgiacomo.travaglini@arm.com// ensure that Google Mock doesn't print a value (even to an internal
218613481Sgiacomo.travaglini@arm.com// buffer) when it is not supposed to do so.
218713481Sgiacomo.travaglini@arm.comclass PrintMeNot {};
218813481Sgiacomo.travaglini@arm.com
218913481Sgiacomo.travaglini@arm.comvoid PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {
219013481Sgiacomo.travaglini@arm.com  ADD_FAILURE() << "Google Mock is printing a value that shouldn't be "
219113481Sgiacomo.travaglini@arm.com                << "printed even to an internal buffer.";
219213481Sgiacomo.travaglini@arm.com}
219313481Sgiacomo.travaglini@arm.com
219413481Sgiacomo.travaglini@arm.comclass LogTestHelper {
219513481Sgiacomo.travaglini@arm.com public:
219613481Sgiacomo.travaglini@arm.com  LogTestHelper() {}
219713481Sgiacomo.travaglini@arm.com
219813481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));
219913481Sgiacomo.travaglini@arm.com
220013481Sgiacomo.travaglini@arm.com private:
220113481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(LogTestHelper);
220213481Sgiacomo.travaglini@arm.com};
220313481Sgiacomo.travaglini@arm.com
220413481Sgiacomo.travaglini@arm.comclass GMockLogTest : public VerboseFlagPreservingFixture {
220513481Sgiacomo.travaglini@arm.com protected:
220613481Sgiacomo.travaglini@arm.com  LogTestHelper helper_;
220713481Sgiacomo.travaglini@arm.com};
220813481Sgiacomo.travaglini@arm.com
220913481Sgiacomo.travaglini@arm.comTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsWarning) {
221013481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kWarningVerbosity;
221113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(helper_, Foo(_))
221213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(PrintMeNot()));
221313481Sgiacomo.travaglini@arm.com  helper_.Foo(PrintMeNot());  // This is an expected call.
221413481Sgiacomo.travaglini@arm.com}
221513481Sgiacomo.travaglini@arm.com
221613481Sgiacomo.travaglini@arm.comTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsError) {
221713481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kErrorVerbosity;
221813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(helper_, Foo(_))
221913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(PrintMeNot()));
222013481Sgiacomo.travaglini@arm.com  helper_.Foo(PrintMeNot());  // This is an expected call.
222113481Sgiacomo.travaglini@arm.com}
222213481Sgiacomo.travaglini@arm.com
222313481Sgiacomo.travaglini@arm.comTEST_F(GMockLogTest, DoesNotPrintWarningInternallyIfVerbosityIsError) {
222413481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = kErrorVerbosity;
222513481Sgiacomo.travaglini@arm.com  ON_CALL(helper_, Foo(_))
222613481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(PrintMeNot()));
222713481Sgiacomo.travaglini@arm.com  helper_.Foo(PrintMeNot());  // This should generate a warning.
222813481Sgiacomo.travaglini@arm.com}
222913481Sgiacomo.travaglini@arm.com
223013481Sgiacomo.travaglini@arm.com// Tests Mock::AllowLeak().
223113481Sgiacomo.travaglini@arm.com
223213481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, AllowsLeakingUnusedMockObject) {
223313481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
223413481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
223513481Sgiacomo.travaglini@arm.com}
223613481Sgiacomo.travaglini@arm.com
223713481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, CanBeCalledBeforeOnCall) {
223813481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
223913481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
224013481Sgiacomo.travaglini@arm.com  ON_CALL(*a, DoA(_)).WillByDefault(Return());
224113481Sgiacomo.travaglini@arm.com  a->DoA(0);
224213481Sgiacomo.travaglini@arm.com}
224313481Sgiacomo.travaglini@arm.com
224413481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, CanBeCalledAfterOnCall) {
224513481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
224613481Sgiacomo.travaglini@arm.com  ON_CALL(*a, DoA(_)).WillByDefault(Return());
224713481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
224813481Sgiacomo.travaglini@arm.com}
224913481Sgiacomo.travaglini@arm.com
225013481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, CanBeCalledBeforeExpectCall) {
225113481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
225213481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
225313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(_));
225413481Sgiacomo.travaglini@arm.com  a->DoA(0);
225513481Sgiacomo.travaglini@arm.com}
225613481Sgiacomo.travaglini@arm.com
225713481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, CanBeCalledAfterExpectCall) {
225813481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
225913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
226013481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
226113481Sgiacomo.travaglini@arm.com}
226213481Sgiacomo.travaglini@arm.com
226313481Sgiacomo.travaglini@arm.comTEST(AllowLeakTest, WorksWhenBothOnCallAndExpectCallArePresent) {
226413481Sgiacomo.travaglini@arm.com  MockA* a = new MockA;
226513481Sgiacomo.travaglini@arm.com  ON_CALL(*a, DoA(_)).WillByDefault(Return());
226613481Sgiacomo.travaglini@arm.com  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
226713481Sgiacomo.travaglini@arm.com  Mock::AllowLeak(a);
226813481Sgiacomo.travaglini@arm.com}
226913481Sgiacomo.travaglini@arm.com
227013481Sgiacomo.travaglini@arm.com// Tests that we can verify and clear a mock object's expectations
227113481Sgiacomo.travaglini@arm.com// when none of its methods has expectations.
227213481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, NoMethodHasExpectations) {
227313481Sgiacomo.travaglini@arm.com  MockB b;
227413481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
227513481Sgiacomo.travaglini@arm.com
227613481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
227713481Sgiacomo.travaglini@arm.com  // freely call them.
227813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
227913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
228013481Sgiacomo.travaglini@arm.com}
228113481Sgiacomo.travaglini@arm.com
228213481Sgiacomo.travaglini@arm.com// Tests that we can verify and clear a mock object's expectations
228313481Sgiacomo.travaglini@arm.com// when some, but not all, of its methods have expectations *and* the
228413481Sgiacomo.travaglini@arm.com// verification succeeds.
228513481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndSucceed) {
228613481Sgiacomo.travaglini@arm.com  MockB b;
228713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
228813481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
228913481Sgiacomo.travaglini@arm.com  b.DoB();
229013481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
229113481Sgiacomo.travaglini@arm.com
229213481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
229313481Sgiacomo.travaglini@arm.com  // freely call them.
229413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
229513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
229613481Sgiacomo.travaglini@arm.com}
229713481Sgiacomo.travaglini@arm.com
229813481Sgiacomo.travaglini@arm.com// Tests that we can verify and clear a mock object's expectations
229913481Sgiacomo.travaglini@arm.com// when some, but not all, of its methods have expectations *and* the
230013481Sgiacomo.travaglini@arm.com// verification fails.
230113481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndFail) {
230213481Sgiacomo.travaglini@arm.com  MockB b;
230313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
230413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
230513481Sgiacomo.travaglini@arm.com  bool result = true;
230613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
230713481Sgiacomo.travaglini@arm.com                          "Actual: never called");
230813481Sgiacomo.travaglini@arm.com  ASSERT_FALSE(result);
230913481Sgiacomo.travaglini@arm.com
231013481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
231113481Sgiacomo.travaglini@arm.com  // freely call them.
231213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
231313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
231413481Sgiacomo.travaglini@arm.com}
231513481Sgiacomo.travaglini@arm.com
231613481Sgiacomo.travaglini@arm.com// Tests that we can verify and clear a mock object's expectations
231713481Sgiacomo.travaglini@arm.com// when all of its methods have expectations.
231813481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, AllMethodsHaveExpectations) {
231913481Sgiacomo.travaglini@arm.com  MockB b;
232013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
232113481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
232213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
232313481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
232413481Sgiacomo.travaglini@arm.com  b.DoB();
232513481Sgiacomo.travaglini@arm.com  b.DoB(1);
232613481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
232713481Sgiacomo.travaglini@arm.com
232813481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
232913481Sgiacomo.travaglini@arm.com  // freely call them.
233013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
233113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
233213481Sgiacomo.travaglini@arm.com}
233313481Sgiacomo.travaglini@arm.com
233413481Sgiacomo.travaglini@arm.com// Tests that we can verify and clear a mock object's expectations
233513481Sgiacomo.travaglini@arm.com// when a method has more than one expectation.
233613481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, AMethodHasManyExpectations) {
233713481Sgiacomo.travaglini@arm.com  MockB b;
233813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(0))
233913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
234013481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
234113481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
234213481Sgiacomo.travaglini@arm.com  b.DoB(1);
234313481Sgiacomo.travaglini@arm.com  bool result = true;
234413481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
234513481Sgiacomo.travaglini@arm.com                          "Actual: never called");
234613481Sgiacomo.travaglini@arm.com  ASSERT_FALSE(result);
234713481Sgiacomo.travaglini@arm.com
234813481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
234913481Sgiacomo.travaglini@arm.com  // freely call them.
235013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
235113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
235213481Sgiacomo.travaglini@arm.com}
235313481Sgiacomo.travaglini@arm.com
235413481Sgiacomo.travaglini@arm.com// Tests that we can call VerifyAndClearExpectations() on the same
235513481Sgiacomo.travaglini@arm.com// mock object multiple times.
235613481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearExpectationsTest, CanCallManyTimes) {
235713481Sgiacomo.travaglini@arm.com  MockB b;
235813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB());
235913481Sgiacomo.travaglini@arm.com  b.DoB();
236013481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClearExpectations(&b);
236113481Sgiacomo.travaglini@arm.com
236213481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
236313481Sgiacomo.travaglini@arm.com      .WillOnce(Return(1));
236413481Sgiacomo.travaglini@arm.com  b.DoB(1);
236513481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClearExpectations(&b);
236613481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClearExpectations(&b);
236713481Sgiacomo.travaglini@arm.com
236813481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
236913481Sgiacomo.travaglini@arm.com  // freely call them.
237013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
237113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
237213481Sgiacomo.travaglini@arm.com}
237313481Sgiacomo.travaglini@arm.com
237413481Sgiacomo.travaglini@arm.com// Tests that we can clear a mock object's default actions when none
237513481Sgiacomo.travaglini@arm.com// of its methods has default actions.
237613481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, NoMethodHasDefaultActions) {
237713481Sgiacomo.travaglini@arm.com  MockB b;
237813481Sgiacomo.travaglini@arm.com  // If this crashes or generates a failure, the test will catch it.
237913481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
238013481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
238113481Sgiacomo.travaglini@arm.com}
238213481Sgiacomo.travaglini@arm.com
238313481Sgiacomo.travaglini@arm.com// Tests that we can clear a mock object's default actions when some,
238413481Sgiacomo.travaglini@arm.com// but not all of its methods have default actions.
238513481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, SomeMethodsHaveDefaultActions) {
238613481Sgiacomo.travaglini@arm.com  MockB b;
238713481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB())
238813481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
238913481Sgiacomo.travaglini@arm.com
239013481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
239113481Sgiacomo.travaglini@arm.com
239213481Sgiacomo.travaglini@arm.com  // Verifies that the default action of int DoB() was removed.
239313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
239413481Sgiacomo.travaglini@arm.com}
239513481Sgiacomo.travaglini@arm.com
239613481Sgiacomo.travaglini@arm.com// Tests that we can clear a mock object's default actions when all of
239713481Sgiacomo.travaglini@arm.com// its methods have default actions.
239813481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, AllMethodsHaveDefaultActions) {
239913481Sgiacomo.travaglini@arm.com  MockB b;
240013481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB())
240113481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
240213481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
240313481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(2));
240413481Sgiacomo.travaglini@arm.com
240513481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
240613481Sgiacomo.travaglini@arm.com
240713481Sgiacomo.travaglini@arm.com  // Verifies that the default action of int DoB() was removed.
240813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
240913481Sgiacomo.travaglini@arm.com
241013481Sgiacomo.travaglini@arm.com  // Verifies that the default action of int DoB(int) was removed.
241113481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(0));
241213481Sgiacomo.travaglini@arm.com}
241313481Sgiacomo.travaglini@arm.com
241413481Sgiacomo.travaglini@arm.com// Tests that we can clear a mock object's default actions when a
241513481Sgiacomo.travaglini@arm.com// method has more than one ON_CALL() set on it.
241613481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, AMethodHasManyDefaultActions) {
241713481Sgiacomo.travaglini@arm.com  MockB b;
241813481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(0))
241913481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
242013481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
242113481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(2));
242213481Sgiacomo.travaglini@arm.com
242313481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
242413481Sgiacomo.travaglini@arm.com
242513481Sgiacomo.travaglini@arm.com  // Verifies that the default actions (there are two) of int DoB(int)
242613481Sgiacomo.travaglini@arm.com  // were removed.
242713481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(0));
242813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
242913481Sgiacomo.travaglini@arm.com}
243013481Sgiacomo.travaglini@arm.com
243113481Sgiacomo.travaglini@arm.com// Tests that we can call VerifyAndClear() on a mock object multiple
243213481Sgiacomo.travaglini@arm.com// times.
243313481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, CanCallManyTimes) {
243413481Sgiacomo.travaglini@arm.com  MockB b;
243513481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB())
243613481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
243713481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
243813481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
243913481Sgiacomo.travaglini@arm.com
244013481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
244113481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
244213481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
244313481Sgiacomo.travaglini@arm.com
244413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
244513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
244613481Sgiacomo.travaglini@arm.com}
244713481Sgiacomo.travaglini@arm.com
244813481Sgiacomo.travaglini@arm.com// Tests that VerifyAndClear() works when the verification succeeds.
244913481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, Success) {
245013481Sgiacomo.travaglini@arm.com  MockB b;
245113481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB())
245213481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
245313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(1))
245413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
245513481Sgiacomo.travaglini@arm.com
245613481Sgiacomo.travaglini@arm.com  b.DoB();
245713481Sgiacomo.travaglini@arm.com  b.DoB(1);
245813481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(Mock::VerifyAndClear(&b));
245913481Sgiacomo.travaglini@arm.com
246013481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
246113481Sgiacomo.travaglini@arm.com  // freely call them.
246213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
246313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
246413481Sgiacomo.travaglini@arm.com}
246513481Sgiacomo.travaglini@arm.com
246613481Sgiacomo.travaglini@arm.com// Tests that VerifyAndClear() works when the verification fails.
246713481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, Failure) {
246813481Sgiacomo.travaglini@arm.com  MockB b;
246913481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
247013481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
247113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
247213481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
247313481Sgiacomo.travaglini@arm.com
247413481Sgiacomo.travaglini@arm.com  b.DoB(1);
247513481Sgiacomo.travaglini@arm.com  bool result = true;
247613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClear(&b),
247713481Sgiacomo.travaglini@arm.com                          "Actual: never called");
247813481Sgiacomo.travaglini@arm.com  ASSERT_FALSE(result);
247913481Sgiacomo.travaglini@arm.com
248013481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
248113481Sgiacomo.travaglini@arm.com  // freely call them.
248213481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
248313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
248413481Sgiacomo.travaglini@arm.com}
248513481Sgiacomo.travaglini@arm.com
248613481Sgiacomo.travaglini@arm.com// Tests that VerifyAndClear() works when the default actions and
248713481Sgiacomo.travaglini@arm.com// expectations are set on a const mock object.
248813481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, Const) {
248913481Sgiacomo.travaglini@arm.com  MockB b;
249013481Sgiacomo.travaglini@arm.com  ON_CALL(Const(b), DoB())
249113481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
249213481Sgiacomo.travaglini@arm.com
249313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(Const(b), DoB())
249413481Sgiacomo.travaglini@arm.com      .WillOnce(DoDefault())
249513481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
249613481Sgiacomo.travaglini@arm.com
249713481Sgiacomo.travaglini@arm.com  b.DoB();
249813481Sgiacomo.travaglini@arm.com  b.DoB();
249913481Sgiacomo.travaglini@arm.com  ASSERT_TRUE(Mock::VerifyAndClear(&b));
250013481Sgiacomo.travaglini@arm.com
250113481Sgiacomo.travaglini@arm.com  // There should be no expectations on the methods now, so we can
250213481Sgiacomo.travaglini@arm.com  // freely call them.
250313481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB());
250413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(0, b.DoB(1));
250513481Sgiacomo.travaglini@arm.com}
250613481Sgiacomo.travaglini@arm.com
250713481Sgiacomo.travaglini@arm.com// Tests that we can set default actions and expectations on a mock
250813481Sgiacomo.travaglini@arm.com// object after VerifyAndClear() has been called on it.
250913481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, CanSetDefaultActionsAndExpectationsAfterwards) {
251013481Sgiacomo.travaglini@arm.com  MockB b;
251113481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB())
251213481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
251313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB(_))
251413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
251513481Sgiacomo.travaglini@arm.com  b.DoB(1);
251613481Sgiacomo.travaglini@arm.com
251713481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b);
251813481Sgiacomo.travaglini@arm.com
251913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b, DoB())
252013481Sgiacomo.travaglini@arm.com      .WillOnce(Return(3));
252113481Sgiacomo.travaglini@arm.com  ON_CALL(b, DoB(_))
252213481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(4));
252313481Sgiacomo.travaglini@arm.com
252413481Sgiacomo.travaglini@arm.com  EXPECT_EQ(3, b.DoB());
252513481Sgiacomo.travaglini@arm.com  EXPECT_EQ(4, b.DoB(1));
252613481Sgiacomo.travaglini@arm.com}
252713481Sgiacomo.travaglini@arm.com
252813481Sgiacomo.travaglini@arm.com// Tests that calling VerifyAndClear() on one mock object does not
252913481Sgiacomo.travaglini@arm.com// affect other mock objects (either of the same type or not).
253013481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest, DoesNotAffectOtherMockObjects) {
253113481Sgiacomo.travaglini@arm.com  MockA a;
253213481Sgiacomo.travaglini@arm.com  MockB b1;
253313481Sgiacomo.travaglini@arm.com  MockB b2;
253413481Sgiacomo.travaglini@arm.com
253513481Sgiacomo.travaglini@arm.com  ON_CALL(a, Binary(_, _))
253613481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(true));
253713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, Binary(_, _))
253813481Sgiacomo.travaglini@arm.com      .WillOnce(DoDefault())
253913481Sgiacomo.travaglini@arm.com      .WillOnce(Return(false));
254013481Sgiacomo.travaglini@arm.com
254113481Sgiacomo.travaglini@arm.com  ON_CALL(b1, DoB())
254213481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(1));
254313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b1, DoB(_))
254413481Sgiacomo.travaglini@arm.com      .WillOnce(Return(2));
254513481Sgiacomo.travaglini@arm.com
254613481Sgiacomo.travaglini@arm.com  ON_CALL(b2, DoB())
254713481Sgiacomo.travaglini@arm.com      .WillByDefault(Return(3));
254813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(b2, DoB(_));
254913481Sgiacomo.travaglini@arm.com
255013481Sgiacomo.travaglini@arm.com  b2.DoB(0);
255113481Sgiacomo.travaglini@arm.com  Mock::VerifyAndClear(&b2);
255213481Sgiacomo.travaglini@arm.com
255313481Sgiacomo.travaglini@arm.com  // Verifies that the default actions and expectations of a and b1
255413481Sgiacomo.travaglini@arm.com  // are still in effect.
255513481Sgiacomo.travaglini@arm.com  EXPECT_TRUE(a.Binary(0, 0));
255613481Sgiacomo.travaglini@arm.com  EXPECT_FALSE(a.Binary(0, 0));
255713481Sgiacomo.travaglini@arm.com
255813481Sgiacomo.travaglini@arm.com  EXPECT_EQ(1, b1.DoB());
255913481Sgiacomo.travaglini@arm.com  EXPECT_EQ(2, b1.DoB(0));
256013481Sgiacomo.travaglini@arm.com}
256113481Sgiacomo.travaglini@arm.com
256213481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest,
256313481Sgiacomo.travaglini@arm.com     DestroyingChainedMocksDoesNotDeadlockThroughExpectations) {
256413481Sgiacomo.travaglini@arm.com  linked_ptr<MockA> a(new MockA);
256513481Sgiacomo.travaglini@arm.com  ReferenceHoldingMock test_mock;
256613481Sgiacomo.travaglini@arm.com
256713481Sgiacomo.travaglini@arm.com  // EXPECT_CALL stores a reference to a inside test_mock.
256813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(test_mock, AcceptReference(_))
256913481Sgiacomo.travaglini@arm.com      .WillRepeatedly(SetArgPointee<0>(a));
257013481Sgiacomo.travaglini@arm.com
257113481Sgiacomo.travaglini@arm.com  // Throw away the reference to the mock that we have in a. After this, the
257213481Sgiacomo.travaglini@arm.com  // only reference to it is stored by test_mock.
257313481Sgiacomo.travaglini@arm.com  a.reset();
257413481Sgiacomo.travaglini@arm.com
257513481Sgiacomo.travaglini@arm.com  // When test_mock goes out of scope, it destroys the last remaining reference
257613481Sgiacomo.travaglini@arm.com  // to the mock object originally pointed to by a. This will cause the MockA
257713481Sgiacomo.travaglini@arm.com  // destructor to be called from inside the ReferenceHoldingMock destructor.
257813481Sgiacomo.travaglini@arm.com  // The state of all mocks is protected by a single global lock, but there
257913481Sgiacomo.travaglini@arm.com  // should be no deadlock.
258013481Sgiacomo.travaglini@arm.com}
258113481Sgiacomo.travaglini@arm.com
258213481Sgiacomo.travaglini@arm.comTEST(VerifyAndClearTest,
258313481Sgiacomo.travaglini@arm.com     DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction) {
258413481Sgiacomo.travaglini@arm.com  linked_ptr<MockA> a(new MockA);
258513481Sgiacomo.travaglini@arm.com  ReferenceHoldingMock test_mock;
258613481Sgiacomo.travaglini@arm.com
258713481Sgiacomo.travaglini@arm.com  // ON_CALL stores a reference to a inside test_mock.
258813481Sgiacomo.travaglini@arm.com  ON_CALL(test_mock, AcceptReference(_))
258913481Sgiacomo.travaglini@arm.com      .WillByDefault(SetArgPointee<0>(a));
259013481Sgiacomo.travaglini@arm.com
259113481Sgiacomo.travaglini@arm.com  // Throw away the reference to the mock that we have in a. After this, the
259213481Sgiacomo.travaglini@arm.com  // only reference to it is stored by test_mock.
259313481Sgiacomo.travaglini@arm.com  a.reset();
259413481Sgiacomo.travaglini@arm.com
259513481Sgiacomo.travaglini@arm.com  // When test_mock goes out of scope, it destroys the last remaining reference
259613481Sgiacomo.travaglini@arm.com  // to the mock object originally pointed to by a. This will cause the MockA
259713481Sgiacomo.travaglini@arm.com  // destructor to be called from inside the ReferenceHoldingMock destructor.
259813481Sgiacomo.travaglini@arm.com  // The state of all mocks is protected by a single global lock, but there
259913481Sgiacomo.travaglini@arm.com  // should be no deadlock.
260013481Sgiacomo.travaglini@arm.com}
260113481Sgiacomo.travaglini@arm.com
260213481Sgiacomo.travaglini@arm.com// Tests that a mock function's action can call a mock function
260313481Sgiacomo.travaglini@arm.com// (either the same function or a different one) either as an explicit
260413481Sgiacomo.travaglini@arm.com// action or as a default action without causing a dead lock.  It
260513481Sgiacomo.travaglini@arm.com// verifies that the action is not performed inside the critical
260613481Sgiacomo.travaglini@arm.com// section.
260713481Sgiacomo.travaglini@arm.comTEST(SynchronizationTest, CanCallMockMethodInAction) {
260813481Sgiacomo.travaglini@arm.com  MockA a;
260913481Sgiacomo.travaglini@arm.com  MockC c;
261013481Sgiacomo.travaglini@arm.com  ON_CALL(a, DoA(_))
261113481Sgiacomo.travaglini@arm.com      .WillByDefault(IgnoreResult(InvokeWithoutArgs(&c,
261213481Sgiacomo.travaglini@arm.com                                                    &MockC::NonVoidMethod)));
261313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1));
261413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(a, DoA(1))
261513481Sgiacomo.travaglini@arm.com      .WillOnce(Invoke(&a, &MockA::DoA))
261613481Sgiacomo.travaglini@arm.com      .RetiresOnSaturation();
261713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(c, NonVoidMethod());
261813481Sgiacomo.travaglini@arm.com
261913481Sgiacomo.travaglini@arm.com  a.DoA(1);
262013481Sgiacomo.travaglini@arm.com  // This will match the second EXPECT_CALL() and trigger another a.DoA(1),
262113481Sgiacomo.travaglini@arm.com  // which will in turn match the first EXPECT_CALL() and trigger a call to
262213481Sgiacomo.travaglini@arm.com  // c.NonVoidMethod() that was specified by the ON_CALL() since the first
262313481Sgiacomo.travaglini@arm.com  // EXPECT_CALL() did not specify an action.
262413481Sgiacomo.travaglini@arm.com}
262513481Sgiacomo.travaglini@arm.com
262613481Sgiacomo.travaglini@arm.com}  // namespace
262713481Sgiacomo.travaglini@arm.com
262813481Sgiacomo.travaglini@arm.com// Allows the user to define his own main and then invoke gmock_main
262913481Sgiacomo.travaglini@arm.com// from it. This might be necessary on some platforms which require
263013481Sgiacomo.travaglini@arm.com// specific setup and teardown.
263113481Sgiacomo.travaglini@arm.com#if GMOCK_RENAME_MAIN
263213481Sgiacomo.travaglini@arm.comint gmock_main(int argc, char **argv) {
263313481Sgiacomo.travaglini@arm.com#else
263413481Sgiacomo.travaglini@arm.comint main(int argc, char **argv) {
263513481Sgiacomo.travaglini@arm.com#endif  // GMOCK_RENAME_MAIN
263613481Sgiacomo.travaglini@arm.com  testing::InitGoogleMock(&argc, argv);
263713481Sgiacomo.travaglini@arm.com
263813481Sgiacomo.travaglini@arm.com  // Ensures that the tests pass no matter what value of
263913481Sgiacomo.travaglini@arm.com  // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.
264013481Sgiacomo.travaglini@arm.com  testing::GMOCK_FLAG(catch_leaked_mocks) = true;
264113481Sgiacomo.travaglini@arm.com  testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity;
264213481Sgiacomo.travaglini@arm.com
264313481Sgiacomo.travaglini@arm.com  return RUN_ALL_TESTS();
264413481Sgiacomo.travaglini@arm.com}
2645