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