113481Sgiacomo.travaglini@arm.com// This file was GENERATED by command:
213481Sgiacomo.travaglini@arm.com//     pump.py gmock-generated-nice-strict.h.pump
313481Sgiacomo.travaglini@arm.com// DO NOT EDIT BY HAND!!!
413481Sgiacomo.travaglini@arm.com
513481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
613481Sgiacomo.travaglini@arm.com// All rights reserved.
713481Sgiacomo.travaglini@arm.com//
813481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
913481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1013481Sgiacomo.travaglini@arm.com// met:
1113481Sgiacomo.travaglini@arm.com//
1213481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1313481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1413481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1513481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1613481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1713481Sgiacomo.travaglini@arm.com// distribution.
1813481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
1913481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2013481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2113481Sgiacomo.travaglini@arm.com//
2213481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2313481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2413481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2513481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2613481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2713481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2813481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
2913481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3013481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3113481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3213481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3313481Sgiacomo.travaglini@arm.com//
3413481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3513481Sgiacomo.travaglini@arm.com
3613481Sgiacomo.travaglini@arm.com// Implements class templates NiceMock, NaggyMock, and StrictMock.
3713481Sgiacomo.travaglini@arm.com//
3813481Sgiacomo.travaglini@arm.com// Given a mock class MockFoo that is created using Google Mock,
3913481Sgiacomo.travaglini@arm.com// NiceMock<MockFoo> is a subclass of MockFoo that allows
4013481Sgiacomo.travaglini@arm.com// uninteresting calls (i.e. calls to mock methods that have no
4113481Sgiacomo.travaglini@arm.com// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo
4213481Sgiacomo.travaglini@arm.com// that prints a warning when an uninteresting call occurs, and
4313481Sgiacomo.travaglini@arm.com// StrictMock<MockFoo> is a subclass of MockFoo that treats all
4413481Sgiacomo.travaglini@arm.com// uninteresting calls as errors.
4513481Sgiacomo.travaglini@arm.com//
4613481Sgiacomo.travaglini@arm.com// Currently a mock is naggy by default, so MockFoo and
4713481Sgiacomo.travaglini@arm.com// NaggyMock<MockFoo> behave like the same.  However, we will soon
4813481Sgiacomo.travaglini@arm.com// switch the default behavior of mocks to be nice, as that in general
4913481Sgiacomo.travaglini@arm.com// leads to more maintainable tests.  When that happens, MockFoo will
5013481Sgiacomo.travaglini@arm.com// stop behaving like NaggyMock<MockFoo> and start behaving like
5113481Sgiacomo.travaglini@arm.com// NiceMock<MockFoo>.
5213481Sgiacomo.travaglini@arm.com//
5313481Sgiacomo.travaglini@arm.com// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of
5413481Sgiacomo.travaglini@arm.com// their respective base class, with up-to 10 arguments.  Therefore
5513481Sgiacomo.travaglini@arm.com// you can write NiceMock<MockFoo>(5, "a") to construct a nice mock
5613481Sgiacomo.travaglini@arm.com// where MockFoo has a constructor that accepts (int, const char*),
5713481Sgiacomo.travaglini@arm.com// for example.
5813481Sgiacomo.travaglini@arm.com//
5913481Sgiacomo.travaglini@arm.com// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,
6013481Sgiacomo.travaglini@arm.com// and StrictMock<MockFoo> only works for mock methods defined using
6113481Sgiacomo.travaglini@arm.com// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.
6213481Sgiacomo.travaglini@arm.com// If a mock method is defined in a base class of MockFoo, the "nice"
6313481Sgiacomo.travaglini@arm.com// or "strict" modifier may not affect it, depending on the compiler.
6413481Sgiacomo.travaglini@arm.com// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT
6513481Sgiacomo.travaglini@arm.com// supported.
6613481Sgiacomo.travaglini@arm.com//
6713481Sgiacomo.travaglini@arm.com// Another known limitation is that the constructors of the base mock
6813481Sgiacomo.travaglini@arm.com// cannot have arguments passed by non-const reference, which are
6913481Sgiacomo.travaglini@arm.com// banned by the Google C++ style guide anyway.
7013481Sgiacomo.travaglini@arm.com
7113481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
7213481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
7313481Sgiacomo.travaglini@arm.com
7413481Sgiacomo.travaglini@arm.com#include "gmock/gmock-spec-builders.h"
7513481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h"
7613481Sgiacomo.travaglini@arm.com
7713481Sgiacomo.travaglini@arm.comnamespace testing {
7813481Sgiacomo.travaglini@arm.com
7913481Sgiacomo.travaglini@arm.comtemplate <class MockClass>
8013481Sgiacomo.travaglini@arm.comclass NiceMock : public MockClass {
8113481Sgiacomo.travaglini@arm.com public:
8213481Sgiacomo.travaglini@arm.com  // We don't factor out the constructor body to a common method, as
8313481Sgiacomo.travaglini@arm.com  // we have to avoid a possible clash with members of MockClass.
8413481Sgiacomo.travaglini@arm.com  NiceMock() {
8513481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
8613481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
8713481Sgiacomo.travaglini@arm.com  }
8813481Sgiacomo.travaglini@arm.com
8913481Sgiacomo.travaglini@arm.com  // C++ doesn't (yet) allow inheritance of constructors, so we have
9013481Sgiacomo.travaglini@arm.com  // to define it for each arity.
9113481Sgiacomo.travaglini@arm.com  template <typename A1>
9213481Sgiacomo.travaglini@arm.com  explicit NiceMock(const A1& a1) : MockClass(a1) {
9313481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
9413481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
9513481Sgiacomo.travaglini@arm.com  }
9613481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2>
9713481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {
9813481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
9913481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
10013481Sgiacomo.travaglini@arm.com  }
10113481Sgiacomo.travaglini@arm.com
10213481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3>
10313481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {
10413481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
10513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
10613481Sgiacomo.travaglini@arm.com  }
10713481Sgiacomo.travaglini@arm.com
10813481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4>
10913481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3,
11013481Sgiacomo.travaglini@arm.com      const A4& a4) : MockClass(a1, a2, a3, a4) {
11113481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
11213481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
11313481Sgiacomo.travaglini@arm.com  }
11413481Sgiacomo.travaglini@arm.com
11513481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5>
11613481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
11713481Sgiacomo.travaglini@arm.com      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {
11813481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
11913481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
12013481Sgiacomo.travaglini@arm.com  }
12113481Sgiacomo.travaglini@arm.com
12213481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
12313481Sgiacomo.travaglini@arm.com      typename A6>
12413481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
12513481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {
12613481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
12713481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
12813481Sgiacomo.travaglini@arm.com  }
12913481Sgiacomo.travaglini@arm.com
13013481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
13113481Sgiacomo.travaglini@arm.com      typename A6, typename A7>
13213481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
13313481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,
13413481Sgiacomo.travaglini@arm.com      a6, a7) {
13513481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
13613481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
13713481Sgiacomo.travaglini@arm.com  }
13813481Sgiacomo.travaglini@arm.com
13913481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
14013481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8>
14113481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
14213481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,
14313481Sgiacomo.travaglini@arm.com      a2, a3, a4, a5, a6, a7, a8) {
14413481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
14513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
14613481Sgiacomo.travaglini@arm.com  }
14713481Sgiacomo.travaglini@arm.com
14813481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
14913481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9>
15013481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
15113481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8,
15213481Sgiacomo.travaglini@arm.com      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
15313481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
15413481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
15513481Sgiacomo.travaglini@arm.com  }
15613481Sgiacomo.travaglini@arm.com
15713481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
15813481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9, typename A10>
15913481Sgiacomo.travaglini@arm.com  NiceMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
16013481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,
16113481Sgiacomo.travaglini@arm.com      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
16213481Sgiacomo.travaglini@arm.com    ::testing::Mock::AllowUninterestingCalls(
16313481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
16413481Sgiacomo.travaglini@arm.com  }
16513481Sgiacomo.travaglini@arm.com
16613481Sgiacomo.travaglini@arm.com  virtual ~NiceMock() {
16713481Sgiacomo.travaglini@arm.com    ::testing::Mock::UnregisterCallReaction(
16813481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
16913481Sgiacomo.travaglini@arm.com  }
17013481Sgiacomo.travaglini@arm.com
17113481Sgiacomo.travaglini@arm.com private:
17213481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(NiceMock);
17313481Sgiacomo.travaglini@arm.com};
17413481Sgiacomo.travaglini@arm.com
17513481Sgiacomo.travaglini@arm.comtemplate <class MockClass>
17613481Sgiacomo.travaglini@arm.comclass NaggyMock : public MockClass {
17713481Sgiacomo.travaglini@arm.com public:
17813481Sgiacomo.travaglini@arm.com  // We don't factor out the constructor body to a common method, as
17913481Sgiacomo.travaglini@arm.com  // we have to avoid a possible clash with members of MockClass.
18013481Sgiacomo.travaglini@arm.com  NaggyMock() {
18113481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
18213481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
18313481Sgiacomo.travaglini@arm.com  }
18413481Sgiacomo.travaglini@arm.com
18513481Sgiacomo.travaglini@arm.com  // C++ doesn't (yet) allow inheritance of constructors, so we have
18613481Sgiacomo.travaglini@arm.com  // to define it for each arity.
18713481Sgiacomo.travaglini@arm.com  template <typename A1>
18813481Sgiacomo.travaglini@arm.com  explicit NaggyMock(const A1& a1) : MockClass(a1) {
18913481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
19013481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
19113481Sgiacomo.travaglini@arm.com  }
19213481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2>
19313481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {
19413481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
19513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
19613481Sgiacomo.travaglini@arm.com  }
19713481Sgiacomo.travaglini@arm.com
19813481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3>
19913481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {
20013481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
20113481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
20213481Sgiacomo.travaglini@arm.com  }
20313481Sgiacomo.travaglini@arm.com
20413481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4>
20513481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3,
20613481Sgiacomo.travaglini@arm.com      const A4& a4) : MockClass(a1, a2, a3, a4) {
20713481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
20813481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
20913481Sgiacomo.travaglini@arm.com  }
21013481Sgiacomo.travaglini@arm.com
21113481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5>
21213481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
21313481Sgiacomo.travaglini@arm.com      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {
21413481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
21513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
21613481Sgiacomo.travaglini@arm.com  }
21713481Sgiacomo.travaglini@arm.com
21813481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
21913481Sgiacomo.travaglini@arm.com      typename A6>
22013481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
22113481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {
22213481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
22313481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
22413481Sgiacomo.travaglini@arm.com  }
22513481Sgiacomo.travaglini@arm.com
22613481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
22713481Sgiacomo.travaglini@arm.com      typename A6, typename A7>
22813481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
22913481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,
23013481Sgiacomo.travaglini@arm.com      a6, a7) {
23113481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
23213481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
23313481Sgiacomo.travaglini@arm.com  }
23413481Sgiacomo.travaglini@arm.com
23513481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
23613481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8>
23713481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
23813481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,
23913481Sgiacomo.travaglini@arm.com      a2, a3, a4, a5, a6, a7, a8) {
24013481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
24113481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
24213481Sgiacomo.travaglini@arm.com  }
24313481Sgiacomo.travaglini@arm.com
24413481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
24513481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9>
24613481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
24713481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8,
24813481Sgiacomo.travaglini@arm.com      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
24913481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
25013481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
25113481Sgiacomo.travaglini@arm.com  }
25213481Sgiacomo.travaglini@arm.com
25313481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
25413481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9, typename A10>
25513481Sgiacomo.travaglini@arm.com  NaggyMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
25613481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,
25713481Sgiacomo.travaglini@arm.com      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
25813481Sgiacomo.travaglini@arm.com    ::testing::Mock::WarnUninterestingCalls(
25913481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
26013481Sgiacomo.travaglini@arm.com  }
26113481Sgiacomo.travaglini@arm.com
26213481Sgiacomo.travaglini@arm.com  virtual ~NaggyMock() {
26313481Sgiacomo.travaglini@arm.com    ::testing::Mock::UnregisterCallReaction(
26413481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
26513481Sgiacomo.travaglini@arm.com  }
26613481Sgiacomo.travaglini@arm.com
26713481Sgiacomo.travaglini@arm.com private:
26813481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(NaggyMock);
26913481Sgiacomo.travaglini@arm.com};
27013481Sgiacomo.travaglini@arm.com
27113481Sgiacomo.travaglini@arm.comtemplate <class MockClass>
27213481Sgiacomo.travaglini@arm.comclass StrictMock : public MockClass {
27313481Sgiacomo.travaglini@arm.com public:
27413481Sgiacomo.travaglini@arm.com  // We don't factor out the constructor body to a common method, as
27513481Sgiacomo.travaglini@arm.com  // we have to avoid a possible clash with members of MockClass.
27613481Sgiacomo.travaglini@arm.com  StrictMock() {
27713481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
27813481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
27913481Sgiacomo.travaglini@arm.com  }
28013481Sgiacomo.travaglini@arm.com
28113481Sgiacomo.travaglini@arm.com  // C++ doesn't (yet) allow inheritance of constructors, so we have
28213481Sgiacomo.travaglini@arm.com  // to define it for each arity.
28313481Sgiacomo.travaglini@arm.com  template <typename A1>
28413481Sgiacomo.travaglini@arm.com  explicit StrictMock(const A1& a1) : MockClass(a1) {
28513481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
28613481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
28713481Sgiacomo.travaglini@arm.com  }
28813481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2>
28913481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2) : MockClass(a1, a2) {
29013481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
29113481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
29213481Sgiacomo.travaglini@arm.com  }
29313481Sgiacomo.travaglini@arm.com
29413481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3>
29513481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3) : MockClass(a1, a2, a3) {
29613481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
29713481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
29813481Sgiacomo.travaglini@arm.com  }
29913481Sgiacomo.travaglini@arm.com
30013481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4>
30113481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3,
30213481Sgiacomo.travaglini@arm.com      const A4& a4) : MockClass(a1, a2, a3, a4) {
30313481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
30413481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
30513481Sgiacomo.travaglini@arm.com  }
30613481Sgiacomo.travaglini@arm.com
30713481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5>
30813481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
30913481Sgiacomo.travaglini@arm.com      const A5& a5) : MockClass(a1, a2, a3, a4, a5) {
31013481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
31113481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
31213481Sgiacomo.travaglini@arm.com  }
31313481Sgiacomo.travaglini@arm.com
31413481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
31513481Sgiacomo.travaglini@arm.com      typename A6>
31613481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
31713481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6) : MockClass(a1, a2, a3, a4, a5, a6) {
31813481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
31913481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
32013481Sgiacomo.travaglini@arm.com  }
32113481Sgiacomo.travaglini@arm.com
32213481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
32313481Sgiacomo.travaglini@arm.com      typename A6, typename A7>
32413481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
32513481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7) : MockClass(a1, a2, a3, a4, a5,
32613481Sgiacomo.travaglini@arm.com      a6, a7) {
32713481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
32813481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
32913481Sgiacomo.travaglini@arm.com  }
33013481Sgiacomo.travaglini@arm.com
33113481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
33213481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8>
33313481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
33413481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8) : MockClass(a1,
33513481Sgiacomo.travaglini@arm.com      a2, a3, a4, a5, a6, a7, a8) {
33613481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
33713481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
33813481Sgiacomo.travaglini@arm.com  }
33913481Sgiacomo.travaglini@arm.com
34013481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
34113481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9>
34213481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
34313481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8,
34413481Sgiacomo.travaglini@arm.com      const A9& a9) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9) {
34513481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
34613481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
34713481Sgiacomo.travaglini@arm.com  }
34813481Sgiacomo.travaglini@arm.com
34913481Sgiacomo.travaglini@arm.com  template <typename A1, typename A2, typename A3, typename A4, typename A5,
35013481Sgiacomo.travaglini@arm.com      typename A6, typename A7, typename A8, typename A9, typename A10>
35113481Sgiacomo.travaglini@arm.com  StrictMock(const A1& a1, const A2& a2, const A3& a3, const A4& a4,
35213481Sgiacomo.travaglini@arm.com      const A5& a5, const A6& a6, const A7& a7, const A8& a8, const A9& a9,
35313481Sgiacomo.travaglini@arm.com      const A10& a10) : MockClass(a1, a2, a3, a4, a5, a6, a7, a8, a9, a10) {
35413481Sgiacomo.travaglini@arm.com    ::testing::Mock::FailUninterestingCalls(
35513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
35613481Sgiacomo.travaglini@arm.com  }
35713481Sgiacomo.travaglini@arm.com
35813481Sgiacomo.travaglini@arm.com  virtual ~StrictMock() {
35913481Sgiacomo.travaglini@arm.com    ::testing::Mock::UnregisterCallReaction(
36013481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
36113481Sgiacomo.travaglini@arm.com  }
36213481Sgiacomo.travaglini@arm.com
36313481Sgiacomo.travaglini@arm.com private:
36413481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_(StrictMock);
36513481Sgiacomo.travaglini@arm.com};
36613481Sgiacomo.travaglini@arm.com
36713481Sgiacomo.travaglini@arm.com// The following specializations catch some (relatively more common)
36813481Sgiacomo.travaglini@arm.com// user errors of nesting nice and strict mocks.  They do NOT catch
36913481Sgiacomo.travaglini@arm.com// all possible errors.
37013481Sgiacomo.travaglini@arm.com
37113481Sgiacomo.travaglini@arm.com// These specializations are declared but not defined, as NiceMock,
37213481Sgiacomo.travaglini@arm.com// NaggyMock, and StrictMock cannot be nested.
37313481Sgiacomo.travaglini@arm.com
37413481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
37513481Sgiacomo.travaglini@arm.comclass NiceMock<NiceMock<MockClass> >;
37613481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
37713481Sgiacomo.travaglini@arm.comclass NiceMock<NaggyMock<MockClass> >;
37813481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
37913481Sgiacomo.travaglini@arm.comclass NiceMock<StrictMock<MockClass> >;
38013481Sgiacomo.travaglini@arm.com
38113481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
38213481Sgiacomo.travaglini@arm.comclass NaggyMock<NiceMock<MockClass> >;
38313481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
38413481Sgiacomo.travaglini@arm.comclass NaggyMock<NaggyMock<MockClass> >;
38513481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
38613481Sgiacomo.travaglini@arm.comclass NaggyMock<StrictMock<MockClass> >;
38713481Sgiacomo.travaglini@arm.com
38813481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
38913481Sgiacomo.travaglini@arm.comclass StrictMock<NiceMock<MockClass> >;
39013481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
39113481Sgiacomo.travaglini@arm.comclass StrictMock<NaggyMock<MockClass> >;
39213481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
39313481Sgiacomo.travaglini@arm.comclass StrictMock<StrictMock<MockClass> >;
39413481Sgiacomo.travaglini@arm.com
39513481Sgiacomo.travaglini@arm.com}  // namespace testing
39613481Sgiacomo.travaglini@arm.com
39713481Sgiacomo.travaglini@arm.com#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
398