1b89a7cc2SEnji Cooper // Copyright 2008, Google Inc.
2b89a7cc2SEnji Cooper // All rights reserved.
3b89a7cc2SEnji Cooper //
4b89a7cc2SEnji Cooper // Redistribution and use in source and binary forms, with or without
5b89a7cc2SEnji Cooper // modification, are permitted provided that the following conditions are
6b89a7cc2SEnji Cooper // met:
7b89a7cc2SEnji Cooper //
8b89a7cc2SEnji Cooper // * Redistributions of source code must retain the above copyright
9b89a7cc2SEnji Cooper // notice, this list of conditions and the following disclaimer.
10b89a7cc2SEnji Cooper // * Redistributions in binary form must reproduce the above
11b89a7cc2SEnji Cooper // copyright notice, this list of conditions and the following disclaimer
12b89a7cc2SEnji Cooper // in the documentation and/or other materials provided with the
13b89a7cc2SEnji Cooper // distribution.
14b89a7cc2SEnji Cooper // * Neither the name of Google Inc. nor the names of its
15b89a7cc2SEnji Cooper // contributors may be used to endorse or promote products derived from
16b89a7cc2SEnji Cooper // this software without specific prior written permission.
17b89a7cc2SEnji Cooper //
18b89a7cc2SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19b89a7cc2SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20b89a7cc2SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21b89a7cc2SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22b89a7cc2SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23b89a7cc2SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24b89a7cc2SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25b89a7cc2SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26b89a7cc2SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27b89a7cc2SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28b89a7cc2SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29b89a7cc2SEnji Cooper
30*28f6c2f2SEnji Cooper #include "gmock/gmock-nice-strict.h"
31b89a7cc2SEnji Cooper
32b89a7cc2SEnji Cooper #include <string>
33b89a7cc2SEnji Cooper #include <utility>
34*28f6c2f2SEnji Cooper
35b89a7cc2SEnji Cooper #include "gmock/gmock.h"
36b89a7cc2SEnji Cooper #include "gtest/gtest-spi.h"
37b89a7cc2SEnji Cooper #include "gtest/gtest.h"
38b89a7cc2SEnji Cooper
39b89a7cc2SEnji Cooper // This must not be defined inside the ::testing namespace, or it will
40b89a7cc2SEnji Cooper // clash with ::testing::Mock.
41b89a7cc2SEnji Cooper class Mock {
42b89a7cc2SEnji Cooper public:
43*28f6c2f2SEnji Cooper Mock() = default;
44b89a7cc2SEnji Cooper
45b89a7cc2SEnji Cooper MOCK_METHOD0(DoThis, void());
46b89a7cc2SEnji Cooper
47b89a7cc2SEnji Cooper private:
48*28f6c2f2SEnji Cooper Mock(const Mock&) = delete;
49*28f6c2f2SEnji Cooper Mock& operator=(const Mock&) = delete;
50b89a7cc2SEnji Cooper };
51b89a7cc2SEnji Cooper
52b89a7cc2SEnji Cooper namespace testing {
53b89a7cc2SEnji Cooper namespace gmock_nice_strict_test {
54b89a7cc2SEnji Cooper
55b89a7cc2SEnji Cooper using testing::HasSubstr;
56b89a7cc2SEnji Cooper using testing::NaggyMock;
57b89a7cc2SEnji Cooper using testing::NiceMock;
58b89a7cc2SEnji Cooper using testing::StrictMock;
59b89a7cc2SEnji Cooper
60b89a7cc2SEnji Cooper #if GTEST_HAS_STREAM_REDIRECTION
61b89a7cc2SEnji Cooper using testing::internal::CaptureStdout;
62b89a7cc2SEnji Cooper using testing::internal::GetCapturedStdout;
63b89a7cc2SEnji Cooper #endif
64b89a7cc2SEnji Cooper
65b89a7cc2SEnji Cooper // Class without default constructor.
66b89a7cc2SEnji Cooper class NotDefaultConstructible {
67b89a7cc2SEnji Cooper public:
NotDefaultConstructible(int)68b89a7cc2SEnji Cooper explicit NotDefaultConstructible(int) {}
69b89a7cc2SEnji Cooper };
70b89a7cc2SEnji Cooper
71*28f6c2f2SEnji Cooper class CallsMockMethodInDestructor {
72*28f6c2f2SEnji Cooper public:
~CallsMockMethodInDestructor()73*28f6c2f2SEnji Cooper ~CallsMockMethodInDestructor() { OnDestroy(); }
74*28f6c2f2SEnji Cooper MOCK_METHOD(void, OnDestroy, ());
75*28f6c2f2SEnji Cooper };
76*28f6c2f2SEnji Cooper
77b89a7cc2SEnji Cooper // Defines some mock classes needed by the tests.
78b89a7cc2SEnji Cooper
79b89a7cc2SEnji Cooper class Foo {
80b89a7cc2SEnji Cooper public:
81*28f6c2f2SEnji Cooper virtual ~Foo() = default;
82b89a7cc2SEnji Cooper
83b89a7cc2SEnji Cooper virtual void DoThis() = 0;
84b89a7cc2SEnji Cooper virtual int DoThat(bool flag) = 0;
85b89a7cc2SEnji Cooper };
86b89a7cc2SEnji Cooper
87b89a7cc2SEnji Cooper class MockFoo : public Foo {
88b89a7cc2SEnji Cooper public:
89*28f6c2f2SEnji Cooper MockFoo() = default;
Delete()90b89a7cc2SEnji Cooper void Delete() { delete this; }
91b89a7cc2SEnji Cooper
92b89a7cc2SEnji Cooper MOCK_METHOD0(DoThis, void());
93b89a7cc2SEnji Cooper MOCK_METHOD1(DoThat, int(bool flag));
94b89a7cc2SEnji Cooper MOCK_METHOD0(ReturnNonDefaultConstructible, NotDefaultConstructible());
95b89a7cc2SEnji Cooper
96b89a7cc2SEnji Cooper private:
97*28f6c2f2SEnji Cooper MockFoo(const MockFoo&) = delete;
98*28f6c2f2SEnji Cooper MockFoo& operator=(const MockFoo&) = delete;
99b89a7cc2SEnji Cooper };
100b89a7cc2SEnji Cooper
101b89a7cc2SEnji Cooper class MockBar {
102b89a7cc2SEnji Cooper public:
MockBar(const std::string & s)103b89a7cc2SEnji Cooper explicit MockBar(const std::string& s) : str_(s) {}
104b89a7cc2SEnji Cooper
MockBar(char a1,char a2,std::string a3,std::string a4,int a5,int a6,const std::string & a7,const std::string & a8,bool a9,bool a10)105b89a7cc2SEnji Cooper MockBar(char a1, char a2, std::string a3, std::string a4, int a5, int a6,
106b89a7cc2SEnji Cooper const std::string& a7, const std::string& a8, bool a9, bool a10) {
107b89a7cc2SEnji Cooper str_ = std::string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) +
108*28f6c2f2SEnji Cooper static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') +
109*28f6c2f2SEnji Cooper (a10 ? 'T' : 'F');
110b89a7cc2SEnji Cooper }
111b89a7cc2SEnji Cooper
112*28f6c2f2SEnji Cooper virtual ~MockBar() = default;
113b89a7cc2SEnji Cooper
str() const114b89a7cc2SEnji Cooper const std::string& str() const { return str_; }
115b89a7cc2SEnji Cooper
116b89a7cc2SEnji Cooper MOCK_METHOD0(This, int());
117b89a7cc2SEnji Cooper MOCK_METHOD2(That, std::string(int, bool));
118b89a7cc2SEnji Cooper
119b89a7cc2SEnji Cooper private:
120b89a7cc2SEnji Cooper std::string str_;
121b89a7cc2SEnji Cooper
122*28f6c2f2SEnji Cooper MockBar(const MockBar&) = delete;
123*28f6c2f2SEnji Cooper MockBar& operator=(const MockBar&) = delete;
124b89a7cc2SEnji Cooper };
125b89a7cc2SEnji Cooper
126b89a7cc2SEnji Cooper class MockBaz {
127b89a7cc2SEnji Cooper public:
128b89a7cc2SEnji Cooper class MoveOnly {
129*28f6c2f2SEnji Cooper public:
130b89a7cc2SEnji Cooper MoveOnly() = default;
131b89a7cc2SEnji Cooper
132b89a7cc2SEnji Cooper MoveOnly(const MoveOnly&) = delete;
133*28f6c2f2SEnji Cooper MoveOnly& operator=(const MoveOnly&) = delete;
134b89a7cc2SEnji Cooper
135b89a7cc2SEnji Cooper MoveOnly(MoveOnly&&) = default;
136*28f6c2f2SEnji Cooper MoveOnly& operator=(MoveOnly&&) = default;
137b89a7cc2SEnji Cooper };
138b89a7cc2SEnji Cooper
MockBaz(MoveOnly)139b89a7cc2SEnji Cooper MockBaz(MoveOnly) {}
140*28f6c2f2SEnji Cooper };
141b89a7cc2SEnji Cooper
142b89a7cc2SEnji Cooper #if GTEST_HAS_STREAM_REDIRECTION
143b89a7cc2SEnji Cooper
144b89a7cc2SEnji Cooper // Tests that a raw mock generates warnings for uninteresting calls.
TEST(RawMockTest,WarningForUninterestingCall)145b89a7cc2SEnji Cooper TEST(RawMockTest, WarningForUninterestingCall) {
146*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
147*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "warning");
148b89a7cc2SEnji Cooper
149b89a7cc2SEnji Cooper MockFoo raw_foo;
150b89a7cc2SEnji Cooper
151b89a7cc2SEnji Cooper CaptureStdout();
152b89a7cc2SEnji Cooper raw_foo.DoThis();
153b89a7cc2SEnji Cooper raw_foo.DoThat(true);
154b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
155b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
156b89a7cc2SEnji Cooper
157*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
158b89a7cc2SEnji Cooper }
159b89a7cc2SEnji Cooper
160b89a7cc2SEnji Cooper // Tests that a raw mock generates warnings for uninteresting calls
161b89a7cc2SEnji Cooper // that delete the mock object.
TEST(RawMockTest,WarningForUninterestingCallAfterDeath)162b89a7cc2SEnji Cooper TEST(RawMockTest, WarningForUninterestingCallAfterDeath) {
163*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
164*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "warning");
165b89a7cc2SEnji Cooper
166b89a7cc2SEnji Cooper MockFoo* const raw_foo = new MockFoo;
167b89a7cc2SEnji Cooper
168*28f6c2f2SEnji Cooper ON_CALL(*raw_foo, DoThis()).WillByDefault(Invoke(raw_foo, &MockFoo::Delete));
169b89a7cc2SEnji Cooper
170b89a7cc2SEnji Cooper CaptureStdout();
171b89a7cc2SEnji Cooper raw_foo->DoThis();
172b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
173b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
174b89a7cc2SEnji Cooper
175*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
176b89a7cc2SEnji Cooper }
177b89a7cc2SEnji Cooper
178b89a7cc2SEnji Cooper // Tests that a raw mock generates informational logs for
179b89a7cc2SEnji Cooper // uninteresting calls.
TEST(RawMockTest,InfoForUninterestingCall)180b89a7cc2SEnji Cooper TEST(RawMockTest, InfoForUninterestingCall) {
181b89a7cc2SEnji Cooper MockFoo raw_foo;
182b89a7cc2SEnji Cooper
183*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
184*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "info");
185b89a7cc2SEnji Cooper CaptureStdout();
186b89a7cc2SEnji Cooper raw_foo.DoThis();
187b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
188b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
189b89a7cc2SEnji Cooper
190*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
191*28f6c2f2SEnji Cooper }
192*28f6c2f2SEnji Cooper
TEST(RawMockTest,IsNaggy_IsNice_IsStrict)193*28f6c2f2SEnji Cooper TEST(RawMockTest, IsNaggy_IsNice_IsStrict) {
194*28f6c2f2SEnji Cooper MockFoo raw_foo;
195*28f6c2f2SEnji Cooper EXPECT_TRUE(Mock::IsNaggy(&raw_foo));
196*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsNice(&raw_foo));
197*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsStrict(&raw_foo));
198b89a7cc2SEnji Cooper }
199b89a7cc2SEnji Cooper
200b89a7cc2SEnji Cooper // Tests that a nice mock generates no warning for uninteresting calls.
TEST(NiceMockTest,NoWarningForUninterestingCall)201b89a7cc2SEnji Cooper TEST(NiceMockTest, NoWarningForUninterestingCall) {
202b89a7cc2SEnji Cooper NiceMock<MockFoo> nice_foo;
203b89a7cc2SEnji Cooper
204b89a7cc2SEnji Cooper CaptureStdout();
205b89a7cc2SEnji Cooper nice_foo.DoThis();
206b89a7cc2SEnji Cooper nice_foo.DoThat(true);
207b89a7cc2SEnji Cooper EXPECT_EQ("", GetCapturedStdout());
208b89a7cc2SEnji Cooper }
209b89a7cc2SEnji Cooper
210b89a7cc2SEnji Cooper // Tests that a nice mock generates no warning for uninteresting calls
211b89a7cc2SEnji Cooper // that delete the mock object.
TEST(NiceMockTest,NoWarningForUninterestingCallAfterDeath)212b89a7cc2SEnji Cooper TEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) {
213b89a7cc2SEnji Cooper NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>;
214b89a7cc2SEnji Cooper
215b89a7cc2SEnji Cooper ON_CALL(*nice_foo, DoThis())
216b89a7cc2SEnji Cooper .WillByDefault(Invoke(nice_foo, &MockFoo::Delete));
217b89a7cc2SEnji Cooper
218b89a7cc2SEnji Cooper CaptureStdout();
219b89a7cc2SEnji Cooper nice_foo->DoThis();
220b89a7cc2SEnji Cooper EXPECT_EQ("", GetCapturedStdout());
221b89a7cc2SEnji Cooper }
222b89a7cc2SEnji Cooper
223b89a7cc2SEnji Cooper // Tests that a nice mock generates informational logs for
224b89a7cc2SEnji Cooper // uninteresting calls.
TEST(NiceMockTest,InfoForUninterestingCall)225b89a7cc2SEnji Cooper TEST(NiceMockTest, InfoForUninterestingCall) {
226b89a7cc2SEnji Cooper NiceMock<MockFoo> nice_foo;
227b89a7cc2SEnji Cooper
228*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
229*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "info");
230b89a7cc2SEnji Cooper CaptureStdout();
231b89a7cc2SEnji Cooper nice_foo.DoThis();
232b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
233b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
234b89a7cc2SEnji Cooper
235*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
236b89a7cc2SEnji Cooper }
237b89a7cc2SEnji Cooper
238b89a7cc2SEnji Cooper #endif // GTEST_HAS_STREAM_REDIRECTION
239b89a7cc2SEnji Cooper
240b89a7cc2SEnji Cooper // Tests that a nice mock allows expected calls.
TEST(NiceMockTest,AllowsExpectedCall)241b89a7cc2SEnji Cooper TEST(NiceMockTest, AllowsExpectedCall) {
242b89a7cc2SEnji Cooper NiceMock<MockFoo> nice_foo;
243b89a7cc2SEnji Cooper
244b89a7cc2SEnji Cooper EXPECT_CALL(nice_foo, DoThis());
245b89a7cc2SEnji Cooper nice_foo.DoThis();
246b89a7cc2SEnji Cooper }
247b89a7cc2SEnji Cooper
248b89a7cc2SEnji Cooper // Tests that an unexpected call on a nice mock which returns a
249b89a7cc2SEnji Cooper // not-default-constructible type throws an exception and the exception contains
250b89a7cc2SEnji Cooper // the method's name.
TEST(NiceMockTest,ThrowsExceptionForUnknownReturnTypes)251b89a7cc2SEnji Cooper TEST(NiceMockTest, ThrowsExceptionForUnknownReturnTypes) {
252b89a7cc2SEnji Cooper NiceMock<MockFoo> nice_foo;
253b89a7cc2SEnji Cooper #if GTEST_HAS_EXCEPTIONS
254b89a7cc2SEnji Cooper try {
255b89a7cc2SEnji Cooper nice_foo.ReturnNonDefaultConstructible();
256b89a7cc2SEnji Cooper FAIL();
257b89a7cc2SEnji Cooper } catch (const std::runtime_error& ex) {
258b89a7cc2SEnji Cooper EXPECT_THAT(ex.what(), HasSubstr("ReturnNonDefaultConstructible"));
259b89a7cc2SEnji Cooper }
260b89a7cc2SEnji Cooper #else
261b89a7cc2SEnji Cooper EXPECT_DEATH_IF_SUPPORTED({ nice_foo.ReturnNonDefaultConstructible(); }, "");
262b89a7cc2SEnji Cooper #endif
263b89a7cc2SEnji Cooper }
264b89a7cc2SEnji Cooper
265b89a7cc2SEnji Cooper // Tests that an unexpected call on a nice mock fails.
TEST(NiceMockTest,UnexpectedCallFails)266b89a7cc2SEnji Cooper TEST(NiceMockTest, UnexpectedCallFails) {
267b89a7cc2SEnji Cooper NiceMock<MockFoo> nice_foo;
268b89a7cc2SEnji Cooper
269b89a7cc2SEnji Cooper EXPECT_CALL(nice_foo, DoThis()).Times(0);
270b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected");
271b89a7cc2SEnji Cooper }
272b89a7cc2SEnji Cooper
273b89a7cc2SEnji Cooper // Tests that NiceMock works with a mock class that has a non-default
274b89a7cc2SEnji Cooper // constructor.
TEST(NiceMockTest,NonDefaultConstructor)275b89a7cc2SEnji Cooper TEST(NiceMockTest, NonDefaultConstructor) {
276b89a7cc2SEnji Cooper NiceMock<MockBar> nice_bar("hi");
277b89a7cc2SEnji Cooper EXPECT_EQ("hi", nice_bar.str());
278b89a7cc2SEnji Cooper
279b89a7cc2SEnji Cooper nice_bar.This();
280b89a7cc2SEnji Cooper nice_bar.That(5, true);
281b89a7cc2SEnji Cooper }
282b89a7cc2SEnji Cooper
283b89a7cc2SEnji Cooper // Tests that NiceMock works with a mock class that has a 10-ary
284b89a7cc2SEnji Cooper // non-default constructor.
TEST(NiceMockTest,NonDefaultConstructor10)285b89a7cc2SEnji Cooper TEST(NiceMockTest, NonDefaultConstructor10) {
286*28f6c2f2SEnji Cooper NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f', "g", "h", true,
287*28f6c2f2SEnji Cooper false);
288b89a7cc2SEnji Cooper EXPECT_EQ("abcdefghTF", nice_bar.str());
289b89a7cc2SEnji Cooper
290b89a7cc2SEnji Cooper nice_bar.This();
291b89a7cc2SEnji Cooper nice_bar.That(5, true);
292b89a7cc2SEnji Cooper }
293b89a7cc2SEnji Cooper
TEST(NiceMockTest,AllowLeak)294b89a7cc2SEnji Cooper TEST(NiceMockTest, AllowLeak) {
295b89a7cc2SEnji Cooper NiceMock<MockFoo>* leaked = new NiceMock<MockFoo>;
296b89a7cc2SEnji Cooper Mock::AllowLeak(leaked);
297b89a7cc2SEnji Cooper EXPECT_CALL(*leaked, DoThis());
298b89a7cc2SEnji Cooper leaked->DoThis();
299b89a7cc2SEnji Cooper }
300b89a7cc2SEnji Cooper
TEST(NiceMockTest,MoveOnlyConstructor)301b89a7cc2SEnji Cooper TEST(NiceMockTest, MoveOnlyConstructor) {
302*28f6c2f2SEnji Cooper NiceMock<MockBaz> nice_baz(MockBaz::MoveOnly{});
303b89a7cc2SEnji Cooper }
304b89a7cc2SEnji Cooper
305b89a7cc2SEnji Cooper // Tests that NiceMock<Mock> compiles where Mock is a user-defined
306*28f6c2f2SEnji Cooper // class (as opposed to ::testing::Mock).
TEST(NiceMockTest,AcceptsClassNamedMock)307b89a7cc2SEnji Cooper TEST(NiceMockTest, AcceptsClassNamedMock) {
308b89a7cc2SEnji Cooper NiceMock< ::Mock> nice;
309b89a7cc2SEnji Cooper EXPECT_CALL(nice, DoThis());
310b89a7cc2SEnji Cooper nice.DoThis();
311b89a7cc2SEnji Cooper }
312*28f6c2f2SEnji Cooper
TEST(NiceMockTest,IsNiceInDestructor)313*28f6c2f2SEnji Cooper TEST(NiceMockTest, IsNiceInDestructor) {
314*28f6c2f2SEnji Cooper {
315*28f6c2f2SEnji Cooper NiceMock<CallsMockMethodInDestructor> nice_on_destroy;
316*28f6c2f2SEnji Cooper // Don't add an expectation for the call before the mock goes out of scope.
317*28f6c2f2SEnji Cooper }
318*28f6c2f2SEnji Cooper }
319*28f6c2f2SEnji Cooper
TEST(NiceMockTest,IsNaggy_IsNice_IsStrict)320*28f6c2f2SEnji Cooper TEST(NiceMockTest, IsNaggy_IsNice_IsStrict) {
321*28f6c2f2SEnji Cooper NiceMock<MockFoo> nice_foo;
322*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsNaggy(&nice_foo));
323*28f6c2f2SEnji Cooper EXPECT_TRUE(Mock::IsNice(&nice_foo));
324*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsStrict(&nice_foo));
325*28f6c2f2SEnji Cooper }
326b89a7cc2SEnji Cooper
327b89a7cc2SEnji Cooper #if GTEST_HAS_STREAM_REDIRECTION
328b89a7cc2SEnji Cooper
329b89a7cc2SEnji Cooper // Tests that a naggy mock generates warnings for uninteresting calls.
TEST(NaggyMockTest,WarningForUninterestingCall)330b89a7cc2SEnji Cooper TEST(NaggyMockTest, WarningForUninterestingCall) {
331*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
332*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "warning");
333b89a7cc2SEnji Cooper
334b89a7cc2SEnji Cooper NaggyMock<MockFoo> naggy_foo;
335b89a7cc2SEnji Cooper
336b89a7cc2SEnji Cooper CaptureStdout();
337b89a7cc2SEnji Cooper naggy_foo.DoThis();
338b89a7cc2SEnji Cooper naggy_foo.DoThat(true);
339b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
340b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
341b89a7cc2SEnji Cooper
342*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
343b89a7cc2SEnji Cooper }
344b89a7cc2SEnji Cooper
345b89a7cc2SEnji Cooper // Tests that a naggy mock generates a warning for an uninteresting call
346b89a7cc2SEnji Cooper // that deletes the mock object.
TEST(NaggyMockTest,WarningForUninterestingCallAfterDeath)347b89a7cc2SEnji Cooper TEST(NaggyMockTest, WarningForUninterestingCallAfterDeath) {
348*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
349*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "warning");
350b89a7cc2SEnji Cooper
351b89a7cc2SEnji Cooper NaggyMock<MockFoo>* const naggy_foo = new NaggyMock<MockFoo>;
352b89a7cc2SEnji Cooper
353b89a7cc2SEnji Cooper ON_CALL(*naggy_foo, DoThis())
354b89a7cc2SEnji Cooper .WillByDefault(Invoke(naggy_foo, &MockFoo::Delete));
355b89a7cc2SEnji Cooper
356b89a7cc2SEnji Cooper CaptureStdout();
357b89a7cc2SEnji Cooper naggy_foo->DoThis();
358b89a7cc2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
359b89a7cc2SEnji Cooper HasSubstr("Uninteresting mock function call"));
360b89a7cc2SEnji Cooper
361*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
362b89a7cc2SEnji Cooper }
363b89a7cc2SEnji Cooper
364b89a7cc2SEnji Cooper #endif // GTEST_HAS_STREAM_REDIRECTION
365b89a7cc2SEnji Cooper
366b89a7cc2SEnji Cooper // Tests that a naggy mock allows expected calls.
TEST(NaggyMockTest,AllowsExpectedCall)367b89a7cc2SEnji Cooper TEST(NaggyMockTest, AllowsExpectedCall) {
368b89a7cc2SEnji Cooper NaggyMock<MockFoo> naggy_foo;
369b89a7cc2SEnji Cooper
370b89a7cc2SEnji Cooper EXPECT_CALL(naggy_foo, DoThis());
371b89a7cc2SEnji Cooper naggy_foo.DoThis();
372b89a7cc2SEnji Cooper }
373b89a7cc2SEnji Cooper
374b89a7cc2SEnji Cooper // Tests that an unexpected call on a naggy mock fails.
TEST(NaggyMockTest,UnexpectedCallFails)375b89a7cc2SEnji Cooper TEST(NaggyMockTest, UnexpectedCallFails) {
376b89a7cc2SEnji Cooper NaggyMock<MockFoo> naggy_foo;
377b89a7cc2SEnji Cooper
378b89a7cc2SEnji Cooper EXPECT_CALL(naggy_foo, DoThis()).Times(0);
379b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(naggy_foo.DoThis(),
380b89a7cc2SEnji Cooper "called more times than expected");
381b89a7cc2SEnji Cooper }
382b89a7cc2SEnji Cooper
383b89a7cc2SEnji Cooper // Tests that NaggyMock works with a mock class that has a non-default
384b89a7cc2SEnji Cooper // constructor.
TEST(NaggyMockTest,NonDefaultConstructor)385b89a7cc2SEnji Cooper TEST(NaggyMockTest, NonDefaultConstructor) {
386b89a7cc2SEnji Cooper NaggyMock<MockBar> naggy_bar("hi");
387b89a7cc2SEnji Cooper EXPECT_EQ("hi", naggy_bar.str());
388b89a7cc2SEnji Cooper
389b89a7cc2SEnji Cooper naggy_bar.This();
390b89a7cc2SEnji Cooper naggy_bar.That(5, true);
391b89a7cc2SEnji Cooper }
392b89a7cc2SEnji Cooper
393b89a7cc2SEnji Cooper // Tests that NaggyMock works with a mock class that has a 10-ary
394b89a7cc2SEnji Cooper // non-default constructor.
TEST(NaggyMockTest,NonDefaultConstructor10)395b89a7cc2SEnji Cooper TEST(NaggyMockTest, NonDefaultConstructor10) {
396*28f6c2f2SEnji Cooper NaggyMock<MockBar> naggy_bar('0', '1', "2", "3", '4', '5', "6", "7", true,
397*28f6c2f2SEnji Cooper false);
398b89a7cc2SEnji Cooper EXPECT_EQ("01234567TF", naggy_bar.str());
399b89a7cc2SEnji Cooper
400b89a7cc2SEnji Cooper naggy_bar.This();
401b89a7cc2SEnji Cooper naggy_bar.That(5, true);
402b89a7cc2SEnji Cooper }
403b89a7cc2SEnji Cooper
TEST(NaggyMockTest,AllowLeak)404b89a7cc2SEnji Cooper TEST(NaggyMockTest, AllowLeak) {
405b89a7cc2SEnji Cooper NaggyMock<MockFoo>* leaked = new NaggyMock<MockFoo>;
406b89a7cc2SEnji Cooper Mock::AllowLeak(leaked);
407b89a7cc2SEnji Cooper EXPECT_CALL(*leaked, DoThis());
408b89a7cc2SEnji Cooper leaked->DoThis();
409b89a7cc2SEnji Cooper }
410b89a7cc2SEnji Cooper
TEST(NaggyMockTest,MoveOnlyConstructor)411b89a7cc2SEnji Cooper TEST(NaggyMockTest, MoveOnlyConstructor) {
412*28f6c2f2SEnji Cooper NaggyMock<MockBaz> naggy_baz(MockBaz::MoveOnly{});
413b89a7cc2SEnji Cooper }
414b89a7cc2SEnji Cooper
415b89a7cc2SEnji Cooper // Tests that NaggyMock<Mock> compiles where Mock is a user-defined
416*28f6c2f2SEnji Cooper // class (as opposed to ::testing::Mock).
TEST(NaggyMockTest,AcceptsClassNamedMock)417b89a7cc2SEnji Cooper TEST(NaggyMockTest, AcceptsClassNamedMock) {
418b89a7cc2SEnji Cooper NaggyMock< ::Mock> naggy;
419b89a7cc2SEnji Cooper EXPECT_CALL(naggy, DoThis());
420b89a7cc2SEnji Cooper naggy.DoThis();
421b89a7cc2SEnji Cooper }
422*28f6c2f2SEnji Cooper
TEST(NaggyMockTest,IsNaggyInDestructor)423*28f6c2f2SEnji Cooper TEST(NaggyMockTest, IsNaggyInDestructor) {
424*28f6c2f2SEnji Cooper const std::string saved_flag = GMOCK_FLAG_GET(verbose);
425*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, "warning");
426*28f6c2f2SEnji Cooper CaptureStdout();
427*28f6c2f2SEnji Cooper
428*28f6c2f2SEnji Cooper {
429*28f6c2f2SEnji Cooper NaggyMock<CallsMockMethodInDestructor> naggy_on_destroy;
430*28f6c2f2SEnji Cooper // Don't add an expectation for the call before the mock goes out of scope.
431*28f6c2f2SEnji Cooper }
432*28f6c2f2SEnji Cooper
433*28f6c2f2SEnji Cooper EXPECT_THAT(GetCapturedStdout(),
434*28f6c2f2SEnji Cooper HasSubstr("Uninteresting mock function call"));
435*28f6c2f2SEnji Cooper
436*28f6c2f2SEnji Cooper GMOCK_FLAG_SET(verbose, saved_flag);
437*28f6c2f2SEnji Cooper }
438*28f6c2f2SEnji Cooper
TEST(NaggyMockTest,IsNaggy_IsNice_IsStrict)439*28f6c2f2SEnji Cooper TEST(NaggyMockTest, IsNaggy_IsNice_IsStrict) {
440*28f6c2f2SEnji Cooper NaggyMock<MockFoo> naggy_foo;
441*28f6c2f2SEnji Cooper EXPECT_TRUE(Mock::IsNaggy(&naggy_foo));
442*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsNice(&naggy_foo));
443*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsStrict(&naggy_foo));
444*28f6c2f2SEnji Cooper }
445b89a7cc2SEnji Cooper
446b89a7cc2SEnji Cooper // Tests that a strict mock allows expected calls.
TEST(StrictMockTest,AllowsExpectedCall)447b89a7cc2SEnji Cooper TEST(StrictMockTest, AllowsExpectedCall) {
448b89a7cc2SEnji Cooper StrictMock<MockFoo> strict_foo;
449b89a7cc2SEnji Cooper
450b89a7cc2SEnji Cooper EXPECT_CALL(strict_foo, DoThis());
451b89a7cc2SEnji Cooper strict_foo.DoThis();
452b89a7cc2SEnji Cooper }
453b89a7cc2SEnji Cooper
454b89a7cc2SEnji Cooper // Tests that an unexpected call on a strict mock fails.
TEST(StrictMockTest,UnexpectedCallFails)455b89a7cc2SEnji Cooper TEST(StrictMockTest, UnexpectedCallFails) {
456b89a7cc2SEnji Cooper StrictMock<MockFoo> strict_foo;
457b89a7cc2SEnji Cooper
458b89a7cc2SEnji Cooper EXPECT_CALL(strict_foo, DoThis()).Times(0);
459b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
460b89a7cc2SEnji Cooper "called more times than expected");
461b89a7cc2SEnji Cooper }
462b89a7cc2SEnji Cooper
463b89a7cc2SEnji Cooper // Tests that an uninteresting call on a strict mock fails.
TEST(StrictMockTest,UninterestingCallFails)464b89a7cc2SEnji Cooper TEST(StrictMockTest, UninterestingCallFails) {
465b89a7cc2SEnji Cooper StrictMock<MockFoo> strict_foo;
466b89a7cc2SEnji Cooper
467b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
468b89a7cc2SEnji Cooper "Uninteresting mock function call");
469b89a7cc2SEnji Cooper }
470b89a7cc2SEnji Cooper
471b89a7cc2SEnji Cooper // Tests that an uninteresting call on a strict mock fails, even if
472b89a7cc2SEnji Cooper // the call deletes the mock object.
TEST(StrictMockTest,UninterestingCallFailsAfterDeath)473b89a7cc2SEnji Cooper TEST(StrictMockTest, UninterestingCallFailsAfterDeath) {
474b89a7cc2SEnji Cooper StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>;
475b89a7cc2SEnji Cooper
476b89a7cc2SEnji Cooper ON_CALL(*strict_foo, DoThis())
477b89a7cc2SEnji Cooper .WillByDefault(Invoke(strict_foo, &MockFoo::Delete));
478b89a7cc2SEnji Cooper
479b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(),
480b89a7cc2SEnji Cooper "Uninteresting mock function call");
481b89a7cc2SEnji Cooper }
482b89a7cc2SEnji Cooper
483b89a7cc2SEnji Cooper // Tests that StrictMock works with a mock class that has a
484b89a7cc2SEnji Cooper // non-default constructor.
TEST(StrictMockTest,NonDefaultConstructor)485b89a7cc2SEnji Cooper TEST(StrictMockTest, NonDefaultConstructor) {
486b89a7cc2SEnji Cooper StrictMock<MockBar> strict_bar("hi");
487b89a7cc2SEnji Cooper EXPECT_EQ("hi", strict_bar.str());
488b89a7cc2SEnji Cooper
489b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
490b89a7cc2SEnji Cooper "Uninteresting mock function call");
491b89a7cc2SEnji Cooper }
492b89a7cc2SEnji Cooper
493b89a7cc2SEnji Cooper // Tests that StrictMock works with a mock class that has a 10-ary
494b89a7cc2SEnji Cooper // non-default constructor.
TEST(StrictMockTest,NonDefaultConstructor10)495b89a7cc2SEnji Cooper TEST(StrictMockTest, NonDefaultConstructor10) {
496*28f6c2f2SEnji Cooper StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f', "g", "h", true,
497*28f6c2f2SEnji Cooper false);
498b89a7cc2SEnji Cooper EXPECT_EQ("abcdefghTF", strict_bar.str());
499b89a7cc2SEnji Cooper
500b89a7cc2SEnji Cooper EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
501b89a7cc2SEnji Cooper "Uninteresting mock function call");
502b89a7cc2SEnji Cooper }
503b89a7cc2SEnji Cooper
TEST(StrictMockTest,AllowLeak)504b89a7cc2SEnji Cooper TEST(StrictMockTest, AllowLeak) {
505b89a7cc2SEnji Cooper StrictMock<MockFoo>* leaked = new StrictMock<MockFoo>;
506b89a7cc2SEnji Cooper Mock::AllowLeak(leaked);
507b89a7cc2SEnji Cooper EXPECT_CALL(*leaked, DoThis());
508b89a7cc2SEnji Cooper leaked->DoThis();
509b89a7cc2SEnji Cooper }
510b89a7cc2SEnji Cooper
TEST(StrictMockTest,MoveOnlyConstructor)511b89a7cc2SEnji Cooper TEST(StrictMockTest, MoveOnlyConstructor) {
512*28f6c2f2SEnji Cooper StrictMock<MockBaz> strict_baz(MockBaz::MoveOnly{});
513b89a7cc2SEnji Cooper }
514b89a7cc2SEnji Cooper
515b89a7cc2SEnji Cooper // Tests that StrictMock<Mock> compiles where Mock is a user-defined
516*28f6c2f2SEnji Cooper // class (as opposed to ::testing::Mock).
TEST(StrictMockTest,AcceptsClassNamedMock)517b89a7cc2SEnji Cooper TEST(StrictMockTest, AcceptsClassNamedMock) {
518b89a7cc2SEnji Cooper StrictMock< ::Mock> strict;
519b89a7cc2SEnji Cooper EXPECT_CALL(strict, DoThis());
520b89a7cc2SEnji Cooper strict.DoThis();
521b89a7cc2SEnji Cooper }
522*28f6c2f2SEnji Cooper
TEST(StrictMockTest,IsStrictInDestructor)523*28f6c2f2SEnji Cooper TEST(StrictMockTest, IsStrictInDestructor) {
524*28f6c2f2SEnji Cooper EXPECT_NONFATAL_FAILURE(
525*28f6c2f2SEnji Cooper {
526*28f6c2f2SEnji Cooper StrictMock<CallsMockMethodInDestructor> strict_on_destroy;
527*28f6c2f2SEnji Cooper // Don't add an expectation for the call before the mock goes out of
528*28f6c2f2SEnji Cooper // scope.
529*28f6c2f2SEnji Cooper },
530*28f6c2f2SEnji Cooper "Uninteresting mock function call");
531*28f6c2f2SEnji Cooper }
532*28f6c2f2SEnji Cooper
TEST(StrictMockTest,IsNaggy_IsNice_IsStrict)533*28f6c2f2SEnji Cooper TEST(StrictMockTest, IsNaggy_IsNice_IsStrict) {
534*28f6c2f2SEnji Cooper StrictMock<MockFoo> strict_foo;
535*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsNaggy(&strict_foo));
536*28f6c2f2SEnji Cooper EXPECT_FALSE(Mock::IsNice(&strict_foo));
537*28f6c2f2SEnji Cooper EXPECT_TRUE(Mock::IsStrict(&strict_foo));
538*28f6c2f2SEnji Cooper }
539b89a7cc2SEnji Cooper
540b89a7cc2SEnji Cooper } // namespace gmock_nice_strict_test
541b89a7cc2SEnji Cooper } // namespace testing
542