1f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Copyright 2008, Google Inc.
2f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// All rights reserved.
3f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
4f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Redistribution and use in source and binary forms, with or without
5f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// modification, are permitted provided that the following conditions are
6f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// met:
7f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
8f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions of source code must retain the above copyright
9f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// notice, this list of conditions and the following disclaimer.
10f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Redistributions in binary form must reproduce the above
11f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// copyright notice, this list of conditions and the following disclaimer
12f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// in the documentation and/or other materials provided with the
13f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// distribution.
14f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//     * Neither the name of Google Inc. nor the names of its
15f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// contributors may be used to endorse or promote products derived from
16f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// this software without specific prior written permission.
17f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
18f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
19f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
20f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
21f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
22f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
23f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
24f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
25f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
26f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
27f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
28f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
29f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
30f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Author: wan@google.com (Zhanyong Wan)
31f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
32f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gmock/gmock-generated-nice-strict.h"
33f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
34f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include <string>
35f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gmock/gmock.h"
36f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest.h"
37f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#include "gtest/gtest-spi.h"
38f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
39f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// This must not be defined inside the ::testing namespace, or it will
40f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// clash with ::testing::Mock.
41f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass Mock {
42f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
43f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  Mock() {}
44f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
45f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MOCK_METHOD0(DoThis, void());
46f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
47f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
48f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);
49f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
50f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
51f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace testing {
52f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochnamespace gmock_nice_strict_test {
53f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
54f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::internal::string;
55f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::GMOCK_FLAG(verbose);
56f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::HasSubstr;
57f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::NaggyMock;
58f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::NiceMock;
59f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::StrictMock;
60f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
61f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_STREAM_REDIRECTION
62f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::internal::CaptureStdout;
63f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochusing testing::internal::GetCapturedStdout;
64f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif
65f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
66f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Defines some mock classes needed by the tests.
67f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
68f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass Foo {
69f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
70f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual ~Foo() {}
71f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
72f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual void DoThis() = 0;
73f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual int DoThat(bool flag) = 0;
74f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
75f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
76f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass MockFoo : public Foo {
77f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
78f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MockFoo() {}
79f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  void Delete() { delete this; }
80f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
81f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MOCK_METHOD0(DoThis, void());
82f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MOCK_METHOD1(DoThat, int(bool flag));
83f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
84f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
85f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
86f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
87f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
88f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdochclass MockBar {
89f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch public:
90f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  explicit MockBar(const string& s) : str_(s) {}
91f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
92f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MockBar(char a1, char a2, string a3, string a4, int a5, int a6,
93f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch          const string& a7, const string& a8, bool a9, bool a10) {
94f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch    str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) +
95f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch        static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F');
96f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  }
97f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
98f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  virtual ~MockBar() {}
99f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
100f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string& str() const { return str_; }
101f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
102f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MOCK_METHOD0(This, int());
103f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MOCK_METHOD2(That, string(int, bool));
104f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
105f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch private:
106f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  string str_;
107f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
108f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar);
109f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch};
110f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
111f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_STREAM_REDIRECTION
112f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
113f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a raw mock generates warnings for uninteresting calls.
114f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(RawMockTest, WarningForUninterestingCall) {
115f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
116f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "warning";
117f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
118f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MockFoo raw_foo;
119f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
120f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
121f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  raw_foo.DoThis();
122f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  raw_foo.DoThat(true);
123f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
124f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
125f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
126f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
127f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
128f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
129f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a raw mock generates warnings for uninteresting calls
130f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// that delete the mock object.
131f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(RawMockTest, WarningForUninterestingCallAfterDeath) {
132f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
133f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "warning";
134f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
135f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MockFoo* const raw_foo = new MockFoo;
136f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
137f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ON_CALL(*raw_foo, DoThis())
138f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      .WillByDefault(Invoke(raw_foo, &MockFoo::Delete));
139f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
140f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
141f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  raw_foo->DoThis();
142f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
143f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
144f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
145f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
146f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
147f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
148f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a raw mock generates informational logs for
149f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// uninteresting calls.
150f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(RawMockTest, InfoForUninterestingCall) {
151f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  MockFoo raw_foo;
152f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
153f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
154f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "info";
155f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
156f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  raw_foo.DoThis();
157f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
158f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
159f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
160f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
161f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
162f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
163f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls.
164f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCall) {
165f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockFoo> nice_foo;
166f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
167f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
168f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_foo.DoThis();
169f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_foo.DoThat(true);
170f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("", GetCapturedStdout());
171f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
172f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
173f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a nice mock generates no warning for uninteresting calls
174f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// that delete the mock object.
175f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) {
176f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>;
177f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
178f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ON_CALL(*nice_foo, DoThis())
179f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      .WillByDefault(Invoke(nice_foo, &MockFoo::Delete));
180f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
181f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
182f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_foo->DoThis();
183f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("", GetCapturedStdout());
184f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
185f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
186f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a nice mock generates informational logs for
187f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// uninteresting calls.
188f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, InfoForUninterestingCall) {
189f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockFoo> nice_foo;
190f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
191f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
192f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "info";
193f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
194f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_foo.DoThis();
195f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
196f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
197f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
198f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
199f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
200f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
201f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // GTEST_HAS_STREAM_REDIRECTION
202f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
203f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a nice mock allows expected calls.
204f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, AllowsExpectedCall) {
205f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockFoo> nice_foo;
206f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
207f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(nice_foo, DoThis());
208f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_foo.DoThis();
209f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
210f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
211f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that an unexpected call on a nice mock fails.
212f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, UnexpectedCallFails) {
213f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockFoo> nice_foo;
214f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
215f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(nice_foo, DoThis()).Times(0);
216f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected");
217f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
218f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
219f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NiceMock works with a mock class that has a non-default
220f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// constructor.
221f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, NonDefaultConstructor) {
222f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockBar> nice_bar("hi");
223f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("hi", nice_bar.str());
224f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
225f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_bar.This();
226f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_bar.That(5, true);
227f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
228f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
229f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NiceMock works with a mock class that has a 10-ary
230f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// non-default constructor.
231f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, NonDefaultConstructor10) {
232f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f',
233f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                             "g", "h", true, false);
234f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("abcdefghTF", nice_bar.str());
235f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
236f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_bar.This();
237f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice_bar.That(5, true);
238f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
239f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
240f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
241f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NiceMock<Mock> compiles where Mock is a user-defined
242f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// class (as opposed to ::testing::Mock).  We had to work around an
243f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of
244f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// NiceMock to be looked up in the wrong context, and this test
245f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ensures that our fix works.
246f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
247f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it
248f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// causes the program to crash there, for reasons unclear to us yet.
249f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NiceMockTest, AcceptsClassNamedMock) {
250f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NiceMock< ::Mock> nice;
251f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(nice, DoThis());
252f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  nice.DoThis();
253f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
254f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
255f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
256f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if GTEST_HAS_STREAM_REDIRECTION
257f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
258f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a naggy mock generates warnings for uninteresting calls.
259f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, WarningForUninterestingCall) {
260f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
261f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "warning";
262f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
263f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockFoo> naggy_foo;
264f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
265f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
266f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_foo.DoThis();
267f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_foo.DoThat(true);
268f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
269f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
270f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
271f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
272f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
273f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
274f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a naggy mock generates a warning for an uninteresting call
275f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// that deletes the mock object.
276f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, WarningForUninterestingCallAfterDeath) {
277f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  const string saved_flag = GMOCK_FLAG(verbose);
278f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = "warning";
279f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
280f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockFoo>* const naggy_foo = new NaggyMock<MockFoo>;
281f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
282f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ON_CALL(*naggy_foo, DoThis())
283f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      .WillByDefault(Invoke(naggy_foo, &MockFoo::Delete));
284f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
285f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  CaptureStdout();
286f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_foo->DoThis();
287f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_THAT(GetCapturedStdout(),
288f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch              HasSubstr("Uninteresting mock function call"));
289f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
290f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  GMOCK_FLAG(verbose) = saved_flag;
291f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
292f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
293f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // GTEST_HAS_STREAM_REDIRECTION
294f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
295f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a naggy mock allows expected calls.
296f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, AllowsExpectedCall) {
297f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockFoo> naggy_foo;
298f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
299f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(naggy_foo, DoThis());
300f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_foo.DoThis();
301f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
302f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
303f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that an unexpected call on a naggy mock fails.
304f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, UnexpectedCallFails) {
305f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockFoo> naggy_foo;
306f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
307f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(naggy_foo, DoThis()).Times(0);
308f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(naggy_foo.DoThis(),
309f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "called more times than expected");
310f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
311f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
312f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NaggyMock works with a mock class that has a non-default
313f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// constructor.
314f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, NonDefaultConstructor) {
315f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockBar> naggy_bar("hi");
316f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("hi", naggy_bar.str());
317f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
318f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_bar.This();
319f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_bar.That(5, true);
320f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
321f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
322f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NaggyMock works with a mock class that has a 10-ary
323f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// non-default constructor.
324f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, NonDefaultConstructor10) {
325f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock<MockBar> naggy_bar('0', '1', "2", "3", '4', '5',
326f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                               "6", "7", true, false);
327f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("01234567TF", naggy_bar.str());
328f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
329f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_bar.This();
330f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy_bar.That(5, true);
331f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
332f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
333f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
334f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that NaggyMock<Mock> compiles where Mock is a user-defined
335f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// class (as opposed to ::testing::Mock).  We had to work around an
336f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of
337f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// NaggyMock to be looked up in the wrong context, and this test
338f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ensures that our fix works.
339f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
340f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it
341f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// causes the program to crash there, for reasons unclear to us yet.
342f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(NaggyMockTest, AcceptsClassNamedMock) {
343f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  NaggyMock< ::Mock> naggy;
344f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(naggy, DoThis());
345f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  naggy.DoThis();
346f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
347f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
348f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
349f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that a strict mock allows expected calls.
350f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, AllowsExpectedCall) {
351f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockFoo> strict_foo;
352f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
353f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(strict_foo, DoThis());
354f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  strict_foo.DoThis();
355f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
356f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
357f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that an unexpected call on a strict mock fails.
358f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, UnexpectedCallFails) {
359f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockFoo> strict_foo;
360f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
361f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(strict_foo, DoThis()).Times(0);
362f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
363f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "called more times than expected");
364f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
365f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
366f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that an uninteresting call on a strict mock fails.
367f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, UninterestingCallFails) {
368f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockFoo> strict_foo;
369f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
370f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
371f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "Uninteresting mock function call");
372f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
373f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
374f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that an uninteresting call on a strict mock fails, even if
375f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// the call deletes the mock object.
376f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, UninterestingCallFailsAfterDeath) {
377f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>;
378f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
379f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  ON_CALL(*strict_foo, DoThis())
380f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch      .WillByDefault(Invoke(strict_foo, &MockFoo::Delete));
381f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
382f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(),
383f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "Uninteresting mock function call");
384f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
385f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
386f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that StrictMock works with a mock class that has a
387f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// non-default constructor.
388f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, NonDefaultConstructor) {
389f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockBar> strict_bar("hi");
390f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("hi", strict_bar.str());
391f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
392f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
393f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "Uninteresting mock function call");
394f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
395f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
396f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that StrictMock works with a mock class that has a 10-ary
397f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// non-default constructor.
398f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, NonDefaultConstructor10) {
399f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f',
400f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                                 "g", "h", true, false);
401f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_EQ("abcdefghTF", strict_bar.str());
402f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
403f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
404f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch                          "Uninteresting mock function call");
405f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
406f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
407f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
408f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// Tests that StrictMock<Mock> compiles where Mock is a user-defined
409f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// class (as opposed to ::testing::Mock).  We had to work around an
410f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// MSVC 8.0 bug that caused the symbol Mock used in the definition of
411f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// StrictMock to be looked up in the wrong context, and this test
412f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// ensures that our fix works.
413f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch//
414f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// We have to skip this test on Symbian and Windows Mobile, as it
415f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch// causes the program to crash there, for reasons unclear to us yet.
416f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen MurdochTEST(StrictMockTest, AcceptsClassNamedMock) {
417f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  StrictMock< ::Mock> strict;
418f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  EXPECT_CALL(strict, DoThis());
419f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch  strict.DoThis();
420f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}
421f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
422f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch
423f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace gmock_nice_strict_test
424f91f0611dbaf29ca0f1d4aecb357ce243a19d2faBen Murdoch}  // namespace testing
425