1c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Copyright 2008, Google Inc.
2c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// All rights reserved.
3c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
4c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Redistribution and use in source and binary forms, with or without
5c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// modification, are permitted provided that the following conditions are
6c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// met:
7c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
8c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions of source code must retain the above copyright
9c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// notice, this list of conditions and the following disclaimer.
10c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Redistributions in binary form must reproduce the above
11c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// in the documentation and/or other materials provided with the
13c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// distribution.
14c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// contributors may be used to endorse or promote products derived from
16c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// this software without specific prior written permission.
17c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
18c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
30c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Author: wan@google.com (Zhanyong Wan)
31c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
32dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock-generated-nice-strict.h"
33c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
34c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#include <string>
35dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gmock/gmock.h"
36dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest.h"
37dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#include "gtest/gtest-spi.h"
38c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
39c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// This must not be defined inside the ::testing namespace, or it will
40c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// clash with ::testing::Mock.
41c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Mock {
42c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
43c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  Mock() {}
44c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
45c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(DoThis, void());
46c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
47c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
48c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);
49c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
50c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
51c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace testing {
52c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochnamespace gmock_nice_strict_test {
53c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
54c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::string;
55c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::GMOCK_FLAG(verbose);
56c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::HasSubstr;
57c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::NiceMock;
58c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::StrictMock;
59c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
60dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if GTEST_HAS_STREAM_REDIRECTION
61c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::CaptureStdout;
62c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochusing testing::internal::GetCapturedStdout;
63dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif
64c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
65c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Defines some mock classes needed by the tests.
66c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
67c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass Foo {
68c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
69c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~Foo() {}
70c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
71c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual void DoThis() = 0;
72c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual int DoThat(bool flag) = 0;
73c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
74c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
75c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockFoo : public Foo {
76c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
77c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockFoo() {}
78c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  void Delete() { delete this; }
79c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
80c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(DoThis, void());
81c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD1(DoThat, int(bool flag));
82c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
83c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
84c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
85c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
86c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
87c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdochclass MockBar {
88c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch public:
89c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  explicit MockBar(const string& s) : str_(s) {}
90c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
91c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MockBar(char a1, char a2, string a3, string a4, int a5, int a6,
92c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch          const string& a7, const string& a8, bool a9, bool a10) {
93c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch    str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) +
94c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch        static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F');
95c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  }
96c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
97c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  virtual ~MockBar() {}
98c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
99c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  const string& str() const { return str_; }
100c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
101c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD0(This, int());
102c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  MOCK_METHOD2(That, string(int, bool));
103c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
104c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch private:
105c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  string str_;
106c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
107c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar);
108c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch};
109c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
110dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#if GTEST_HAS_STREAM_REDIRECTION
111c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
112c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls.
113c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCall) {
114c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockFoo> nice_foo;
115c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
116c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CaptureStdout();
117c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo.DoThis();
118c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo.DoThat(true);
119c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", GetCapturedStdout().c_str());
120c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
121c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
122c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls
123c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// that delete the mock object.
124c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) {
125c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>;
126c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
127c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ON_CALL(*nice_foo, DoThis())
128c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillByDefault(Invoke(nice_foo, &MockFoo::Delete));
129c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
130c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CaptureStdout();
131c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo->DoThis();
132c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_STREQ("", GetCapturedStdout().c_str());
133c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
134c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
135c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock generates informational logs for
136c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// uninteresting calls.
137c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, InfoForUninterestingCall) {
138c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockFoo> nice_foo;
139c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
1403345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  const string saved_flag = GMOCK_FLAG(verbose);
141c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  GMOCK_FLAG(verbose) = "info";
142c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CaptureStdout();
143c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo.DoThis();
144c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
145c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              HasSubstr("Uninteresting mock function call"));
146c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
147c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  CaptureStdout();
148c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo.DoThat(true);
149c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
150c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch              HasSubstr("Uninteresting mock function call"));
1513345a6884c488ff3a535c2c9acdd33d74b37e311Iain Merrick  GMOCK_FLAG(verbose) = saved_flag;
152c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
153c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
154dc0f95d653279beabeb9817299e2902918ba123eKristian Monsen#endif  // GTEST_HAS_STREAM_REDIRECTION
155c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
156c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a nice mock allows expected calls.
157c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, AllowsExpectedCall) {
158c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockFoo> nice_foo;
159c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
160c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(nice_foo, DoThis());
161c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_foo.DoThis();
162c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
163c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
164c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an unexpected call on a nice mock fails.
165c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, UnexpectedCallFails) {
166c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockFoo> nice_foo;
167c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
168c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(nice_foo, DoThis()).Times(0);
169c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected");
170c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
171c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
172c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock works with a mock class that has a non-default
173c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// constructor.
174c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NonDefaultConstructor) {
175c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockBar> nice_bar("hi");
176c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("hi", nice_bar.str());
177c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
178c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_bar.This();
179c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_bar.That(5, true);
180c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
181c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
182c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock works with a mock class that has a 10-ary
183c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor.
184c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, NonDefaultConstructor10) {
185c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f',
186c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                             "g", "h", true, false);
187c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("abcdefghTF", nice_bar.str());
188c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
189c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_bar.This();
190c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice_bar.That(5, true);
191c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
192c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
193c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
194c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that NiceMock<Mock> compiles where Mock is a user-defined
195c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class (as opposed to ::testing::Mock).  We had to workaround an
196c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of
197c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// NiceMock to be looked up in the wrong context, and this test
198c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ensures that our fix works.
199c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
200c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it
201c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// causes the program to crash there, for reasons unclear to us yet.
202c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(NiceMockTest, AcceptsClassNamedMock) {
203c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  NiceMock< ::Mock> nice;
204c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(nice, DoThis());
205c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  nice.DoThis();
206c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
207c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
208c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
209c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that a strict mock allows expected calls.
210c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, AllowsExpectedCall) {
211c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockFoo> strict_foo;
212c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
213c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(strict_foo, DoThis());
214c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  strict_foo.DoThis();
215c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
216c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
217c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an unexpected call on a strict mock fails.
218c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UnexpectedCallFails) {
219c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockFoo> strict_foo;
220c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
221c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(strict_foo, DoThis()).Times(0);
222c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
223c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          "called more times than expected");
224c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
225c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
226c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an uninteresting call on a strict mock fails.
227c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UninterestingCallFails) {
228c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockFoo> strict_foo;
229c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
230c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
231c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          "Uninteresting mock function call");
232c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
233c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
234c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that an uninteresting call on a strict mock fails, even if
235c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// the call deletes the mock object.
236c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, UninterestingCallFailsAfterDeath) {
237c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>;
238c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
239c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  ON_CALL(*strict_foo, DoThis())
240c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch      .WillByDefault(Invoke(strict_foo, &MockFoo::Delete));
241c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
242c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(),
243c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          "Uninteresting mock function call");
244c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
245c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
246c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock works with a mock class that has a
247c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor.
248c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, NonDefaultConstructor) {
249c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockBar> strict_bar("hi");
250c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("hi", strict_bar.str());
251c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
252c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
253c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          "Uninteresting mock function call");
254c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
255c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
256c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock works with a mock class that has a 10-ary
257c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// non-default constructor.
258c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, NonDefaultConstructor10) {
259c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f',
260c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                                 "g", "h", true, false);
261c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_EQ("abcdefghTF", strict_bar.str());
262c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
263c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
264c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch                          "Uninteresting mock function call");
265c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
266c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
267c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
268c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// Tests that StrictMock<Mock> compiles where Mock is a user-defined
269c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// class (as opposed to ::testing::Mock).  We had to workaround an
270c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of
271c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// StrictMock to be looked up in the wrong context, and this test
272c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// ensures that our fix works.
273c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch//
274c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it
275c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch// causes the program to crash there, for reasons unclear to us yet.
276c407dc5cd9bdc5668497f21b26b09d988ab439deBen MurdochTEST(StrictMockTest, AcceptsClassNamedMock) {
277c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  StrictMock< ::Mock> strict;
278c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  EXPECT_CALL(strict, DoThis());
279c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch  strict.DoThis();
280c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}
281c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
282c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch
283c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace gmock_nice_strict_test
284c407dc5cd9bdc5668497f21b26b09d988ab439deBen Murdoch}  // namespace testing
285