1dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Copyright 2007, Google Inc.
2dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// All rights reserved.
3dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
4dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Redistribution and use in source and binary forms, with or without
5dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// modification, are permitted provided that the following conditions are
6dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// met:
7dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
8dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions of source code must retain the above copyright
9dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// notice, this list of conditions and the following disclaimer.
10dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Redistributions in binary form must reproduce the above
11dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// copyright notice, this list of conditions and the following disclaimer
12dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// in the documentation and/or other materials provided with the
13dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// distribution.
14dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//     * Neither the name of Google Inc. nor the names of its
15dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// contributors may be used to endorse or promote products derived from
16dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// this software without specific prior written permission.
17dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
18dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
30dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Author: wan@google.com (Zhanyong Wan)
31dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
32dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Google Mock - a framework for writing C++ mock classes.
33dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter//
34dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// This file tests the spec builder syntax.
35dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
3646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock-spec-builders.h"
37dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
38dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <ostream>  // NOLINT
39dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <sstream>
40dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#include <string>
41dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
4246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/gmock.h"
4346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gmock/internal/gmock-port.h"
4446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest.h"
4546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/gtest-spi.h"
4646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#include "gtest/internal/gtest-port.h"
47dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
48dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace testing {
49dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace internal {
50dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
51dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Helper class for testing the Expectation class template.
52dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass ExpectationTester {
53dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
54dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Sets the call count of the given expectation to the given number.
55dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void SetCallCount(int n, ExpectationBase* exp) {
56dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    exp->call_count_ = n;
57dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
58dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
59dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
60dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace internal
61dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace testing
62dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
63dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixternamespace {
64dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
65dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::_;
66dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AnyNumber;
67dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AtLeast;
68dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::AtMost;
69dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Between;
70dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Cardinality;
71dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::CardinalityInterface;
7246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::ContainsRegex;
73dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Const;
74dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::DoAll;
75dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::DoDefault;
7646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Eq;
7746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Expectation;
7846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::ExpectationSet;
79dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::GMOCK_FLAG(verbose);
80dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Gt;
81dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::InSequence;
82dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Invoke;
83dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::InvokeWithoutArgs;
84dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::IsSubstring;
85dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Lt;
86dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Message;
87dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Mock;
8846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::Ne;
89dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Return;
90dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::Sequence;
9146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::SetArgPointee;
9246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::ExpectationTester;
9346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::FormatFileLocation;
94dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::kErrorVerbosity;
95dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::kInfoVerbosity;
96dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::kWarningVerbosity;
9746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::String;
9846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::linked_ptr;
99dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterusing testing::internal::string;
100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
10146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
10246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::HasSubstr;
10346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::CaptureStdout;
10446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanusing testing::internal::GetCapturedStdout;
10546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
10646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass Incomplete;
10846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
10946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass MockIncomplete {
11046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public:
11146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // This line verifies that a mock method can take a by-reference
11246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // argument of an incomplete type.
11346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MOCK_METHOD1(ByRefFunc, void(const Incomplete& x));
11446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
11546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tells Google Mock how to print a value of type Incomplete.
11746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid PrintTo(const Incomplete& x, ::std::ostream* os);
11846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
11946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(MockMethodTest, CanInstantiateWithIncompleteArgType) {
12046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Even though this mock class contains a mock method that takes
12146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // by-reference an argument whose type is incomplete, we can still
12246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // use the mock, as long as Google Mock knows how to print the
12346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // argument.
12446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockIncomplete incomplete;
12546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(incomplete, ByRefFunc(_))
12646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .Times(AnyNumber());
12746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
12846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
12946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// The definition of the printer for the argument type doesn't have to
13046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// be visible where the mock is used.
13146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanvoid PrintTo(const Incomplete& /* x */, ::std::ostream* os) {
13246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  *os << "incomplete";
13346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
13446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass Result {};
136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass MockA {
138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
13946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA() {}
14046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD1(DoA, void(int n));  // NOLINT
142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD1(ReturnResult, Result(int n));  // NOLINT
143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD2(Binary, bool(int x, int y));  // NOLINT
144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD2(ReturnInt, int(int x, int y));  // NOLINT
14546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
14646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
14746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockA);
148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass MockB {
151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
15246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockB() {}
15346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_CONST_METHOD0(DoB, int());  // NOLINT
155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD1(DoB, int(int n));  // NOLINT
15646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
15746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
15846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockB);
15946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
16046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass ReferenceHoldingMock {
16246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan public:
16346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ReferenceHoldingMock() {}
16446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MOCK_METHOD1(AcceptReference, void(linked_ptr<MockA>*));
16646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
16746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
16846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(ReferenceHoldingMock);
169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that EXPECT_CALL and ON_CALL compile in a presence of macro
172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// redefining a mock method name. This could happen, for example, when
173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the tested code #includes Win32 API headers which define many APIs
174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// as macros, e.g. #define TextOut TextOutW.
175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#define Method MethodW
177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass CC {
179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual ~CC() {}
181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual int Method() = 0;
182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass MockCC : public CC {
184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
18546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockCC() {}
18646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD0(Method, int());
18846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
18946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
19046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockCC);
191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a method with expanded name compiles.
194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockCC cc;
196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(cc, Method());
197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the method with expanded name not only compiles but runs
200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// and returns a correct value, too.
201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockCC cc;
203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(cc, Method()).WillByDefault(Return(42));
204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(42, cc.Method());
205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a method with expanded name compiles.
208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockCC cc;
210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(cc, Method());
211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  cc.Method();
212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that it works, too.
215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockCC cc;
217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(cc, Method()).WillOnce(Return(42));
218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(42, cc.Method());
219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter#undef Method  // Done with macro redefinition tests.
222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that ON_CALL evaluates its arguments exactly once as promised
224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// by Google Mock.
225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, EvaluatesFirstArgumentOnce) {
226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* pa = &a;
228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(*pa++, DoA(_));
230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(&a + 1, pa);
231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, EvaluatesSecondArgumentOnce) {
234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int n = 0;
236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, DoA(n++));
238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, n);
239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the syntax of ON_CALL() is enforced at run time.
242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, WithIsOptional) {
244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, DoA(5))
247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return());
248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, DoA(_))
249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .With(_)
250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return());
251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, WithCanAppearAtMostOnce) {
254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ON_CALL(a, ReturnResult(_))
258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_)
259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_)
260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillByDefault(Return(Result()));
261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".With() cannot appear more than once in an ON_CALL()");
262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, WillByDefaultIsMandatory) {
265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
26746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ON_CALL(a, DoA(5));
269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(5);
270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallSyntaxTest, WillByDefaultCanAppearAtMostOnce) {
274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ON_CALL(a, DoA(5))
278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillByDefault(Return())
279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillByDefault(Return());
280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".WillByDefault() must appear exactly once in an ON_CALL()");
281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that EXPECT_CALL evaluates its arguments exactly once as
284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// promised by Google Mock.
285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, EvaluatesFirstArgumentOnce) {
286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* pa = &a;
288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*pa++, DoA(_));
290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(0);
291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(&a + 1, pa);
292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, EvaluatesSecondArgumentOnce) {
295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int n = 0;
297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(n++));
299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(0);
300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, n);
301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the syntax of EXPECT_CALL() is enforced at run time.
304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WithIsOptional) {
306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(5))
309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(0);
310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(6))
311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .With(_)
312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(0);
313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WithCanAppearAtMostOnce) {
316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(6))
320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_)
321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_);
322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".With() cannot appear more than once in an EXPECT_CALL()");
323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(6);
325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WithMustBeFirstClause) {
328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1)
333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_);
334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".With() must be the first clause in an EXPECT_CALL()");
335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(2))
340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return())
341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .With(_);
342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".With() must be the first clause in an EXPECT_CALL()");
343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, TimesCanBeInferred) {
348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return());
352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(2))
354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return())
355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillRepeatedly(Return());
356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, TimesCanAppearAtMostOnce) {
363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
366dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1)
368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(2);
369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".Times() cannot appear more than once in an EXPECT_CALL()");
370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, TimesMustBeBeforeInSequence) {
376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .InSequence(s)
382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1);
383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".Times() cannot appear after ");
384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, InSequenceIsOptional) {
389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1));
393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(2))
394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s);
395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, InSequenceCanAppearMultipleTimes) {
401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s1, s2;
403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s1, s2)
406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s1);
407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
41146108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeAfter) {
41246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
41346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Sequence s;
41446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
41546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e = EXPECT_CALL(a, DoA(1))
41646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .Times(AnyNumber());
41746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_NONFATAL_FAILURE({  // NOLINT
41846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_CALL(a, DoA(2))
41946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        .After(e)
42046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        .InSequence(s);
42146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }, ".InSequence() cannot appear after ");
42246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
42346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
42446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
42546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
42646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeWillOnce) {
427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return())
433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .InSequence(s);
434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".InSequence() cannot appear after ");
435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
43946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectCallSyntaxTest, AfterMustBeBeforeWillOnce) {
44046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
44146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
44246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e = EXPECT_CALL(a, DoA(1));
44346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_NONFATAL_FAILURE({
44446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    EXPECT_CALL(a, DoA(2))
44546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        .WillOnce(Return())
44646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        .After(e);
44746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }, ".After() cannot appear after ");
44846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
44946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
45046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
45146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
45246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
453dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillIsOptional) {
454dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
455dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
456dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1));
457dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(2))
458dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return());
459dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
460dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
461dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
462dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
463dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
464dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillCanAppearMultipleTimes) {
465dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
466dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
467dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
468dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(AnyNumber())
469dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return())
470dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return())
471dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return());
472dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
473dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
474dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillMustBeBeforeWillRepeatedly) {
475dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
476dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
477dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
478dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
479dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return())
480dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return());
481dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".WillOnce() cannot appear after ");
482dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
483dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
484dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
485dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
486dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillRepeatedlyIsOptional) {
487dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
488dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
489dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
490dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return());
491dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(2))
492dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return())
493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillRepeatedly(Return());
494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
498dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
499dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
500dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillRepeatedlyCannotAppearMultipleTimes) {
501dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
502dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
503dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
504dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
505dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return())
506dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return());
507dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".WillRepeatedly() cannot appear more than once in an "
508dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     "EXPECT_CALL()");
509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
510dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
511dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WillRepeatedlyMustBeBeforeRetiresOnSaturation) {
512dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
513dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
514dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .RetiresOnSaturation()
517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return());
518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".WillRepeatedly() cannot appear after ");
519dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
520dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
521dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, RetiresOnSaturationIsOptional) {
522dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
523dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
524dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1));
525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
526dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RetiresOnSaturation();
527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, RetiresOnSaturationCannotAppearMultipleTimes) {
533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
536dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1))
537dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .RetiresOnSaturation()
538dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .RetiresOnSaturation();
539dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, ".RetiresOnSaturation() cannot appear more than once");
540dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
541dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
542dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
543dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
544dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, DefaultCardinalityIsOnce) {
545dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
546dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
547dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
548dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
549dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
550dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
551dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
552dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
553dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "to be called once");
554dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
555dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
556dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
557dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
558dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
559dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "to be called once");
560dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
561dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
56246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
563dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
564dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock doesn't print a warning when the number of
565dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// WillOnce() is adequate.
566dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, DoesNotWarnOnAdequateActionCount) {
56746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
568dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
569dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
570dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
571dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // It's always fine to omit WillOnce() entirely.
572dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
573dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(0);
574dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(1))
575dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AtMost(1));
576dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(2))
577dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1)
578dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(1));
579dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
580dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // It's fine for the number of WillOnce()s to equal the upper bound.
581dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(3))
582dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(Between(1, 2))
583dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
584dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2));
585dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
586dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // It's fine for the number of WillOnce()s to be smaller than the
587dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // upper bound when there is a WillRepeatedly().
588dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(4))
589dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AtMost(3))
590dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
591dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
592dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
593dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Satisfies the above expectations.
594dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(2);
595dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(3);
596dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
59746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", GetCapturedStdout().c_str());
598dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
599dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
600dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock warns on having too many actions in an
601dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expectation compared to its cardinality.
602dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WarnsOnTooManyActions) {
60346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
604dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
605dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
606dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
607dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Warns when the number of WillOnce()s is larger than the upper bound.
608dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
609dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(0)
610dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1));  // #1
611dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
612dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AtMost(1))
613dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
614dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2));  // #2
615dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(1))
616dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1)
617dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
618dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2))
619dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .RetiresOnSaturation();  // #3
620dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
621dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Warns when the number of WillOnce()s equals the upper bound and
622dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // there is a WillRepeatedly().
623dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
624dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(0)
625dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(1));  // #4
626dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(2))
627dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(1)
628dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
629dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));  // #5
630dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
631dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Satisfies the above expectations.
632dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(1);
633dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(2);
634dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
63546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output = GetCapturedStdout();
63646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
63746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
63846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
63946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be never called, but has 1 WillOnce().",
64046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);  // #1
64146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
64246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
64346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
64446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be called at most once, "
64546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "but has 2 WillOnce()s.",
64646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);  // #2
64746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
64846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
64946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too many actions specified in EXPECT_CALL(b, DoB(1))...\n"
65046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be called once, but has 2 WillOnce()s.",
65146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);  // #3
65246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
65346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
65446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
65546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be never called, but has 0 WillOnce()s "
65646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "and a WillRepeatedly().",
65746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);  // #4
65846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
65946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
66046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too many actions specified in EXPECT_CALL(b, DoB(2))...\n"
66146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be called once, but has 1 WillOnce() "
66246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "and a WillRepeatedly().",
66346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);  // #5
664dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
665dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
666dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock warns on having too few actions in an
667dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expectation compared to its cardinality.
668dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallSyntaxTest, WarnsOnTooFewActions) {
669dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
670dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(Between(2, 3))
673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
67546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
67746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output = GetCapturedStdout();
67846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(
67946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      IsSubstring,
68046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Too few actions specified in EXPECT_CALL(b, DoB())...\n"
68146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "Expected to be called between 2 and 3 times, "
68246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "but has only 1 WillOnce().",
68346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      output);
684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
68746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_STREAM_REDIRECTION
688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the semantics of ON_CALL().
690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the built-in default action is taken when no ON_CALL()
692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is specified.
693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCall) {
694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB());
696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the built-in default action is taken when no ON_CALL()
701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matches the invocation.
702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCallMatches) {
703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(1))
705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_));
707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(2));
709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the last matching ON_CALL() action is taken.
712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(OnCallTest, PicksLastMatchingOnCall) {
713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(3));
716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(2))
717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(2));
718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(1))
719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_));
721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, b.DoB(2));
723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests the semantics of EXPECT_CALL().
726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that any call is allowed when no EXPECT_CALL() is specified.
728dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, AllowsAnyCallWhenNoSpec) {
729dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
730dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB());
731dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There is no expectation on DoB(int).
732dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
733dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
734dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // DoB(int) can be called any number of times.
736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
737dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(2);
738dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
739dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
740dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the last matching EXPECT_CALL() fires.
741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, PicksLastMatchingExpectCall) {
742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillRepeatedly(Return(2));
745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(1))
746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillRepeatedly(Return(1));
747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b.DoB(1));
749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests lower-bound violation.
752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, CatchesTooFewCalls) {
753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB(5))
756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AtLeast(2));
757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(5);
75946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }, "Actual function call count doesn't match EXPECT_CALL(b, DoB(5))...\n"
760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     "         Expected: to be called at least twice\n"
761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     "           Actual: called once - unsatisfied and active");
762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the cardinality can be inferred when no Times(...) is
765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// specified.
766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, InfersCardinalityWhenThereIsNoWillRepeatedly) {
767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2));
772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(1, b.DoB());
774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(2, b.DoB());
775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2));
782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(1, b.DoB());
784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "to be called twice");
785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {  // NOLINT
787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(2));
791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(1, b.DoB());
793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(2, b.DoB());
794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_NONFATAL_FAILURE(b.DoB(), "to be called twice");
795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {
799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(1, b.DoB());
806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {  // NOLINT
809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
813dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
814dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(1, b.DoB());
815dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(2, b.DoB());
816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_EQ(2, b.DoB());
817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1))
823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "to be called at least once");
825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the n-th action is taken for the n-th matching
828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// invocation.
829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, NthMatchTakesNthAction) {
830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1))
833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2))
834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(3));
835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b.DoB());
837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, b.DoB());
838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(3, b.DoB());
839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
84146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests that the WillRepeatedly() action is taken when the WillOnce(...)
84246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// list is exhausted.
84346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectCallTest, TakesRepeatedActionWhenWillListIsExhausted) {
84446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockB b;
84546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(b, DoB())
84646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Return(1))
84746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillRepeatedly(Return(2));
84846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
84946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, b.DoB());
85046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(2, b.DoB());
85146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(2, b.DoB());
85246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
85346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
85446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the default action is taken when the WillOnce(...) list is
857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// exhausted and there is no WillRepeatedly().
858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectCallTest, TakesDefaultActionWhenWillListIsExhausted) {
859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(1);
862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(AnyNumber())
864dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1))
865dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
86746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));  // Shouldn't generate a warning as the
869dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                           // expectation has no action clause at all.
870dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b.DoB());
871dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, b.DoB());
87246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output1 = GetCapturedStdout();
87346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_STREQ("", output1.c_str());
874dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
87546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
876dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
877dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
87846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output2 = GetCapturedStdout();
87946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(output2.c_str(),
88046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
88146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                        "Called 3 times, but only 2 WillOnce()s are specified"
88246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                        " - returning default value."));
88346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(output2.c_str(),
88446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
88546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                        "Called 4 times, but only 2 WillOnce()s are specified"
88646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                        " - returning default value."));
88746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
88846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
88946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(FunctionMockerTest, ReportsExpectCallLocationForExhausedActions) {
890dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
89146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  std::string expect_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
89246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(b, DoB()).Times(AnyNumber()).WillOnce(Return(1));
893dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b.DoB());
89546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
89646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
89746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(0, b.DoB());
89846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output = GetCapturedStdout();
89946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The warning message should contain the call location.
90046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(IsSubstring, expect_call_location, output);
901dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
90346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(FunctionMockerTest, ReportsDefaultActionLocationOfUninterestingCalls) {
90446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  std::string on_call_location;
90546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
90646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  {
90746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    MockB b;
90846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    on_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
90946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    ON_CALL(b, DoB(_)).WillByDefault(Return(0));
91046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    b.DoB(0);
91146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
91246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(IsSubstring, on_call_location, GetCapturedStdout());
91346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
91446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
91546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_STREAM_REDIRECTION
91646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an uninteresting call performs the default action.
918dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UninterestingCallTest, DoesDefaultAction) {
919dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is an ON_CALL() statement, the action specified by it
920dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be taken.
921dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, Binary(_, _))
923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(true));
924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(a.Binary(1, 2));
925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is no ON_CALL(), the default value for the return type
927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be returned.
928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
929dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
931dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an unexpected call performs the default action.
933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, DoesDefaultAction) {
934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is an ON_CALL() statement, the action specified by it
935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be taken.
936dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, Binary(_, _))
938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(true));
939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, Binary(0, 0));
940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.Binary(0, 0);
941dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool result = false;
942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(result = a.Binary(1, 2),
943dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Unexpected mock function call");
944dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(result);
945dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
946dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is no ON_CALL(), the default value for the return type
947dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be returned.
948dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
949dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(0))
950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(0);
951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int n = -1;
952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(n = b.DoB(1),
953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Unexpected mock function call");
954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, n);
955dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when an unexpected void function generates the right
958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// failure message.
959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, GeneratesFailureForVoidFunction) {
960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // First, tests the message when there is only one EXPECT_CALL().
961dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a1;
962dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a1, DoA(1));
963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a1.DoA(1);
964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Ideally we should match the failure message against a regex, but
965dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // EXPECT_NONFATAL_FAILURE doesn't support that, so we test for
966dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // multiple sub-strings instead.
967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a1.DoA(9),
969dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Unexpected mock function call - returning directly.\n"
970dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoA(9)\n"
971dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Google Mock tried the following 1 expectation, but it didn't match:");
972dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
973dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a1.DoA(9),
974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "  Expected arg #0: is equal to 1\n"
975dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: 9\n"
976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be called once\n"
977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: called once - saturated and active");
978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Next, tests the message when there are more than one EXPECT_CALL().
980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a2;
981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a2, DoA(1));
982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a2, DoA(3));
983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a2.DoA(1);
984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a2.DoA(2),
986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Unexpected mock function call - returning directly.\n"
987dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoA(2)\n"
988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Google Mock tried the following 2 expectations, but none matched:");
989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
990dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a2.DoA(2),
99146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "tried expectation #0: EXPECT_CALL(a2, DoA(1))...\n"
992dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "  Expected arg #0: is equal to 1\n"
993dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: 2\n"
994dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be called once\n"
995dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: called once - saturated and active");
996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a2.DoA(2),
99846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "tried expectation #1: EXPECT_CALL(a2, DoA(3))...\n"
999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "  Expected arg #0: is equal to 3\n"
1000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: 2\n"
1001dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be called once\n"
1002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: never called - unsatisfied and active");
1003dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a2.DoA(3);
1004dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1006dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an unexpected non-void function generates the right
1007dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// failure message.
1008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, GeneartesFailureForNonVoidFunction) {
1009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b1;
1010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b1, DoB(1));
1011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b1.DoB(1);
1012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      b1.DoB(2),
1014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Unexpected mock function call - returning default value.\n"
1015dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoB(2)\n"
1016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "          Returns: 0\n"
1017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Google Mock tried the following 1 expectation, but it didn't match:");
1018dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      b1.DoB(2),
1020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "  Expected arg #0: is equal to 1\n"
1021dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: 2\n"
1022dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be called once\n"
1023dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: called once - saturated and active");
1024dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock explains that an retired expectation doesn't
1027dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// match the call.
1028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, RetiredExpectation) {
1029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1030dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(1))
1031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RetiresOnSaturation();
1032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1033dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
1034dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      b.DoB(1),
1036dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: the expectation is active\n"
1037dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: it is retired");
1038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock explains that an expectation that doesn't
1041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// match the arguments doesn't match the call.
1042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, UnmatchedArguments) {
1043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(1));
1045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      b.DoB(2),
1048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "  Expected arg #0: is equal to 1\n"
1049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: 2\n");
1050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
1051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock explains that an expectation with
1054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// unsatisfied pre-requisites doesn't match the call.
1055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UnexpectedCallTest, UnsatisifiedPrerequisites) {
1056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s1, s2;
1057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(1))
1059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s1);
1060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(2))
1061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(AnyNumber())
1062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s1);
1063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(3))
1064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s2);
1065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(4))
1066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s1, s2);
1067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ::testing::TestPartResultArray failures;
1069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    ::testing::ScopedFakeTestPartResultReporter reporter(&failures);
1071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB(4);
1072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // Now 'failures' contains the Google Test failures generated by
1073dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // the above statement.
1074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be one non-fatal failure.
1077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_EQ(1, failures.size());
1078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  const ::testing::TestPartResult& r = failures.GetTestPartResult(0);
107946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(::testing::TestPartResult::kNonFatalFailure, r.type());
1080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the failure message contains the two unsatisfied
1082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // pre-requisites but not the satisfied one.
108346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_USES_PCRE
108446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(r.message(), ContainsRegex(
1085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // PCRE has trouble using (.|\n) to match any character, but
1086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // supports the (?s) prefix for using . to match any character.
1087dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "(?s)the following immediate pre-requisites are not satisfied:\n"
1088dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      ".*: pre-requisite #0\n"
108946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      ".*: pre-requisite #1"));
109046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#elif GTEST_USES_POSIX_RE
109146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(r.message(), ContainsRegex(
1092dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // POSIX RE doesn't understand the (?s) prefix, but has no trouble
1093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // with (.|\n).
1094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "the following immediate pre-requisites are not satisfied:\n"
1095dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "(.|\n)*: pre-requisite #0\n"
109646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "(.|\n)*: pre-requisite #1"));
109746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else
109846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // We can only use Google Test's own simple regex.
109946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(r.message(), ContainsRegex(
110046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "the following immediate pre-requisites are not satisfied:"));
110146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #0"));
110246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #1"));
110346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_USES_PCRE
1104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
1106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(3);
1107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(4);
1108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(UndefinedReturnValueTest, ReturnValueIsMandatory) {
1111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // TODO(wan@google.com): We should really verify the output message,
1113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // but we cannot yet due to that EXPECT_DEATH only captures stderr
1114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // while Google Mock logs to stdout.
111546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(1), "");
1116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an excessive call (one whose arguments match the
1119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// matchers but is called too many times) performs the default action.
1120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExcessiveCallTest, DoesDefaultAction) {
1121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is an ON_CALL() statement, the action specified by it
1122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be taken.
1123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, Binary(_, _))
1125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(true));
1126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, Binary(0, 0));
1127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.Binary(0, 0);
1128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  bool result = false;
1129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(result = a.Binary(0, 0),
1130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Mock function called more times than expected");
1131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(result);
1132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // When there is no ON_CALL(), the default value for the return type
1134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should be returned.
1135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(0))
1137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(0);
1138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int n = -1;
1139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(n = b.DoB(0),
1140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Mock function called more times than expected");
1141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, n);
1142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when a void function is called too many times,
1145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// the failure message contains the argument values.
1146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExcessiveCallTest, GeneratesFailureForVoidFunction) {
1147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(_))
1149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(0);
1150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      a.DoA(9),
1152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Mock function called more times than expected - returning directly.\n"
1153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoA(9)\n"
1154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be never called\n"
1155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: called once - over-saturated and active");
1156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that when a non-void function is called too many times, the
1159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// failure message contains the argument values and the return value.
1160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExcessiveCallTest, GeneratesFailureForNonVoidFunction) {
1161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_));
1163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
1164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(
1165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      b.DoB(2),
1166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Mock function called more times than expected - "
1167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "returning default value.\n"
1168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoB(2)\n"
1169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "          Returns: 0\n"
1170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "         Expected: to be called once\n"
1171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "           Actual: called twice - over-saturated and active");
1172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests using sequences.
1175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(InSequenceTest, AllExpectationInScopeAreInSequence) {
1177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
1182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(2));
1183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
1186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(2);
1187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "Unexpected mock function call");
1188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
1190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
1191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(InSequenceTest, NestedInSequence) {
1194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1196dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
1199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    {
1200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      InSequence dummy2;
1201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      EXPECT_CALL(a, DoA(2));
1203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      EXPECT_CALL(a, DoA(3));
1204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
1205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
1208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
1209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(3);
1210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "Unexpected mock function call");
1211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
1213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(3);
1214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(InSequenceTest, ExpectationsOutOfScopeAreNotAffected) {
1217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
1222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(2));
1223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(3));
1225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({  // NOLINT
1227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(2);
1228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "Unexpected mock function call");
1229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(3);
1231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
1232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
1233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1234dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that any order is allowed when no sequence is used.
1236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SequenceTest, AnyOrderIsOkByDefault) {
1237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
1239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
1240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
1242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
1243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
1246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB();
1247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {  // NOLINT
1250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
1251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockB b;
1252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(1));
1254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(b, DoB())
1255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB();
1258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(1);
1259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that the calls must be in strict order when a complete order
1263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// is specified.
1264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo) {
1265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
1267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(1))
1269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s)
1270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(Result()));
1271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(2))
1273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s)
1274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(Result()));
1275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(3))
1277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s)
1278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(Result()));
1279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
128046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(1);
1282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(3);
1283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(2);
1284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
128646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(2);
1288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(1);
1289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(3);
1290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.ReturnResult(1);
1293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.ReturnResult(2);
1294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.ReturnResult(3);
1295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests specifying a DAG using multiple sequences.
1298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SequenceTest, CallsMustConformToSpecifiedDag) {
1299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
1301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence x, y;
1302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(1))
1304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(x)
1305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(Result()));
1306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
1308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(2)
1309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(y);
1310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(2))
1312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(x, y)
1313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillRepeatedly(Return(Result()));
1314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, ReturnResult(3))
1316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(x)
1317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(Result()));
1318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
131946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(1);
1321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB();
1322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(2);
1323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
132546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(2);
1327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
132946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(3);
1331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
133346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED({
1334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(1);
1335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB();
1336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b.DoB();
1337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(3);
1338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.ReturnResult(2);
1339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "");
1340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
1342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.ReturnResult(1);
1343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
1344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.ReturnResult(3);
1345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(SequenceTest, Retirement) {
1348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
1349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
1350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
1352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s);
1353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(_))
1354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s)
1355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .RetiresOnSaturation();
1356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, DoA(1))
1357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s);
1358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
1360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(2);
1361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a.DoA(1);
1362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
136446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests Expectation.
136546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
136646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationTest, ConstrutorsWork) {
136746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
136846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1;  // Default ctor.
136946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
137046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Ctor from various forms of EXPECT_CALL.
137146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(2));
137246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e3 = EXPECT_CALL(a, DoA(3)).With(_);
137346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  {
137446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Sequence s;
137546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Expectation e4 = EXPECT_CALL(a, DoA(4)).Times(1);
137646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    Expectation e5 = EXPECT_CALL(a, DoA(5)).InSequence(s);
137746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
137846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e6 = EXPECT_CALL(a, DoA(6)).After(e2);
137946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e7 = EXPECT_CALL(a, DoA(7)).WillOnce(Return());
138046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e8 = EXPECT_CALL(a, DoA(8)).WillRepeatedly(Return());
138146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e9 = EXPECT_CALL(a, DoA(9)).RetiresOnSaturation();
138246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
138346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e10 = e2;  // Copy ctor.
138446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
138546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(e1, Ne(e2));
138646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(e2, Eq(e10));
138746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
138846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
138946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(3);
139046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(4);
139146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(5);
139246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(6);
139346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(7);
139446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(8);
139546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(9);
139646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
139746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
139846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationTest, AssignmentWorks) {
139946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
140046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1;
140146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(1));
140246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
140346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(e1, Ne(e2));
140446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
140546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  e1 = e2;
140646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(e1, Eq(e2));
140746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
140846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
140946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
141046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
141146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests ExpectationSet.
141246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
141346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, MemberTypesAreCorrect) {
141446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ::testing::StaticAssertTypeEq<Expectation, ExpectationSet::value_type>();
141546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
141646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
141746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, ConstructorsWork) {
141846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
141946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
142046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1;
142146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const Expectation e2;
142246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es1;  // Default ctor.
142346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es2 = EXPECT_CALL(a, DoA(1));  // Ctor from EXPECT_CALL.
142446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es3 = e1;  // Ctor from Expectation.
142546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es4(e1);   // Ctor from Expectation; alternative syntax.
142646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es5 = e2;  // Ctor from const Expectation.
142746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es6(e2);   // Ctor from const Expectation; alternative syntax.
142846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es7 = es2;  // Copy ctor.
142946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
143046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(0, es1.size());
143146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es2.size());
143246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es3.size());
143346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es4.size());
143446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es5.size());
143546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es6.size());
143646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es7.size());
143746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
143846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es3, Ne(es2));
143946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es4, Eq(es3));
144046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es5, Eq(es4));
144146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es6, Eq(es5));
144246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es7, Eq(es2));
144346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
144446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
144546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
144646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, AssignmentWorks) {
144746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es1;
144846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es2 = Expectation();
144946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
145046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es1 = es2;
145146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es1.size());
145246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(*(es1.begin()), Eq(Expectation()));
145346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es1, Eq(es2));
145446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
145546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
145646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, InsertionWorks) {
145746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es1;
145846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1;
145946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es1 += e1;
146046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es1.size());
146146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(*(es1.begin()), Eq(e1));
146246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
146346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
146446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(1));
146546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es1 += e2;
146646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(2, es1.size());
146746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
146846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet::const_iterator it1 = es1.begin();
146946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet::const_iterator it2 = it1;
147046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ++it2;
147146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(*it1 == e1 || *it2 == e1);  // e1 must be in the set.
147246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_TRUE(*it1 == e2 || *it2 == e2);  // e2 must be in the set too.
147346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
147446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
147546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
147646108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, SizeWorks) {
147746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es;
147846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(0, es.size());
147946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
148046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += Expectation();
148146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(1, es.size());
148246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
148346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
148446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += EXPECT_CALL(a, DoA(1));
148546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_EQ(2, es.size());
148646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
148746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
148846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
148946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
149046108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(ExpectationSetTest, IsEnumerable) {
149146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es;
149246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(es.begin(), Eq(es.end()));
149346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
149446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += Expectation();
149546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet::const_iterator it = es.begin();
149646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(it, Ne(es.end()));
149746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(*it, Eq(Expectation()));
149846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ++it;
149946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(it, Eq(es.end()));
150046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
150146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
150246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Tests the .After() clause.
150346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
150446108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, SucceedsWhenPartialOrderIsSatisfied) {
150546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
150646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es;
150746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += EXPECT_CALL(a, DoA(1));
150846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += EXPECT_CALL(a, DoA(2));
150946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(3))
151046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(es);
151146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
151246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
151346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
151446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(3);
151546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
151646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
151746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {
151846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
151946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockB b;
152046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The following also verifies that const Expectation objects work
152146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // too.  Do not remove the const modifiers.
152246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const Expectation e1 = EXPECT_CALL(a, DoA(1));
152346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const Expectation e2 = EXPECT_CALL(b, DoB())
152446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .Times(2)
152546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e1);
152646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(2)).After(e2);
152746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
152846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
152946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  b.DoB();
153046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  b.DoB();
153146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
153246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
153346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
153446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Calls must be in strict order when specified so.
153546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterDeathTest, CallsMustBeInStrictOrderWhenSpecifiedSo) {
153646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
153746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockB b;
153846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1 = EXPECT_CALL(a, DoA(1));
153946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(b, DoB())
154046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .Times(2)
154146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e1);
154246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, ReturnResult(2))
154346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e2)
154446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Return(Result()));
154546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
154646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
154746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // If a call to ReturnResult() violates the specified order, no
154846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // matching expectation will be found, and thus the default action
154946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // will be done.  Since the return type of ReturnResult() is not a
155046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // built-in type, gmock won't know what to return and will thus
155146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // abort the program.  Therefore a death test can tell us whether
155246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // gmock catches the order violation correctly.
155346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  //
155446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // gtest and gmock print messages to stdout, which isn't captured by
155546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // death tests.  Therefore we have to match with an empty regular
155646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // expression in all the EXPECT_DEATH()s.
155746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), "");
155846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
155946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  b.DoB();
156046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(2), "");
156146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
156246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  b.DoB();
156346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.ReturnResult(2);
156446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
156546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
156646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Calls must satisfy the partial order when specified so.
156746108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterDeathTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
156846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
156946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e = EXPECT_CALL(a, DoA(1));
157046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const ExpectationSet es = EXPECT_CALL(a, DoA(2));
157146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, ReturnResult(3))
157246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e, es)
157346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Return(Result()));
157446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
157546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
157646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
157746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
157846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
157946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
158046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
158146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.ReturnResult(3);
158246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
158346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
158446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// .After() can be combined with .InSequence().
158546108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterDeathTest, CanBeUsedWithInSequence) {
158646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
158746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Sequence s;
158846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e = EXPECT_CALL(a, DoA(1));
158946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(2)).InSequence(s);
159046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, ReturnResult(3))
159146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .InSequence(s).After(e)
159246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Return(Result()));
159346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
159446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
159546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
159646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
159746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
159846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.ReturnResult(3);
159946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
160046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
160146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// .After() can be called multiple times.
160246108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, CanBeCalledManyTimes) {
160346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
160446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1 = EXPECT_CALL(a, DoA(1));
160546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(2));
160646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e3 = EXPECT_CALL(a, DoA(3));
160746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(4))
160846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e1)
160946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e2)
161046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e3);
161146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
161246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(3);
161346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
161446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
161546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(4);
161646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
161746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
161846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// .After() accepts up to 5 arguments.
161946108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, AcceptsUpToFiveArguments) {
162046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
162146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1 = EXPECT_CALL(a, DoA(1));
162246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(2));
162346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e3 = EXPECT_CALL(a, DoA(3));
162446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es1 = EXPECT_CALL(a, DoA(4));
162546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es2 = EXPECT_CALL(a, DoA(5));
162646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(6))
162746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e1, e2, e3, es1, es2);
162846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
162946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(5);
163046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
163146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(4);
163246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
163346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(3);
163446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(6);
163546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
163646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
163746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// .After() allows input to contain duplicated Expectations.
163846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, AcceptsDuplicatedInput) {
163946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
164046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e1 = EXPECT_CALL(a, DoA(1));
164146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(2));
164246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es;
164346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += e1;
164446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es += e2;
164546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, ReturnResult(3))
164646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(e1, e2, es, e1)
164746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Return(Result()));
164846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
164946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
165046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_DEATH_IF_SUPPORTED(a.ReturnResult(3), "");
165146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
165246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
165346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.ReturnResult(3);
165446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
165546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
165646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// An Expectation added to an ExpectationSet after it has been used in
165746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// an .After() has no effect.
165846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(AfterTest, ChangesToExpectationSetHaveNoEffectAfterwards) {
165946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
166046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ExpectationSet es1 = EXPECT_CALL(a, DoA(1));
166146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  Expectation e2 = EXPECT_CALL(a, DoA(2));
166246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(3))
166346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .After(es1);
166446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  es1 += e2;
166546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
166646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
166746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(3);
166846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(2);
166946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
167046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1671dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that Google Mock correctly handles calls to mock functions
1672dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// after a mock object owning one of their pre-requisites has died.
1673dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1674dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that calls that satisfy the original spec are successful.
1675dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, Success1) {
1676dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b1 = new MockB;
1677dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1678dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b2 = new MockB;
1679dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1680dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1681dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1682dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b1, DoB(_))
1683dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1));
1684dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*a, Binary(_, _))
1685dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber())
1686dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(true));
1687dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b2, DoB(_))
1688dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber())
1689dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
1690dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1691dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1692dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b1->DoB(1));
1693dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b1;
1694dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // a's pre-requisite has died.
1695dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(a->Binary(0, 1));
1696dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b2;
1697dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // a's successor has died.
1698dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(a->Binary(1, 2));
1699dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete a;
1700dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1701dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1702dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that calls that satisfy the original spec are successful.
1703dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, Success2) {
1704dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b1 = new MockB;
1705dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1706dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b2 = new MockB;
1707dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1708dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1709dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1710dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b1, DoB(_))
1711dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1));
1712dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*a, Binary(_, _))
1713dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1714dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b2, DoB(_))
1715dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber())
1716dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
1717dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1718dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1719dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete a;  // a is trivially satisfied.
1720dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b1->DoB(1));
1721dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, b2->DoB(2));
1722dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b1;
1723dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b2;
1724dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1725dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1726dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that it's OK to delete a mock object itself in its action.
1727dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
172846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Suppresses warning on unreferenced formal parameter in MSVC with
172946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// -W4.
173046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#ifdef _MSC_VER
173146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(push)
173246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(disable:4100)
173346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
173446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1735dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterACTION_P(Delete, ptr) { delete ptr; }
1736dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
173746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#ifdef _MSC_VER
173846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# pragma warning(pop)
173946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif
174046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1741dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {
1742dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1743dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(_)).WillOnce(Delete(a));
1744dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->DoA(42);  // This will cause a to be deleted.
1745dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1746dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1747dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningValue) {
1748dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1749dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, ReturnResult(_))
1750dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(DoAll(Delete(a), Return(Result())));
1751dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->ReturnResult(42);  // This will cause a to be deleted.
1752dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1753dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1754dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that calls that violate the original spec yield failures.
1755dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, Failure1) {
1756dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b1 = new MockB;
1757dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1758dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b2 = new MockB;
1759dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1760dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1761dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1762dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b1, DoB(_))
1763dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(1));
1764dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*a, Binary(_, _))
1765dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1766dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b2, DoB(_))
1767dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber())
1768dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillRepeatedly(Return(2));
1769dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1770dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1771dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete a;  // a is trivially satisfied.
1772dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE({
1773dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    b2->DoB(2);
1774dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }, "Unexpected mock function call");
1775dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b1->DoB(1));
1776dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b1;
1777dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b2;
1778dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1779dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1780dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that calls that violate the original spec yield failures.
1781dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(DeletingMockEarlyTest, Failure2) {
1782dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b1 = new MockB;
1783dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* const a = new MockA;
1784dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB* const b2 = new MockB;
1785dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1786dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  {
1787dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    InSequence dummy;
1788dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b1, DoB(_));
1789dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*a, Binary(_, _))
1790dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1791dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(*b2, DoB(_))
1792dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .Times(AnyNumber());
1793dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1794dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1795dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(delete b1,
1796dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Actual: never called");
1797dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(a->Binary(0, 1),
1798dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Unexpected mock function call");
1799dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(b2->DoB(1),
1800dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Unexpected mock function call");
1801dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete a;
1802dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  delete b2;
1803dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1804dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1805dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass EvenNumberCardinality : public CardinalityInterface {
1806dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1807dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Returns true iff call_count calls will satisfy this cardinality.
1808dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual bool IsSatisfiedByCallCount(int call_count) const {
1809dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    return call_count % 2 == 0;
1810dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1811dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1812dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Returns true iff call_count calls will saturate this cardinality.
181346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  virtual bool IsSaturatedByCallCount(int /* call_count */) const {
181446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    return false;
181546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  }
1816dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1817dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Describes self to an ostream.
1818dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  virtual void DescribeTo(::std::ostream* os) const {
1819dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    *os << "called even number of times";
1820dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1821dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1822dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1823dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterCardinality EvenNumber() {
1824dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return Cardinality(new EvenNumberCardinality);
1825dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1826dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1827dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(ExpectationBaseTest,
1828dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter     AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality) {
1829dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
1830dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Sequence s;
1831dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1832dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(1))
1833dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(EvenNumber())
1834dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s);
1835dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(2))
1836dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(AnyNumber())
1837dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .InSequence(s);
1838dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(3))
1839dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .Times(AnyNumber());
1840dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1841dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->DoA(3);
1842dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->DoA(1);
1843dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(a->DoA(2), "Unexpected mock function call");
1844dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(delete a, "to be called even number of times");
1845dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1846dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1847dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// The following tests verify the message generated when a mock
1848dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// function is called.
1849dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1850dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct Printable {
1851dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1852dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1853dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterinline void operator<<(::std::ostream& os, const Printable&) {
1854dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  os << "Printable";
1855dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1856dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1857dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterstruct Unprintable {
1858dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Unprintable() : value(0) {}
1859dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  int value;
1860dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1861dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1862dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass MockC {
1863dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
186446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockC() {}
186546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1866dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD6(VoidMethod, void(bool cond, int n, string s, void* p,
1867dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                                const Printable& x, Unprintable y));
1868dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD0(NonVoidMethod, int());  // NOLINT
186946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
187046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
187146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockC);
1872dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
1873dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
187446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass VerboseFlagPreservingFixture : public testing::Test {
187546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan protected:
187646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The code needs to work when both ::string and ::std::string are defined
187746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // and the flag is implemented as a testing::internal::String.  In this
187846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // case, without the call to c_str(), the compiler will complain that it
187946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // cannot figure out what overload of string constructor to use.
188046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // TODO(vladl@google.com): Use internal::string instead of String for
188146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // string flags in Google Test.
188246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  VerboseFlagPreservingFixture()
188346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      : saved_verbose_flag_(GMOCK_FLAG(verbose).c_str()) {}
188446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
188546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ~VerboseFlagPreservingFixture() { GMOCK_FLAG(verbose) = saved_verbose_flag_; }
188646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
188746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
188846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const string saved_verbose_flag_;
188946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
189046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(VerboseFlagPreservingFixture);
189146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan};
189246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
189346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GTEST_HAS_STREAM_REDIRECTION
1894dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1895dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an uninteresting mock function call generates a warning
1896dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// containing the stack trace.
1897dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FunctionCallMessageTest, UninterestingCallGeneratesFyiWithStackTrace) {
1898dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockC c;
189946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
1900dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  c.VoidMethod(false, 5, "Hi", NULL, Printable(), Unprintable());
190146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output = GetCapturedStdout();
1902dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
1903dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_PRED_FORMAT2(IsSubstring, "Stack trace:", output);
190446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
190546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# ifndef NDEBUG
190646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
1907dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // We check the stack trace content in dbg-mode only, as opt-mode
1908dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // may inline the call we are interested in seeing.
1909dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1910dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that a void mock function's name appears in the stack
1911dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // trace.
191246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(IsSubstring, "VoidMethod(", output);
1913dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1914dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that a non-void mock function's name appears in the
1915dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // stack trace.
191646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
1917dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  c.NonVoidMethod();
191846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output2 = GetCapturedStdout();
191946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_PRED_FORMAT2(IsSubstring, "NonVoidMethod(", output2);
192046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
192146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif  // NDEBUG
1922dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1923dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1924dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that an uninteresting mock function call causes the function
1925dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// arguments and return value to be printed.
1926dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(FunctionCallMessageTest, UninterestingCallPrintsArgumentsAndReturnValue) {
1927dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // A non-void mock function.
1928dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
192946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
1930dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
193146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output1 = GetCapturedStdout();
1932dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_PRED_FORMAT2(
1933dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      IsSubstring,
1934dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "Uninteresting mock function call - returning default value.\n"
1935dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      "    Function call: DoB()\n"
193646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      "          Returns: 0\n", output1.c_str());
1937dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Makes sure the return value is printed.
1938dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1939dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // A void mock function.
1940dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockC c;
194146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  CaptureStdout();
1942dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  c.VoidMethod(false, 5, "Hi", NULL, Printable(), Unprintable());
194346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  const String output2 = GetCapturedStdout();
194446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_THAT(output2.c_str(),
194546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan              ContainsRegex(
194646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                  "Uninteresting mock function call - returning directly\\.\n"
194746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                  "    Function call: VoidMethod"
194846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                  "\\(false, 5, \"Hi\", NULL, @.+ "
194946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                  "Printable, 4-byte object <00-00 00-00>\\)"));
1950dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // A void function has no return value to print.
1951dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
1952dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1953dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests how the --gmock_verbose flag affects Google Mock's output.
1954dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
195546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
1956dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
1957dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the given Google Mock output is correct.  (When
1958dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // should_print is true, the output should match the given regex and
1959dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // contain the given function name in the stack trace.  When it's
1960dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // false, the output should be empty.)
196146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  void VerifyOutput(const String& output, bool should_print,
196246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                    const string& expected_substring,
1963dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                    const string& function_name) {
1964dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    if (should_print) {
196546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      EXPECT_THAT(output.c_str(), HasSubstr(expected_substring));
196646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# ifndef NDEBUG
1967dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // We check the stack trace content in dbg-mode only, as opt-mode
1968dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      // may inline the call we are interested in seeing.
196946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      EXPECT_THAT(output.c_str(), HasSubstr(function_name));
197046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# else
197146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      // Suppresses 'unused function parameter' warnings.
197246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      static_cast<void>(function_name);
197346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan# endif  // NDEBUG
1974dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    } else {
197546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      EXPECT_STREQ("", output.c_str());
1976dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    }
1977dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
1978dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1979dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Tests how the flag affects expected calls.
1980dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void TestExpectedCall(bool should_print) {
1981dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
1982dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, DoA(5));
1983dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    EXPECT_CALL(a, Binary(_, 1))
1984dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        .WillOnce(Return(true));
1985dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1986dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // A void-returning function.
198746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    CaptureStdout();
1988dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(5);
1989dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    VerifyOutput(
199046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        GetCapturedStdout(),
1991dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        should_print,
199246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Mock function call matches EXPECT_CALL(a, DoA(5))...\n"
199346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "    Function call: DoA(5)\n"
199446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Stack trace:\n",
199546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "DoA");
1996dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
1997dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // A non-void-returning function.
199846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    CaptureStdout();
1999dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.Binary(2, 1);
2000dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    VerifyOutput(
200146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        GetCapturedStdout(),
2002dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        should_print,
200346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Mock function call matches EXPECT_CALL(a, Binary(_, 1))...\n"
200446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "    Function call: Binary(2, 1)\n"
2005dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        "          Returns: true\n"
200646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Stack trace:\n",
200746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Binary");
2008dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2009dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2010dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Tests how the flag affects uninteresting calls.
2011dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  void TestUninterestingCall(bool should_print) {
2012dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    MockA a;
2013dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2014dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // A void-returning function.
201546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    CaptureStdout();
2016dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.DoA(5);
2017dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    VerifyOutput(
201846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        GetCapturedStdout(),
2019dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        should_print,
2020dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        "\nGMOCK WARNING:\n"
202146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Uninteresting mock function call - returning directly.\n"
202246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "    Function call: DoA(5)\n"
202346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Stack trace:\n",
202446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "DoA");
2025dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2026dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    // A non-void-returning function.
202746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan    CaptureStdout();
2028dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    a.Binary(2, 1);
2029dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter    VerifyOutput(
203046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        GetCapturedStdout(),
2031dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        should_print,
2032dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        "\nGMOCK WARNING:\n"
203346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Uninteresting mock function call - returning default value.\n"
203446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "    Function call: Binary(2, 1)\n"
2035dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter        "          Returns: false\n"
203646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Stack trace:\n",
203746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan        "Binary");
2038dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  }
2039dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2040dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2041dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that --gmock_verbose=info causes both expected and
2042dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// uninteresting calls to be reported.
2043dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockVerboseFlagTest, Info) {
2044dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kInfoVerbosity;
2045dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestExpectedCall(true);
2046dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestUninterestingCall(true);
2047dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2048dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2049dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that --gmock_verbose=warning causes uninteresting calls to be
2050dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// reported.
2051dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockVerboseFlagTest, Warning) {
2052dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kWarningVerbosity;
2053dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestExpectedCall(false);
2054dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestUninterestingCall(true);
2055dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2056dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2057dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that --gmock_verbose=warning causes neither expected nor
2058dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// uninteresting calls to be reported.
2059dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockVerboseFlagTest, Error) {
2060dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kErrorVerbosity;
2061dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestExpectedCall(false);
2062dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestUninterestingCall(false);
2063dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2064dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2065dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that --gmock_verbose=SOME_INVALID_VALUE has the same effect
2066dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// as --gmock_verbose=warning.
2067dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockVerboseFlagTest, InvalidFlagIsTreatedAsWarning) {
2068dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = "invalid";  // Treated as "warning".
2069dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestExpectedCall(false);
2070dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  TestUninterestingCall(true);
2071dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2072dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
207346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GTEST_HAS_STREAM_REDIRECTION
2074dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2075dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// A helper class that generates a failure when printed.  We use it to
2076dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// ensure that Google Mock doesn't print a value (even to an internal
2077dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// buffer) when it is not supposed to do so.
2078dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass PrintMeNot {};
2079dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2080dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixtervoid PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {
2081dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ADD_FAILURE() << "Google Mock is printing a value that shouldn't be "
2082dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                << "printed even to an internal buffer.";
2083dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2084dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2085dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterclass LogTestHelper {
2086dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter public:
208746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  LogTestHelper() {}
208846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2089dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));
209046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
209146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan private:
209246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  GTEST_DISALLOW_COPY_AND_ASSIGN_(LogTestHelper);
2093dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2094dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
209546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanclass GMockLogTest : public VerboseFlagPreservingFixture {
2096dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter protected:
2097dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  LogTestHelper helper_;
2098dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter};
2099dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2100dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsWarning) {
2101dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kWarningVerbosity;
2102dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(helper_, Foo(_))
2103dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(PrintMeNot()));
2104dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  helper_.Foo(PrintMeNot());  // This is an expected call.
2105dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2106dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2107dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsError) {
2108dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kErrorVerbosity;
2109dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(helper_, Foo(_))
2110dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(PrintMeNot()));
2111dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  helper_.Foo(PrintMeNot());  // This is an expected call.
2112dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2113dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2114dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST_F(GMockLogTest, DoesNotPrintWarningInternallyIfVerbosityIsError) {
2115dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  GMOCK_FLAG(verbose) = kErrorVerbosity;
2116dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(helper_, Foo(_))
2117dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(PrintMeNot()));
2118dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  helper_.Foo(PrintMeNot());  // This should generate a warning.
2119dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2120dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2121dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests Mock::AllowLeak().
2122dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2123dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, AllowsLeakingUnusedMockObject) {
2124dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2125dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2126dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2127dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2128dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, CanBeCalledBeforeOnCall) {
2129dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2130dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2131dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(*a, DoA(_)).WillByDefault(Return());
2132dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->DoA(0);
2133dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2134dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2135dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, CanBeCalledAfterOnCall) {
2136dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2137dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(*a, DoA(_)).WillByDefault(Return());
2138dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2139dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2140dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2141dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, CanBeCalledBeforeExpectCall) {
2142dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2143dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2144dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(_));
2145dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  a->DoA(0);
2146dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2147dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2148dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, CanBeCalledAfterExpectCall) {
2149dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2150dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
2151dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2152dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2153dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2154dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(AllowLeakTest, WorksWhenBothOnCallAndExpectCallArePresent) {
2155dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA* a = new MockA;
2156dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(*a, DoA(_)).WillByDefault(Return());
2157dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
2158dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::AllowLeak(a);
2159dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2160dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2161dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can verify and clear a mock object's expectations
2162dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// when none of its methods has expectations.
2163dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, NoMethodHasExpectations) {
2164dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2165dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2166dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2167dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2168dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2169dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2170dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2171dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2172dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2173dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can verify and clear a mock object's expectations
2174dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// when some, but not all, of its methods have expectations *and* the
2175dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// verification succeeds.
2176dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndSucceed) {
2177dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2178dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
2179dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
2180dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2181dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2182dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2183dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2184dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2185dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2186dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2187dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2188dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2189dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can verify and clear a mock object's expectations
2190dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// when some, but not all, of its methods have expectations *and* the
2191dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// verification fails.
2192dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndFail) {
2193dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2194dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
2195dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
219646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool result = true;
2197dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
2198dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Actual: never called");
2199dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_FALSE(result);
2200dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2201dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2202dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2203dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2204dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2205dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2206dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2207dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can verify and clear a mock object's expectations
2208dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// when all of its methods have expectations.
2209dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, AllMethodsHaveExpectations) {
2210dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2211dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
2212dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
2213dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
2214dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2215dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2216dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
2217dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2218dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2219dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2220dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2221dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2222dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2223dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2224dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2225dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can verify and clear a mock object's expectations
2226dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// when a method has more than one expectation.
2227dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, AMethodHasManyExpectations) {
2228dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2229dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(0))
2230dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
2231dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
2232dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2233dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
223446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool result = true;
2235dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
2236dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Actual: never called");
2237dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_FALSE(result);
2238dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2239dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2240dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2241dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2242dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2243dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2244dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2245dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can call VerifyAndClearExpectations() on the same
2246dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// mock object multiple times.
2247dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearExpectationsTest, CanCallManyTimes) {
2248dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2249dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB());
2250dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2251dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClearExpectations(&b);
2252dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2253dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
2254dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(1));
2255dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
2256dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClearExpectations(&b);
2257dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClearExpectations(&b);
2258dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2259dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2260dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2261dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2262dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2263dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2264dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2265dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can clear a mock object's default actions when none
2266dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// of its methods has default actions.
2267dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, NoMethodHasDefaultActions) {
2268dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2269dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // If this crashes or generates a failure, the test will catch it.
2270dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2271dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2272dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2273dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2274dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can clear a mock object's default actions when some,
2275dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// but not all of its methods have default actions.
2276dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, SomeMethodsHaveDefaultActions) {
2277dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2278dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB())
2279dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2280dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2281dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2282dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2283dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the default action of int DoB() was removed.
2284dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2285dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2286dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2287dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can clear a mock object's default actions when all of
2288dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// its methods have default actions.
2289dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, AllMethodsHaveDefaultActions) {
2290dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2291dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB())
2292dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2293dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
2294dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(2));
2295dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2296dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2297dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2298dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the default action of int DoB() was removed.
2299dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2300dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2301dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the default action of int DoB(int) was removed.
2302dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(0));
2303dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2304dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2305dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can clear a mock object's default actions when a
2306dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// method has more than one ON_CALL() set on it.
2307dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, AMethodHasManyDefaultActions) {
2308dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2309dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(0))
2310dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2311dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
2312dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(2));
2313dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2314dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2315dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2316dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the default actions (there are two) of int DoB(int)
2317dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // were removed.
2318dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(0));
2319dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2320dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2321dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2322dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can call VerifyAndClear() on a mock object multiple
2323dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// times.
2324dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, CanCallManyTimes) {
2325dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2326dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB())
2327dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2328dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2329dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2330dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2331dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
2332dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2333dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2334dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2335dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2336dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2337dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2338dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2339dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that VerifyAndClear() works when the verification succeeds.
2340dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, Success) {
2341dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2342dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB())
2343dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2344dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(1))
2345dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2346dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2347dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2348dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
2349dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(Mock::VerifyAndClear(&b));
2350dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2351dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2352dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2353dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2354dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2355dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2356dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2357dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that VerifyAndClear() works when the verification fails.
2358dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, Failure) {
2359dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2360dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
2361dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2362dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
2363dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2364dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2365dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
236646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  bool result = true;
2367dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClear(&b),
2368dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter                          "Actual: never called");
2369dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_FALSE(result);
2370dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2371dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2372dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2373dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2374dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2375dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2376dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2377dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that VerifyAndClear() works when the default actions and
2378dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// expectations are set on a const mock object.
2379dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, Const) {
2380dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2381dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(Const(b), DoB())
2382dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2383dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2384dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(Const(b), DoB())
2385dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(DoDefault())
2386dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2387dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2388dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2389dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB();
2390dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ASSERT_TRUE(Mock::VerifyAndClear(&b));
2391dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2392dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // There should be no expectations on the methods now, so we can
2393dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // freely call them.
2394dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB());
2395dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(0, b.DoB(1));
2396dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2397dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2398dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that we can set default actions and expectations on a mock
2399dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// object after VerifyAndClear() has been called on it.
2400dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, CanSetDefaultActionsAndExpectationsAfterwards) {
2401dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b;
2402dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB())
2403dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2404dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB(_))
2405dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2406dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b.DoB(1);
2407dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2408dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b);
2409dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2410dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b, DoB())
2411dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(3));
2412dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b, DoB(_))
2413dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(4));
2414dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2415dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(3, b.DoB());
2416dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(4, b.DoB(1));
2417dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2418dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2419dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that calling VerifyAndClear() on one mock object does not
2420dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// affect other mock objects (either of the same type or not).
2421dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken MixterTEST(VerifyAndClearTest, DoesNotAffectOtherMockObjects) {
2422dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockA a;
2423dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b1;
2424dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  MockB b2;
2425dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2426dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(a, Binary(_, _))
2427dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(true));
2428dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(a, Binary(_, _))
2429dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(DoDefault())
2430dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(false));
2431dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2432dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b1, DoB())
2433dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(1));
2434dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b1, DoB(_))
2435dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillOnce(Return(2));
2436dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2437dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  ON_CALL(b2, DoB())
2438dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter      .WillByDefault(Return(3));
2439dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_CALL(b2, DoB(_));
2440dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2441dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  b2.DoB(0);
2442dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  Mock::VerifyAndClear(&b2);
2443dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2444dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Verifies that the default actions and expectations of a and b1
2445dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // are still in effect.
2446dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_TRUE(a.Binary(0, 0));
2447dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_FALSE(a.Binary(0, 0));
2448dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2449dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(1, b1.DoB());
2450dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  EXPECT_EQ(2, b1.DoB(0));
2451dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2452dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
245346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(VerifyAndClearTest,
245446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     DestroyingChainedMocksDoesNotDeadlockThroughExpectations) {
245546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  linked_ptr<MockA> a(new MockA);
245646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ReferenceHoldingMock test_mock;
245746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
245846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // EXPECT_CALL stores a reference to a inside test_mock.
245946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(test_mock, AcceptReference(_))
246046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillRepeatedly(SetArgPointee<0>(a));
246146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
246246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Throw away the reference to the mock that we have in a. After this, the
246346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // only reference to it is stored by test_mock.
246446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.reset();
246546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
246646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // When test_mock goes out of scope, it destroys the last remaining reference
246746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // to the mock object originally pointed to by a. This will cause the MockA
246846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // destructor to be called from inside the ReferenceHoldingMock destructor.
246946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The state of all mocks is protected by a single global lock, but there
247046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // should be no deadlock.
247146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
247246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
247346108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(VerifyAndClearTest,
247446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan     DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction) {
247546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  linked_ptr<MockA> a(new MockA);
247646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ReferenceHoldingMock test_mock;
247746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
247846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // ON_CALL stores a reference to a inside test_mock.
247946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ON_CALL(test_mock, AcceptReference(_))
248046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillByDefault(SetArgPointee<0>(a));
248146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
248246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // Throw away the reference to the mock that we have in a. After this, the
248346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // only reference to it is stored by test_mock.
248446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.reset();
248546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
248646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // When test_mock goes out of scope, it destroys the last remaining reference
248746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // to the mock object originally pointed to by a. This will cause the MockA
248846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // destructor to be called from inside the ReferenceHoldingMock destructor.
248946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // The state of all mocks is protected by a single global lock, but there
249046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // should be no deadlock.
249146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan}
249246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan
2493dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// Tests that a mock function's action can call a mock function
2494dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// (either the same function or a different one) either as an explicit
2495dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// action or as a default action without causing a dead lock.  It
2496dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// verifies that the action is not performed inside the critical
2497dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter// section.
249846108a219a4b812dd8f36fee479a0340ea5963f5Ben ChanTEST(SynchronizationTest, CanCallMockMethodInAction) {
249946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockA a;
250046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  MockC c;
250146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  ON_CALL(a, DoA(_))
250246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillByDefault(IgnoreResult(InvokeWithoutArgs(&c,
250346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan                                                    &MockC::NonVoidMethod)));
250446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(1));
250546108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(a, DoA(1))
250646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .WillOnce(Invoke(&a, &MockA::DoA))
250746108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan      .RetiresOnSaturation();
250846108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  EXPECT_CALL(c, NonVoidMethod());
2509dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
251046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  a.DoA(1);
251146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // This will match the second EXPECT_CALL() and trigger another a.DoA(1),
251246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // which will in turn match the first EXPECT_CALL() and trigger a call to
251346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // c.NonVoidMethod() that was specified by the ON_CALL() since the first
251446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan  // EXPECT_CALL() did not specify an action.
2515dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2516dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2517dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}  // namespace
2518dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
251946108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// Allows the user to define his own main and then invoke gmock_main
252046108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// from it. This might be necessary on some platforms which require
252146108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan// specific setup and teardown.
252246108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#if GMOCK_RENAME_MAIN
252346108a219a4b812dd8f36fee479a0340ea5963f5Ben Chanint gmock_main(int argc, char **argv) {
252446108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#else
2525dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixterint main(int argc, char **argv) {
252646108a219a4b812dd8f36fee479a0340ea5963f5Ben Chan#endif  // GMOCK_RENAME_MAIN
2527dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  testing::InitGoogleMock(&argc, argv);
2528dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2529dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // Ensures that the tests pass no matter what value of
2530dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.
2531dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  testing::GMOCK_FLAG(catch_leaked_mocks) = true;
2532dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  testing::GMOCK_FLAG(verbose) = testing::internal::kWarningVerbosity;
2533dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter
2534dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter  return RUN_ALL_TESTS();
2535dd1c93d5709e32713961cfd95fe30489a4ad2d26Ken Mixter}
2536