113481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
213481Sgiacomo.travaglini@arm.com// All rights reserved.
313481Sgiacomo.travaglini@arm.com//
413481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
513481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
613481Sgiacomo.travaglini@arm.com// met:
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
913481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1013481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1113481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1213481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1313481Sgiacomo.travaglini@arm.com// distribution.
1413481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1513481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
1613481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
1713481Sgiacomo.travaglini@arm.com//
1813481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
1913481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2013481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2113481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2213481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2313481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2513481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
2613481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
2713481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
2813481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
2913481Sgiacomo.travaglini@arm.com//
3013481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3113481Sgiacomo.travaglini@arm.com
3213481Sgiacomo.travaglini@arm.com#include "gmock/gmock-generated-nice-strict.h"
3313481Sgiacomo.travaglini@arm.com
3413481Sgiacomo.travaglini@arm.com#include <string>
3513481Sgiacomo.travaglini@arm.com#include "gmock/gmock.h"
3613481Sgiacomo.travaglini@arm.com#include "gtest/gtest.h"
3713481Sgiacomo.travaglini@arm.com#include "gtest/gtest-spi.h"
3813481Sgiacomo.travaglini@arm.com
3913481Sgiacomo.travaglini@arm.com// This must not be defined inside the ::testing namespace, or it will
4013481Sgiacomo.travaglini@arm.com// clash with ::testing::Mock.
4113481Sgiacomo.travaglini@arm.comclass Mock {
4213481Sgiacomo.travaglini@arm.com public:
4313481Sgiacomo.travaglini@arm.com  Mock() {}
4413481Sgiacomo.travaglini@arm.com
4513481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(DoThis, void());
4613481Sgiacomo.travaglini@arm.com
4713481Sgiacomo.travaglini@arm.com private:
4813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(Mock);
4913481Sgiacomo.travaglini@arm.com};
5013481Sgiacomo.travaglini@arm.com
5113481Sgiacomo.travaglini@arm.comnamespace testing {
5213481Sgiacomo.travaglini@arm.comnamespace gmock_nice_strict_test {
5313481Sgiacomo.travaglini@arm.com
5413481Sgiacomo.travaglini@arm.comusing testing::internal::string;
5513481Sgiacomo.travaglini@arm.comusing testing::GMOCK_FLAG(verbose);
5613481Sgiacomo.travaglini@arm.comusing testing::HasSubstr;
5713481Sgiacomo.travaglini@arm.comusing testing::NaggyMock;
5813481Sgiacomo.travaglini@arm.comusing testing::NiceMock;
5913481Sgiacomo.travaglini@arm.comusing testing::StrictMock;
6013481Sgiacomo.travaglini@arm.com
6113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
6213481Sgiacomo.travaglini@arm.comusing testing::internal::CaptureStdout;
6313481Sgiacomo.travaglini@arm.comusing testing::internal::GetCapturedStdout;
6413481Sgiacomo.travaglini@arm.com#endif
6513481Sgiacomo.travaglini@arm.com
6613481Sgiacomo.travaglini@arm.com// Defines some mock classes needed by the tests.
6713481Sgiacomo.travaglini@arm.com
6813481Sgiacomo.travaglini@arm.comclass Foo {
6913481Sgiacomo.travaglini@arm.com public:
7013481Sgiacomo.travaglini@arm.com  virtual ~Foo() {}
7113481Sgiacomo.travaglini@arm.com
7213481Sgiacomo.travaglini@arm.com  virtual void DoThis() = 0;
7313481Sgiacomo.travaglini@arm.com  virtual int DoThat(bool flag) = 0;
7413481Sgiacomo.travaglini@arm.com};
7513481Sgiacomo.travaglini@arm.com
7613481Sgiacomo.travaglini@arm.comclass MockFoo : public Foo {
7713481Sgiacomo.travaglini@arm.com public:
7813481Sgiacomo.travaglini@arm.com  MockFoo() {}
7913481Sgiacomo.travaglini@arm.com  void Delete() { delete this; }
8013481Sgiacomo.travaglini@arm.com
8113481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(DoThis, void());
8213481Sgiacomo.travaglini@arm.com  MOCK_METHOD1(DoThat, int(bool flag));
8313481Sgiacomo.travaglini@arm.com
8413481Sgiacomo.travaglini@arm.com private:
8513481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockFoo);
8613481Sgiacomo.travaglini@arm.com};
8713481Sgiacomo.travaglini@arm.com
8813481Sgiacomo.travaglini@arm.comclass MockBar {
8913481Sgiacomo.travaglini@arm.com public:
9013481Sgiacomo.travaglini@arm.com  explicit MockBar(const string& s) : str_(s) {}
9113481Sgiacomo.travaglini@arm.com
9213481Sgiacomo.travaglini@arm.com  MockBar(char a1, char a2, string a3, string a4, int a5, int a6,
9313481Sgiacomo.travaglini@arm.com          const string& a7, const string& a8, bool a9, bool a10) {
9413481Sgiacomo.travaglini@arm.com    str_ = string() + a1 + a2 + a3 + a4 + static_cast<char>(a5) +
9513481Sgiacomo.travaglini@arm.com        static_cast<char>(a6) + a7 + a8 + (a9 ? 'T' : 'F') + (a10 ? 'T' : 'F');
9613481Sgiacomo.travaglini@arm.com  }
9713481Sgiacomo.travaglini@arm.com
9813481Sgiacomo.travaglini@arm.com  virtual ~MockBar() {}
9913481Sgiacomo.travaglini@arm.com
10013481Sgiacomo.travaglini@arm.com  const string& str() const { return str_; }
10113481Sgiacomo.travaglini@arm.com
10213481Sgiacomo.travaglini@arm.com  MOCK_METHOD0(This, int());
10313481Sgiacomo.travaglini@arm.com  MOCK_METHOD2(That, string(int, bool));
10413481Sgiacomo.travaglini@arm.com
10513481Sgiacomo.travaglini@arm.com private:
10613481Sgiacomo.travaglini@arm.com  string str_;
10713481Sgiacomo.travaglini@arm.com
10813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(MockBar);
10913481Sgiacomo.travaglini@arm.com};
11013481Sgiacomo.travaglini@arm.com
11113481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
11213481Sgiacomo.travaglini@arm.com
11313481Sgiacomo.travaglini@arm.com// Tests that a raw mock generates warnings for uninteresting calls.
11413481Sgiacomo.travaglini@arm.comTEST(RawMockTest, WarningForUninterestingCall) {
11513481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
11613481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "warning";
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com  MockFoo raw_foo;
11913481Sgiacomo.travaglini@arm.com
12013481Sgiacomo.travaglini@arm.com  CaptureStdout();
12113481Sgiacomo.travaglini@arm.com  raw_foo.DoThis();
12213481Sgiacomo.travaglini@arm.com  raw_foo.DoThat(true);
12313481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
12413481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
12513481Sgiacomo.travaglini@arm.com
12613481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
12713481Sgiacomo.travaglini@arm.com}
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com// Tests that a raw mock generates warnings for uninteresting calls
13013481Sgiacomo.travaglini@arm.com// that delete the mock object.
13113481Sgiacomo.travaglini@arm.comTEST(RawMockTest, WarningForUninterestingCallAfterDeath) {
13213481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
13313481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "warning";
13413481Sgiacomo.travaglini@arm.com
13513481Sgiacomo.travaglini@arm.com  MockFoo* const raw_foo = new MockFoo;
13613481Sgiacomo.travaglini@arm.com
13713481Sgiacomo.travaglini@arm.com  ON_CALL(*raw_foo, DoThis())
13813481Sgiacomo.travaglini@arm.com      .WillByDefault(Invoke(raw_foo, &MockFoo::Delete));
13913481Sgiacomo.travaglini@arm.com
14013481Sgiacomo.travaglini@arm.com  CaptureStdout();
14113481Sgiacomo.travaglini@arm.com  raw_foo->DoThis();
14213481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
14313481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
14413481Sgiacomo.travaglini@arm.com
14513481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
14613481Sgiacomo.travaglini@arm.com}
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.com// Tests that a raw mock generates informational logs for
14913481Sgiacomo.travaglini@arm.com// uninteresting calls.
15013481Sgiacomo.travaglini@arm.comTEST(RawMockTest, InfoForUninterestingCall) {
15113481Sgiacomo.travaglini@arm.com  MockFoo raw_foo;
15213481Sgiacomo.travaglini@arm.com
15313481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
15413481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "info";
15513481Sgiacomo.travaglini@arm.com  CaptureStdout();
15613481Sgiacomo.travaglini@arm.com  raw_foo.DoThis();
15713481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
15813481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
15913481Sgiacomo.travaglini@arm.com
16013481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
16113481Sgiacomo.travaglini@arm.com}
16213481Sgiacomo.travaglini@arm.com
16313481Sgiacomo.travaglini@arm.com// Tests that a nice mock generates no warning for uninteresting calls.
16413481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, NoWarningForUninterestingCall) {
16513481Sgiacomo.travaglini@arm.com  NiceMock<MockFoo> nice_foo;
16613481Sgiacomo.travaglini@arm.com
16713481Sgiacomo.travaglini@arm.com  CaptureStdout();
16813481Sgiacomo.travaglini@arm.com  nice_foo.DoThis();
16913481Sgiacomo.travaglini@arm.com  nice_foo.DoThat(true);
17013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", GetCapturedStdout());
17113481Sgiacomo.travaglini@arm.com}
17213481Sgiacomo.travaglini@arm.com
17313481Sgiacomo.travaglini@arm.com// Tests that a nice mock generates no warning for uninteresting calls
17413481Sgiacomo.travaglini@arm.com// that delete the mock object.
17513481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, NoWarningForUninterestingCallAfterDeath) {
17613481Sgiacomo.travaglini@arm.com  NiceMock<MockFoo>* const nice_foo = new NiceMock<MockFoo>;
17713481Sgiacomo.travaglini@arm.com
17813481Sgiacomo.travaglini@arm.com  ON_CALL(*nice_foo, DoThis())
17913481Sgiacomo.travaglini@arm.com      .WillByDefault(Invoke(nice_foo, &MockFoo::Delete));
18013481Sgiacomo.travaglini@arm.com
18113481Sgiacomo.travaglini@arm.com  CaptureStdout();
18213481Sgiacomo.travaglini@arm.com  nice_foo->DoThis();
18313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("", GetCapturedStdout());
18413481Sgiacomo.travaglini@arm.com}
18513481Sgiacomo.travaglini@arm.com
18613481Sgiacomo.travaglini@arm.com// Tests that a nice mock generates informational logs for
18713481Sgiacomo.travaglini@arm.com// uninteresting calls.
18813481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, InfoForUninterestingCall) {
18913481Sgiacomo.travaglini@arm.com  NiceMock<MockFoo> nice_foo;
19013481Sgiacomo.travaglini@arm.com
19113481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
19213481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "info";
19313481Sgiacomo.travaglini@arm.com  CaptureStdout();
19413481Sgiacomo.travaglini@arm.com  nice_foo.DoThis();
19513481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
19613481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
19713481Sgiacomo.travaglini@arm.com
19813481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
19913481Sgiacomo.travaglini@arm.com}
20013481Sgiacomo.travaglini@arm.com
20113481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STREAM_REDIRECTION
20213481Sgiacomo.travaglini@arm.com
20313481Sgiacomo.travaglini@arm.com// Tests that a nice mock allows expected calls.
20413481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, AllowsExpectedCall) {
20513481Sgiacomo.travaglini@arm.com  NiceMock<MockFoo> nice_foo;
20613481Sgiacomo.travaglini@arm.com
20713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(nice_foo, DoThis());
20813481Sgiacomo.travaglini@arm.com  nice_foo.DoThis();
20913481Sgiacomo.travaglini@arm.com}
21013481Sgiacomo.travaglini@arm.com
21113481Sgiacomo.travaglini@arm.com// Tests that an unexpected call on a nice mock fails.
21213481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, UnexpectedCallFails) {
21313481Sgiacomo.travaglini@arm.com  NiceMock<MockFoo> nice_foo;
21413481Sgiacomo.travaglini@arm.com
21513481Sgiacomo.travaglini@arm.com  EXPECT_CALL(nice_foo, DoThis()).Times(0);
21613481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(nice_foo.DoThis(), "called more times than expected");
21713481Sgiacomo.travaglini@arm.com}
21813481Sgiacomo.travaglini@arm.com
21913481Sgiacomo.travaglini@arm.com// Tests that NiceMock works with a mock class that has a non-default
22013481Sgiacomo.travaglini@arm.com// constructor.
22113481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, NonDefaultConstructor) {
22213481Sgiacomo.travaglini@arm.com  NiceMock<MockBar> nice_bar("hi");
22313481Sgiacomo.travaglini@arm.com  EXPECT_EQ("hi", nice_bar.str());
22413481Sgiacomo.travaglini@arm.com
22513481Sgiacomo.travaglini@arm.com  nice_bar.This();
22613481Sgiacomo.travaglini@arm.com  nice_bar.That(5, true);
22713481Sgiacomo.travaglini@arm.com}
22813481Sgiacomo.travaglini@arm.com
22913481Sgiacomo.travaglini@arm.com// Tests that NiceMock works with a mock class that has a 10-ary
23013481Sgiacomo.travaglini@arm.com// non-default constructor.
23113481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, NonDefaultConstructor10) {
23213481Sgiacomo.travaglini@arm.com  NiceMock<MockBar> nice_bar('a', 'b', "c", "d", 'e', 'f',
23313481Sgiacomo.travaglini@arm.com                             "g", "h", true, false);
23413481Sgiacomo.travaglini@arm.com  EXPECT_EQ("abcdefghTF", nice_bar.str());
23513481Sgiacomo.travaglini@arm.com
23613481Sgiacomo.travaglini@arm.com  nice_bar.This();
23713481Sgiacomo.travaglini@arm.com  nice_bar.That(5, true);
23813481Sgiacomo.travaglini@arm.com}
23913481Sgiacomo.travaglini@arm.com
24013481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
24113481Sgiacomo.travaglini@arm.com// Tests that NiceMock<Mock> compiles where Mock is a user-defined
24213481Sgiacomo.travaglini@arm.com// class (as opposed to ::testing::Mock).  We had to work around an
24313481Sgiacomo.travaglini@arm.com// MSVC 8.0 bug that caused the symbol Mock used in the definition of
24413481Sgiacomo.travaglini@arm.com// NiceMock to be looked up in the wrong context, and this test
24513481Sgiacomo.travaglini@arm.com// ensures that our fix works.
24613481Sgiacomo.travaglini@arm.com//
24713481Sgiacomo.travaglini@arm.com// We have to skip this test on Symbian and Windows Mobile, as it
24813481Sgiacomo.travaglini@arm.com// causes the program to crash there, for reasons unclear to us yet.
24913481Sgiacomo.travaglini@arm.comTEST(NiceMockTest, AcceptsClassNamedMock) {
25013481Sgiacomo.travaglini@arm.com  NiceMock< ::Mock> nice;
25113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(nice, DoThis());
25213481Sgiacomo.travaglini@arm.com  nice.DoThis();
25313481Sgiacomo.travaglini@arm.com}
25413481Sgiacomo.travaglini@arm.com#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
25513481Sgiacomo.travaglini@arm.com
25613481Sgiacomo.travaglini@arm.com#if GTEST_HAS_STREAM_REDIRECTION
25713481Sgiacomo.travaglini@arm.com
25813481Sgiacomo.travaglini@arm.com// Tests that a naggy mock generates warnings for uninteresting calls.
25913481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, WarningForUninterestingCall) {
26013481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
26113481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "warning";
26213481Sgiacomo.travaglini@arm.com
26313481Sgiacomo.travaglini@arm.com  NaggyMock<MockFoo> naggy_foo;
26413481Sgiacomo.travaglini@arm.com
26513481Sgiacomo.travaglini@arm.com  CaptureStdout();
26613481Sgiacomo.travaglini@arm.com  naggy_foo.DoThis();
26713481Sgiacomo.travaglini@arm.com  naggy_foo.DoThat(true);
26813481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
26913481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
27013481Sgiacomo.travaglini@arm.com
27113481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
27213481Sgiacomo.travaglini@arm.com}
27313481Sgiacomo.travaglini@arm.com
27413481Sgiacomo.travaglini@arm.com// Tests that a naggy mock generates a warning for an uninteresting call
27513481Sgiacomo.travaglini@arm.com// that deletes the mock object.
27613481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, WarningForUninterestingCallAfterDeath) {
27713481Sgiacomo.travaglini@arm.com  const string saved_flag = GMOCK_FLAG(verbose);
27813481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = "warning";
27913481Sgiacomo.travaglini@arm.com
28013481Sgiacomo.travaglini@arm.com  NaggyMock<MockFoo>* const naggy_foo = new NaggyMock<MockFoo>;
28113481Sgiacomo.travaglini@arm.com
28213481Sgiacomo.travaglini@arm.com  ON_CALL(*naggy_foo, DoThis())
28313481Sgiacomo.travaglini@arm.com      .WillByDefault(Invoke(naggy_foo, &MockFoo::Delete));
28413481Sgiacomo.travaglini@arm.com
28513481Sgiacomo.travaglini@arm.com  CaptureStdout();
28613481Sgiacomo.travaglini@arm.com  naggy_foo->DoThis();
28713481Sgiacomo.travaglini@arm.com  EXPECT_THAT(GetCapturedStdout(),
28813481Sgiacomo.travaglini@arm.com              HasSubstr("Uninteresting mock function call"));
28913481Sgiacomo.travaglini@arm.com
29013481Sgiacomo.travaglini@arm.com  GMOCK_FLAG(verbose) = saved_flag;
29113481Sgiacomo.travaglini@arm.com}
29213481Sgiacomo.travaglini@arm.com
29313481Sgiacomo.travaglini@arm.com#endif  // GTEST_HAS_STREAM_REDIRECTION
29413481Sgiacomo.travaglini@arm.com
29513481Sgiacomo.travaglini@arm.com// Tests that a naggy mock allows expected calls.
29613481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, AllowsExpectedCall) {
29713481Sgiacomo.travaglini@arm.com  NaggyMock<MockFoo> naggy_foo;
29813481Sgiacomo.travaglini@arm.com
29913481Sgiacomo.travaglini@arm.com  EXPECT_CALL(naggy_foo, DoThis());
30013481Sgiacomo.travaglini@arm.com  naggy_foo.DoThis();
30113481Sgiacomo.travaglini@arm.com}
30213481Sgiacomo.travaglini@arm.com
30313481Sgiacomo.travaglini@arm.com// Tests that an unexpected call on a naggy mock fails.
30413481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, UnexpectedCallFails) {
30513481Sgiacomo.travaglini@arm.com  NaggyMock<MockFoo> naggy_foo;
30613481Sgiacomo.travaglini@arm.com
30713481Sgiacomo.travaglini@arm.com  EXPECT_CALL(naggy_foo, DoThis()).Times(0);
30813481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(naggy_foo.DoThis(),
30913481Sgiacomo.travaglini@arm.com                          "called more times than expected");
31013481Sgiacomo.travaglini@arm.com}
31113481Sgiacomo.travaglini@arm.com
31213481Sgiacomo.travaglini@arm.com// Tests that NaggyMock works with a mock class that has a non-default
31313481Sgiacomo.travaglini@arm.com// constructor.
31413481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, NonDefaultConstructor) {
31513481Sgiacomo.travaglini@arm.com  NaggyMock<MockBar> naggy_bar("hi");
31613481Sgiacomo.travaglini@arm.com  EXPECT_EQ("hi", naggy_bar.str());
31713481Sgiacomo.travaglini@arm.com
31813481Sgiacomo.travaglini@arm.com  naggy_bar.This();
31913481Sgiacomo.travaglini@arm.com  naggy_bar.That(5, true);
32013481Sgiacomo.travaglini@arm.com}
32113481Sgiacomo.travaglini@arm.com
32213481Sgiacomo.travaglini@arm.com// Tests that NaggyMock works with a mock class that has a 10-ary
32313481Sgiacomo.travaglini@arm.com// non-default constructor.
32413481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, NonDefaultConstructor10) {
32513481Sgiacomo.travaglini@arm.com  NaggyMock<MockBar> naggy_bar('0', '1', "2", "3", '4', '5',
32613481Sgiacomo.travaglini@arm.com                               "6", "7", true, false);
32713481Sgiacomo.travaglini@arm.com  EXPECT_EQ("01234567TF", naggy_bar.str());
32813481Sgiacomo.travaglini@arm.com
32913481Sgiacomo.travaglini@arm.com  naggy_bar.This();
33013481Sgiacomo.travaglini@arm.com  naggy_bar.That(5, true);
33113481Sgiacomo.travaglini@arm.com}
33213481Sgiacomo.travaglini@arm.com
33313481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
33413481Sgiacomo.travaglini@arm.com// Tests that NaggyMock<Mock> compiles where Mock is a user-defined
33513481Sgiacomo.travaglini@arm.com// class (as opposed to ::testing::Mock).  We had to work around an
33613481Sgiacomo.travaglini@arm.com// MSVC 8.0 bug that caused the symbol Mock used in the definition of
33713481Sgiacomo.travaglini@arm.com// NaggyMock to be looked up in the wrong context, and this test
33813481Sgiacomo.travaglini@arm.com// ensures that our fix works.
33913481Sgiacomo.travaglini@arm.com//
34013481Sgiacomo.travaglini@arm.com// We have to skip this test on Symbian and Windows Mobile, as it
34113481Sgiacomo.travaglini@arm.com// causes the program to crash there, for reasons unclear to us yet.
34213481Sgiacomo.travaglini@arm.comTEST(NaggyMockTest, AcceptsClassNamedMock) {
34313481Sgiacomo.travaglini@arm.com  NaggyMock< ::Mock> naggy;
34413481Sgiacomo.travaglini@arm.com  EXPECT_CALL(naggy, DoThis());
34513481Sgiacomo.travaglini@arm.com  naggy.DoThis();
34613481Sgiacomo.travaglini@arm.com}
34713481Sgiacomo.travaglini@arm.com#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
34813481Sgiacomo.travaglini@arm.com
34913481Sgiacomo.travaglini@arm.com// Tests that a strict mock allows expected calls.
35013481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, AllowsExpectedCall) {
35113481Sgiacomo.travaglini@arm.com  StrictMock<MockFoo> strict_foo;
35213481Sgiacomo.travaglini@arm.com
35313481Sgiacomo.travaglini@arm.com  EXPECT_CALL(strict_foo, DoThis());
35413481Sgiacomo.travaglini@arm.com  strict_foo.DoThis();
35513481Sgiacomo.travaglini@arm.com}
35613481Sgiacomo.travaglini@arm.com
35713481Sgiacomo.travaglini@arm.com// Tests that an unexpected call on a strict mock fails.
35813481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, UnexpectedCallFails) {
35913481Sgiacomo.travaglini@arm.com  StrictMock<MockFoo> strict_foo;
36013481Sgiacomo.travaglini@arm.com
36113481Sgiacomo.travaglini@arm.com  EXPECT_CALL(strict_foo, DoThis()).Times(0);
36213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
36313481Sgiacomo.travaglini@arm.com                          "called more times than expected");
36413481Sgiacomo.travaglini@arm.com}
36513481Sgiacomo.travaglini@arm.com
36613481Sgiacomo.travaglini@arm.com// Tests that an uninteresting call on a strict mock fails.
36713481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, UninterestingCallFails) {
36813481Sgiacomo.travaglini@arm.com  StrictMock<MockFoo> strict_foo;
36913481Sgiacomo.travaglini@arm.com
37013481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(strict_foo.DoThis(),
37113481Sgiacomo.travaglini@arm.com                          "Uninteresting mock function call");
37213481Sgiacomo.travaglini@arm.com}
37313481Sgiacomo.travaglini@arm.com
37413481Sgiacomo.travaglini@arm.com// Tests that an uninteresting call on a strict mock fails, even if
37513481Sgiacomo.travaglini@arm.com// the call deletes the mock object.
37613481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, UninterestingCallFailsAfterDeath) {
37713481Sgiacomo.travaglini@arm.com  StrictMock<MockFoo>* const strict_foo = new StrictMock<MockFoo>;
37813481Sgiacomo.travaglini@arm.com
37913481Sgiacomo.travaglini@arm.com  ON_CALL(*strict_foo, DoThis())
38013481Sgiacomo.travaglini@arm.com      .WillByDefault(Invoke(strict_foo, &MockFoo::Delete));
38113481Sgiacomo.travaglini@arm.com
38213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(strict_foo->DoThis(),
38313481Sgiacomo.travaglini@arm.com                          "Uninteresting mock function call");
38413481Sgiacomo.travaglini@arm.com}
38513481Sgiacomo.travaglini@arm.com
38613481Sgiacomo.travaglini@arm.com// Tests that StrictMock works with a mock class that has a
38713481Sgiacomo.travaglini@arm.com// non-default constructor.
38813481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, NonDefaultConstructor) {
38913481Sgiacomo.travaglini@arm.com  StrictMock<MockBar> strict_bar("hi");
39013481Sgiacomo.travaglini@arm.com  EXPECT_EQ("hi", strict_bar.str());
39113481Sgiacomo.travaglini@arm.com
39213481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
39313481Sgiacomo.travaglini@arm.com                          "Uninteresting mock function call");
39413481Sgiacomo.travaglini@arm.com}
39513481Sgiacomo.travaglini@arm.com
39613481Sgiacomo.travaglini@arm.com// Tests that StrictMock works with a mock class that has a 10-ary
39713481Sgiacomo.travaglini@arm.com// non-default constructor.
39813481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, NonDefaultConstructor10) {
39913481Sgiacomo.travaglini@arm.com  StrictMock<MockBar> strict_bar('a', 'b', "c", "d", 'e', 'f',
40013481Sgiacomo.travaglini@arm.com                                 "g", "h", true, false);
40113481Sgiacomo.travaglini@arm.com  EXPECT_EQ("abcdefghTF", strict_bar.str());
40213481Sgiacomo.travaglini@arm.com
40313481Sgiacomo.travaglini@arm.com  EXPECT_NONFATAL_FAILURE(strict_bar.That(5, true),
40413481Sgiacomo.travaglini@arm.com                          "Uninteresting mock function call");
40513481Sgiacomo.travaglini@arm.com}
40613481Sgiacomo.travaglini@arm.com
40713481Sgiacomo.travaglini@arm.com#if !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
40813481Sgiacomo.travaglini@arm.com// Tests that StrictMock<Mock> compiles where Mock is a user-defined
40913481Sgiacomo.travaglini@arm.com// class (as opposed to ::testing::Mock).  We had to work around an
41013481Sgiacomo.travaglini@arm.com// MSVC 8.0 bug that caused the symbol Mock used in the definition of
41113481Sgiacomo.travaglini@arm.com// StrictMock to be looked up in the wrong context, and this test
41213481Sgiacomo.travaglini@arm.com// ensures that our fix works.
41313481Sgiacomo.travaglini@arm.com//
41413481Sgiacomo.travaglini@arm.com// We have to skip this test on Symbian and Windows Mobile, as it
41513481Sgiacomo.travaglini@arm.com// causes the program to crash there, for reasons unclear to us yet.
41613481Sgiacomo.travaglini@arm.comTEST(StrictMockTest, AcceptsClassNamedMock) {
41713481Sgiacomo.travaglini@arm.com  StrictMock< ::Mock> strict;
41813481Sgiacomo.travaglini@arm.com  EXPECT_CALL(strict, DoThis());
41913481Sgiacomo.travaglini@arm.com  strict.DoThis();
42013481Sgiacomo.travaglini@arm.com}
42113481Sgiacomo.travaglini@arm.com#endif  // !GTEST_OS_SYMBIAN && !GTEST_OS_WINDOWS_MOBILE
42213481Sgiacomo.travaglini@arm.com
42313481Sgiacomo.travaglini@arm.com}  // namespace gmock_nice_strict_test
42413481Sgiacomo.travaglini@arm.com}  // namespace testing
425