xref: /aosp_15_r20/external/googletest/googlemock/test/gmock-spec-builders_test.cc (revision 481dde660366d6f317d242b6974ef1b20adb843c)
1*481dde66SAndroid Build Coastguard Worker // Copyright 2007, Google Inc.
2*481dde66SAndroid Build Coastguard Worker // All rights reserved.
3*481dde66SAndroid Build Coastguard Worker //
4*481dde66SAndroid Build Coastguard Worker // Redistribution and use in source and binary forms, with or without
5*481dde66SAndroid Build Coastguard Worker // modification, are permitted provided that the following conditions are
6*481dde66SAndroid Build Coastguard Worker // met:
7*481dde66SAndroid Build Coastguard Worker //
8*481dde66SAndroid Build Coastguard Worker //     * Redistributions of source code must retain the above copyright
9*481dde66SAndroid Build Coastguard Worker // notice, this list of conditions and the following disclaimer.
10*481dde66SAndroid Build Coastguard Worker //     * Redistributions in binary form must reproduce the above
11*481dde66SAndroid Build Coastguard Worker // copyright notice, this list of conditions and the following disclaimer
12*481dde66SAndroid Build Coastguard Worker // in the documentation and/or other materials provided with the
13*481dde66SAndroid Build Coastguard Worker // distribution.
14*481dde66SAndroid Build Coastguard Worker //     * Neither the name of Google Inc. nor the names of its
15*481dde66SAndroid Build Coastguard Worker // contributors may be used to endorse or promote products derived from
16*481dde66SAndroid Build Coastguard Worker // this software without specific prior written permission.
17*481dde66SAndroid Build Coastguard Worker //
18*481dde66SAndroid Build Coastguard Worker // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19*481dde66SAndroid Build Coastguard Worker // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20*481dde66SAndroid Build Coastguard Worker // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21*481dde66SAndroid Build Coastguard Worker // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22*481dde66SAndroid Build Coastguard Worker // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23*481dde66SAndroid Build Coastguard Worker // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24*481dde66SAndroid Build Coastguard Worker // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25*481dde66SAndroid Build Coastguard Worker // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26*481dde66SAndroid Build Coastguard Worker // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27*481dde66SAndroid Build Coastguard Worker // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28*481dde66SAndroid Build Coastguard Worker // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29*481dde66SAndroid Build Coastguard Worker 
30*481dde66SAndroid Build Coastguard Worker // Google Mock - a framework for writing C++ mock classes.
31*481dde66SAndroid Build Coastguard Worker //
32*481dde66SAndroid Build Coastguard Worker // This file tests the spec builder syntax.
33*481dde66SAndroid Build Coastguard Worker 
34*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock-spec-builders.h"
35*481dde66SAndroid Build Coastguard Worker 
36*481dde66SAndroid Build Coastguard Worker #include <memory>
37*481dde66SAndroid Build Coastguard Worker #include <ostream>  // NOLINT
38*481dde66SAndroid Build Coastguard Worker #include <sstream>
39*481dde66SAndroid Build Coastguard Worker #include <string>
40*481dde66SAndroid Build Coastguard Worker #include <type_traits>
41*481dde66SAndroid Build Coastguard Worker 
42*481dde66SAndroid Build Coastguard Worker #include "gmock/gmock.h"
43*481dde66SAndroid Build Coastguard Worker #include "gmock/internal/gmock-port.h"
44*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest-spi.h"
45*481dde66SAndroid Build Coastguard Worker #include "gtest/gtest.h"
46*481dde66SAndroid Build Coastguard Worker #include "gtest/internal/gtest-port.h"
47*481dde66SAndroid Build Coastguard Worker 
48*481dde66SAndroid Build Coastguard Worker namespace testing {
49*481dde66SAndroid Build Coastguard Worker namespace {
50*481dde66SAndroid Build Coastguard Worker 
51*481dde66SAndroid Build Coastguard Worker using ::testing::internal::FormatFileLocation;
52*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kAllow;
53*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kErrorVerbosity;
54*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kFail;
55*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kInfoVerbosity;
56*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kWarn;
57*481dde66SAndroid Build Coastguard Worker using ::testing::internal::kWarningVerbosity;
58*481dde66SAndroid Build Coastguard Worker 
59*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
60*481dde66SAndroid Build Coastguard Worker using ::testing::internal::CaptureStdout;
61*481dde66SAndroid Build Coastguard Worker using ::testing::internal::GetCapturedStdout;
62*481dde66SAndroid Build Coastguard Worker #endif
63*481dde66SAndroid Build Coastguard Worker 
64*481dde66SAndroid Build Coastguard Worker class Incomplete;
65*481dde66SAndroid Build Coastguard Worker 
66*481dde66SAndroid Build Coastguard Worker class MockIncomplete {
67*481dde66SAndroid Build Coastguard Worker  public:
68*481dde66SAndroid Build Coastguard Worker   // This line verifies that a mock method can take a by-reference
69*481dde66SAndroid Build Coastguard Worker   // argument of an incomplete type.
70*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(ByRefFunc, void(const Incomplete& x));
71*481dde66SAndroid Build Coastguard Worker };
72*481dde66SAndroid Build Coastguard Worker 
73*481dde66SAndroid Build Coastguard Worker // Tells Google Mock how to print a value of type Incomplete.
74*481dde66SAndroid Build Coastguard Worker void PrintTo(const Incomplete& x, ::std::ostream* os);
75*481dde66SAndroid Build Coastguard Worker 
TEST(MockMethodTest,CanInstantiateWithIncompleteArgType)76*481dde66SAndroid Build Coastguard Worker TEST(MockMethodTest, CanInstantiateWithIncompleteArgType) {
77*481dde66SAndroid Build Coastguard Worker   // Even though this mock class contains a mock method that takes
78*481dde66SAndroid Build Coastguard Worker   // by-reference an argument whose type is incomplete, we can still
79*481dde66SAndroid Build Coastguard Worker   // use the mock, as long as Google Mock knows how to print the
80*481dde66SAndroid Build Coastguard Worker   // argument.
81*481dde66SAndroid Build Coastguard Worker   MockIncomplete incomplete;
82*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(incomplete, ByRefFunc(_)).Times(AnyNumber());
83*481dde66SAndroid Build Coastguard Worker }
84*481dde66SAndroid Build Coastguard Worker 
85*481dde66SAndroid Build Coastguard Worker // The definition of the printer for the argument type doesn't have to
86*481dde66SAndroid Build Coastguard Worker // be visible where the mock is used.
PrintTo(const Incomplete &,::std::ostream * os)87*481dde66SAndroid Build Coastguard Worker void PrintTo(const Incomplete& /* x */, ::std::ostream* os) {
88*481dde66SAndroid Build Coastguard Worker   *os << "incomplete";
89*481dde66SAndroid Build Coastguard Worker }
90*481dde66SAndroid Build Coastguard Worker 
91*481dde66SAndroid Build Coastguard Worker class Result {};
92*481dde66SAndroid Build Coastguard Worker 
93*481dde66SAndroid Build Coastguard Worker // A type that's not default constructible.
94*481dde66SAndroid Build Coastguard Worker class NonDefaultConstructible {
95*481dde66SAndroid Build Coastguard Worker  public:
NonDefaultConstructible(int)96*481dde66SAndroid Build Coastguard Worker   explicit NonDefaultConstructible(int /* dummy */) {}
97*481dde66SAndroid Build Coastguard Worker };
98*481dde66SAndroid Build Coastguard Worker 
99*481dde66SAndroid Build Coastguard Worker class MockA {
100*481dde66SAndroid Build Coastguard Worker  public:
101*481dde66SAndroid Build Coastguard Worker   MockA() = default;
102*481dde66SAndroid Build Coastguard Worker 
103*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(DoA, void(int n));
104*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(ReturnResult, Result(int n));
105*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD0(ReturnNonDefaultConstructible, NonDefaultConstructible());
106*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD2(Binary, bool(int x, int y));
107*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD2(ReturnInt, int(int x, int y));
108*481dde66SAndroid Build Coastguard Worker 
109*481dde66SAndroid Build Coastguard Worker  private:
110*481dde66SAndroid Build Coastguard Worker   MockA(const MockA&) = delete;
111*481dde66SAndroid Build Coastguard Worker   MockA& operator=(const MockA&) = delete;
112*481dde66SAndroid Build Coastguard Worker };
113*481dde66SAndroid Build Coastguard Worker 
114*481dde66SAndroid Build Coastguard Worker class MockB {
115*481dde66SAndroid Build Coastguard Worker  public:
116*481dde66SAndroid Build Coastguard Worker   MockB() = default;
117*481dde66SAndroid Build Coastguard Worker 
118*481dde66SAndroid Build Coastguard Worker   MOCK_CONST_METHOD0(DoB, int());  // NOLINT
119*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(DoB, int(int n));   // NOLINT
120*481dde66SAndroid Build Coastguard Worker 
121*481dde66SAndroid Build Coastguard Worker  private:
122*481dde66SAndroid Build Coastguard Worker   MockB(const MockB&) = delete;
123*481dde66SAndroid Build Coastguard Worker   MockB& operator=(const MockB&) = delete;
124*481dde66SAndroid Build Coastguard Worker };
125*481dde66SAndroid Build Coastguard Worker 
126*481dde66SAndroid Build Coastguard Worker class ReferenceHoldingMock {
127*481dde66SAndroid Build Coastguard Worker  public:
128*481dde66SAndroid Build Coastguard Worker   ReferenceHoldingMock() = default;
129*481dde66SAndroid Build Coastguard Worker 
130*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(AcceptReference, void(std::shared_ptr<MockA>*));
131*481dde66SAndroid Build Coastguard Worker 
132*481dde66SAndroid Build Coastguard Worker  private:
133*481dde66SAndroid Build Coastguard Worker   ReferenceHoldingMock(const ReferenceHoldingMock&) = delete;
134*481dde66SAndroid Build Coastguard Worker   ReferenceHoldingMock& operator=(const ReferenceHoldingMock&) = delete;
135*481dde66SAndroid Build Coastguard Worker };
136*481dde66SAndroid Build Coastguard Worker 
137*481dde66SAndroid Build Coastguard Worker // Tests that EXPECT_CALL and ON_CALL compile in a presence of macro
138*481dde66SAndroid Build Coastguard Worker // redefining a mock method name. This could happen, for example, when
139*481dde66SAndroid Build Coastguard Worker // the tested code #includes Win32 API headers which define many APIs
140*481dde66SAndroid Build Coastguard Worker // as macros, e.g. #define TextOut TextOutW.
141*481dde66SAndroid Build Coastguard Worker 
142*481dde66SAndroid Build Coastguard Worker #define Method MethodW
143*481dde66SAndroid Build Coastguard Worker 
144*481dde66SAndroid Build Coastguard Worker class CC {
145*481dde66SAndroid Build Coastguard Worker  public:
146*481dde66SAndroid Build Coastguard Worker   virtual ~CC() = default;
147*481dde66SAndroid Build Coastguard Worker   virtual int Method() = 0;
148*481dde66SAndroid Build Coastguard Worker };
149*481dde66SAndroid Build Coastguard Worker class MockCC : public CC {
150*481dde66SAndroid Build Coastguard Worker  public:
151*481dde66SAndroid Build Coastguard Worker   MockCC() = default;
152*481dde66SAndroid Build Coastguard Worker 
153*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD0(Method, int());
154*481dde66SAndroid Build Coastguard Worker 
155*481dde66SAndroid Build Coastguard Worker  private:
156*481dde66SAndroid Build Coastguard Worker   MockCC(const MockCC&) = delete;
157*481dde66SAndroid Build Coastguard Worker   MockCC& operator=(const MockCC&) = delete;
158*481dde66SAndroid Build Coastguard Worker };
159*481dde66SAndroid Build Coastguard Worker 
160*481dde66SAndroid Build Coastguard Worker // Tests that a method with expanded name compiles.
TEST(OnCallSyntaxTest,CompilesWithMethodNameExpandedFromMacro)161*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
162*481dde66SAndroid Build Coastguard Worker   MockCC cc;
163*481dde66SAndroid Build Coastguard Worker   ON_CALL(cc, Method());
164*481dde66SAndroid Build Coastguard Worker }
165*481dde66SAndroid Build Coastguard Worker 
166*481dde66SAndroid Build Coastguard Worker // Tests that the method with expanded name not only compiles but runs
167*481dde66SAndroid Build Coastguard Worker // and returns a correct value, too.
TEST(OnCallSyntaxTest,WorksWithMethodNameExpandedFromMacro)168*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
169*481dde66SAndroid Build Coastguard Worker   MockCC cc;
170*481dde66SAndroid Build Coastguard Worker   ON_CALL(cc, Method()).WillByDefault(Return(42));
171*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(42, cc.Method());
172*481dde66SAndroid Build Coastguard Worker }
173*481dde66SAndroid Build Coastguard Worker 
174*481dde66SAndroid Build Coastguard Worker // Tests that a method with expanded name compiles.
TEST(ExpectCallSyntaxTest,CompilesWithMethodNameExpandedFromMacro)175*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, CompilesWithMethodNameExpandedFromMacro) {
176*481dde66SAndroid Build Coastguard Worker   MockCC cc;
177*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(cc, Method());
178*481dde66SAndroid Build Coastguard Worker   cc.Method();
179*481dde66SAndroid Build Coastguard Worker }
180*481dde66SAndroid Build Coastguard Worker 
181*481dde66SAndroid Build Coastguard Worker // Tests that it works, too.
TEST(ExpectCallSyntaxTest,WorksWithMethodNameExpandedFromMacro)182*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WorksWithMethodNameExpandedFromMacro) {
183*481dde66SAndroid Build Coastguard Worker   MockCC cc;
184*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(cc, Method()).WillOnce(Return(42));
185*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(42, cc.Method());
186*481dde66SAndroid Build Coastguard Worker }
187*481dde66SAndroid Build Coastguard Worker 
188*481dde66SAndroid Build Coastguard Worker #undef Method  // Done with macro redefinition tests.
189*481dde66SAndroid Build Coastguard Worker 
190*481dde66SAndroid Build Coastguard Worker // Tests that ON_CALL evaluates its arguments exactly once as promised
191*481dde66SAndroid Build Coastguard Worker // by Google Mock.
TEST(OnCallSyntaxTest,EvaluatesFirstArgumentOnce)192*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, EvaluatesFirstArgumentOnce) {
193*481dde66SAndroid Build Coastguard Worker   MockA a;
194*481dde66SAndroid Build Coastguard Worker   MockA* pa = &a;
195*481dde66SAndroid Build Coastguard Worker 
196*481dde66SAndroid Build Coastguard Worker   ON_CALL(*pa++, DoA(_));
197*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&a + 1, pa);
198*481dde66SAndroid Build Coastguard Worker }
199*481dde66SAndroid Build Coastguard Worker 
TEST(OnCallSyntaxTest,EvaluatesSecondArgumentOnce)200*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, EvaluatesSecondArgumentOnce) {
201*481dde66SAndroid Build Coastguard Worker   MockA a;
202*481dde66SAndroid Build Coastguard Worker   int n = 0;
203*481dde66SAndroid Build Coastguard Worker 
204*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA(n++));
205*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, n);
206*481dde66SAndroid Build Coastguard Worker }
207*481dde66SAndroid Build Coastguard Worker 
208*481dde66SAndroid Build Coastguard Worker // Tests that the syntax of ON_CALL() is enforced at run time.
209*481dde66SAndroid Build Coastguard Worker 
TEST(OnCallSyntaxTest,WithIsOptional)210*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, WithIsOptional) {
211*481dde66SAndroid Build Coastguard Worker   MockA a;
212*481dde66SAndroid Build Coastguard Worker 
213*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA(5)).WillByDefault(Return());
214*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA(_)).With(_).WillByDefault(Return());
215*481dde66SAndroid Build Coastguard Worker }
216*481dde66SAndroid Build Coastguard Worker 
TEST(OnCallSyntaxTest,WithCanAppearAtMostOnce)217*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, WithCanAppearAtMostOnce) {
218*481dde66SAndroid Build Coastguard Worker   MockA a;
219*481dde66SAndroid Build Coastguard Worker 
220*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
221*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
222*481dde66SAndroid Build Coastguard Worker         ON_CALL(a, ReturnResult(_))
223*481dde66SAndroid Build Coastguard Worker             .With(_)
224*481dde66SAndroid Build Coastguard Worker             .With(_)
225*481dde66SAndroid Build Coastguard Worker             .WillByDefault(Return(Result()));
226*481dde66SAndroid Build Coastguard Worker       },
227*481dde66SAndroid Build Coastguard Worker       ".With() cannot appear more than once in an ON_CALL()");
228*481dde66SAndroid Build Coastguard Worker }
229*481dde66SAndroid Build Coastguard Worker 
TEST(OnCallSyntaxTest,WillByDefaultIsMandatory)230*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, WillByDefaultIsMandatory) {
231*481dde66SAndroid Build Coastguard Worker   MockA a;
232*481dde66SAndroid Build Coastguard Worker 
233*481dde66SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(
234*481dde66SAndroid Build Coastguard Worker       {
235*481dde66SAndroid Build Coastguard Worker         ON_CALL(a, DoA(5));
236*481dde66SAndroid Build Coastguard Worker         a.DoA(5);
237*481dde66SAndroid Build Coastguard Worker       },
238*481dde66SAndroid Build Coastguard Worker       "");
239*481dde66SAndroid Build Coastguard Worker }
240*481dde66SAndroid Build Coastguard Worker 
TEST(OnCallSyntaxTest,WillByDefaultCanAppearAtMostOnce)241*481dde66SAndroid Build Coastguard Worker TEST(OnCallSyntaxTest, WillByDefaultCanAppearAtMostOnce) {
242*481dde66SAndroid Build Coastguard Worker   MockA a;
243*481dde66SAndroid Build Coastguard Worker 
244*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
245*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
246*481dde66SAndroid Build Coastguard Worker         ON_CALL(a, DoA(5)).WillByDefault(Return()).WillByDefault(Return());
247*481dde66SAndroid Build Coastguard Worker       },
248*481dde66SAndroid Build Coastguard Worker       ".WillByDefault() must appear exactly once in an ON_CALL()");
249*481dde66SAndroid Build Coastguard Worker }
250*481dde66SAndroid Build Coastguard Worker 
251*481dde66SAndroid Build Coastguard Worker // Tests that EXPECT_CALL evaluates its arguments exactly once as
252*481dde66SAndroid Build Coastguard Worker // promised by Google Mock.
TEST(ExpectCallSyntaxTest,EvaluatesFirstArgumentOnce)253*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, EvaluatesFirstArgumentOnce) {
254*481dde66SAndroid Build Coastguard Worker   MockA a;
255*481dde66SAndroid Build Coastguard Worker   MockA* pa = &a;
256*481dde66SAndroid Build Coastguard Worker 
257*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*pa++, DoA(_));
258*481dde66SAndroid Build Coastguard Worker   a.DoA(0);
259*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(&a + 1, pa);
260*481dde66SAndroid Build Coastguard Worker }
261*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,EvaluatesSecondArgumentOnce)262*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, EvaluatesSecondArgumentOnce) {
263*481dde66SAndroid Build Coastguard Worker   MockA a;
264*481dde66SAndroid Build Coastguard Worker   int n = 0;
265*481dde66SAndroid Build Coastguard Worker 
266*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(n++));
267*481dde66SAndroid Build Coastguard Worker   a.DoA(0);
268*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, n);
269*481dde66SAndroid Build Coastguard Worker }
270*481dde66SAndroid Build Coastguard Worker 
271*481dde66SAndroid Build Coastguard Worker // Tests that the syntax of EXPECT_CALL() is enforced at run time.
272*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WithIsOptional)273*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WithIsOptional) {
274*481dde66SAndroid Build Coastguard Worker   MockA a;
275*481dde66SAndroid Build Coastguard Worker 
276*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(5)).Times(0);
277*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(6)).With(_).Times(0);
278*481dde66SAndroid Build Coastguard Worker }
279*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WithCanAppearAtMostOnce)280*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WithCanAppearAtMostOnce) {
281*481dde66SAndroid Build Coastguard Worker   MockA a;
282*481dde66SAndroid Build Coastguard Worker 
283*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
284*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
285*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(6)).With(_).With(_);
286*481dde66SAndroid Build Coastguard Worker       },
287*481dde66SAndroid Build Coastguard Worker       ".With() cannot appear more than once in an EXPECT_CALL()");
288*481dde66SAndroid Build Coastguard Worker 
289*481dde66SAndroid Build Coastguard Worker   a.DoA(6);
290*481dde66SAndroid Build Coastguard Worker }
291*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WithMustBeFirstClause)292*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WithMustBeFirstClause) {
293*481dde66SAndroid Build Coastguard Worker   MockA a;
294*481dde66SAndroid Build Coastguard Worker 
295*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
296*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
297*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).Times(1).With(_);
298*481dde66SAndroid Build Coastguard Worker       },
299*481dde66SAndroid Build Coastguard Worker       ".With() must be the first clause in an EXPECT_CALL()");
300*481dde66SAndroid Build Coastguard Worker 
301*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
302*481dde66SAndroid Build Coastguard Worker 
303*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
304*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
305*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(2)).WillOnce(Return()).With(_);
306*481dde66SAndroid Build Coastguard Worker       },
307*481dde66SAndroid Build Coastguard Worker       ".With() must be the first clause in an EXPECT_CALL()");
308*481dde66SAndroid Build Coastguard Worker 
309*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
310*481dde66SAndroid Build Coastguard Worker }
311*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,TimesCanBeInferred)312*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, TimesCanBeInferred) {
313*481dde66SAndroid Build Coastguard Worker   MockA a;
314*481dde66SAndroid Build Coastguard Worker 
315*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).WillOnce(Return());
316*481dde66SAndroid Build Coastguard Worker 
317*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).WillOnce(Return()).WillRepeatedly(Return());
318*481dde66SAndroid Build Coastguard Worker 
319*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
320*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
321*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
322*481dde66SAndroid Build Coastguard Worker }
323*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,TimesCanAppearAtMostOnce)324*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, TimesCanAppearAtMostOnce) {
325*481dde66SAndroid Build Coastguard Worker   MockA a;
326*481dde66SAndroid Build Coastguard Worker 
327*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
328*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
329*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).Times(1).Times(2);
330*481dde66SAndroid Build Coastguard Worker       },
331*481dde66SAndroid Build Coastguard Worker       ".Times() cannot appear more than once in an EXPECT_CALL()");
332*481dde66SAndroid Build Coastguard Worker 
333*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
334*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
335*481dde66SAndroid Build Coastguard Worker }
336*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,TimesMustBeBeforeInSequence)337*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, TimesMustBeBeforeInSequence) {
338*481dde66SAndroid Build Coastguard Worker   MockA a;
339*481dde66SAndroid Build Coastguard Worker   Sequence s;
340*481dde66SAndroid Build Coastguard Worker 
341*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
342*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
343*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).InSequence(s).Times(1);
344*481dde66SAndroid Build Coastguard Worker       },
345*481dde66SAndroid Build Coastguard Worker       ".Times() may only appear *before* ");
346*481dde66SAndroid Build Coastguard Worker 
347*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
348*481dde66SAndroid Build Coastguard Worker }
349*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,InSequenceIsOptional)350*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, InSequenceIsOptional) {
351*481dde66SAndroid Build Coastguard Worker   MockA a;
352*481dde66SAndroid Build Coastguard Worker   Sequence s;
353*481dde66SAndroid Build Coastguard Worker 
354*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1));
355*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).InSequence(s);
356*481dde66SAndroid Build Coastguard Worker 
357*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
358*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
359*481dde66SAndroid Build Coastguard Worker }
360*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,InSequenceCanAppearMultipleTimes)361*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, InSequenceCanAppearMultipleTimes) {
362*481dde66SAndroid Build Coastguard Worker   MockA a;
363*481dde66SAndroid Build Coastguard Worker   Sequence s1, s2;
364*481dde66SAndroid Build Coastguard Worker 
365*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).InSequence(s1, s2).InSequence(s1);
366*481dde66SAndroid Build Coastguard Worker 
367*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
368*481dde66SAndroid Build Coastguard Worker }
369*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,InSequenceMustBeBeforeAfter)370*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeAfter) {
371*481dde66SAndroid Build Coastguard Worker   MockA a;
372*481dde66SAndroid Build Coastguard Worker   Sequence s;
373*481dde66SAndroid Build Coastguard Worker 
374*481dde66SAndroid Build Coastguard Worker   Expectation e = EXPECT_CALL(a, DoA(1)).Times(AnyNumber());
375*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
376*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
377*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(2)).After(e).InSequence(s);
378*481dde66SAndroid Build Coastguard Worker       },
379*481dde66SAndroid Build Coastguard Worker       ".InSequence() cannot appear after ");
380*481dde66SAndroid Build Coastguard Worker 
381*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
382*481dde66SAndroid Build Coastguard Worker }
383*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,InSequenceMustBeBeforeWillOnce)384*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, InSequenceMustBeBeforeWillOnce) {
385*481dde66SAndroid Build Coastguard Worker   MockA a;
386*481dde66SAndroid Build Coastguard Worker   Sequence s;
387*481dde66SAndroid Build Coastguard Worker 
388*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
389*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
390*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).WillOnce(Return()).InSequence(s);
391*481dde66SAndroid Build Coastguard Worker       },
392*481dde66SAndroid Build Coastguard Worker       ".InSequence() cannot appear after ");
393*481dde66SAndroid Build Coastguard Worker 
394*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
395*481dde66SAndroid Build Coastguard Worker }
396*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,AfterMustBeBeforeWillOnce)397*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, AfterMustBeBeforeWillOnce) {
398*481dde66SAndroid Build Coastguard Worker   MockA a;
399*481dde66SAndroid Build Coastguard Worker 
400*481dde66SAndroid Build Coastguard Worker   Expectation e = EXPECT_CALL(a, DoA(1));
401*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
402*481dde66SAndroid Build Coastguard Worker       { EXPECT_CALL(a, DoA(2)).WillOnce(Return()).After(e); },
403*481dde66SAndroid Build Coastguard Worker       ".After() cannot appear after ");
404*481dde66SAndroid Build Coastguard Worker 
405*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
406*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
407*481dde66SAndroid Build Coastguard Worker }
408*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillIsOptional)409*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillIsOptional) {
410*481dde66SAndroid Build Coastguard Worker   MockA a;
411*481dde66SAndroid Build Coastguard Worker 
412*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1));
413*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).WillOnce(Return());
414*481dde66SAndroid Build Coastguard Worker 
415*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
416*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
417*481dde66SAndroid Build Coastguard Worker }
418*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillCanAppearMultipleTimes)419*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillCanAppearMultipleTimes) {
420*481dde66SAndroid Build Coastguard Worker   MockA a;
421*481dde66SAndroid Build Coastguard Worker 
422*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1))
423*481dde66SAndroid Build Coastguard Worker       .Times(AnyNumber())
424*481dde66SAndroid Build Coastguard Worker       .WillOnce(Return())
425*481dde66SAndroid Build Coastguard Worker       .WillOnce(Return())
426*481dde66SAndroid Build Coastguard Worker       .WillOnce(Return());
427*481dde66SAndroid Build Coastguard Worker }
428*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillMustBeBeforeWillRepeatedly)429*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillMustBeBeforeWillRepeatedly) {
430*481dde66SAndroid Build Coastguard Worker   MockA a;
431*481dde66SAndroid Build Coastguard Worker 
432*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
433*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
434*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).WillRepeatedly(Return()).WillOnce(Return());
435*481dde66SAndroid Build Coastguard Worker       },
436*481dde66SAndroid Build Coastguard Worker       ".WillOnce() cannot appear after ");
437*481dde66SAndroid Build Coastguard Worker 
438*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
439*481dde66SAndroid Build Coastguard Worker }
440*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillRepeatedlyIsOptional)441*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillRepeatedlyIsOptional) {
442*481dde66SAndroid Build Coastguard Worker   MockA a;
443*481dde66SAndroid Build Coastguard Worker 
444*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).WillOnce(Return());
445*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).WillOnce(Return()).WillRepeatedly(Return());
446*481dde66SAndroid Build Coastguard Worker 
447*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
448*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
449*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
450*481dde66SAndroid Build Coastguard Worker }
451*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillRepeatedlyCannotAppearMultipleTimes)452*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillRepeatedlyCannotAppearMultipleTimes) {
453*481dde66SAndroid Build Coastguard Worker   MockA a;
454*481dde66SAndroid Build Coastguard Worker 
455*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
456*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
457*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).WillRepeatedly(Return()).WillRepeatedly(
458*481dde66SAndroid Build Coastguard Worker             Return());
459*481dde66SAndroid Build Coastguard Worker       },
460*481dde66SAndroid Build Coastguard Worker       ".WillRepeatedly() cannot appear more than once in an "
461*481dde66SAndroid Build Coastguard Worker       "EXPECT_CALL()");
462*481dde66SAndroid Build Coastguard Worker }
463*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WillRepeatedlyMustBeBeforeRetiresOnSaturation)464*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WillRepeatedlyMustBeBeforeRetiresOnSaturation) {
465*481dde66SAndroid Build Coastguard Worker   MockA a;
466*481dde66SAndroid Build Coastguard Worker 
467*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
468*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
469*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).RetiresOnSaturation().WillRepeatedly(Return());
470*481dde66SAndroid Build Coastguard Worker       },
471*481dde66SAndroid Build Coastguard Worker       ".WillRepeatedly() cannot appear after ");
472*481dde66SAndroid Build Coastguard Worker }
473*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,RetiresOnSaturationIsOptional)474*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, RetiresOnSaturationIsOptional) {
475*481dde66SAndroid Build Coastguard Worker   MockA a;
476*481dde66SAndroid Build Coastguard Worker 
477*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1));
478*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).RetiresOnSaturation();
479*481dde66SAndroid Build Coastguard Worker 
480*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
481*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
482*481dde66SAndroid Build Coastguard Worker }
483*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,RetiresOnSaturationCannotAppearMultipleTimes)484*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, RetiresOnSaturationCannotAppearMultipleTimes) {
485*481dde66SAndroid Build Coastguard Worker   MockA a;
486*481dde66SAndroid Build Coastguard Worker 
487*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
488*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
489*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1)).RetiresOnSaturation().RetiresOnSaturation();
490*481dde66SAndroid Build Coastguard Worker       },
491*481dde66SAndroid Build Coastguard Worker       ".RetiresOnSaturation() cannot appear more than once");
492*481dde66SAndroid Build Coastguard Worker 
493*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
494*481dde66SAndroid Build Coastguard Worker }
495*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,DefaultCardinalityIsOnce)496*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, DefaultCardinalityIsOnce) {
497*481dde66SAndroid Build Coastguard Worker   {
498*481dde66SAndroid Build Coastguard Worker     MockA a;
499*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
500*481dde66SAndroid Build Coastguard Worker     a.DoA(1);
501*481dde66SAndroid Build Coastguard Worker   }
502*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
503*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
504*481dde66SAndroid Build Coastguard Worker         MockA a;
505*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1));
506*481dde66SAndroid Build Coastguard Worker       },
507*481dde66SAndroid Build Coastguard Worker       "to be called once");
508*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
509*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
510*481dde66SAndroid Build Coastguard Worker         MockA a;
511*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(a, DoA(1));
512*481dde66SAndroid Build Coastguard Worker         a.DoA(1);
513*481dde66SAndroid Build Coastguard Worker         a.DoA(1);
514*481dde66SAndroid Build Coastguard Worker       },
515*481dde66SAndroid Build Coastguard Worker       "to be called once");
516*481dde66SAndroid Build Coastguard Worker }
517*481dde66SAndroid Build Coastguard Worker 
518*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
519*481dde66SAndroid Build Coastguard Worker 
520*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock doesn't print a warning when the number of
521*481dde66SAndroid Build Coastguard Worker // WillOnce() is adequate.
TEST(ExpectCallSyntaxTest,DoesNotWarnOnAdequateActionCount)522*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, DoesNotWarnOnAdequateActionCount) {
523*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
524*481dde66SAndroid Build Coastguard Worker   {
525*481dde66SAndroid Build Coastguard Worker     MockB b;
526*481dde66SAndroid Build Coastguard Worker 
527*481dde66SAndroid Build Coastguard Worker     // It's always fine to omit WillOnce() entirely.
528*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(0);
529*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(1)).Times(AtMost(1));
530*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(2)).Times(1).WillRepeatedly(Return(1));
531*481dde66SAndroid Build Coastguard Worker 
532*481dde66SAndroid Build Coastguard Worker     // It's fine for the number of WillOnce()s to equal the upper bound.
533*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(3))
534*481dde66SAndroid Build Coastguard Worker         .Times(Between(1, 2))
535*481dde66SAndroid Build Coastguard Worker         .WillOnce(Return(1))
536*481dde66SAndroid Build Coastguard Worker         .WillOnce(Return(2));
537*481dde66SAndroid Build Coastguard Worker 
538*481dde66SAndroid Build Coastguard Worker     // It's fine for the number of WillOnce()s to be smaller than the
539*481dde66SAndroid Build Coastguard Worker     // upper bound when there is a WillRepeatedly().
540*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(4)).Times(AtMost(3)).WillOnce(Return(1)).WillRepeatedly(
541*481dde66SAndroid Build Coastguard Worker         Return(2));
542*481dde66SAndroid Build Coastguard Worker 
543*481dde66SAndroid Build Coastguard Worker     // Satisfies the above expectations.
544*481dde66SAndroid Build Coastguard Worker     b.DoB(2);
545*481dde66SAndroid Build Coastguard Worker     b.DoB(3);
546*481dde66SAndroid Build Coastguard Worker   }
547*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", GetCapturedStdout().c_str());
548*481dde66SAndroid Build Coastguard Worker }
549*481dde66SAndroid Build Coastguard Worker 
550*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock warns on having too many actions in an
551*481dde66SAndroid Build Coastguard Worker // expectation compared to its cardinality.
TEST(ExpectCallSyntaxTest,WarnsOnTooManyActions)552*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WarnsOnTooManyActions) {
553*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
554*481dde66SAndroid Build Coastguard Worker   {
555*481dde66SAndroid Build Coastguard Worker     MockB b;
556*481dde66SAndroid Build Coastguard Worker 
557*481dde66SAndroid Build Coastguard Worker     // Warns when the number of WillOnce()s is larger than the upper bound.
558*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(0).WillOnce(Return(1));  // #1
559*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(AtMost(1)).WillOnce(Return(1)).WillOnce(
560*481dde66SAndroid Build Coastguard Worker         Return(2));  // #2
561*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(1))
562*481dde66SAndroid Build Coastguard Worker         .Times(1)
563*481dde66SAndroid Build Coastguard Worker         .WillOnce(Return(1))
564*481dde66SAndroid Build Coastguard Worker         .WillOnce(Return(2))
565*481dde66SAndroid Build Coastguard Worker         .RetiresOnSaturation();  // #3
566*481dde66SAndroid Build Coastguard Worker 
567*481dde66SAndroid Build Coastguard Worker     // Warns when the number of WillOnce()s equals the upper bound and
568*481dde66SAndroid Build Coastguard Worker     // there is a WillRepeatedly().
569*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(0).WillRepeatedly(Return(1));  // #4
570*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB(2)).Times(1).WillOnce(Return(1)).WillRepeatedly(
571*481dde66SAndroid Build Coastguard Worker         Return(2));  // #5
572*481dde66SAndroid Build Coastguard Worker 
573*481dde66SAndroid Build Coastguard Worker     // Satisfies the above expectations.
574*481dde66SAndroid Build Coastguard Worker     b.DoB(1);
575*481dde66SAndroid Build Coastguard Worker     b.DoB(2);
576*481dde66SAndroid Build Coastguard Worker   }
577*481dde66SAndroid Build Coastguard Worker   const std::string output = GetCapturedStdout();
578*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring,
579*481dde66SAndroid Build Coastguard Worker                       "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
580*481dde66SAndroid Build Coastguard Worker                       "Expected to be never called, but has 1 WillOnce().",
581*481dde66SAndroid Build Coastguard Worker                       output);  // #1
582*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring,
583*481dde66SAndroid Build Coastguard Worker                       "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
584*481dde66SAndroid Build Coastguard Worker                       "Expected to be called at most once, "
585*481dde66SAndroid Build Coastguard Worker                       "but has 2 WillOnce()s.",
586*481dde66SAndroid Build Coastguard Worker                       output);  // #2
587*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(
588*481dde66SAndroid Build Coastguard Worker       IsSubstring,
589*481dde66SAndroid Build Coastguard Worker       "Too many actions specified in EXPECT_CALL(b, DoB(1))...\n"
590*481dde66SAndroid Build Coastguard Worker       "Expected to be called once, but has 2 WillOnce()s.",
591*481dde66SAndroid Build Coastguard Worker       output);  // #3
592*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring,
593*481dde66SAndroid Build Coastguard Worker                       "Too many actions specified in EXPECT_CALL(b, DoB())...\n"
594*481dde66SAndroid Build Coastguard Worker                       "Expected to be never called, but has 0 WillOnce()s "
595*481dde66SAndroid Build Coastguard Worker                       "and a WillRepeatedly().",
596*481dde66SAndroid Build Coastguard Worker                       output);  // #4
597*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(
598*481dde66SAndroid Build Coastguard Worker       IsSubstring,
599*481dde66SAndroid Build Coastguard Worker       "Too many actions specified in EXPECT_CALL(b, DoB(2))...\n"
600*481dde66SAndroid Build Coastguard Worker       "Expected to be called once, but has 1 WillOnce() "
601*481dde66SAndroid Build Coastguard Worker       "and a WillRepeatedly().",
602*481dde66SAndroid Build Coastguard Worker       output);  // #5
603*481dde66SAndroid Build Coastguard Worker }
604*481dde66SAndroid Build Coastguard Worker 
605*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock warns on having too few actions in an
606*481dde66SAndroid Build Coastguard Worker // expectation compared to its cardinality.
TEST(ExpectCallSyntaxTest,WarnsOnTooFewActions)607*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WarnsOnTooFewActions) {
608*481dde66SAndroid Build Coastguard Worker   MockB b;
609*481dde66SAndroid Build Coastguard Worker 
610*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).Times(Between(2, 3)).WillOnce(Return(1));
611*481dde66SAndroid Build Coastguard Worker 
612*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
613*481dde66SAndroid Build Coastguard Worker   b.DoB();
614*481dde66SAndroid Build Coastguard Worker   const std::string output = GetCapturedStdout();
615*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring,
616*481dde66SAndroid Build Coastguard Worker                       "Too few actions specified in EXPECT_CALL(b, DoB())...\n"
617*481dde66SAndroid Build Coastguard Worker                       "Expected to be called between 2 and 3 times, "
618*481dde66SAndroid Build Coastguard Worker                       "but has only 1 WillOnce().",
619*481dde66SAndroid Build Coastguard Worker                       output);
620*481dde66SAndroid Build Coastguard Worker   b.DoB();
621*481dde66SAndroid Build Coastguard Worker }
622*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallSyntaxTest,WarningIsErrorWithFlag)623*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallSyntaxTest, WarningIsErrorWithFlag) {
624*481dde66SAndroid Build Coastguard Worker   int original_behavior = GMOCK_FLAG_GET(default_mock_behavior);
625*481dde66SAndroid Build Coastguard Worker 
626*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, kAllow);
627*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
628*481dde66SAndroid Build Coastguard Worker   {
629*481dde66SAndroid Build Coastguard Worker     MockA a;
630*481dde66SAndroid Build Coastguard Worker     a.DoA(0);
631*481dde66SAndroid Build Coastguard Worker   }
632*481dde66SAndroid Build Coastguard Worker   std::string output = GetCapturedStdout();
633*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(output.empty()) << output;
634*481dde66SAndroid Build Coastguard Worker 
635*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, kWarn);
636*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
637*481dde66SAndroid Build Coastguard Worker   {
638*481dde66SAndroid Build Coastguard Worker     MockA a;
639*481dde66SAndroid Build Coastguard Worker     a.DoA(0);
640*481dde66SAndroid Build Coastguard Worker   }
641*481dde66SAndroid Build Coastguard Worker   std::string warning_output = GetCapturedStdout();
642*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
643*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
644*481dde66SAndroid Build Coastguard Worker                       warning_output);
645*481dde66SAndroid Build Coastguard Worker 
646*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, kFail);
647*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
648*481dde66SAndroid Build Coastguard Worker       {
649*481dde66SAndroid Build Coastguard Worker         MockA a;
650*481dde66SAndroid Build Coastguard Worker         a.DoA(0);
651*481dde66SAndroid Build Coastguard Worker       },
652*481dde66SAndroid Build Coastguard Worker       "Uninteresting mock function call");
653*481dde66SAndroid Build Coastguard Worker 
654*481dde66SAndroid Build Coastguard Worker   // Out of bounds values are converted to kWarn
655*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, -1);
656*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
657*481dde66SAndroid Build Coastguard Worker   {
658*481dde66SAndroid Build Coastguard Worker     MockA a;
659*481dde66SAndroid Build Coastguard Worker     a.DoA(0);
660*481dde66SAndroid Build Coastguard Worker   }
661*481dde66SAndroid Build Coastguard Worker   warning_output = GetCapturedStdout();
662*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
663*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
664*481dde66SAndroid Build Coastguard Worker                       warning_output);
665*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, 3);
666*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
667*481dde66SAndroid Build Coastguard Worker   {
668*481dde66SAndroid Build Coastguard Worker     MockA a;
669*481dde66SAndroid Build Coastguard Worker     a.DoA(0);
670*481dde66SAndroid Build Coastguard Worker   }
671*481dde66SAndroid Build Coastguard Worker   warning_output = GetCapturedStdout();
672*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", warning_output);
673*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "Uninteresting mock function call",
674*481dde66SAndroid Build Coastguard Worker                       warning_output);
675*481dde66SAndroid Build Coastguard Worker 
676*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(default_mock_behavior, original_behavior);
677*481dde66SAndroid Build Coastguard Worker }
678*481dde66SAndroid Build Coastguard Worker 
679*481dde66SAndroid Build Coastguard Worker #endif  // GTEST_HAS_STREAM_REDIRECTION
680*481dde66SAndroid Build Coastguard Worker 
681*481dde66SAndroid Build Coastguard Worker // Tests the semantics of ON_CALL().
682*481dde66SAndroid Build Coastguard Worker 
683*481dde66SAndroid Build Coastguard Worker // Tests that the built-in default action is taken when no ON_CALL()
684*481dde66SAndroid Build Coastguard Worker // is specified.
TEST(OnCallTest,TakesBuiltInDefaultActionWhenNoOnCall)685*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCall) {
686*481dde66SAndroid Build Coastguard Worker   MockB b;
687*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB());
688*481dde66SAndroid Build Coastguard Worker 
689*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
690*481dde66SAndroid Build Coastguard Worker }
691*481dde66SAndroid Build Coastguard Worker 
692*481dde66SAndroid Build Coastguard Worker // Tests that the built-in default action is taken when no ON_CALL()
693*481dde66SAndroid Build Coastguard Worker // matches the invocation.
TEST(OnCallTest,TakesBuiltInDefaultActionWhenNoOnCallMatches)694*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, TakesBuiltInDefaultActionWhenNoOnCallMatches) {
695*481dde66SAndroid Build Coastguard Worker   MockB b;
696*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(1)).WillByDefault(Return(1));
697*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_));
698*481dde66SAndroid Build Coastguard Worker 
699*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(2));
700*481dde66SAndroid Build Coastguard Worker }
701*481dde66SAndroid Build Coastguard Worker 
702*481dde66SAndroid Build Coastguard Worker // Tests that the last matching ON_CALL() action is taken.
TEST(OnCallTest,PicksLastMatchingOnCall)703*481dde66SAndroid Build Coastguard Worker TEST(OnCallTest, PicksLastMatchingOnCall) {
704*481dde66SAndroid Build Coastguard Worker   MockB b;
705*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(3));
706*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(2)).WillByDefault(Return(2));
707*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(1)).WillByDefault(Return(1));
708*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_));
709*481dde66SAndroid Build Coastguard Worker 
710*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b.DoB(2));
711*481dde66SAndroid Build Coastguard Worker }
712*481dde66SAndroid Build Coastguard Worker 
713*481dde66SAndroid Build Coastguard Worker // Tests the semantics of EXPECT_CALL().
714*481dde66SAndroid Build Coastguard Worker 
715*481dde66SAndroid Build Coastguard Worker // Tests that any call is allowed when no EXPECT_CALL() is specified.
TEST(ExpectCallTest,AllowsAnyCallWhenNoSpec)716*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, AllowsAnyCallWhenNoSpec) {
717*481dde66SAndroid Build Coastguard Worker   MockB b;
718*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB());
719*481dde66SAndroid Build Coastguard Worker   // There is no expectation on DoB(int).
720*481dde66SAndroid Build Coastguard Worker 
721*481dde66SAndroid Build Coastguard Worker   b.DoB();
722*481dde66SAndroid Build Coastguard Worker 
723*481dde66SAndroid Build Coastguard Worker   // DoB(int) can be called any number of times.
724*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
725*481dde66SAndroid Build Coastguard Worker   b.DoB(2);
726*481dde66SAndroid Build Coastguard Worker }
727*481dde66SAndroid Build Coastguard Worker 
728*481dde66SAndroid Build Coastguard Worker // Tests that the last matching EXPECT_CALL() fires.
TEST(ExpectCallTest,PicksLastMatchingExpectCall)729*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, PicksLastMatchingExpectCall) {
730*481dde66SAndroid Build Coastguard Worker   MockB b;
731*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).WillRepeatedly(Return(2));
732*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(1)).WillRepeatedly(Return(1));
733*481dde66SAndroid Build Coastguard Worker 
734*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b.DoB(1));
735*481dde66SAndroid Build Coastguard Worker }
736*481dde66SAndroid Build Coastguard Worker 
737*481dde66SAndroid Build Coastguard Worker // Tests lower-bound violation.
TEST(ExpectCallTest,CatchesTooFewCalls)738*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, CatchesTooFewCalls) {
739*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
740*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
741*481dde66SAndroid Build Coastguard Worker         MockB b;
742*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(b, DoB(5)).Description("DoB Method").Times(AtLeast(2));
743*481dde66SAndroid Build Coastguard Worker 
744*481dde66SAndroid Build Coastguard Worker         b.DoB(5);
745*481dde66SAndroid Build Coastguard Worker       },
746*481dde66SAndroid Build Coastguard Worker       "Actual function \"DoB Method\" call count "
747*481dde66SAndroid Build Coastguard Worker       "doesn't match EXPECT_CALL(b, DoB(5))...\n"
748*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called at least twice\n"
749*481dde66SAndroid Build Coastguard Worker       "           Actual: called once - unsatisfied and active");
750*481dde66SAndroid Build Coastguard Worker }
751*481dde66SAndroid Build Coastguard Worker 
752*481dde66SAndroid Build Coastguard Worker // Tests that the cardinality can be inferred when no Times(...) is
753*481dde66SAndroid Build Coastguard Worker // specified.
TEST(ExpectCallTest,InfersCardinalityWhenThereIsNoWillRepeatedly)754*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, InfersCardinalityWhenThereIsNoWillRepeatedly) {
755*481dde66SAndroid Build Coastguard Worker   {
756*481dde66SAndroid Build Coastguard Worker     MockB b;
757*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillOnce(Return(2));
758*481dde66SAndroid Build Coastguard Worker 
759*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(1, b.DoB());
760*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(2, b.DoB());
761*481dde66SAndroid Build Coastguard Worker   }
762*481dde66SAndroid Build Coastguard Worker 
763*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
764*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
765*481dde66SAndroid Build Coastguard Worker         MockB b;
766*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillOnce(Return(2));
767*481dde66SAndroid Build Coastguard Worker 
768*481dde66SAndroid Build Coastguard Worker         EXPECT_EQ(1, b.DoB());
769*481dde66SAndroid Build Coastguard Worker       },
770*481dde66SAndroid Build Coastguard Worker       "to be called twice");
771*481dde66SAndroid Build Coastguard Worker 
772*481dde66SAndroid Build Coastguard Worker   {  // NOLINT
773*481dde66SAndroid Build Coastguard Worker     MockB b;
774*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillOnce(Return(2));
775*481dde66SAndroid Build Coastguard Worker 
776*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(1, b.DoB());
777*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(2, b.DoB());
778*481dde66SAndroid Build Coastguard Worker     EXPECT_NONFATAL_FAILURE(b.DoB(), "to be called twice");
779*481dde66SAndroid Build Coastguard Worker   }
780*481dde66SAndroid Build Coastguard Worker }
781*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectCallTest,InfersCardinality1WhenThereIsWillRepeatedly)782*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, InfersCardinality1WhenThereIsWillRepeatedly) {
783*481dde66SAndroid Build Coastguard Worker   {
784*481dde66SAndroid Build Coastguard Worker     MockB b;
785*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillRepeatedly(Return(2));
786*481dde66SAndroid Build Coastguard Worker 
787*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(1, b.DoB());
788*481dde66SAndroid Build Coastguard Worker   }
789*481dde66SAndroid Build Coastguard Worker 
790*481dde66SAndroid Build Coastguard Worker   {  // NOLINT
791*481dde66SAndroid Build Coastguard Worker     MockB b;
792*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillRepeatedly(Return(2));
793*481dde66SAndroid Build Coastguard Worker 
794*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(1, b.DoB());
795*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(2, b.DoB());
796*481dde66SAndroid Build Coastguard Worker     EXPECT_EQ(2, b.DoB());
797*481dde66SAndroid Build Coastguard Worker   }
798*481dde66SAndroid Build Coastguard Worker 
799*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
800*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
801*481dde66SAndroid Build Coastguard Worker         MockB b;
802*481dde66SAndroid Build Coastguard Worker         EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillRepeatedly(Return(2));
803*481dde66SAndroid Build Coastguard Worker       },
804*481dde66SAndroid Build Coastguard Worker       "to be called at least once");
805*481dde66SAndroid Build Coastguard Worker }
806*481dde66SAndroid Build Coastguard Worker 
807*481dde66SAndroid Build Coastguard Worker #if defined(GTEST_INTERNAL_CPLUSPLUS_LANG) && \
808*481dde66SAndroid Build Coastguard Worker     GTEST_INTERNAL_CPLUSPLUS_LANG >= 201703L
809*481dde66SAndroid Build Coastguard Worker 
810*481dde66SAndroid Build Coastguard Worker // It should be possible to return a non-moveable type from a mock action in
811*481dde66SAndroid Build Coastguard Worker // C++17 and above, where it's guaranteed that such a type can be initialized
812*481dde66SAndroid Build Coastguard Worker // from a prvalue returned from a function.
TEST(ExpectCallTest,NonMoveableType)813*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, NonMoveableType) {
814*481dde66SAndroid Build Coastguard Worker   // Define a non-moveable result type.
815*481dde66SAndroid Build Coastguard Worker   struct NonMoveableStruct {
816*481dde66SAndroid Build Coastguard Worker     explicit NonMoveableStruct(int x_in) : x(x_in) {}
817*481dde66SAndroid Build Coastguard Worker     NonMoveableStruct(NonMoveableStruct&&) = delete;
818*481dde66SAndroid Build Coastguard Worker 
819*481dde66SAndroid Build Coastguard Worker     int x;
820*481dde66SAndroid Build Coastguard Worker   };
821*481dde66SAndroid Build Coastguard Worker 
822*481dde66SAndroid Build Coastguard Worker   static_assert(!std::is_move_constructible_v<NonMoveableStruct>);
823*481dde66SAndroid Build Coastguard Worker   static_assert(!std::is_copy_constructible_v<NonMoveableStruct>);
824*481dde66SAndroid Build Coastguard Worker 
825*481dde66SAndroid Build Coastguard Worker   static_assert(!std::is_move_assignable_v<NonMoveableStruct>);
826*481dde66SAndroid Build Coastguard Worker   static_assert(!std::is_copy_assignable_v<NonMoveableStruct>);
827*481dde66SAndroid Build Coastguard Worker 
828*481dde66SAndroid Build Coastguard Worker   // We should be able to use a callable that returns that result as both a
829*481dde66SAndroid Build Coastguard Worker   // OnceAction and an Action, whether the callable ignores arguments or not.
830*481dde66SAndroid Build Coastguard Worker   const auto return_17 = [] { return NonMoveableStruct(17); };
831*481dde66SAndroid Build Coastguard Worker 
832*481dde66SAndroid Build Coastguard Worker   static_cast<void>(OnceAction<NonMoveableStruct()>{return_17});
833*481dde66SAndroid Build Coastguard Worker   static_cast<void>(Action<NonMoveableStruct()>{return_17});
834*481dde66SAndroid Build Coastguard Worker 
835*481dde66SAndroid Build Coastguard Worker   static_cast<void>(OnceAction<NonMoveableStruct(int)>{return_17});
836*481dde66SAndroid Build Coastguard Worker   static_cast<void>(Action<NonMoveableStruct(int)>{return_17});
837*481dde66SAndroid Build Coastguard Worker 
838*481dde66SAndroid Build Coastguard Worker   // It should be possible to return the result end to end through an
839*481dde66SAndroid Build Coastguard Worker   // EXPECT_CALL statement, with both WillOnce and WillRepeatedly.
840*481dde66SAndroid Build Coastguard Worker   MockFunction<NonMoveableStruct()> mock;
841*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(mock, Call)   //
842*481dde66SAndroid Build Coastguard Worker       .WillOnce(return_17)  //
843*481dde66SAndroid Build Coastguard Worker       .WillRepeatedly(return_17);
844*481dde66SAndroid Build Coastguard Worker 
845*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(17, mock.AsStdFunction()().x);
846*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(17, mock.AsStdFunction()().x);
847*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(17, mock.AsStdFunction()().x);
848*481dde66SAndroid Build Coastguard Worker }
849*481dde66SAndroid Build Coastguard Worker 
850*481dde66SAndroid Build Coastguard Worker #endif  // C++17 and above
851*481dde66SAndroid Build Coastguard Worker 
852*481dde66SAndroid Build Coastguard Worker // Tests that the n-th action is taken for the n-th matching
853*481dde66SAndroid Build Coastguard Worker // invocation.
TEST(ExpectCallTest,NthMatchTakesNthAction)854*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, NthMatchTakesNthAction) {
855*481dde66SAndroid Build Coastguard Worker   MockB b;
856*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillOnce(Return(2)).WillOnce(
857*481dde66SAndroid Build Coastguard Worker       Return(3));
858*481dde66SAndroid Build Coastguard Worker 
859*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b.DoB());
860*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b.DoB());
861*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3, b.DoB());
862*481dde66SAndroid Build Coastguard Worker }
863*481dde66SAndroid Build Coastguard Worker 
864*481dde66SAndroid Build Coastguard Worker // Tests that the WillRepeatedly() action is taken when the WillOnce(...)
865*481dde66SAndroid Build Coastguard Worker // list is exhausted.
TEST(ExpectCallTest,TakesRepeatedActionWhenWillListIsExhausted)866*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, TakesRepeatedActionWhenWillListIsExhausted) {
867*481dde66SAndroid Build Coastguard Worker   MockB b;
868*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(1)).WillRepeatedly(Return(2));
869*481dde66SAndroid Build Coastguard Worker 
870*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b.DoB());
871*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b.DoB());
872*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b.DoB());
873*481dde66SAndroid Build Coastguard Worker }
874*481dde66SAndroid Build Coastguard Worker 
875*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
876*481dde66SAndroid Build Coastguard Worker 
877*481dde66SAndroid Build Coastguard Worker // Tests that the default action is taken when the WillOnce(...) list is
878*481dde66SAndroid Build Coastguard Worker // exhausted and there is no WillRepeatedly().
TEST(ExpectCallTest,TakesDefaultActionWhenWillListIsExhausted)879*481dde66SAndroid Build Coastguard Worker TEST(ExpectCallTest, TakesDefaultActionWhenWillListIsExhausted) {
880*481dde66SAndroid Build Coastguard Worker   MockB b;
881*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).Times(1);
882*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB())
883*481dde66SAndroid Build Coastguard Worker       .Times(AnyNumber())
884*481dde66SAndroid Build Coastguard Worker       .WillOnce(Return(1))
885*481dde66SAndroid Build Coastguard Worker       .WillOnce(Return(2));
886*481dde66SAndroid Build Coastguard Worker 
887*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
888*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));  // Shouldn't generate a warning as the
889*481dde66SAndroid Build Coastguard Worker                            // expectation has no action clause at all.
890*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b.DoB());
891*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b.DoB());
892*481dde66SAndroid Build Coastguard Worker   const std::string output1 = GetCapturedStdout();
893*481dde66SAndroid Build Coastguard Worker   EXPECT_STREQ("", output1.c_str());
894*481dde66SAndroid Build Coastguard Worker 
895*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
896*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
897*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
898*481dde66SAndroid Build Coastguard Worker   const std::string output2 = GetCapturedStdout();
899*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(output2.c_str(),
900*481dde66SAndroid Build Coastguard Worker               HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
901*481dde66SAndroid Build Coastguard Worker                         "Called 3 times, but only 2 WillOnce()s are specified"
902*481dde66SAndroid Build Coastguard Worker                         " - returning default value."));
903*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(output2.c_str(),
904*481dde66SAndroid Build Coastguard Worker               HasSubstr("Actions ran out in EXPECT_CALL(b, DoB())...\n"
905*481dde66SAndroid Build Coastguard Worker                         "Called 4 times, but only 2 WillOnce()s are specified"
906*481dde66SAndroid Build Coastguard Worker                         " - returning default value."));
907*481dde66SAndroid Build Coastguard Worker }
908*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionMockerMessageTest,ReportsExpectCallLocationForExhaustedActions)909*481dde66SAndroid Build Coastguard Worker TEST(FunctionMockerMessageTest, ReportsExpectCallLocationForExhaustedActions) {
910*481dde66SAndroid Build Coastguard Worker   MockB b;
911*481dde66SAndroid Build Coastguard Worker   std::string expect_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
912*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).Times(AnyNumber()).WillOnce(Return(1));
913*481dde66SAndroid Build Coastguard Worker 
914*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b.DoB());
915*481dde66SAndroid Build Coastguard Worker 
916*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
917*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
918*481dde66SAndroid Build Coastguard Worker   const std::string output = GetCapturedStdout();
919*481dde66SAndroid Build Coastguard Worker   // The warning message should contain the call location.
920*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, expect_call_location, output);
921*481dde66SAndroid Build Coastguard Worker }
922*481dde66SAndroid Build Coastguard Worker 
TEST(FunctionMockerMessageTest,ReportsDefaultActionLocationOfUninterestingCallsForNaggyMock)923*481dde66SAndroid Build Coastguard Worker TEST(FunctionMockerMessageTest,
924*481dde66SAndroid Build Coastguard Worker      ReportsDefaultActionLocationOfUninterestingCallsForNaggyMock) {
925*481dde66SAndroid Build Coastguard Worker   std::string on_call_location;
926*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
927*481dde66SAndroid Build Coastguard Worker   {
928*481dde66SAndroid Build Coastguard Worker     NaggyMock<MockB> b;
929*481dde66SAndroid Build Coastguard Worker     on_call_location = FormatFileLocation(__FILE__, __LINE__ + 1);
930*481dde66SAndroid Build Coastguard Worker     ON_CALL(b, DoB(_)).WillByDefault(Return(0));
931*481dde66SAndroid Build Coastguard Worker     b.DoB(0);
932*481dde66SAndroid Build Coastguard Worker   }
933*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, on_call_location, GetCapturedStdout());
934*481dde66SAndroid Build Coastguard Worker }
935*481dde66SAndroid Build Coastguard Worker 
936*481dde66SAndroid Build Coastguard Worker #endif  // GTEST_HAS_STREAM_REDIRECTION
937*481dde66SAndroid Build Coastguard Worker 
938*481dde66SAndroid Build Coastguard Worker // Tests that an uninteresting call performs the default action.
TEST(UninterestingCallTest,DoesDefaultAction)939*481dde66SAndroid Build Coastguard Worker TEST(UninterestingCallTest, DoesDefaultAction) {
940*481dde66SAndroid Build Coastguard Worker   // When there is an ON_CALL() statement, the action specified by it
941*481dde66SAndroid Build Coastguard Worker   // should be taken.
942*481dde66SAndroid Build Coastguard Worker   MockA a;
943*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary(_, _)).WillByDefault(Return(true));
944*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(a.Binary(1, 2));
945*481dde66SAndroid Build Coastguard Worker 
946*481dde66SAndroid Build Coastguard Worker   // When there is no ON_CALL(), the default value for the return type
947*481dde66SAndroid Build Coastguard Worker   // should be returned.
948*481dde66SAndroid Build Coastguard Worker   MockB b;
949*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
950*481dde66SAndroid Build Coastguard Worker }
951*481dde66SAndroid Build Coastguard Worker 
952*481dde66SAndroid Build Coastguard Worker // Tests that an unexpected call performs the default action.
TEST(UnexpectedCallTest,DoesDefaultAction)953*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, DoesDefaultAction) {
954*481dde66SAndroid Build Coastguard Worker   // When there is an ON_CALL() statement, the action specified by it
955*481dde66SAndroid Build Coastguard Worker   // should be taken.
956*481dde66SAndroid Build Coastguard Worker   MockA a;
957*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary(_, _)).WillByDefault(Return(true));
958*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, Binary(0, 0));
959*481dde66SAndroid Build Coastguard Worker   a.Binary(0, 0);
960*481dde66SAndroid Build Coastguard Worker   bool result = false;
961*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(result = a.Binary(1, 2),
962*481dde66SAndroid Build Coastguard Worker                           "Unexpected mock function call");
963*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(result);
964*481dde66SAndroid Build Coastguard Worker 
965*481dde66SAndroid Build Coastguard Worker   // When there is no ON_CALL(), the default value for the return type
966*481dde66SAndroid Build Coastguard Worker   // should be returned.
967*481dde66SAndroid Build Coastguard Worker   MockB b;
968*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(0)).Times(0);
969*481dde66SAndroid Build Coastguard Worker   int n = -1;
970*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(n = b.DoB(1), "Unexpected mock function call");
971*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, n);
972*481dde66SAndroid Build Coastguard Worker }
973*481dde66SAndroid Build Coastguard Worker 
974*481dde66SAndroid Build Coastguard Worker // Tests that when an unexpected void function generates the right
975*481dde66SAndroid Build Coastguard Worker // failure message.
TEST(UnexpectedCallTest,GeneratesFailureForVoidFunction)976*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, GeneratesFailureForVoidFunction) {
977*481dde66SAndroid Build Coastguard Worker   // First, tests the message when there is only one EXPECT_CALL().
978*481dde66SAndroid Build Coastguard Worker   MockA a1;
979*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a1, DoA(1));
980*481dde66SAndroid Build Coastguard Worker   a1.DoA(1);
981*481dde66SAndroid Build Coastguard Worker   // Ideally we should match the failure message against a regex, but
982*481dde66SAndroid Build Coastguard Worker   // EXPECT_NONFATAL_FAILURE doesn't support that, so we test for
983*481dde66SAndroid Build Coastguard Worker   // multiple sub-strings instead.
984*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
985*481dde66SAndroid Build Coastguard Worker       a1.DoA(9),
986*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call - returning directly.\n"
987*481dde66SAndroid Build Coastguard Worker       "    Function call: DoA(9)\n"
988*481dde66SAndroid Build Coastguard Worker       "Google Mock tried the following 1 expectation, but it didn't match:");
989*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
990*481dde66SAndroid Build Coastguard Worker       a1.DoA(9),
991*481dde66SAndroid Build Coastguard Worker       "  Expected arg #0: is equal to 1\n"
992*481dde66SAndroid Build Coastguard Worker       "           Actual: 9\n"
993*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called once\n"
994*481dde66SAndroid Build Coastguard Worker       "           Actual: called once - saturated and active");
995*481dde66SAndroid Build Coastguard Worker 
996*481dde66SAndroid Build Coastguard Worker   // Next, tests the message when there are more than one EXPECT_CALL().
997*481dde66SAndroid Build Coastguard Worker   MockA a2;
998*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a2, DoA(1));
999*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a2, DoA(3));
1000*481dde66SAndroid Build Coastguard Worker   a2.DoA(1);
1001*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1002*481dde66SAndroid Build Coastguard Worker       a2.DoA(2),
1003*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call - returning directly.\n"
1004*481dde66SAndroid Build Coastguard Worker       "    Function call: DoA(2)\n"
1005*481dde66SAndroid Build Coastguard Worker       "Google Mock tried the following 2 expectations, but none matched:");
1006*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1007*481dde66SAndroid Build Coastguard Worker       a2.DoA(2),
1008*481dde66SAndroid Build Coastguard Worker       "tried expectation #0: EXPECT_CALL(a2, DoA(1))...\n"
1009*481dde66SAndroid Build Coastguard Worker       "  Expected arg #0: is equal to 1\n"
1010*481dde66SAndroid Build Coastguard Worker       "           Actual: 2\n"
1011*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called once\n"
1012*481dde66SAndroid Build Coastguard Worker       "           Actual: called once - saturated and active");
1013*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1014*481dde66SAndroid Build Coastguard Worker       a2.DoA(2),
1015*481dde66SAndroid Build Coastguard Worker       "tried expectation #1: EXPECT_CALL(a2, DoA(3))...\n"
1016*481dde66SAndroid Build Coastguard Worker       "  Expected arg #0: is equal to 3\n"
1017*481dde66SAndroid Build Coastguard Worker       "           Actual: 2\n"
1018*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called once\n"
1019*481dde66SAndroid Build Coastguard Worker       "           Actual: never called - unsatisfied and active");
1020*481dde66SAndroid Build Coastguard Worker   a2.DoA(3);
1021*481dde66SAndroid Build Coastguard Worker }
1022*481dde66SAndroid Build Coastguard Worker 
1023*481dde66SAndroid Build Coastguard Worker // Tests that an unexpected non-void function generates the right
1024*481dde66SAndroid Build Coastguard Worker // failure message.
TEST(UnexpectedCallTest,GeneartesFailureForNonVoidFunction)1025*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, GeneartesFailureForNonVoidFunction) {
1026*481dde66SAndroid Build Coastguard Worker   MockB b1;
1027*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b1, DoB(1));
1028*481dde66SAndroid Build Coastguard Worker   b1.DoB(1);
1029*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1030*481dde66SAndroid Build Coastguard Worker       b1.DoB(2),
1031*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call - returning default value.\n"
1032*481dde66SAndroid Build Coastguard Worker       "    Function call: DoB(2)\n"
1033*481dde66SAndroid Build Coastguard Worker       "          Returns: 0\n"
1034*481dde66SAndroid Build Coastguard Worker       "Google Mock tried the following 1 expectation, but it didn't match:");
1035*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1036*481dde66SAndroid Build Coastguard Worker       b1.DoB(2),
1037*481dde66SAndroid Build Coastguard Worker       "  Expected arg #0: is equal to 1\n"
1038*481dde66SAndroid Build Coastguard Worker       "           Actual: 2\n"
1039*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called once\n"
1040*481dde66SAndroid Build Coastguard Worker       "           Actual: called once - saturated and active");
1041*481dde66SAndroid Build Coastguard Worker }
1042*481dde66SAndroid Build Coastguard Worker 
1043*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock explains that an retired expectation doesn't
1044*481dde66SAndroid Build Coastguard Worker // match the call.
TEST(UnexpectedCallTest,RetiredExpectation)1045*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, RetiredExpectation) {
1046*481dde66SAndroid Build Coastguard Worker   MockB b;
1047*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(1)).RetiresOnSaturation();
1048*481dde66SAndroid Build Coastguard Worker 
1049*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
1050*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(b.DoB(1),
1051*481dde66SAndroid Build Coastguard Worker                           "         Expected: the expectation is active\n"
1052*481dde66SAndroid Build Coastguard Worker                           "           Actual: it is retired");
1053*481dde66SAndroid Build Coastguard Worker }
1054*481dde66SAndroid Build Coastguard Worker 
1055*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock explains that an expectation that doesn't
1056*481dde66SAndroid Build Coastguard Worker // match the arguments doesn't match the call.
TEST(UnexpectedCallTest,UnmatchedArguments)1057*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, UnmatchedArguments) {
1058*481dde66SAndroid Build Coastguard Worker   MockB b;
1059*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(1));
1060*481dde66SAndroid Build Coastguard Worker 
1061*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(b.DoB(2),
1062*481dde66SAndroid Build Coastguard Worker                           "  Expected arg #0: is equal to 1\n"
1063*481dde66SAndroid Build Coastguard Worker                           "           Actual: 2\n");
1064*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
1065*481dde66SAndroid Build Coastguard Worker }
1066*481dde66SAndroid Build Coastguard Worker 
1067*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock explains that an expectation with
1068*481dde66SAndroid Build Coastguard Worker // unsatisfied pre-requisites doesn't match the call.
TEST(UnexpectedCallTest,UnsatisfiedPrerequisites)1069*481dde66SAndroid Build Coastguard Worker TEST(UnexpectedCallTest, UnsatisfiedPrerequisites) {
1070*481dde66SAndroid Build Coastguard Worker   Sequence s1, s2;
1071*481dde66SAndroid Build Coastguard Worker   MockB b;
1072*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(1)).InSequence(s1);
1073*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(2)).Times(AnyNumber()).InSequence(s1);
1074*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(3)).InSequence(s2);
1075*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(4)).InSequence(s1, s2);
1076*481dde66SAndroid Build Coastguard Worker 
1077*481dde66SAndroid Build Coastguard Worker   ::testing::TestPartResultArray failures;
1078*481dde66SAndroid Build Coastguard Worker   {
1079*481dde66SAndroid Build Coastguard Worker     ::testing::ScopedFakeTestPartResultReporter reporter(&failures);
1080*481dde66SAndroid Build Coastguard Worker     b.DoB(4);
1081*481dde66SAndroid Build Coastguard Worker     // Now 'failures' contains the Google Test failures generated by
1082*481dde66SAndroid Build Coastguard Worker     // the above statement.
1083*481dde66SAndroid Build Coastguard Worker   }
1084*481dde66SAndroid Build Coastguard Worker 
1085*481dde66SAndroid Build Coastguard Worker   // There should be one non-fatal failure.
1086*481dde66SAndroid Build Coastguard Worker   ASSERT_EQ(1, failures.size());
1087*481dde66SAndroid Build Coastguard Worker   const ::testing::TestPartResult& r = failures.GetTestPartResult(0);
1088*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(::testing::TestPartResult::kNonFatalFailure, r.type());
1089*481dde66SAndroid Build Coastguard Worker 
1090*481dde66SAndroid Build Coastguard Worker   // Verifies that the failure message contains the two unsatisfied
1091*481dde66SAndroid Build Coastguard Worker   // pre-requisites but not the satisfied one.
1092*481dde66SAndroid Build Coastguard Worker #ifdef GTEST_USES_POSIX_RE
1093*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(r.message(),
1094*481dde66SAndroid Build Coastguard Worker               ContainsRegex(
1095*481dde66SAndroid Build Coastguard Worker                   // POSIX RE doesn't understand the (?s) prefix, but has no
1096*481dde66SAndroid Build Coastguard Worker                   // trouble with (.|\n).
1097*481dde66SAndroid Build Coastguard Worker                   "the following immediate pre-requisites are not satisfied:\n"
1098*481dde66SAndroid Build Coastguard Worker                   "(.|\n)*: pre-requisite #0\n"
1099*481dde66SAndroid Build Coastguard Worker                   "(.|\n)*: pre-requisite #1"));
1100*481dde66SAndroid Build Coastguard Worker #else
1101*481dde66SAndroid Build Coastguard Worker   // We can only use Google Test's own simple regex.
1102*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(r.message(),
1103*481dde66SAndroid Build Coastguard Worker               ContainsRegex(
1104*481dde66SAndroid Build Coastguard Worker                   "the following immediate pre-requisites are not satisfied:"));
1105*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #0"));
1106*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(r.message(), ContainsRegex(": pre-requisite #1"));
1107*481dde66SAndroid Build Coastguard Worker #endif  // GTEST_USES_POSIX_RE
1108*481dde66SAndroid Build Coastguard Worker 
1109*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
1110*481dde66SAndroid Build Coastguard Worker   b.DoB(3);
1111*481dde66SAndroid Build Coastguard Worker   b.DoB(4);
1112*481dde66SAndroid Build Coastguard Worker }
1113*481dde66SAndroid Build Coastguard Worker 
TEST(UndefinedReturnValueTest,ReturnValueIsMandatoryWhenNotDefaultConstructible)1114*481dde66SAndroid Build Coastguard Worker TEST(UndefinedReturnValueTest,
1115*481dde66SAndroid Build Coastguard Worker      ReturnValueIsMandatoryWhenNotDefaultConstructible) {
1116*481dde66SAndroid Build Coastguard Worker   MockA a;
1117*481dde66SAndroid Build Coastguard Worker   // FIXME: We should really verify the output message,
1118*481dde66SAndroid Build Coastguard Worker   // but we cannot yet due to that EXPECT_DEATH only captures stderr
1119*481dde66SAndroid Build Coastguard Worker   // while Google Mock logs to stdout.
1120*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_EXCEPTIONS
1121*481dde66SAndroid Build Coastguard Worker   EXPECT_ANY_THROW(a.ReturnNonDefaultConstructible());
1122*481dde66SAndroid Build Coastguard Worker #else
1123*481dde66SAndroid Build Coastguard Worker   EXPECT_DEATH_IF_SUPPORTED(a.ReturnNonDefaultConstructible(), "");
1124*481dde66SAndroid Build Coastguard Worker #endif
1125*481dde66SAndroid Build Coastguard Worker }
1126*481dde66SAndroid Build Coastguard Worker 
1127*481dde66SAndroid Build Coastguard Worker // Tests that an excessive call (one whose arguments match the
1128*481dde66SAndroid Build Coastguard Worker // matchers but is called too many times) performs the default action.
TEST(ExcessiveCallTest,DoesDefaultAction)1129*481dde66SAndroid Build Coastguard Worker TEST(ExcessiveCallTest, DoesDefaultAction) {
1130*481dde66SAndroid Build Coastguard Worker   // When there is an ON_CALL() statement, the action specified by it
1131*481dde66SAndroid Build Coastguard Worker   // should be taken.
1132*481dde66SAndroid Build Coastguard Worker   MockA a;
1133*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary(_, _)).WillByDefault(Return(true));
1134*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, Binary(0, 0));
1135*481dde66SAndroid Build Coastguard Worker   a.Binary(0, 0);
1136*481dde66SAndroid Build Coastguard Worker   bool result = false;
1137*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(result = a.Binary(0, 0),
1138*481dde66SAndroid Build Coastguard Worker                           "Mock function called more times than expected");
1139*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(result);
1140*481dde66SAndroid Build Coastguard Worker 
1141*481dde66SAndroid Build Coastguard Worker   // When there is no ON_CALL(), the default value for the return type
1142*481dde66SAndroid Build Coastguard Worker   // should be returned.
1143*481dde66SAndroid Build Coastguard Worker   MockB b;
1144*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(0)).Description("DoB Method").Times(0);
1145*481dde66SAndroid Build Coastguard Worker   int n = -1;
1146*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1147*481dde66SAndroid Build Coastguard Worker       n = b.DoB(0),
1148*481dde66SAndroid Build Coastguard Worker       "Mock function \"DoB Method\" called more times than expected");
1149*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, n);
1150*481dde66SAndroid Build Coastguard Worker }
1151*481dde66SAndroid Build Coastguard Worker 
1152*481dde66SAndroid Build Coastguard Worker // Tests that when a void function is called too many times,
1153*481dde66SAndroid Build Coastguard Worker // the failure message contains the argument values.
TEST(ExcessiveCallTest,GeneratesFailureForVoidFunction)1154*481dde66SAndroid Build Coastguard Worker TEST(ExcessiveCallTest, GeneratesFailureForVoidFunction) {
1155*481dde66SAndroid Build Coastguard Worker   MockA a;
1156*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(_)).Description("DoA Method").Times(0);
1157*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1158*481dde66SAndroid Build Coastguard Worker       a.DoA(9),
1159*481dde66SAndroid Build Coastguard Worker       "Mock function \"DoA Method\" called more times than expected - "
1160*481dde66SAndroid Build Coastguard Worker       "returning directly.\n"
1161*481dde66SAndroid Build Coastguard Worker       "    Function call: DoA(9)\n"
1162*481dde66SAndroid Build Coastguard Worker       "         Expected: to be never called\n"
1163*481dde66SAndroid Build Coastguard Worker       "           Actual: called once - over-saturated and active");
1164*481dde66SAndroid Build Coastguard Worker }
1165*481dde66SAndroid Build Coastguard Worker 
1166*481dde66SAndroid Build Coastguard Worker // Tests that when a non-void function is called too many times, the
1167*481dde66SAndroid Build Coastguard Worker // failure message contains the argument values and the return value.
TEST(ExcessiveCallTest,GeneratesFailureForNonVoidFunction)1168*481dde66SAndroid Build Coastguard Worker TEST(ExcessiveCallTest, GeneratesFailureForNonVoidFunction) {
1169*481dde66SAndroid Build Coastguard Worker   MockB b;
1170*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_));
1171*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
1172*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1173*481dde66SAndroid Build Coastguard Worker       b.DoB(2),
1174*481dde66SAndroid Build Coastguard Worker       "Mock function called more times than expected - "
1175*481dde66SAndroid Build Coastguard Worker       "returning default value.\n"
1176*481dde66SAndroid Build Coastguard Worker       "    Function call: DoB(2)\n"
1177*481dde66SAndroid Build Coastguard Worker       "          Returns: 0\n"
1178*481dde66SAndroid Build Coastguard Worker       "         Expected: to be called once\n"
1179*481dde66SAndroid Build Coastguard Worker       "           Actual: called twice - over-saturated and active");
1180*481dde66SAndroid Build Coastguard Worker }
1181*481dde66SAndroid Build Coastguard Worker 
1182*481dde66SAndroid Build Coastguard Worker // Tests using sequences.
1183*481dde66SAndroid Build Coastguard Worker 
TEST(InSequenceTest,AllExpectationInScopeAreInSequence)1184*481dde66SAndroid Build Coastguard Worker TEST(InSequenceTest, AllExpectationInScopeAreInSequence) {
1185*481dde66SAndroid Build Coastguard Worker   MockA a;
1186*481dde66SAndroid Build Coastguard Worker   {
1187*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1188*481dde66SAndroid Build Coastguard Worker 
1189*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
1190*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(2));
1191*481dde66SAndroid Build Coastguard Worker   }
1192*481dde66SAndroid Build Coastguard Worker 
1193*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1194*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
1195*481dde66SAndroid Build Coastguard Worker         a.DoA(2);
1196*481dde66SAndroid Build Coastguard Worker       },
1197*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call");
1198*481dde66SAndroid Build Coastguard Worker 
1199*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1200*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1201*481dde66SAndroid Build Coastguard Worker }
1202*481dde66SAndroid Build Coastguard Worker 
TEST(InSequenceTest,NestedInSequence)1203*481dde66SAndroid Build Coastguard Worker TEST(InSequenceTest, NestedInSequence) {
1204*481dde66SAndroid Build Coastguard Worker   MockA a;
1205*481dde66SAndroid Build Coastguard Worker   {
1206*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1207*481dde66SAndroid Build Coastguard Worker 
1208*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
1209*481dde66SAndroid Build Coastguard Worker     {
1210*481dde66SAndroid Build Coastguard Worker       InSequence dummy2;
1211*481dde66SAndroid Build Coastguard Worker 
1212*481dde66SAndroid Build Coastguard Worker       EXPECT_CALL(a, DoA(2));
1213*481dde66SAndroid Build Coastguard Worker       EXPECT_CALL(a, DoA(3));
1214*481dde66SAndroid Build Coastguard Worker     }
1215*481dde66SAndroid Build Coastguard Worker   }
1216*481dde66SAndroid Build Coastguard Worker 
1217*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1218*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
1219*481dde66SAndroid Build Coastguard Worker         a.DoA(1);
1220*481dde66SAndroid Build Coastguard Worker         a.DoA(3);
1221*481dde66SAndroid Build Coastguard Worker       },
1222*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call");
1223*481dde66SAndroid Build Coastguard Worker 
1224*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1225*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1226*481dde66SAndroid Build Coastguard Worker }
1227*481dde66SAndroid Build Coastguard Worker 
TEST(InSequenceTest,ExpectationsOutOfScopeAreNotAffected)1228*481dde66SAndroid Build Coastguard Worker TEST(InSequenceTest, ExpectationsOutOfScopeAreNotAffected) {
1229*481dde66SAndroid Build Coastguard Worker   MockA a;
1230*481dde66SAndroid Build Coastguard Worker   {
1231*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1232*481dde66SAndroid Build Coastguard Worker 
1233*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
1234*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(2));
1235*481dde66SAndroid Build Coastguard Worker   }
1236*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(3));
1237*481dde66SAndroid Build Coastguard Worker 
1238*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(
1239*481dde66SAndroid Build Coastguard Worker       {  // NOLINT
1240*481dde66SAndroid Build Coastguard Worker         a.DoA(2);
1241*481dde66SAndroid Build Coastguard Worker       },
1242*481dde66SAndroid Build Coastguard Worker       "Unexpected mock function call");
1243*481dde66SAndroid Build Coastguard Worker 
1244*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1245*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1246*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1247*481dde66SAndroid Build Coastguard Worker }
1248*481dde66SAndroid Build Coastguard Worker 
1249*481dde66SAndroid Build Coastguard Worker // Tests that any order is allowed when no sequence is used.
TEST(SequenceTest,AnyOrderIsOkByDefault)1250*481dde66SAndroid Build Coastguard Worker TEST(SequenceTest, AnyOrderIsOkByDefault) {
1251*481dde66SAndroid Build Coastguard Worker   {
1252*481dde66SAndroid Build Coastguard Worker     MockA a;
1253*481dde66SAndroid Build Coastguard Worker     MockB b;
1254*481dde66SAndroid Build Coastguard Worker 
1255*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
1256*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(AnyNumber());
1257*481dde66SAndroid Build Coastguard Worker 
1258*481dde66SAndroid Build Coastguard Worker     a.DoA(1);
1259*481dde66SAndroid Build Coastguard Worker     b.DoB();
1260*481dde66SAndroid Build Coastguard Worker   }
1261*481dde66SAndroid Build Coastguard Worker 
1262*481dde66SAndroid Build Coastguard Worker   {  // NOLINT
1263*481dde66SAndroid Build Coastguard Worker     MockA a;
1264*481dde66SAndroid Build Coastguard Worker     MockB b;
1265*481dde66SAndroid Build Coastguard Worker 
1266*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(1));
1267*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b, DoB()).Times(AnyNumber());
1268*481dde66SAndroid Build Coastguard Worker 
1269*481dde66SAndroid Build Coastguard Worker     b.DoB();
1270*481dde66SAndroid Build Coastguard Worker     a.DoA(1);
1271*481dde66SAndroid Build Coastguard Worker   }
1272*481dde66SAndroid Build Coastguard Worker }
1273*481dde66SAndroid Build Coastguard Worker 
1274*481dde66SAndroid Build Coastguard Worker // Tests that the calls must be in strict order when a complete order
1275*481dde66SAndroid Build Coastguard Worker // is specified.
TEST(SequenceTest,CallsMustBeInStrictOrderWhenSaidSo1)1276*481dde66SAndroid Build Coastguard Worker TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo1) {
1277*481dde66SAndroid Build Coastguard Worker   MockA a;
1278*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, ReturnResult(_)).WillByDefault(Return(Result()));
1279*481dde66SAndroid Build Coastguard Worker 
1280*481dde66SAndroid Build Coastguard Worker   Sequence s;
1281*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(1)).InSequence(s);
1282*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(2)).InSequence(s);
1283*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(3)).InSequence(s);
1284*481dde66SAndroid Build Coastguard Worker 
1285*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(1);
1286*481dde66SAndroid Build Coastguard Worker 
1287*481dde66SAndroid Build Coastguard Worker   // May only be called after a.ReturnResult(2).
1288*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
1289*481dde66SAndroid Build Coastguard Worker 
1290*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(2);
1291*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(3);
1292*481dde66SAndroid Build Coastguard Worker }
1293*481dde66SAndroid Build Coastguard Worker 
1294*481dde66SAndroid Build Coastguard Worker // Tests that the calls must be in strict order when a complete order
1295*481dde66SAndroid Build Coastguard Worker // is specified.
TEST(SequenceTest,CallsMustBeInStrictOrderWhenSaidSo2)1296*481dde66SAndroid Build Coastguard Worker TEST(SequenceTest, CallsMustBeInStrictOrderWhenSaidSo2) {
1297*481dde66SAndroid Build Coastguard Worker   MockA a;
1298*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, ReturnResult(_)).WillByDefault(Return(Result()));
1299*481dde66SAndroid Build Coastguard Worker 
1300*481dde66SAndroid Build Coastguard Worker   Sequence s;
1301*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(1)).InSequence(s);
1302*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(2)).InSequence(s);
1303*481dde66SAndroid Build Coastguard Worker 
1304*481dde66SAndroid Build Coastguard Worker   // May only be called after a.ReturnResult(1).
1305*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.ReturnResult(2), "Unexpected mock function call");
1306*481dde66SAndroid Build Coastguard Worker 
1307*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(1);
1308*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(2);
1309*481dde66SAndroid Build Coastguard Worker }
1310*481dde66SAndroid Build Coastguard Worker 
1311*481dde66SAndroid Build Coastguard Worker // Tests specifying a DAG using multiple sequences.
1312*481dde66SAndroid Build Coastguard Worker class PartialOrderTest : public testing::Test {
1313*481dde66SAndroid Build Coastguard Worker  protected:
PartialOrderTest()1314*481dde66SAndroid Build Coastguard Worker   PartialOrderTest() {
1315*481dde66SAndroid Build Coastguard Worker     ON_CALL(a_, ReturnResult(_)).WillByDefault(Return(Result()));
1316*481dde66SAndroid Build Coastguard Worker 
1317*481dde66SAndroid Build Coastguard Worker     // Specifies this partial ordering:
1318*481dde66SAndroid Build Coastguard Worker     //
1319*481dde66SAndroid Build Coastguard Worker     // a.ReturnResult(1) ==>
1320*481dde66SAndroid Build Coastguard Worker     //                       a.ReturnResult(2) * n  ==>  a.ReturnResult(3)
1321*481dde66SAndroid Build Coastguard Worker     // b.DoB() * 2       ==>
1322*481dde66SAndroid Build Coastguard Worker     Sequence x, y;
1323*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a_, ReturnResult(1)).InSequence(x);
1324*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(b_, DoB()).Times(2).InSequence(y);
1325*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a_, ReturnResult(2)).Times(AnyNumber()).InSequence(x, y);
1326*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a_, ReturnResult(3)).InSequence(x);
1327*481dde66SAndroid Build Coastguard Worker   }
1328*481dde66SAndroid Build Coastguard Worker 
1329*481dde66SAndroid Build Coastguard Worker   MockA a_;
1330*481dde66SAndroid Build Coastguard Worker   MockB b_;
1331*481dde66SAndroid Build Coastguard Worker };
1332*481dde66SAndroid Build Coastguard Worker 
TEST_F(PartialOrderTest,CallsMustConformToSpecifiedDag1)1333*481dde66SAndroid Build Coastguard Worker TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag1) {
1334*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(1);
1335*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1336*481dde66SAndroid Build Coastguard Worker 
1337*481dde66SAndroid Build Coastguard Worker   // May only be called after the second DoB().
1338*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
1339*481dde66SAndroid Build Coastguard Worker 
1340*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1341*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(3);
1342*481dde66SAndroid Build Coastguard Worker }
1343*481dde66SAndroid Build Coastguard Worker 
TEST_F(PartialOrderTest,CallsMustConformToSpecifiedDag2)1344*481dde66SAndroid Build Coastguard Worker TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag2) {
1345*481dde66SAndroid Build Coastguard Worker   // May only be called after ReturnResult(1).
1346*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
1347*481dde66SAndroid Build Coastguard Worker 
1348*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(1);
1349*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1350*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1351*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(3);
1352*481dde66SAndroid Build Coastguard Worker }
1353*481dde66SAndroid Build Coastguard Worker 
TEST_F(PartialOrderTest,CallsMustConformToSpecifiedDag3)1354*481dde66SAndroid Build Coastguard Worker TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag3) {
1355*481dde66SAndroid Build Coastguard Worker   // May only be called last.
1356*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a_.ReturnResult(3), "Unexpected mock function call");
1357*481dde66SAndroid Build Coastguard Worker 
1358*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(1);
1359*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1360*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1361*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(3);
1362*481dde66SAndroid Build Coastguard Worker }
1363*481dde66SAndroid Build Coastguard Worker 
TEST_F(PartialOrderTest,CallsMustConformToSpecifiedDag4)1364*481dde66SAndroid Build Coastguard Worker TEST_F(PartialOrderTest, CallsMustConformToSpecifiedDag4) {
1365*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(1);
1366*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1367*481dde66SAndroid Build Coastguard Worker   b_.DoB();
1368*481dde66SAndroid Build Coastguard Worker   a_.ReturnResult(3);
1369*481dde66SAndroid Build Coastguard Worker 
1370*481dde66SAndroid Build Coastguard Worker   // May only be called before ReturnResult(3).
1371*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a_.ReturnResult(2), "Unexpected mock function call");
1372*481dde66SAndroid Build Coastguard Worker }
1373*481dde66SAndroid Build Coastguard Worker 
TEST(SequenceTest,Retirement)1374*481dde66SAndroid Build Coastguard Worker TEST(SequenceTest, Retirement) {
1375*481dde66SAndroid Build Coastguard Worker   MockA a;
1376*481dde66SAndroid Build Coastguard Worker   Sequence s;
1377*481dde66SAndroid Build Coastguard Worker 
1378*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).InSequence(s);
1379*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(_)).InSequence(s).RetiresOnSaturation();
1380*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1)).InSequence(s);
1381*481dde66SAndroid Build Coastguard Worker 
1382*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1383*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1384*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1385*481dde66SAndroid Build Coastguard Worker }
1386*481dde66SAndroid Build Coastguard Worker 
1387*481dde66SAndroid Build Coastguard Worker // Tests Expectation.
1388*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationTest,ConstrutorsWork)1389*481dde66SAndroid Build Coastguard Worker TEST(ExpectationTest, ConstrutorsWork) {
1390*481dde66SAndroid Build Coastguard Worker   MockA a;
1391*481dde66SAndroid Build Coastguard Worker   Expectation e1;  // Default ctor.
1392*481dde66SAndroid Build Coastguard Worker 
1393*481dde66SAndroid Build Coastguard Worker   // Ctor from various forms of EXPECT_CALL.
1394*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(2));
1395*481dde66SAndroid Build Coastguard Worker   Expectation e3 = EXPECT_CALL(a, DoA(3)).With(_);
1396*481dde66SAndroid Build Coastguard Worker   {
1397*481dde66SAndroid Build Coastguard Worker     Sequence s;
1398*481dde66SAndroid Build Coastguard Worker     Expectation e4 = EXPECT_CALL(a, DoA(4)).Times(1);
1399*481dde66SAndroid Build Coastguard Worker     Expectation e5 = EXPECT_CALL(a, DoA(5)).InSequence(s);
1400*481dde66SAndroid Build Coastguard Worker   }
1401*481dde66SAndroid Build Coastguard Worker   Expectation e6 = EXPECT_CALL(a, DoA(6)).After(e2);
1402*481dde66SAndroid Build Coastguard Worker   Expectation e7 = EXPECT_CALL(a, DoA(7)).WillOnce(Return());
1403*481dde66SAndroid Build Coastguard Worker   Expectation e8 = EXPECT_CALL(a, DoA(8)).WillRepeatedly(Return());
1404*481dde66SAndroid Build Coastguard Worker   Expectation e9 = EXPECT_CALL(a, DoA(9)).RetiresOnSaturation();
1405*481dde66SAndroid Build Coastguard Worker 
1406*481dde66SAndroid Build Coastguard Worker   Expectation e10 = e2;  // Copy ctor.
1407*481dde66SAndroid Build Coastguard Worker 
1408*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(e1, Ne(e2));
1409*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(e2, Eq(e10));
1410*481dde66SAndroid Build Coastguard Worker 
1411*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1412*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1413*481dde66SAndroid Build Coastguard Worker   a.DoA(4);
1414*481dde66SAndroid Build Coastguard Worker   a.DoA(5);
1415*481dde66SAndroid Build Coastguard Worker   a.DoA(6);
1416*481dde66SAndroid Build Coastguard Worker   a.DoA(7);
1417*481dde66SAndroid Build Coastguard Worker   a.DoA(8);
1418*481dde66SAndroid Build Coastguard Worker   a.DoA(9);
1419*481dde66SAndroid Build Coastguard Worker }
1420*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationTest,AssignmentWorks)1421*481dde66SAndroid Build Coastguard Worker TEST(ExpectationTest, AssignmentWorks) {
1422*481dde66SAndroid Build Coastguard Worker   MockA a;
1423*481dde66SAndroid Build Coastguard Worker   Expectation e1;
1424*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(1));
1425*481dde66SAndroid Build Coastguard Worker 
1426*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(e1, Ne(e2));
1427*481dde66SAndroid Build Coastguard Worker 
1428*481dde66SAndroid Build Coastguard Worker   e1 = e2;
1429*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(e1, Eq(e2));
1430*481dde66SAndroid Build Coastguard Worker 
1431*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1432*481dde66SAndroid Build Coastguard Worker }
1433*481dde66SAndroid Build Coastguard Worker 
1434*481dde66SAndroid Build Coastguard Worker // Tests ExpectationSet.
1435*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,MemberTypesAreCorrect)1436*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, MemberTypesAreCorrect) {
1437*481dde66SAndroid Build Coastguard Worker   ::testing::StaticAssertTypeEq<Expectation, ExpectationSet::value_type>();
1438*481dde66SAndroid Build Coastguard Worker }
1439*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,ConstructorsWork)1440*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, ConstructorsWork) {
1441*481dde66SAndroid Build Coastguard Worker   MockA a;
1442*481dde66SAndroid Build Coastguard Worker 
1443*481dde66SAndroid Build Coastguard Worker   Expectation e1;
1444*481dde66SAndroid Build Coastguard Worker   const Expectation e2;
1445*481dde66SAndroid Build Coastguard Worker   ExpectationSet es1;                           // Default ctor.
1446*481dde66SAndroid Build Coastguard Worker   ExpectationSet es2 = EXPECT_CALL(a, DoA(1));  // Ctor from EXPECT_CALL.
1447*481dde66SAndroid Build Coastguard Worker   ExpectationSet es3 = e1;                      // Ctor from Expectation.
1448*481dde66SAndroid Build Coastguard Worker   ExpectationSet es4(e1);    // Ctor from Expectation; alternative syntax.
1449*481dde66SAndroid Build Coastguard Worker   ExpectationSet es5 = e2;   // Ctor from const Expectation.
1450*481dde66SAndroid Build Coastguard Worker   ExpectationSet es6(e2);    // Ctor from const Expectation; alternative syntax.
1451*481dde66SAndroid Build Coastguard Worker   ExpectationSet es7 = es2;  // Copy ctor.
1452*481dde66SAndroid Build Coastguard Worker 
1453*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, es1.size());
1454*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es2.size());
1455*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es3.size());
1456*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es4.size());
1457*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es5.size());
1458*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es6.size());
1459*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es7.size());
1460*481dde66SAndroid Build Coastguard Worker 
1461*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es3, Ne(es2));
1462*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es4, Eq(es3));
1463*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es5, Eq(es4));
1464*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es6, Eq(es5));
1465*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es7, Eq(es2));
1466*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1467*481dde66SAndroid Build Coastguard Worker }
1468*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,AssignmentWorks)1469*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, AssignmentWorks) {
1470*481dde66SAndroid Build Coastguard Worker   ExpectationSet es1;
1471*481dde66SAndroid Build Coastguard Worker   ExpectationSet es2 = Expectation();
1472*481dde66SAndroid Build Coastguard Worker 
1473*481dde66SAndroid Build Coastguard Worker   es1 = es2;
1474*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es1.size());
1475*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(*(es1.begin()), Eq(Expectation()));
1476*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(es1, Eq(es2));
1477*481dde66SAndroid Build Coastguard Worker }
1478*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,InsertionWorks)1479*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, InsertionWorks) {
1480*481dde66SAndroid Build Coastguard Worker   ExpectationSet es1;
1481*481dde66SAndroid Build Coastguard Worker   Expectation e1;
1482*481dde66SAndroid Build Coastguard Worker   es1 += e1;
1483*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es1.size());
1484*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(*(es1.begin()), Eq(e1));
1485*481dde66SAndroid Build Coastguard Worker 
1486*481dde66SAndroid Build Coastguard Worker   MockA a;
1487*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(1));
1488*481dde66SAndroid Build Coastguard Worker   es1 += e2;
1489*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, es1.size());
1490*481dde66SAndroid Build Coastguard Worker 
1491*481dde66SAndroid Build Coastguard Worker   ExpectationSet::const_iterator it1 = es1.begin();
1492*481dde66SAndroid Build Coastguard Worker   ExpectationSet::const_iterator it2 = it1;
1493*481dde66SAndroid Build Coastguard Worker   ++it2;
1494*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(*it1 == e1 || *it2 == e1);  // e1 must be in the set.
1495*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(*it1 == e2 || *it2 == e2);  // e2 must be in the set too.
1496*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1497*481dde66SAndroid Build Coastguard Worker }
1498*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,SizeWorks)1499*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, SizeWorks) {
1500*481dde66SAndroid Build Coastguard Worker   ExpectationSet es;
1501*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, es.size());
1502*481dde66SAndroid Build Coastguard Worker 
1503*481dde66SAndroid Build Coastguard Worker   es += Expectation();
1504*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, es.size());
1505*481dde66SAndroid Build Coastguard Worker 
1506*481dde66SAndroid Build Coastguard Worker   MockA a;
1507*481dde66SAndroid Build Coastguard Worker   es += EXPECT_CALL(a, DoA(1));
1508*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, es.size());
1509*481dde66SAndroid Build Coastguard Worker 
1510*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1511*481dde66SAndroid Build Coastguard Worker }
1512*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationSetTest,IsEnumerable)1513*481dde66SAndroid Build Coastguard Worker TEST(ExpectationSetTest, IsEnumerable) {
1514*481dde66SAndroid Build Coastguard Worker   ExpectationSet es;
1515*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(es.begin() == es.end());
1516*481dde66SAndroid Build Coastguard Worker 
1517*481dde66SAndroid Build Coastguard Worker   es += Expectation();
1518*481dde66SAndroid Build Coastguard Worker   ExpectationSet::const_iterator it = es.begin();
1519*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(it != es.end());
1520*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(*it, Eq(Expectation()));
1521*481dde66SAndroid Build Coastguard Worker   ++it;
1522*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(it == es.end());
1523*481dde66SAndroid Build Coastguard Worker }
1524*481dde66SAndroid Build Coastguard Worker 
1525*481dde66SAndroid Build Coastguard Worker // Tests the .After() clause.
1526*481dde66SAndroid Build Coastguard Worker 
TEST(AfterTest,SucceedsWhenPartialOrderIsSatisfied)1527*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, SucceedsWhenPartialOrderIsSatisfied) {
1528*481dde66SAndroid Build Coastguard Worker   MockA a;
1529*481dde66SAndroid Build Coastguard Worker   ExpectationSet es;
1530*481dde66SAndroid Build Coastguard Worker   es += EXPECT_CALL(a, DoA(1));
1531*481dde66SAndroid Build Coastguard Worker   es += EXPECT_CALL(a, DoA(2));
1532*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(3)).After(es);
1533*481dde66SAndroid Build Coastguard Worker 
1534*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1535*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1536*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1537*481dde66SAndroid Build Coastguard Worker }
1538*481dde66SAndroid Build Coastguard Worker 
TEST(AfterTest,SucceedsWhenTotalOrderIsSatisfied)1539*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, SucceedsWhenTotalOrderIsSatisfied) {
1540*481dde66SAndroid Build Coastguard Worker   MockA a;
1541*481dde66SAndroid Build Coastguard Worker   MockB b;
1542*481dde66SAndroid Build Coastguard Worker   // The following also verifies that const Expectation objects work
1543*481dde66SAndroid Build Coastguard Worker   // too.  Do not remove the const modifiers.
1544*481dde66SAndroid Build Coastguard Worker   const Expectation e1 = EXPECT_CALL(a, DoA(1));
1545*481dde66SAndroid Build Coastguard Worker   const Expectation e2 = EXPECT_CALL(b, DoB()).Times(2).After(e1);
1546*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).After(e2);
1547*481dde66SAndroid Build Coastguard Worker 
1548*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1549*481dde66SAndroid Build Coastguard Worker   b.DoB();
1550*481dde66SAndroid Build Coastguard Worker   b.DoB();
1551*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1552*481dde66SAndroid Build Coastguard Worker }
1553*481dde66SAndroid Build Coastguard Worker 
1554*481dde66SAndroid Build Coastguard Worker // Calls must be in strict order when specified so using .After().
TEST(AfterTest,CallsMustBeInStrictOrderWhenSpecifiedSo1)1555*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo1) {
1556*481dde66SAndroid Build Coastguard Worker   MockA a;
1557*481dde66SAndroid Build Coastguard Worker   MockB b;
1558*481dde66SAndroid Build Coastguard Worker 
1559*481dde66SAndroid Build Coastguard Worker   // Define ordering:
1560*481dde66SAndroid Build Coastguard Worker   //   a.DoA(1) ==> b.DoB() ==> a.DoA(2)
1561*481dde66SAndroid Build Coastguard Worker   Expectation e1 = EXPECT_CALL(a, DoA(1));
1562*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(b, DoB()).After(e1);
1563*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).After(e2);
1564*481dde66SAndroid Build Coastguard Worker 
1565*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1566*481dde66SAndroid Build Coastguard Worker 
1567*481dde66SAndroid Build Coastguard Worker   // May only be called after DoB().
1568*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call");
1569*481dde66SAndroid Build Coastguard Worker 
1570*481dde66SAndroid Build Coastguard Worker   b.DoB();
1571*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1572*481dde66SAndroid Build Coastguard Worker }
1573*481dde66SAndroid Build Coastguard Worker 
1574*481dde66SAndroid Build Coastguard Worker // Calls must be in strict order when specified so using .After().
TEST(AfterTest,CallsMustBeInStrictOrderWhenSpecifiedSo2)1575*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CallsMustBeInStrictOrderWhenSpecifiedSo2) {
1576*481dde66SAndroid Build Coastguard Worker   MockA a;
1577*481dde66SAndroid Build Coastguard Worker   MockB b;
1578*481dde66SAndroid Build Coastguard Worker 
1579*481dde66SAndroid Build Coastguard Worker   // Define ordering:
1580*481dde66SAndroid Build Coastguard Worker   //   a.DoA(1) ==> b.DoB() * 2 ==> a.DoA(2)
1581*481dde66SAndroid Build Coastguard Worker   Expectation e1 = EXPECT_CALL(a, DoA(1));
1582*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(b, DoB()).Times(2).After(e1);
1583*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).After(e2);
1584*481dde66SAndroid Build Coastguard Worker 
1585*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1586*481dde66SAndroid Build Coastguard Worker   b.DoB();
1587*481dde66SAndroid Build Coastguard Worker 
1588*481dde66SAndroid Build Coastguard Worker   // May only be called after the second DoB().
1589*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.DoA(2), "Unexpected mock function call");
1590*481dde66SAndroid Build Coastguard Worker 
1591*481dde66SAndroid Build Coastguard Worker   b.DoB();
1592*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1593*481dde66SAndroid Build Coastguard Worker }
1594*481dde66SAndroid Build Coastguard Worker 
1595*481dde66SAndroid Build Coastguard Worker // Calls must satisfy the partial order when specified so.
TEST(AfterTest,CallsMustSatisfyPartialOrderWhenSpecifiedSo)1596*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo) {
1597*481dde66SAndroid Build Coastguard Worker   MockA a;
1598*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, ReturnResult(_)).WillByDefault(Return(Result()));
1599*481dde66SAndroid Build Coastguard Worker 
1600*481dde66SAndroid Build Coastguard Worker   // Define ordering:
1601*481dde66SAndroid Build Coastguard Worker   //   a.DoA(1) ==>
1602*481dde66SAndroid Build Coastguard Worker   //   a.DoA(2) ==> a.ReturnResult(3)
1603*481dde66SAndroid Build Coastguard Worker   Expectation e = EXPECT_CALL(a, DoA(1));
1604*481dde66SAndroid Build Coastguard Worker   const ExpectationSet es = EXPECT_CALL(a, DoA(2));
1605*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(3)).After(e, es);
1606*481dde66SAndroid Build Coastguard Worker 
1607*481dde66SAndroid Build Coastguard Worker   // May only be called last.
1608*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
1609*481dde66SAndroid Build Coastguard Worker 
1610*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1611*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1612*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(3);
1613*481dde66SAndroid Build Coastguard Worker }
1614*481dde66SAndroid Build Coastguard Worker 
1615*481dde66SAndroid Build Coastguard Worker // Calls must satisfy the partial order when specified so.
TEST(AfterTest,CallsMustSatisfyPartialOrderWhenSpecifiedSo2)1616*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CallsMustSatisfyPartialOrderWhenSpecifiedSo2) {
1617*481dde66SAndroid Build Coastguard Worker   MockA a;
1618*481dde66SAndroid Build Coastguard Worker 
1619*481dde66SAndroid Build Coastguard Worker   // Define ordering:
1620*481dde66SAndroid Build Coastguard Worker   //   a.DoA(1) ==>
1621*481dde66SAndroid Build Coastguard Worker   //   a.DoA(2) ==> a.DoA(3)
1622*481dde66SAndroid Build Coastguard Worker   Expectation e = EXPECT_CALL(a, DoA(1));
1623*481dde66SAndroid Build Coastguard Worker   const ExpectationSet es = EXPECT_CALL(a, DoA(2));
1624*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(3)).After(e, es);
1625*481dde66SAndroid Build Coastguard Worker 
1626*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1627*481dde66SAndroid Build Coastguard Worker 
1628*481dde66SAndroid Build Coastguard Worker   // May only be called last.
1629*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call");
1630*481dde66SAndroid Build Coastguard Worker 
1631*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1632*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1633*481dde66SAndroid Build Coastguard Worker }
1634*481dde66SAndroid Build Coastguard Worker 
1635*481dde66SAndroid Build Coastguard Worker // .After() can be combined with .InSequence().
TEST(AfterTest,CanBeUsedWithInSequence)1636*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CanBeUsedWithInSequence) {
1637*481dde66SAndroid Build Coastguard Worker   MockA a;
1638*481dde66SAndroid Build Coastguard Worker   Sequence s;
1639*481dde66SAndroid Build Coastguard Worker   Expectation e = EXPECT_CALL(a, DoA(1));
1640*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(2)).InSequence(s);
1641*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(3)).InSequence(s).After(e);
1642*481dde66SAndroid Build Coastguard Worker 
1643*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1644*481dde66SAndroid Build Coastguard Worker 
1645*481dde66SAndroid Build Coastguard Worker   // May only be after DoA(2).
1646*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.DoA(3), "Unexpected mock function call");
1647*481dde66SAndroid Build Coastguard Worker 
1648*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1649*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1650*481dde66SAndroid Build Coastguard Worker }
1651*481dde66SAndroid Build Coastguard Worker 
1652*481dde66SAndroid Build Coastguard Worker // .After() can be called multiple times.
TEST(AfterTest,CanBeCalledManyTimes)1653*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, CanBeCalledManyTimes) {
1654*481dde66SAndroid Build Coastguard Worker   MockA a;
1655*481dde66SAndroid Build Coastguard Worker   Expectation e1 = EXPECT_CALL(a, DoA(1));
1656*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(2));
1657*481dde66SAndroid Build Coastguard Worker   Expectation e3 = EXPECT_CALL(a, DoA(3));
1658*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(4)).After(e1).After(e2).After(e3);
1659*481dde66SAndroid Build Coastguard Worker 
1660*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1661*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1662*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1663*481dde66SAndroid Build Coastguard Worker   a.DoA(4);
1664*481dde66SAndroid Build Coastguard Worker }
1665*481dde66SAndroid Build Coastguard Worker 
1666*481dde66SAndroid Build Coastguard Worker // .After() accepts up to 5 arguments.
TEST(AfterTest,AcceptsUpToFiveArguments)1667*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, AcceptsUpToFiveArguments) {
1668*481dde66SAndroid Build Coastguard Worker   MockA a;
1669*481dde66SAndroid Build Coastguard Worker   Expectation e1 = EXPECT_CALL(a, DoA(1));
1670*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(2));
1671*481dde66SAndroid Build Coastguard Worker   Expectation e3 = EXPECT_CALL(a, DoA(3));
1672*481dde66SAndroid Build Coastguard Worker   ExpectationSet es1 = EXPECT_CALL(a, DoA(4));
1673*481dde66SAndroid Build Coastguard Worker   ExpectationSet es2 = EXPECT_CALL(a, DoA(5));
1674*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(6)).After(e1, e2, e3, es1, es2);
1675*481dde66SAndroid Build Coastguard Worker 
1676*481dde66SAndroid Build Coastguard Worker   a.DoA(5);
1677*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1678*481dde66SAndroid Build Coastguard Worker   a.DoA(4);
1679*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1680*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1681*481dde66SAndroid Build Coastguard Worker   a.DoA(6);
1682*481dde66SAndroid Build Coastguard Worker }
1683*481dde66SAndroid Build Coastguard Worker 
1684*481dde66SAndroid Build Coastguard Worker // .After() allows input to contain duplicated Expectations.
TEST(AfterTest,AcceptsDuplicatedInput)1685*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, AcceptsDuplicatedInput) {
1686*481dde66SAndroid Build Coastguard Worker   MockA a;
1687*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, ReturnResult(_)).WillByDefault(Return(Result()));
1688*481dde66SAndroid Build Coastguard Worker 
1689*481dde66SAndroid Build Coastguard Worker   // Define ordering:
1690*481dde66SAndroid Build Coastguard Worker   //   DoA(1) ==>
1691*481dde66SAndroid Build Coastguard Worker   //   DoA(2) ==> ReturnResult(3)
1692*481dde66SAndroid Build Coastguard Worker   Expectation e1 = EXPECT_CALL(a, DoA(1));
1693*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(2));
1694*481dde66SAndroid Build Coastguard Worker   ExpectationSet es;
1695*481dde66SAndroid Build Coastguard Worker   es += e1;
1696*481dde66SAndroid Build Coastguard Worker   es += e2;
1697*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, ReturnResult(3)).After(e1, e2, es, e1);
1698*481dde66SAndroid Build Coastguard Worker 
1699*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1700*481dde66SAndroid Build Coastguard Worker 
1701*481dde66SAndroid Build Coastguard Worker   // May only be after DoA(2).
1702*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a.ReturnResult(3), "Unexpected mock function call");
1703*481dde66SAndroid Build Coastguard Worker 
1704*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1705*481dde66SAndroid Build Coastguard Worker   a.ReturnResult(3);
1706*481dde66SAndroid Build Coastguard Worker }
1707*481dde66SAndroid Build Coastguard Worker 
1708*481dde66SAndroid Build Coastguard Worker // An Expectation added to an ExpectationSet after it has been used in
1709*481dde66SAndroid Build Coastguard Worker // an .After() has no effect.
TEST(AfterTest,ChangesToExpectationSetHaveNoEffectAfterwards)1710*481dde66SAndroid Build Coastguard Worker TEST(AfterTest, ChangesToExpectationSetHaveNoEffectAfterwards) {
1711*481dde66SAndroid Build Coastguard Worker   MockA a;
1712*481dde66SAndroid Build Coastguard Worker   ExpectationSet es1 = EXPECT_CALL(a, DoA(1));
1713*481dde66SAndroid Build Coastguard Worker   Expectation e2 = EXPECT_CALL(a, DoA(2));
1714*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(3)).After(es1);
1715*481dde66SAndroid Build Coastguard Worker   es1 += e2;
1716*481dde66SAndroid Build Coastguard Worker 
1717*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
1718*481dde66SAndroid Build Coastguard Worker   a.DoA(3);
1719*481dde66SAndroid Build Coastguard Worker   a.DoA(2);
1720*481dde66SAndroid Build Coastguard Worker }
1721*481dde66SAndroid Build Coastguard Worker 
1722*481dde66SAndroid Build Coastguard Worker // Tests that Google Mock correctly handles calls to mock functions
1723*481dde66SAndroid Build Coastguard Worker // after a mock object owning one of their pre-requisites has died.
1724*481dde66SAndroid Build Coastguard Worker 
1725*481dde66SAndroid Build Coastguard Worker // Tests that calls that satisfy the original spec are successful.
TEST(DeletingMockEarlyTest,Success1)1726*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, Success1) {
1727*481dde66SAndroid Build Coastguard Worker   MockB* const b1 = new MockB;
1728*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1729*481dde66SAndroid Build Coastguard Worker   MockB* const b2 = new MockB;
1730*481dde66SAndroid Build Coastguard Worker 
1731*481dde66SAndroid Build Coastguard Worker   {
1732*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1733*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b1, DoB(_)).WillOnce(Return(1));
1734*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*a, Binary(_, _))
1735*481dde66SAndroid Build Coastguard Worker         .Times(AnyNumber())
1736*481dde66SAndroid Build Coastguard Worker         .WillRepeatedly(Return(true));
1737*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b2, DoB(_)).Times(AnyNumber()).WillRepeatedly(Return(2));
1738*481dde66SAndroid Build Coastguard Worker   }
1739*481dde66SAndroid Build Coastguard Worker 
1740*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b1->DoB(1));
1741*481dde66SAndroid Build Coastguard Worker   delete b1;
1742*481dde66SAndroid Build Coastguard Worker   // a's pre-requisite has died.
1743*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(a->Binary(0, 1));
1744*481dde66SAndroid Build Coastguard Worker   delete b2;
1745*481dde66SAndroid Build Coastguard Worker   // a's successor has died.
1746*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(a->Binary(1, 2));
1747*481dde66SAndroid Build Coastguard Worker   delete a;
1748*481dde66SAndroid Build Coastguard Worker }
1749*481dde66SAndroid Build Coastguard Worker 
1750*481dde66SAndroid Build Coastguard Worker // Tests that calls that satisfy the original spec are successful.
TEST(DeletingMockEarlyTest,Success2)1751*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, Success2) {
1752*481dde66SAndroid Build Coastguard Worker   MockB* const b1 = new MockB;
1753*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1754*481dde66SAndroid Build Coastguard Worker   MockB* const b2 = new MockB;
1755*481dde66SAndroid Build Coastguard Worker 
1756*481dde66SAndroid Build Coastguard Worker   {
1757*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1758*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b1, DoB(_)).WillOnce(Return(1));
1759*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*a, Binary(_, _)).Times(AnyNumber());
1760*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b2, DoB(_)).Times(AnyNumber()).WillRepeatedly(Return(2));
1761*481dde66SAndroid Build Coastguard Worker   }
1762*481dde66SAndroid Build Coastguard Worker 
1763*481dde66SAndroid Build Coastguard Worker   delete a;  // a is trivially satisfied.
1764*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b1->DoB(1));
1765*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b2->DoB(2));
1766*481dde66SAndroid Build Coastguard Worker   delete b1;
1767*481dde66SAndroid Build Coastguard Worker   delete b2;
1768*481dde66SAndroid Build Coastguard Worker }
1769*481dde66SAndroid Build Coastguard Worker 
1770*481dde66SAndroid Build Coastguard Worker // Tests that it's OK to delete a mock object itself in its action.
1771*481dde66SAndroid Build Coastguard Worker 
1772*481dde66SAndroid Build Coastguard Worker // Suppresses warning on unreferenced formal parameter in MSVC with
1773*481dde66SAndroid Build Coastguard Worker // -W4.
1774*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_PUSH_(4100)
1775*481dde66SAndroid Build Coastguard Worker 
ACTION_P(Delete,ptr)1776*481dde66SAndroid Build Coastguard Worker ACTION_P(Delete, ptr) { delete ptr; }
1777*481dde66SAndroid Build Coastguard Worker 
1778*481dde66SAndroid Build Coastguard Worker GTEST_DISABLE_MSC_WARNINGS_POP_()  // 4100
1779*481dde66SAndroid Build Coastguard Worker 
TEST(DeletingMockEarlyTest,CanDeleteSelfInActionReturningVoid)1780*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningVoid) {
1781*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1782*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(_)).WillOnce(Delete(a));
1783*481dde66SAndroid Build Coastguard Worker   a->DoA(42);  // This will cause a to be deleted.
1784*481dde66SAndroid Build Coastguard Worker }
1785*481dde66SAndroid Build Coastguard Worker 
TEST(DeletingMockEarlyTest,CanDeleteSelfInActionReturningValue)1786*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, CanDeleteSelfInActionReturningValue) {
1787*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1788*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, ReturnResult(_)).WillOnce(DoAll(Delete(a), Return(Result())));
1789*481dde66SAndroid Build Coastguard Worker   a->ReturnResult(42);  // This will cause a to be deleted.
1790*481dde66SAndroid Build Coastguard Worker }
1791*481dde66SAndroid Build Coastguard Worker 
1792*481dde66SAndroid Build Coastguard Worker // Tests that calls that violate the original spec yield failures.
TEST(DeletingMockEarlyTest,Failure1)1793*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, Failure1) {
1794*481dde66SAndroid Build Coastguard Worker   MockB* const b1 = new MockB;
1795*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1796*481dde66SAndroid Build Coastguard Worker   MockB* const b2 = new MockB;
1797*481dde66SAndroid Build Coastguard Worker 
1798*481dde66SAndroid Build Coastguard Worker   {
1799*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1800*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b1, DoB(_)).WillOnce(Return(1));
1801*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*a, Binary(_, _)).Times(AnyNumber());
1802*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b2, DoB(_)).Times(AnyNumber()).WillRepeatedly(Return(2));
1803*481dde66SAndroid Build Coastguard Worker   }
1804*481dde66SAndroid Build Coastguard Worker 
1805*481dde66SAndroid Build Coastguard Worker   delete a;  // a is trivially satisfied.
1806*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE({ b2->DoB(2); }, "Unexpected mock function call");
1807*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b1->DoB(1));
1808*481dde66SAndroid Build Coastguard Worker   delete b1;
1809*481dde66SAndroid Build Coastguard Worker   delete b2;
1810*481dde66SAndroid Build Coastguard Worker }
1811*481dde66SAndroid Build Coastguard Worker 
1812*481dde66SAndroid Build Coastguard Worker // Tests that calls that violate the original spec yield failures.
TEST(DeletingMockEarlyTest,Failure2)1813*481dde66SAndroid Build Coastguard Worker TEST(DeletingMockEarlyTest, Failure2) {
1814*481dde66SAndroid Build Coastguard Worker   MockB* const b1 = new MockB;
1815*481dde66SAndroid Build Coastguard Worker   MockA* const a = new MockA;
1816*481dde66SAndroid Build Coastguard Worker   MockB* const b2 = new MockB;
1817*481dde66SAndroid Build Coastguard Worker 
1818*481dde66SAndroid Build Coastguard Worker   {
1819*481dde66SAndroid Build Coastguard Worker     InSequence dummy;
1820*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b1, DoB(_));
1821*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*a, Binary(_, _)).Times(AnyNumber());
1822*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(*b2, DoB(_)).Times(AnyNumber());
1823*481dde66SAndroid Build Coastguard Worker   }
1824*481dde66SAndroid Build Coastguard Worker 
1825*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(delete b1, "Actual: never called");
1826*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a->Binary(0, 1), "Unexpected mock function call");
1827*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(b2->DoB(1), "Unexpected mock function call");
1828*481dde66SAndroid Build Coastguard Worker   delete a;
1829*481dde66SAndroid Build Coastguard Worker   delete b2;
1830*481dde66SAndroid Build Coastguard Worker }
1831*481dde66SAndroid Build Coastguard Worker 
1832*481dde66SAndroid Build Coastguard Worker class EvenNumberCardinality : public CardinalityInterface {
1833*481dde66SAndroid Build Coastguard Worker  public:
1834*481dde66SAndroid Build Coastguard Worker   // Returns true if and only if call_count calls will satisfy this
1835*481dde66SAndroid Build Coastguard Worker   // cardinality.
IsSatisfiedByCallCount(int call_count) const1836*481dde66SAndroid Build Coastguard Worker   bool IsSatisfiedByCallCount(int call_count) const override {
1837*481dde66SAndroid Build Coastguard Worker     return call_count % 2 == 0;
1838*481dde66SAndroid Build Coastguard Worker   }
1839*481dde66SAndroid Build Coastguard Worker 
1840*481dde66SAndroid Build Coastguard Worker   // Returns true if and only if call_count calls will saturate this
1841*481dde66SAndroid Build Coastguard Worker   // cardinality.
IsSaturatedByCallCount(int) const1842*481dde66SAndroid Build Coastguard Worker   bool IsSaturatedByCallCount(int /* call_count */) const override {
1843*481dde66SAndroid Build Coastguard Worker     return false;
1844*481dde66SAndroid Build Coastguard Worker   }
1845*481dde66SAndroid Build Coastguard Worker 
1846*481dde66SAndroid Build Coastguard Worker   // Describes self to an ostream.
DescribeTo(::std::ostream * os) const1847*481dde66SAndroid Build Coastguard Worker   void DescribeTo(::std::ostream* os) const override {
1848*481dde66SAndroid Build Coastguard Worker     *os << "called even number of times";
1849*481dde66SAndroid Build Coastguard Worker   }
1850*481dde66SAndroid Build Coastguard Worker };
1851*481dde66SAndroid Build Coastguard Worker 
EvenNumber()1852*481dde66SAndroid Build Coastguard Worker Cardinality EvenNumber() { return Cardinality(new EvenNumberCardinality); }
1853*481dde66SAndroid Build Coastguard Worker 
TEST(ExpectationBaseTest,AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality)1854*481dde66SAndroid Build Coastguard Worker TEST(ExpectationBaseTest,
1855*481dde66SAndroid Build Coastguard Worker      AllPrerequisitesAreSatisfiedWorksForNonMonotonicCardinality) {
1856*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
1857*481dde66SAndroid Build Coastguard Worker   Sequence s;
1858*481dde66SAndroid Build Coastguard Worker 
1859*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(1)).Times(EvenNumber()).InSequence(s);
1860*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(2)).Times(AnyNumber()).InSequence(s);
1861*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(3)).Times(AnyNumber());
1862*481dde66SAndroid Build Coastguard Worker 
1863*481dde66SAndroid Build Coastguard Worker   a->DoA(3);
1864*481dde66SAndroid Build Coastguard Worker   a->DoA(1);
1865*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(a->DoA(2), "Unexpected mock function call");
1866*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(delete a, "to be called even number of times");
1867*481dde66SAndroid Build Coastguard Worker }
1868*481dde66SAndroid Build Coastguard Worker 
1869*481dde66SAndroid Build Coastguard Worker // The following tests verify the message generated when a mock
1870*481dde66SAndroid Build Coastguard Worker // function is called.
1871*481dde66SAndroid Build Coastguard Worker 
1872*481dde66SAndroid Build Coastguard Worker struct Printable {};
1873*481dde66SAndroid Build Coastguard Worker 
operator <<(::std::ostream & os,const Printable &)1874*481dde66SAndroid Build Coastguard Worker inline void operator<<(::std::ostream& os, const Printable&) {
1875*481dde66SAndroid Build Coastguard Worker   os << "Printable";
1876*481dde66SAndroid Build Coastguard Worker }
1877*481dde66SAndroid Build Coastguard Worker 
1878*481dde66SAndroid Build Coastguard Worker struct Unprintable {
Unprintabletesting::__anone188f75b0111::Unprintable1879*481dde66SAndroid Build Coastguard Worker   Unprintable() : value(0) {}
1880*481dde66SAndroid Build Coastguard Worker   int value;
1881*481dde66SAndroid Build Coastguard Worker };
1882*481dde66SAndroid Build Coastguard Worker 
1883*481dde66SAndroid Build Coastguard Worker class MockC {
1884*481dde66SAndroid Build Coastguard Worker  public:
1885*481dde66SAndroid Build Coastguard Worker   MockC() = default;
1886*481dde66SAndroid Build Coastguard Worker 
1887*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD6(VoidMethod, void(bool cond, int n, std::string s, void* p,
1888*481dde66SAndroid Build Coastguard Worker                                 const Printable& x, Unprintable y));
1889*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD0(NonVoidMethod, int());  // NOLINT
1890*481dde66SAndroid Build Coastguard Worker 
1891*481dde66SAndroid Build Coastguard Worker  private:
1892*481dde66SAndroid Build Coastguard Worker   MockC(const MockC&) = delete;
1893*481dde66SAndroid Build Coastguard Worker   MockC& operator=(const MockC&) = delete;
1894*481dde66SAndroid Build Coastguard Worker };
1895*481dde66SAndroid Build Coastguard Worker 
1896*481dde66SAndroid Build Coastguard Worker class VerboseFlagPreservingFixture : public testing::Test {
1897*481dde66SAndroid Build Coastguard Worker  protected:
VerboseFlagPreservingFixture()1898*481dde66SAndroid Build Coastguard Worker   VerboseFlagPreservingFixture()
1899*481dde66SAndroid Build Coastguard Worker       : saved_verbose_flag_(GMOCK_FLAG_GET(verbose)) {}
1900*481dde66SAndroid Build Coastguard Worker 
~VerboseFlagPreservingFixture()1901*481dde66SAndroid Build Coastguard Worker   ~VerboseFlagPreservingFixture() override {
1902*481dde66SAndroid Build Coastguard Worker     GMOCK_FLAG_SET(verbose, saved_verbose_flag_);
1903*481dde66SAndroid Build Coastguard Worker   }
1904*481dde66SAndroid Build Coastguard Worker 
1905*481dde66SAndroid Build Coastguard Worker  private:
1906*481dde66SAndroid Build Coastguard Worker   const std::string saved_verbose_flag_;
1907*481dde66SAndroid Build Coastguard Worker 
1908*481dde66SAndroid Build Coastguard Worker   VerboseFlagPreservingFixture(const VerboseFlagPreservingFixture&) = delete;
1909*481dde66SAndroid Build Coastguard Worker   VerboseFlagPreservingFixture& operator=(const VerboseFlagPreservingFixture&) =
1910*481dde66SAndroid Build Coastguard Worker       delete;
1911*481dde66SAndroid Build Coastguard Worker };
1912*481dde66SAndroid Build Coastguard Worker 
1913*481dde66SAndroid Build Coastguard Worker #if GTEST_HAS_STREAM_REDIRECTION
1914*481dde66SAndroid Build Coastguard Worker 
1915*481dde66SAndroid Build Coastguard Worker // Tests that an uninteresting mock function call on a naggy mock
1916*481dde66SAndroid Build Coastguard Worker // generates a warning without the stack trace when
1917*481dde66SAndroid Build Coastguard Worker // --gmock_verbose=warning is specified.
TEST(FunctionCallMessageTest,UninterestingCallOnNaggyMockGeneratesNoStackTraceWhenVerboseWarning)1918*481dde66SAndroid Build Coastguard Worker TEST(FunctionCallMessageTest,
1919*481dde66SAndroid Build Coastguard Worker      UninterestingCallOnNaggyMockGeneratesNoStackTraceWhenVerboseWarning) {
1920*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kWarningVerbosity);
1921*481dde66SAndroid Build Coastguard Worker   NaggyMock<MockC> c;
1922*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
1923*481dde66SAndroid Build Coastguard Worker   c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
1924*481dde66SAndroid Build Coastguard Worker   const std::string output = GetCapturedStdout();
1925*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
1926*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsNotSubstring, "Stack trace:", output);
1927*481dde66SAndroid Build Coastguard Worker }
1928*481dde66SAndroid Build Coastguard Worker 
1929*481dde66SAndroid Build Coastguard Worker // Tests that an uninteresting mock function call on a naggy mock
1930*481dde66SAndroid Build Coastguard Worker // generates a warning containing the stack trace when
1931*481dde66SAndroid Build Coastguard Worker // --gmock_verbose=info is specified.
TEST(FunctionCallMessageTest,UninterestingCallOnNaggyMockGeneratesFyiWithStackTraceWhenVerboseInfo)1932*481dde66SAndroid Build Coastguard Worker TEST(FunctionCallMessageTest,
1933*481dde66SAndroid Build Coastguard Worker      UninterestingCallOnNaggyMockGeneratesFyiWithStackTraceWhenVerboseInfo) {
1934*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kInfoVerbosity);
1935*481dde66SAndroid Build Coastguard Worker   NaggyMock<MockC> c;
1936*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
1937*481dde66SAndroid Build Coastguard Worker   c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
1938*481dde66SAndroid Build Coastguard Worker   const std::string output = GetCapturedStdout();
1939*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "GMOCK WARNING", output);
1940*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "Stack trace:", output);
1941*481dde66SAndroid Build Coastguard Worker 
1942*481dde66SAndroid Build Coastguard Worker #ifndef NDEBUG
1943*481dde66SAndroid Build Coastguard Worker 
1944*481dde66SAndroid Build Coastguard Worker   // We check the stack trace content in dbg-mode only, as opt-mode
1945*481dde66SAndroid Build Coastguard Worker   // may inline the call we are interested in seeing.
1946*481dde66SAndroid Build Coastguard Worker 
1947*481dde66SAndroid Build Coastguard Worker   // Verifies that a void mock function's name appears in the stack
1948*481dde66SAndroid Build Coastguard Worker   // trace.
1949*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "VoidMethod(", output);
1950*481dde66SAndroid Build Coastguard Worker 
1951*481dde66SAndroid Build Coastguard Worker   // Verifies that a non-void mock function's name appears in the
1952*481dde66SAndroid Build Coastguard Worker   // stack trace.
1953*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
1954*481dde66SAndroid Build Coastguard Worker   c.NonVoidMethod();
1955*481dde66SAndroid Build Coastguard Worker   const std::string output2 = GetCapturedStdout();
1956*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(IsSubstring, "NonVoidMethod(", output2);
1957*481dde66SAndroid Build Coastguard Worker 
1958*481dde66SAndroid Build Coastguard Worker #endif  // NDEBUG
1959*481dde66SAndroid Build Coastguard Worker }
1960*481dde66SAndroid Build Coastguard Worker 
1961*481dde66SAndroid Build Coastguard Worker // Tests that an uninteresting mock function call on a naggy mock
1962*481dde66SAndroid Build Coastguard Worker // causes the function arguments and return value to be printed.
TEST(FunctionCallMessageTest,UninterestingCallOnNaggyMockPrintsArgumentsAndReturnValue)1963*481dde66SAndroid Build Coastguard Worker TEST(FunctionCallMessageTest,
1964*481dde66SAndroid Build Coastguard Worker      UninterestingCallOnNaggyMockPrintsArgumentsAndReturnValue) {
1965*481dde66SAndroid Build Coastguard Worker   // A non-void mock function.
1966*481dde66SAndroid Build Coastguard Worker   NaggyMock<MockB> b;
1967*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
1968*481dde66SAndroid Build Coastguard Worker   b.DoB();
1969*481dde66SAndroid Build Coastguard Worker   const std::string output1 = GetCapturedStdout();
1970*481dde66SAndroid Build Coastguard Worker   EXPECT_PRED_FORMAT2(
1971*481dde66SAndroid Build Coastguard Worker       IsSubstring,
1972*481dde66SAndroid Build Coastguard Worker       "Uninteresting mock function call - returning default value.\n"
1973*481dde66SAndroid Build Coastguard Worker       "    Function call: DoB()\n"
1974*481dde66SAndroid Build Coastguard Worker       "          Returns: 0\n",
1975*481dde66SAndroid Build Coastguard Worker       output1.c_str());
1976*481dde66SAndroid Build Coastguard Worker   // Makes sure the return value is printed.
1977*481dde66SAndroid Build Coastguard Worker 
1978*481dde66SAndroid Build Coastguard Worker   // A void mock function.
1979*481dde66SAndroid Build Coastguard Worker   NaggyMock<MockC> c;
1980*481dde66SAndroid Build Coastguard Worker   CaptureStdout();
1981*481dde66SAndroid Build Coastguard Worker   c.VoidMethod(false, 5, "Hi", nullptr, Printable(), Unprintable());
1982*481dde66SAndroid Build Coastguard Worker   const std::string output2 = GetCapturedStdout();
1983*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(
1984*481dde66SAndroid Build Coastguard Worker       output2.c_str(),
1985*481dde66SAndroid Build Coastguard Worker       ContainsRegex("Uninteresting mock function call - returning directly\\.\n"
1986*481dde66SAndroid Build Coastguard Worker                     "    Function call: VoidMethod"
1987*481dde66SAndroid Build Coastguard Worker                     "\\(false, 5, \"Hi\", NULL, @.+ "
1988*481dde66SAndroid Build Coastguard Worker                     "Printable, 4-byte object <00-00 00-00>\\)"));
1989*481dde66SAndroid Build Coastguard Worker   // A void function has no return value to print.
1990*481dde66SAndroid Build Coastguard Worker }
1991*481dde66SAndroid Build Coastguard Worker 
1992*481dde66SAndroid Build Coastguard Worker // Tests how the --gmock_verbose flag affects Google Mock's output.
1993*481dde66SAndroid Build Coastguard Worker 
1994*481dde66SAndroid Build Coastguard Worker class GMockVerboseFlagTest : public VerboseFlagPreservingFixture {
1995*481dde66SAndroid Build Coastguard Worker  public:
1996*481dde66SAndroid Build Coastguard Worker   // Verifies that the given Google Mock output is correct.  (When
1997*481dde66SAndroid Build Coastguard Worker   // should_print is true, the output should match the given regex and
1998*481dde66SAndroid Build Coastguard Worker   // contain the given function name in the stack trace.  When it's
1999*481dde66SAndroid Build Coastguard Worker   // false, the output should be empty.)
VerifyOutput(const std::string & output,bool should_print,const std::string & expected_substring,const std::string & function_name)2000*481dde66SAndroid Build Coastguard Worker   void VerifyOutput(const std::string& output, bool should_print,
2001*481dde66SAndroid Build Coastguard Worker                     const std::string& expected_substring,
2002*481dde66SAndroid Build Coastguard Worker                     const std::string& function_name) {
2003*481dde66SAndroid Build Coastguard Worker     if (should_print) {
2004*481dde66SAndroid Build Coastguard Worker       EXPECT_THAT(output.c_str(), HasSubstr(expected_substring));
2005*481dde66SAndroid Build Coastguard Worker #ifndef NDEBUG
2006*481dde66SAndroid Build Coastguard Worker       // We check the stack trace content in dbg-mode only, as opt-mode
2007*481dde66SAndroid Build Coastguard Worker       // may inline the call we are interested in seeing.
2008*481dde66SAndroid Build Coastguard Worker       EXPECT_THAT(output.c_str(), HasSubstr(function_name));
2009*481dde66SAndroid Build Coastguard Worker #else
2010*481dde66SAndroid Build Coastguard Worker       // Suppresses 'unused function parameter' warnings.
2011*481dde66SAndroid Build Coastguard Worker       static_cast<void>(function_name);
2012*481dde66SAndroid Build Coastguard Worker #endif  // NDEBUG
2013*481dde66SAndroid Build Coastguard Worker     } else {
2014*481dde66SAndroid Build Coastguard Worker       EXPECT_STREQ("", output.c_str());
2015*481dde66SAndroid Build Coastguard Worker     }
2016*481dde66SAndroid Build Coastguard Worker   }
2017*481dde66SAndroid Build Coastguard Worker 
2018*481dde66SAndroid Build Coastguard Worker   // Tests how the flag affects expected calls.
TestExpectedCall(bool should_print)2019*481dde66SAndroid Build Coastguard Worker   void TestExpectedCall(bool should_print) {
2020*481dde66SAndroid Build Coastguard Worker     MockA a;
2021*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, DoA(5));
2022*481dde66SAndroid Build Coastguard Worker     EXPECT_CALL(a, Binary(_, 1)).WillOnce(Return(true));
2023*481dde66SAndroid Build Coastguard Worker 
2024*481dde66SAndroid Build Coastguard Worker     // A void-returning function.
2025*481dde66SAndroid Build Coastguard Worker     CaptureStdout();
2026*481dde66SAndroid Build Coastguard Worker     a.DoA(5);
2027*481dde66SAndroid Build Coastguard Worker     VerifyOutput(GetCapturedStdout(), should_print,
2028*481dde66SAndroid Build Coastguard Worker                  "Mock function call matches EXPECT_CALL(a, DoA(5))...\n"
2029*481dde66SAndroid Build Coastguard Worker                  "    Function call: DoA(5)\n"
2030*481dde66SAndroid Build Coastguard Worker                  "Stack trace:\n",
2031*481dde66SAndroid Build Coastguard Worker                  "DoA");
2032*481dde66SAndroid Build Coastguard Worker 
2033*481dde66SAndroid Build Coastguard Worker     // A non-void-returning function.
2034*481dde66SAndroid Build Coastguard Worker     CaptureStdout();
2035*481dde66SAndroid Build Coastguard Worker     a.Binary(2, 1);
2036*481dde66SAndroid Build Coastguard Worker     VerifyOutput(GetCapturedStdout(), should_print,
2037*481dde66SAndroid Build Coastguard Worker                  "Mock function call matches EXPECT_CALL(a, Binary(_, 1))...\n"
2038*481dde66SAndroid Build Coastguard Worker                  "    Function call: Binary(2, 1)\n"
2039*481dde66SAndroid Build Coastguard Worker                  "          Returns: true\n"
2040*481dde66SAndroid Build Coastguard Worker                  "Stack trace:\n",
2041*481dde66SAndroid Build Coastguard Worker                  "Binary");
2042*481dde66SAndroid Build Coastguard Worker   }
2043*481dde66SAndroid Build Coastguard Worker 
2044*481dde66SAndroid Build Coastguard Worker   // Tests how the flag affects uninteresting calls on a naggy mock.
TestUninterestingCallOnNaggyMock(bool should_print)2045*481dde66SAndroid Build Coastguard Worker   void TestUninterestingCallOnNaggyMock(bool should_print) {
2046*481dde66SAndroid Build Coastguard Worker     NaggyMock<MockA> a;
2047*481dde66SAndroid Build Coastguard Worker     const std::string note =
2048*481dde66SAndroid Build Coastguard Worker         "NOTE: You can safely ignore the above warning unless this "
2049*481dde66SAndroid Build Coastguard Worker         "call should not happen.  Do not suppress it by blindly adding "
2050*481dde66SAndroid Build Coastguard Worker         "an EXPECT_CALL() if you don't mean to enforce the call.  "
2051*481dde66SAndroid Build Coastguard Worker         "See "
2052*481dde66SAndroid Build Coastguard Worker         "https://github.com/google/googletest/blob/main/docs/"
2053*481dde66SAndroid Build Coastguard Worker         "gmock_cook_book.md#"
2054*481dde66SAndroid Build Coastguard Worker         "knowing-when-to-expect-useoncall for details.";
2055*481dde66SAndroid Build Coastguard Worker 
2056*481dde66SAndroid Build Coastguard Worker     // A void-returning function.
2057*481dde66SAndroid Build Coastguard Worker     CaptureStdout();
2058*481dde66SAndroid Build Coastguard Worker     a.DoA(5);
2059*481dde66SAndroid Build Coastguard Worker     VerifyOutput(GetCapturedStdout(), should_print,
2060*481dde66SAndroid Build Coastguard Worker                  "\nGMOCK WARNING:\n"
2061*481dde66SAndroid Build Coastguard Worker                  "Uninteresting mock function call - returning directly.\n"
2062*481dde66SAndroid Build Coastguard Worker                  "    Function call: DoA(5)\n" +
2063*481dde66SAndroid Build Coastguard Worker                      note,
2064*481dde66SAndroid Build Coastguard Worker                  "DoA");
2065*481dde66SAndroid Build Coastguard Worker 
2066*481dde66SAndroid Build Coastguard Worker     // A non-void-returning function.
2067*481dde66SAndroid Build Coastguard Worker     CaptureStdout();
2068*481dde66SAndroid Build Coastguard Worker     a.Binary(2, 1);
2069*481dde66SAndroid Build Coastguard Worker     VerifyOutput(GetCapturedStdout(), should_print,
2070*481dde66SAndroid Build Coastguard Worker                  "\nGMOCK WARNING:\n"
2071*481dde66SAndroid Build Coastguard Worker                  "Uninteresting mock function call - returning default value.\n"
2072*481dde66SAndroid Build Coastguard Worker                  "    Function call: Binary(2, 1)\n"
2073*481dde66SAndroid Build Coastguard Worker                  "          Returns: false\n" +
2074*481dde66SAndroid Build Coastguard Worker                      note,
2075*481dde66SAndroid Build Coastguard Worker                  "Binary");
2076*481dde66SAndroid Build Coastguard Worker   }
2077*481dde66SAndroid Build Coastguard Worker };
2078*481dde66SAndroid Build Coastguard Worker 
2079*481dde66SAndroid Build Coastguard Worker // Tests that --gmock_verbose=info causes both expected and
2080*481dde66SAndroid Build Coastguard Worker // uninteresting calls to be reported.
TEST_F(GMockVerboseFlagTest,Info)2081*481dde66SAndroid Build Coastguard Worker TEST_F(GMockVerboseFlagTest, Info) {
2082*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kInfoVerbosity);
2083*481dde66SAndroid Build Coastguard Worker   TestExpectedCall(true);
2084*481dde66SAndroid Build Coastguard Worker   TestUninterestingCallOnNaggyMock(true);
2085*481dde66SAndroid Build Coastguard Worker }
2086*481dde66SAndroid Build Coastguard Worker 
2087*481dde66SAndroid Build Coastguard Worker // Tests that --gmock_verbose=warning causes uninteresting calls to be
2088*481dde66SAndroid Build Coastguard Worker // reported.
TEST_F(GMockVerboseFlagTest,Warning)2089*481dde66SAndroid Build Coastguard Worker TEST_F(GMockVerboseFlagTest, Warning) {
2090*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kWarningVerbosity);
2091*481dde66SAndroid Build Coastguard Worker   TestExpectedCall(false);
2092*481dde66SAndroid Build Coastguard Worker   TestUninterestingCallOnNaggyMock(true);
2093*481dde66SAndroid Build Coastguard Worker }
2094*481dde66SAndroid Build Coastguard Worker 
2095*481dde66SAndroid Build Coastguard Worker // Tests that --gmock_verbose=warning causes neither expected nor
2096*481dde66SAndroid Build Coastguard Worker // uninteresting calls to be reported.
TEST_F(GMockVerboseFlagTest,Error)2097*481dde66SAndroid Build Coastguard Worker TEST_F(GMockVerboseFlagTest, Error) {
2098*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kErrorVerbosity);
2099*481dde66SAndroid Build Coastguard Worker   TestExpectedCall(false);
2100*481dde66SAndroid Build Coastguard Worker   TestUninterestingCallOnNaggyMock(false);
2101*481dde66SAndroid Build Coastguard Worker }
2102*481dde66SAndroid Build Coastguard Worker 
2103*481dde66SAndroid Build Coastguard Worker // Tests that --gmock_verbose=SOME_INVALID_VALUE has the same effect
2104*481dde66SAndroid Build Coastguard Worker // as --gmock_verbose=warning.
TEST_F(GMockVerboseFlagTest,InvalidFlagIsTreatedAsWarning)2105*481dde66SAndroid Build Coastguard Worker TEST_F(GMockVerboseFlagTest, InvalidFlagIsTreatedAsWarning) {
2106*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, "invalid");  // Treated as "warning".
2107*481dde66SAndroid Build Coastguard Worker   TestExpectedCall(false);
2108*481dde66SAndroid Build Coastguard Worker   TestUninterestingCallOnNaggyMock(true);
2109*481dde66SAndroid Build Coastguard Worker }
2110*481dde66SAndroid Build Coastguard Worker 
2111*481dde66SAndroid Build Coastguard Worker #endif  // GTEST_HAS_STREAM_REDIRECTION
2112*481dde66SAndroid Build Coastguard Worker 
2113*481dde66SAndroid Build Coastguard Worker // A helper class that generates a failure when printed.  We use it to
2114*481dde66SAndroid Build Coastguard Worker // ensure that Google Mock doesn't print a value (even to an internal
2115*481dde66SAndroid Build Coastguard Worker // buffer) when it is not supposed to do so.
2116*481dde66SAndroid Build Coastguard Worker class PrintMeNot {};
2117*481dde66SAndroid Build Coastguard Worker 
PrintTo(PrintMeNot,::std::ostream *)2118*481dde66SAndroid Build Coastguard Worker void PrintTo(PrintMeNot /* dummy */, ::std::ostream* /* os */) {
2119*481dde66SAndroid Build Coastguard Worker   ADD_FAILURE() << "Google Mock is printing a value that shouldn't be "
2120*481dde66SAndroid Build Coastguard Worker                 << "printed even to an internal buffer.";
2121*481dde66SAndroid Build Coastguard Worker }
2122*481dde66SAndroid Build Coastguard Worker 
2123*481dde66SAndroid Build Coastguard Worker class LogTestHelper {
2124*481dde66SAndroid Build Coastguard Worker  public:
2125*481dde66SAndroid Build Coastguard Worker   LogTestHelper() = default;
2126*481dde66SAndroid Build Coastguard Worker 
2127*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(Foo, PrintMeNot(PrintMeNot));
2128*481dde66SAndroid Build Coastguard Worker 
2129*481dde66SAndroid Build Coastguard Worker  private:
2130*481dde66SAndroid Build Coastguard Worker   LogTestHelper(const LogTestHelper&) = delete;
2131*481dde66SAndroid Build Coastguard Worker   LogTestHelper& operator=(const LogTestHelper&) = delete;
2132*481dde66SAndroid Build Coastguard Worker };
2133*481dde66SAndroid Build Coastguard Worker 
2134*481dde66SAndroid Build Coastguard Worker class GMockLogTest : public VerboseFlagPreservingFixture {
2135*481dde66SAndroid Build Coastguard Worker  protected:
2136*481dde66SAndroid Build Coastguard Worker   LogTestHelper helper_;
2137*481dde66SAndroid Build Coastguard Worker };
2138*481dde66SAndroid Build Coastguard Worker 
TEST_F(GMockLogTest,DoesNotPrintGoodCallInternallyIfVerbosityIsWarning)2139*481dde66SAndroid Build Coastguard Worker TEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsWarning) {
2140*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kWarningVerbosity);
2141*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(helper_, Foo(_)).WillOnce(Return(PrintMeNot()));
2142*481dde66SAndroid Build Coastguard Worker   helper_.Foo(PrintMeNot());  // This is an expected call.
2143*481dde66SAndroid Build Coastguard Worker }
2144*481dde66SAndroid Build Coastguard Worker 
TEST_F(GMockLogTest,DoesNotPrintGoodCallInternallyIfVerbosityIsError)2145*481dde66SAndroid Build Coastguard Worker TEST_F(GMockLogTest, DoesNotPrintGoodCallInternallyIfVerbosityIsError) {
2146*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kErrorVerbosity);
2147*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(helper_, Foo(_)).WillOnce(Return(PrintMeNot()));
2148*481dde66SAndroid Build Coastguard Worker   helper_.Foo(PrintMeNot());  // This is an expected call.
2149*481dde66SAndroid Build Coastguard Worker }
2150*481dde66SAndroid Build Coastguard Worker 
TEST_F(GMockLogTest,DoesNotPrintWarningInternallyIfVerbosityIsError)2151*481dde66SAndroid Build Coastguard Worker TEST_F(GMockLogTest, DoesNotPrintWarningInternallyIfVerbosityIsError) {
2152*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, kErrorVerbosity);
2153*481dde66SAndroid Build Coastguard Worker   ON_CALL(helper_, Foo(_)).WillByDefault(Return(PrintMeNot()));
2154*481dde66SAndroid Build Coastguard Worker   helper_.Foo(PrintMeNot());  // This should generate a warning.
2155*481dde66SAndroid Build Coastguard Worker }
2156*481dde66SAndroid Build Coastguard Worker 
2157*481dde66SAndroid Build Coastguard Worker // Tests Mock::AllowLeak().
2158*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,AllowsLeakingUnusedMockObject)2159*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, AllowsLeakingUnusedMockObject) {
2160*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2161*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2162*481dde66SAndroid Build Coastguard Worker }
2163*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,CanBeCalledBeforeOnCall)2164*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, CanBeCalledBeforeOnCall) {
2165*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2166*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2167*481dde66SAndroid Build Coastguard Worker   ON_CALL(*a, DoA(_)).WillByDefault(Return());
2168*481dde66SAndroid Build Coastguard Worker   a->DoA(0);
2169*481dde66SAndroid Build Coastguard Worker }
2170*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,CanBeCalledAfterOnCall)2171*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, CanBeCalledAfterOnCall) {
2172*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2173*481dde66SAndroid Build Coastguard Worker   ON_CALL(*a, DoA(_)).WillByDefault(Return());
2174*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2175*481dde66SAndroid Build Coastguard Worker }
2176*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,CanBeCalledBeforeExpectCall)2177*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, CanBeCalledBeforeExpectCall) {
2178*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2179*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2180*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(_));
2181*481dde66SAndroid Build Coastguard Worker   a->DoA(0);
2182*481dde66SAndroid Build Coastguard Worker }
2183*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,CanBeCalledAfterExpectCall)2184*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, CanBeCalledAfterExpectCall) {
2185*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2186*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
2187*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2188*481dde66SAndroid Build Coastguard Worker }
2189*481dde66SAndroid Build Coastguard Worker 
TEST(AllowLeakTest,WorksWhenBothOnCallAndExpectCallArePresent)2190*481dde66SAndroid Build Coastguard Worker TEST(AllowLeakTest, WorksWhenBothOnCallAndExpectCallArePresent) {
2191*481dde66SAndroid Build Coastguard Worker   MockA* a = new MockA;
2192*481dde66SAndroid Build Coastguard Worker   ON_CALL(*a, DoA(_)).WillByDefault(Return());
2193*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(*a, DoA(_)).Times(AnyNumber());
2194*481dde66SAndroid Build Coastguard Worker   Mock::AllowLeak(a);
2195*481dde66SAndroid Build Coastguard Worker }
2196*481dde66SAndroid Build Coastguard Worker 
2197*481dde66SAndroid Build Coastguard Worker // Tests that we can verify and clear a mock object's expectations
2198*481dde66SAndroid Build Coastguard Worker // when none of its methods has expectations.
TEST(VerifyAndClearExpectationsTest,NoMethodHasExpectations)2199*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, NoMethodHasExpectations) {
2200*481dde66SAndroid Build Coastguard Worker   MockB b;
2201*481dde66SAndroid Build Coastguard Worker   ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2202*481dde66SAndroid Build Coastguard Worker 
2203*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2204*481dde66SAndroid Build Coastguard Worker   // freely call them.
2205*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2206*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2207*481dde66SAndroid Build Coastguard Worker }
2208*481dde66SAndroid Build Coastguard Worker 
2209*481dde66SAndroid Build Coastguard Worker // Tests that we can verify and clear a mock object's expectations
2210*481dde66SAndroid Build Coastguard Worker // when some, but not all, of its methods have expectations *and* the
2211*481dde66SAndroid Build Coastguard Worker // verification succeeds.
TEST(VerifyAndClearExpectationsTest,SomeMethodsHaveExpectationsAndSucceed)2212*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndSucceed) {
2213*481dde66SAndroid Build Coastguard Worker   MockB b;
2214*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(1));
2215*481dde66SAndroid Build Coastguard Worker   b.DoB();
2216*481dde66SAndroid Build Coastguard Worker   ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2217*481dde66SAndroid Build Coastguard Worker 
2218*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2219*481dde66SAndroid Build Coastguard Worker   // freely call them.
2220*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2221*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2222*481dde66SAndroid Build Coastguard Worker }
2223*481dde66SAndroid Build Coastguard Worker 
2224*481dde66SAndroid Build Coastguard Worker // Tests that we can verify and clear a mock object's expectations
2225*481dde66SAndroid Build Coastguard Worker // when some, but not all, of its methods have expectations *and* the
2226*481dde66SAndroid Build Coastguard Worker // verification fails.
TEST(VerifyAndClearExpectationsTest,SomeMethodsHaveExpectationsAndFail)2227*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, SomeMethodsHaveExpectationsAndFail) {
2228*481dde66SAndroid Build Coastguard Worker   MockB b;
2229*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(1));
2230*481dde66SAndroid Build Coastguard Worker   bool result = true;
2231*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
2232*481dde66SAndroid Build Coastguard Worker                           "Actual: never called");
2233*481dde66SAndroid Build Coastguard Worker   ASSERT_FALSE(result);
2234*481dde66SAndroid Build Coastguard Worker 
2235*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2236*481dde66SAndroid Build Coastguard Worker   // freely call them.
2237*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2238*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2239*481dde66SAndroid Build Coastguard Worker }
2240*481dde66SAndroid Build Coastguard Worker 
2241*481dde66SAndroid Build Coastguard Worker // Tests that we can verify and clear a mock object's expectations
2242*481dde66SAndroid Build Coastguard Worker // when all of its methods have expectations.
TEST(VerifyAndClearExpectationsTest,AllMethodsHaveExpectations)2243*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, AllMethodsHaveExpectations) {
2244*481dde66SAndroid Build Coastguard Worker   MockB b;
2245*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(1));
2246*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).WillOnce(Return(2));
2247*481dde66SAndroid Build Coastguard Worker   b.DoB();
2248*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2249*481dde66SAndroid Build Coastguard Worker   ASSERT_TRUE(Mock::VerifyAndClearExpectations(&b));
2250*481dde66SAndroid Build Coastguard Worker 
2251*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2252*481dde66SAndroid Build Coastguard Worker   // freely call them.
2253*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2254*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2255*481dde66SAndroid Build Coastguard Worker }
2256*481dde66SAndroid Build Coastguard Worker 
2257*481dde66SAndroid Build Coastguard Worker // Tests that we can verify and clear a mock object's expectations
2258*481dde66SAndroid Build Coastguard Worker // when a method has more than one expectation.
TEST(VerifyAndClearExpectationsTest,AMethodHasManyExpectations)2259*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, AMethodHasManyExpectations) {
2260*481dde66SAndroid Build Coastguard Worker   MockB b;
2261*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(0)).WillOnce(Return(1));
2262*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).WillOnce(Return(2));
2263*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2264*481dde66SAndroid Build Coastguard Worker   bool result = true;
2265*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClearExpectations(&b),
2266*481dde66SAndroid Build Coastguard Worker                           "Actual: never called");
2267*481dde66SAndroid Build Coastguard Worker   ASSERT_FALSE(result);
2268*481dde66SAndroid Build Coastguard Worker 
2269*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2270*481dde66SAndroid Build Coastguard Worker   // freely call them.
2271*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2272*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2273*481dde66SAndroid Build Coastguard Worker }
2274*481dde66SAndroid Build Coastguard Worker 
2275*481dde66SAndroid Build Coastguard Worker // Tests that we can call VerifyAndClearExpectations() on the same
2276*481dde66SAndroid Build Coastguard Worker // mock object multiple times.
TEST(VerifyAndClearExpectationsTest,CanCallManyTimes)2277*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearExpectationsTest, CanCallManyTimes) {
2278*481dde66SAndroid Build Coastguard Worker   MockB b;
2279*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB());
2280*481dde66SAndroid Build Coastguard Worker   b.DoB();
2281*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClearExpectations(&b);
2282*481dde66SAndroid Build Coastguard Worker 
2283*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).WillOnce(Return(1));
2284*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2285*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClearExpectations(&b);
2286*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClearExpectations(&b);
2287*481dde66SAndroid Build Coastguard Worker 
2288*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2289*481dde66SAndroid Build Coastguard Worker   // freely call them.
2290*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2291*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2292*481dde66SAndroid Build Coastguard Worker }
2293*481dde66SAndroid Build Coastguard Worker 
2294*481dde66SAndroid Build Coastguard Worker // Tests that we can clear a mock object's default actions when none
2295*481dde66SAndroid Build Coastguard Worker // of its methods has default actions.
TEST(VerifyAndClearTest,NoMethodHasDefaultActions)2296*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, NoMethodHasDefaultActions) {
2297*481dde66SAndroid Build Coastguard Worker   MockB b;
2298*481dde66SAndroid Build Coastguard Worker   // If this crashes or generates a failure, the test will catch it.
2299*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2300*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2301*481dde66SAndroid Build Coastguard Worker }
2302*481dde66SAndroid Build Coastguard Worker 
2303*481dde66SAndroid Build Coastguard Worker // Tests that we can clear a mock object's default actions when some,
2304*481dde66SAndroid Build Coastguard Worker // but not all of its methods have default actions.
TEST(VerifyAndClearTest,SomeMethodsHaveDefaultActions)2305*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, SomeMethodsHaveDefaultActions) {
2306*481dde66SAndroid Build Coastguard Worker   MockB b;
2307*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(1));
2308*481dde66SAndroid Build Coastguard Worker 
2309*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2310*481dde66SAndroid Build Coastguard Worker 
2311*481dde66SAndroid Build Coastguard Worker   // Verifies that the default action of int DoB() was removed.
2312*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2313*481dde66SAndroid Build Coastguard Worker }
2314*481dde66SAndroid Build Coastguard Worker 
2315*481dde66SAndroid Build Coastguard Worker // Tests that we can clear a mock object's default actions when all of
2316*481dde66SAndroid Build Coastguard Worker // its methods have default actions.
TEST(VerifyAndClearTest,AllMethodsHaveDefaultActions)2317*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, AllMethodsHaveDefaultActions) {
2318*481dde66SAndroid Build Coastguard Worker   MockB b;
2319*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(1));
2320*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(2));
2321*481dde66SAndroid Build Coastguard Worker 
2322*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2323*481dde66SAndroid Build Coastguard Worker 
2324*481dde66SAndroid Build Coastguard Worker   // Verifies that the default action of int DoB() was removed.
2325*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2326*481dde66SAndroid Build Coastguard Worker 
2327*481dde66SAndroid Build Coastguard Worker   // Verifies that the default action of int DoB(int) was removed.
2328*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(0));
2329*481dde66SAndroid Build Coastguard Worker }
2330*481dde66SAndroid Build Coastguard Worker 
2331*481dde66SAndroid Build Coastguard Worker // Tests that we can clear a mock object's default actions when a
2332*481dde66SAndroid Build Coastguard Worker // method has more than one ON_CALL() set on it.
TEST(VerifyAndClearTest,AMethodHasManyDefaultActions)2333*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, AMethodHasManyDefaultActions) {
2334*481dde66SAndroid Build Coastguard Worker   MockB b;
2335*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(0)).WillByDefault(Return(1));
2336*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(2));
2337*481dde66SAndroid Build Coastguard Worker 
2338*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2339*481dde66SAndroid Build Coastguard Worker 
2340*481dde66SAndroid Build Coastguard Worker   // Verifies that the default actions (there are two) of int DoB(int)
2341*481dde66SAndroid Build Coastguard Worker   // were removed.
2342*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(0));
2343*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2344*481dde66SAndroid Build Coastguard Worker }
2345*481dde66SAndroid Build Coastguard Worker 
2346*481dde66SAndroid Build Coastguard Worker // Tests that we can call VerifyAndClear() on a mock object multiple
2347*481dde66SAndroid Build Coastguard Worker // times.
TEST(VerifyAndClearTest,CanCallManyTimes)2348*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, CanCallManyTimes) {
2349*481dde66SAndroid Build Coastguard Worker   MockB b;
2350*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(1));
2351*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2352*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2353*481dde66SAndroid Build Coastguard Worker 
2354*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(1));
2355*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2356*481dde66SAndroid Build Coastguard Worker 
2357*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2358*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2359*481dde66SAndroid Build Coastguard Worker }
2360*481dde66SAndroid Build Coastguard Worker 
2361*481dde66SAndroid Build Coastguard Worker // Tests that VerifyAndClear() works when the verification succeeds.
TEST(VerifyAndClearTest,Success)2362*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, Success) {
2363*481dde66SAndroid Build Coastguard Worker   MockB b;
2364*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(1));
2365*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(1)).WillOnce(Return(2));
2366*481dde66SAndroid Build Coastguard Worker 
2367*481dde66SAndroid Build Coastguard Worker   b.DoB();
2368*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2369*481dde66SAndroid Build Coastguard Worker   ASSERT_TRUE(Mock::VerifyAndClear(&b));
2370*481dde66SAndroid Build Coastguard Worker 
2371*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2372*481dde66SAndroid Build Coastguard Worker   // freely call them.
2373*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2374*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2375*481dde66SAndroid Build Coastguard Worker }
2376*481dde66SAndroid Build Coastguard Worker 
2377*481dde66SAndroid Build Coastguard Worker // Tests that VerifyAndClear() works when the verification fails.
TEST(VerifyAndClearTest,Failure)2378*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, Failure) {
2379*481dde66SAndroid Build Coastguard Worker   MockB b;
2380*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(1));
2381*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(2));
2382*481dde66SAndroid Build Coastguard Worker 
2383*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2384*481dde66SAndroid Build Coastguard Worker   bool result = true;
2385*481dde66SAndroid Build Coastguard Worker   EXPECT_NONFATAL_FAILURE(result = Mock::VerifyAndClear(&b),
2386*481dde66SAndroid Build Coastguard Worker                           "Actual: never called");
2387*481dde66SAndroid Build Coastguard Worker   ASSERT_FALSE(result);
2388*481dde66SAndroid Build Coastguard Worker 
2389*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2390*481dde66SAndroid Build Coastguard Worker   // freely call them.
2391*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2392*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2393*481dde66SAndroid Build Coastguard Worker }
2394*481dde66SAndroid Build Coastguard Worker 
2395*481dde66SAndroid Build Coastguard Worker // Tests that VerifyAndClear() works when the default actions and
2396*481dde66SAndroid Build Coastguard Worker // expectations are set on a const mock object.
TEST(VerifyAndClearTest,Const)2397*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, Const) {
2398*481dde66SAndroid Build Coastguard Worker   MockB b;
2399*481dde66SAndroid Build Coastguard Worker   ON_CALL(Const(b), DoB()).WillByDefault(Return(1));
2400*481dde66SAndroid Build Coastguard Worker 
2401*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(Const(b), DoB()).WillOnce(DoDefault()).WillOnce(Return(2));
2402*481dde66SAndroid Build Coastguard Worker 
2403*481dde66SAndroid Build Coastguard Worker   b.DoB();
2404*481dde66SAndroid Build Coastguard Worker   b.DoB();
2405*481dde66SAndroid Build Coastguard Worker   ASSERT_TRUE(Mock::VerifyAndClear(&b));
2406*481dde66SAndroid Build Coastguard Worker 
2407*481dde66SAndroid Build Coastguard Worker   // There should be no expectations on the methods now, so we can
2408*481dde66SAndroid Build Coastguard Worker   // freely call them.
2409*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB());
2410*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(0, b.DoB(1));
2411*481dde66SAndroid Build Coastguard Worker }
2412*481dde66SAndroid Build Coastguard Worker 
2413*481dde66SAndroid Build Coastguard Worker // Tests that we can set default actions and expectations on a mock
2414*481dde66SAndroid Build Coastguard Worker // object after VerifyAndClear() has been called on it.
TEST(VerifyAndClearTest,CanSetDefaultActionsAndExpectationsAfterwards)2415*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, CanSetDefaultActionsAndExpectationsAfterwards) {
2416*481dde66SAndroid Build Coastguard Worker   MockB b;
2417*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(1));
2418*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB(_)).WillOnce(Return(2));
2419*481dde66SAndroid Build Coastguard Worker   b.DoB(1);
2420*481dde66SAndroid Build Coastguard Worker 
2421*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b);
2422*481dde66SAndroid Build Coastguard Worker 
2423*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b, DoB()).WillOnce(Return(3));
2424*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(_)).WillByDefault(Return(4));
2425*481dde66SAndroid Build Coastguard Worker 
2426*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(3, b.DoB());
2427*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(4, b.DoB(1));
2428*481dde66SAndroid Build Coastguard Worker }
2429*481dde66SAndroid Build Coastguard Worker 
2430*481dde66SAndroid Build Coastguard Worker // Tests that calling VerifyAndClear() on one mock object does not
2431*481dde66SAndroid Build Coastguard Worker // affect other mock objects (either of the same type or not).
TEST(VerifyAndClearTest,DoesNotAffectOtherMockObjects)2432*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest, DoesNotAffectOtherMockObjects) {
2433*481dde66SAndroid Build Coastguard Worker   MockA a;
2434*481dde66SAndroid Build Coastguard Worker   MockB b1;
2435*481dde66SAndroid Build Coastguard Worker   MockB b2;
2436*481dde66SAndroid Build Coastguard Worker 
2437*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary(_, _)).WillByDefault(Return(true));
2438*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, Binary(_, _)).WillOnce(DoDefault()).WillOnce(Return(false));
2439*481dde66SAndroid Build Coastguard Worker 
2440*481dde66SAndroid Build Coastguard Worker   ON_CALL(b1, DoB()).WillByDefault(Return(1));
2441*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b1, DoB(_)).WillOnce(Return(2));
2442*481dde66SAndroid Build Coastguard Worker 
2443*481dde66SAndroid Build Coastguard Worker   ON_CALL(b2, DoB()).WillByDefault(Return(3));
2444*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(b2, DoB(_));
2445*481dde66SAndroid Build Coastguard Worker 
2446*481dde66SAndroid Build Coastguard Worker   b2.DoB(0);
2447*481dde66SAndroid Build Coastguard Worker   Mock::VerifyAndClear(&b2);
2448*481dde66SAndroid Build Coastguard Worker 
2449*481dde66SAndroid Build Coastguard Worker   // Verifies that the default actions and expectations of a and b1
2450*481dde66SAndroid Build Coastguard Worker   // are still in effect.
2451*481dde66SAndroid Build Coastguard Worker   EXPECT_TRUE(a.Binary(0, 0));
2452*481dde66SAndroid Build Coastguard Worker   EXPECT_FALSE(a.Binary(0, 0));
2453*481dde66SAndroid Build Coastguard Worker 
2454*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(1, b1.DoB());
2455*481dde66SAndroid Build Coastguard Worker   EXPECT_EQ(2, b1.DoB(0));
2456*481dde66SAndroid Build Coastguard Worker }
2457*481dde66SAndroid Build Coastguard Worker 
TEST(VerifyAndClearTest,DestroyingChainedMocksDoesNotDeadlockThroughExpectations)2458*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest,
2459*481dde66SAndroid Build Coastguard Worker      DestroyingChainedMocksDoesNotDeadlockThroughExpectations) {
2460*481dde66SAndroid Build Coastguard Worker   std::shared_ptr<MockA> a(new MockA);
2461*481dde66SAndroid Build Coastguard Worker   ReferenceHoldingMock test_mock;
2462*481dde66SAndroid Build Coastguard Worker 
2463*481dde66SAndroid Build Coastguard Worker   // EXPECT_CALL stores a reference to a inside test_mock.
2464*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(test_mock, AcceptReference(_))
2465*481dde66SAndroid Build Coastguard Worker       .WillRepeatedly(SetArgPointee<0>(a));
2466*481dde66SAndroid Build Coastguard Worker 
2467*481dde66SAndroid Build Coastguard Worker   // Throw away the reference to the mock that we have in a. After this, the
2468*481dde66SAndroid Build Coastguard Worker   // only reference to it is stored by test_mock.
2469*481dde66SAndroid Build Coastguard Worker   a.reset();
2470*481dde66SAndroid Build Coastguard Worker 
2471*481dde66SAndroid Build Coastguard Worker   // When test_mock goes out of scope, it destroys the last remaining reference
2472*481dde66SAndroid Build Coastguard Worker   // to the mock object originally pointed to by a. This will cause the MockA
2473*481dde66SAndroid Build Coastguard Worker   // destructor to be called from inside the ReferenceHoldingMock destructor.
2474*481dde66SAndroid Build Coastguard Worker   // The state of all mocks is protected by a single global lock, but there
2475*481dde66SAndroid Build Coastguard Worker   // should be no deadlock.
2476*481dde66SAndroid Build Coastguard Worker }
2477*481dde66SAndroid Build Coastguard Worker 
TEST(VerifyAndClearTest,DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction)2478*481dde66SAndroid Build Coastguard Worker TEST(VerifyAndClearTest,
2479*481dde66SAndroid Build Coastguard Worker      DestroyingChainedMocksDoesNotDeadlockThroughDefaultAction) {
2480*481dde66SAndroid Build Coastguard Worker   std::shared_ptr<MockA> a(new MockA);
2481*481dde66SAndroid Build Coastguard Worker   ReferenceHoldingMock test_mock;
2482*481dde66SAndroid Build Coastguard Worker 
2483*481dde66SAndroid Build Coastguard Worker   // ON_CALL stores a reference to a inside test_mock.
2484*481dde66SAndroid Build Coastguard Worker   ON_CALL(test_mock, AcceptReference(_)).WillByDefault(SetArgPointee<0>(a));
2485*481dde66SAndroid Build Coastguard Worker 
2486*481dde66SAndroid Build Coastguard Worker   // Throw away the reference to the mock that we have in a. After this, the
2487*481dde66SAndroid Build Coastguard Worker   // only reference to it is stored by test_mock.
2488*481dde66SAndroid Build Coastguard Worker   a.reset();
2489*481dde66SAndroid Build Coastguard Worker 
2490*481dde66SAndroid Build Coastguard Worker   // When test_mock goes out of scope, it destroys the last remaining reference
2491*481dde66SAndroid Build Coastguard Worker   // to the mock object originally pointed to by a. This will cause the MockA
2492*481dde66SAndroid Build Coastguard Worker   // destructor to be called from inside the ReferenceHoldingMock destructor.
2493*481dde66SAndroid Build Coastguard Worker   // The state of all mocks is protected by a single global lock, but there
2494*481dde66SAndroid Build Coastguard Worker   // should be no deadlock.
2495*481dde66SAndroid Build Coastguard Worker }
2496*481dde66SAndroid Build Coastguard Worker 
2497*481dde66SAndroid Build Coastguard Worker // Tests that a mock function's action can call a mock function
2498*481dde66SAndroid Build Coastguard Worker // (either the same function or a different one) either as an explicit
2499*481dde66SAndroid Build Coastguard Worker // action or as a default action without causing a dead lock.  It
2500*481dde66SAndroid Build Coastguard Worker // verifies that the action is not performed inside the critical
2501*481dde66SAndroid Build Coastguard Worker // section.
TEST(SynchronizationTest,CanCallMockMethodInAction)2502*481dde66SAndroid Build Coastguard Worker TEST(SynchronizationTest, CanCallMockMethodInAction) {
2503*481dde66SAndroid Build Coastguard Worker   MockA a;
2504*481dde66SAndroid Build Coastguard Worker   MockC c;
2505*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA(_)).WillByDefault(
2506*481dde66SAndroid Build Coastguard Worker       IgnoreResult(InvokeWithoutArgs(&c, &MockC::NonVoidMethod)));
2507*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1));
2508*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(a, DoA(1))
2509*481dde66SAndroid Build Coastguard Worker       .WillOnce(Invoke(&a, &MockA::DoA))
2510*481dde66SAndroid Build Coastguard Worker       .RetiresOnSaturation();
2511*481dde66SAndroid Build Coastguard Worker   EXPECT_CALL(c, NonVoidMethod());
2512*481dde66SAndroid Build Coastguard Worker 
2513*481dde66SAndroid Build Coastguard Worker   a.DoA(1);
2514*481dde66SAndroid Build Coastguard Worker   // This will match the second EXPECT_CALL() and trigger another a.DoA(1),
2515*481dde66SAndroid Build Coastguard Worker   // which will in turn match the first EXPECT_CALL() and trigger a call to
2516*481dde66SAndroid Build Coastguard Worker   // c.NonVoidMethod() that was specified by the ON_CALL() since the first
2517*481dde66SAndroid Build Coastguard Worker   // EXPECT_CALL() did not specify an action.
2518*481dde66SAndroid Build Coastguard Worker }
2519*481dde66SAndroid Build Coastguard Worker 
TEST(ParameterlessExpectationsTest,CanSetExpectationsWithoutMatchers)2520*481dde66SAndroid Build Coastguard Worker TEST(ParameterlessExpectationsTest, CanSetExpectationsWithoutMatchers) {
2521*481dde66SAndroid Build Coastguard Worker   MockA a;
2522*481dde66SAndroid Build Coastguard Worker   int do_a_arg0 = 0;
2523*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA).WillByDefault(SaveArg<0>(&do_a_arg0));
2524*481dde66SAndroid Build Coastguard Worker   int do_a_47_arg0 = 0;
2525*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, DoA(47)).WillByDefault(SaveArg<0>(&do_a_47_arg0));
2526*481dde66SAndroid Build Coastguard Worker 
2527*481dde66SAndroid Build Coastguard Worker   a.DoA(17);
2528*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(do_a_arg0, 17);
2529*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(do_a_47_arg0, 0);
2530*481dde66SAndroid Build Coastguard Worker   a.DoA(47);
2531*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(do_a_arg0, 17);
2532*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(do_a_47_arg0, 47);
2533*481dde66SAndroid Build Coastguard Worker 
2534*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary).WillByDefault(Return(true));
2535*481dde66SAndroid Build Coastguard Worker   ON_CALL(a, Binary(_, 14)).WillByDefault(Return(false));
2536*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(a.Binary(14, 17), true);
2537*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(a.Binary(17, 14), false);
2538*481dde66SAndroid Build Coastguard Worker }
2539*481dde66SAndroid Build Coastguard Worker 
TEST(ParameterlessExpectationsTest,CanSetExpectationsForOverloadedMethods)2540*481dde66SAndroid Build Coastguard Worker TEST(ParameterlessExpectationsTest, CanSetExpectationsForOverloadedMethods) {
2541*481dde66SAndroid Build Coastguard Worker   MockB b;
2542*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB()).WillByDefault(Return(9));
2543*481dde66SAndroid Build Coastguard Worker   ON_CALL(b, DoB(5)).WillByDefault(Return(11));
2544*481dde66SAndroid Build Coastguard Worker 
2545*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(b.DoB(), 9);
2546*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(b.DoB(1), 0);  // default value
2547*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(b.DoB(5), 11);
2548*481dde66SAndroid Build Coastguard Worker }
2549*481dde66SAndroid Build Coastguard Worker 
2550*481dde66SAndroid Build Coastguard Worker struct MockWithConstMethods {
2551*481dde66SAndroid Build Coastguard Worker  public:
2552*481dde66SAndroid Build Coastguard Worker   MOCK_CONST_METHOD1(Foo, int(int));
2553*481dde66SAndroid Build Coastguard Worker   MOCK_CONST_METHOD2(Bar, int(int, const char*));
2554*481dde66SAndroid Build Coastguard Worker };
2555*481dde66SAndroid Build Coastguard Worker 
TEST(ParameterlessExpectationsTest,CanSetExpectationsForConstMethods)2556*481dde66SAndroid Build Coastguard Worker TEST(ParameterlessExpectationsTest, CanSetExpectationsForConstMethods) {
2557*481dde66SAndroid Build Coastguard Worker   MockWithConstMethods mock;
2558*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, Foo).WillByDefault(Return(7));
2559*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, Bar).WillByDefault(Return(33));
2560*481dde66SAndroid Build Coastguard Worker 
2561*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(mock.Foo(17), 7);
2562*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(mock.Bar(27, "purple"), 33);
2563*481dde66SAndroid Build Coastguard Worker }
2564*481dde66SAndroid Build Coastguard Worker 
2565*481dde66SAndroid Build Coastguard Worker class MockConstOverload {
2566*481dde66SAndroid Build Coastguard Worker  public:
2567*481dde66SAndroid Build Coastguard Worker   MOCK_METHOD1(Overloaded, int(int));
2568*481dde66SAndroid Build Coastguard Worker   MOCK_CONST_METHOD1(Overloaded, int(int));
2569*481dde66SAndroid Build Coastguard Worker };
2570*481dde66SAndroid Build Coastguard Worker 
TEST(ParameterlessExpectationsTest,CanSetExpectationsForConstOverloadedMethods)2571*481dde66SAndroid Build Coastguard Worker TEST(ParameterlessExpectationsTest,
2572*481dde66SAndroid Build Coastguard Worker      CanSetExpectationsForConstOverloadedMethods) {
2573*481dde66SAndroid Build Coastguard Worker   MockConstOverload mock;
2574*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, Overloaded(_)).WillByDefault(Return(7));
2575*481dde66SAndroid Build Coastguard Worker   ON_CALL(mock, Overloaded(5)).WillByDefault(Return(9));
2576*481dde66SAndroid Build Coastguard Worker   ON_CALL(Const(mock), Overloaded(5)).WillByDefault(Return(11));
2577*481dde66SAndroid Build Coastguard Worker   ON_CALL(Const(mock), Overloaded(7)).WillByDefault(Return(13));
2578*481dde66SAndroid Build Coastguard Worker 
2579*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(mock.Overloaded(1), 7);
2580*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(mock.Overloaded(5), 9);
2581*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(mock.Overloaded(7), 7);
2582*481dde66SAndroid Build Coastguard Worker 
2583*481dde66SAndroid Build Coastguard Worker   const MockConstOverload& const_mock = mock;
2584*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(const_mock.Overloaded(1), 0);
2585*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(const_mock.Overloaded(5), 11);
2586*481dde66SAndroid Build Coastguard Worker   EXPECT_THAT(const_mock.Overloaded(7), 13);
2587*481dde66SAndroid Build Coastguard Worker }
2588*481dde66SAndroid Build Coastguard Worker 
2589*481dde66SAndroid Build Coastguard Worker }  // namespace
2590*481dde66SAndroid Build Coastguard Worker }  // namespace testing
2591*481dde66SAndroid Build Coastguard Worker 
main(int argc,char ** argv)2592*481dde66SAndroid Build Coastguard Worker int main(int argc, char** argv) {
2593*481dde66SAndroid Build Coastguard Worker   testing::InitGoogleMock(&argc, argv);
2594*481dde66SAndroid Build Coastguard Worker   // Ensures that the tests pass no matter what value of
2595*481dde66SAndroid Build Coastguard Worker   // --gmock_catch_leaked_mocks and --gmock_verbose the user specifies.
2596*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(catch_leaked_mocks, true);
2597*481dde66SAndroid Build Coastguard Worker   GMOCK_FLAG_SET(verbose, testing::internal::kWarningVerbosity);
2598*481dde66SAndroid Build Coastguard Worker 
2599*481dde66SAndroid Build Coastguard Worker   return RUN_ALL_TESTS();
2600*481dde66SAndroid Build Coastguard Worker }
2601