113481Sgiacomo.travaglini@arm.com$$ -*- mode: c++; -*-
213481Sgiacomo.travaglini@arm.com$$ This is a Pump source file.  Please use Pump to convert it to
313481Sgiacomo.travaglini@arm.com$$ gmock-generated-nice-strict.h.
413481Sgiacomo.travaglini@arm.com$$
513481Sgiacomo.travaglini@arm.com$var n = 10  $$ The maximum arity we support.
613481Sgiacomo.travaglini@arm.com// Copyright 2008, Google Inc.
713481Sgiacomo.travaglini@arm.com// All rights reserved.
813481Sgiacomo.travaglini@arm.com//
913481Sgiacomo.travaglini@arm.com// Redistribution and use in source and binary forms, with or without
1013481Sgiacomo.travaglini@arm.com// modification, are permitted provided that the following conditions are
1113481Sgiacomo.travaglini@arm.com// met:
1213481Sgiacomo.travaglini@arm.com//
1313481Sgiacomo.travaglini@arm.com//     * Redistributions of source code must retain the above copyright
1413481Sgiacomo.travaglini@arm.com// notice, this list of conditions and the following disclaimer.
1513481Sgiacomo.travaglini@arm.com//     * Redistributions in binary form must reproduce the above
1613481Sgiacomo.travaglini@arm.com// copyright notice, this list of conditions and the following disclaimer
1713481Sgiacomo.travaglini@arm.com// in the documentation and/or other materials provided with the
1813481Sgiacomo.travaglini@arm.com// distribution.
1913481Sgiacomo.travaglini@arm.com//     * Neither the name of Google Inc. nor the names of its
2013481Sgiacomo.travaglini@arm.com// contributors may be used to endorse or promote products derived from
2113481Sgiacomo.travaglini@arm.com// this software without specific prior written permission.
2213481Sgiacomo.travaglini@arm.com//
2313481Sgiacomo.travaglini@arm.com// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
2413481Sgiacomo.travaglini@arm.com// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
2513481Sgiacomo.travaglini@arm.com// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
2613481Sgiacomo.travaglini@arm.com// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
2713481Sgiacomo.travaglini@arm.com// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
2813481Sgiacomo.travaglini@arm.com// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
2913481Sgiacomo.travaglini@arm.com// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
3013481Sgiacomo.travaglini@arm.com// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
3113481Sgiacomo.travaglini@arm.com// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
3213481Sgiacomo.travaglini@arm.com// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
3313481Sgiacomo.travaglini@arm.com// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
3413481Sgiacomo.travaglini@arm.com//
3513481Sgiacomo.travaglini@arm.com// Author: wan@google.com (Zhanyong Wan)
3613481Sgiacomo.travaglini@arm.com
3713481Sgiacomo.travaglini@arm.com// Implements class templates NiceMock, NaggyMock, and StrictMock.
3813481Sgiacomo.travaglini@arm.com//
3913481Sgiacomo.travaglini@arm.com// Given a mock class MockFoo that is created using Google Mock,
4013481Sgiacomo.travaglini@arm.com// NiceMock<MockFoo> is a subclass of MockFoo that allows
4113481Sgiacomo.travaglini@arm.com// uninteresting calls (i.e. calls to mock methods that have no
4213481Sgiacomo.travaglini@arm.com// EXPECT_CALL specs), NaggyMock<MockFoo> is a subclass of MockFoo
4313481Sgiacomo.travaglini@arm.com// that prints a warning when an uninteresting call occurs, and
4413481Sgiacomo.travaglini@arm.com// StrictMock<MockFoo> is a subclass of MockFoo that treats all
4513481Sgiacomo.travaglini@arm.com// uninteresting calls as errors.
4613481Sgiacomo.travaglini@arm.com//
4713481Sgiacomo.travaglini@arm.com// Currently a mock is naggy by default, so MockFoo and
4813481Sgiacomo.travaglini@arm.com// NaggyMock<MockFoo> behave like the same.  However, we will soon
4913481Sgiacomo.travaglini@arm.com// switch the default behavior of mocks to be nice, as that in general
5013481Sgiacomo.travaglini@arm.com// leads to more maintainable tests.  When that happens, MockFoo will
5113481Sgiacomo.travaglini@arm.com// stop behaving like NaggyMock<MockFoo> and start behaving like
5213481Sgiacomo.travaglini@arm.com// NiceMock<MockFoo>.
5313481Sgiacomo.travaglini@arm.com//
5413481Sgiacomo.travaglini@arm.com// NiceMock, NaggyMock, and StrictMock "inherit" the constructors of
5513481Sgiacomo.travaglini@arm.com// their respective base class, with up-to $n arguments.  Therefore
5613481Sgiacomo.travaglini@arm.com// you can write NiceMock<MockFoo>(5, "a") to construct a nice mock
5713481Sgiacomo.travaglini@arm.com// where MockFoo has a constructor that accepts (int, const char*),
5813481Sgiacomo.travaglini@arm.com// for example.
5913481Sgiacomo.travaglini@arm.com//
6013481Sgiacomo.travaglini@arm.com// A known limitation is that NiceMock<MockFoo>, NaggyMock<MockFoo>,
6113481Sgiacomo.travaglini@arm.com// and StrictMock<MockFoo> only works for mock methods defined using
6213481Sgiacomo.travaglini@arm.com// the MOCK_METHOD* family of macros DIRECTLY in the MockFoo class.
6313481Sgiacomo.travaglini@arm.com// If a mock method is defined in a base class of MockFoo, the "nice"
6413481Sgiacomo.travaglini@arm.com// or "strict" modifier may not affect it, depending on the compiler.
6513481Sgiacomo.travaglini@arm.com// In particular, nesting NiceMock, NaggyMock, and StrictMock is NOT
6613481Sgiacomo.travaglini@arm.com// supported.
6713481Sgiacomo.travaglini@arm.com//
6813481Sgiacomo.travaglini@arm.com// Another known limitation is that the constructors of the base mock
6913481Sgiacomo.travaglini@arm.com// cannot have arguments passed by non-const reference, which are
7013481Sgiacomo.travaglini@arm.com// banned by the Google C++ style guide anyway.
7113481Sgiacomo.travaglini@arm.com
7213481Sgiacomo.travaglini@arm.com#ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
7313481Sgiacomo.travaglini@arm.com#define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
7413481Sgiacomo.travaglini@arm.com
7513481Sgiacomo.travaglini@arm.com#include "gmock/gmock-spec-builders.h"
7613481Sgiacomo.travaglini@arm.com#include "gmock/internal/gmock-port.h"
7713481Sgiacomo.travaglini@arm.com
7813481Sgiacomo.travaglini@arm.comnamespace testing {
7913481Sgiacomo.travaglini@arm.com
8013481Sgiacomo.travaglini@arm.com$range kind 0..2
8113481Sgiacomo.travaglini@arm.com$for kind [[
8213481Sgiacomo.travaglini@arm.com
8313481Sgiacomo.travaglini@arm.com$var clazz=[[$if kind==0 [[NiceMock]]
8413481Sgiacomo.travaglini@arm.com             $elif kind==1 [[NaggyMock]]
8513481Sgiacomo.travaglini@arm.com             $else [[StrictMock]]]]
8613481Sgiacomo.travaglini@arm.com
8713481Sgiacomo.travaglini@arm.com$var method=[[$if kind==0 [[AllowUninterestingCalls]]
8813481Sgiacomo.travaglini@arm.com             $elif kind==1 [[WarnUninterestingCalls]]
8913481Sgiacomo.travaglini@arm.com             $else [[FailUninterestingCalls]]]]
9013481Sgiacomo.travaglini@arm.com
9113481Sgiacomo.travaglini@arm.comtemplate <class MockClass>
9213481Sgiacomo.travaglini@arm.comclass $clazz : public MockClass {
9313481Sgiacomo.travaglini@arm.com public:
9413481Sgiacomo.travaglini@arm.com  // We don't factor out the constructor body to a common method, as
9513481Sgiacomo.travaglini@arm.com  // we have to avoid a possible clash with members of MockClass.
9613481Sgiacomo.travaglini@arm.com  $clazz() {
9713481Sgiacomo.travaglini@arm.com    ::testing::Mock::$method(
9813481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
9913481Sgiacomo.travaglini@arm.com  }
10013481Sgiacomo.travaglini@arm.com
10113481Sgiacomo.travaglini@arm.com  // C++ doesn't (yet) allow inheritance of constructors, so we have
10213481Sgiacomo.travaglini@arm.com  // to define it for each arity.
10313481Sgiacomo.travaglini@arm.com  template <typename A1>
10413481Sgiacomo.travaglini@arm.com  explicit $clazz(const A1& a1) : MockClass(a1) {
10513481Sgiacomo.travaglini@arm.com    ::testing::Mock::$method(
10613481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
10713481Sgiacomo.travaglini@arm.com  }
10813481Sgiacomo.travaglini@arm.com
10913481Sgiacomo.travaglini@arm.com$range i 2..n
11013481Sgiacomo.travaglini@arm.com$for i [[
11113481Sgiacomo.travaglini@arm.com$range j 1..i
11213481Sgiacomo.travaglini@arm.com  template <$for j, [[typename A$j]]>
11313481Sgiacomo.travaglini@arm.com  $clazz($for j, [[const A$j& a$j]]) : MockClass($for j, [[a$j]]) {
11413481Sgiacomo.travaglini@arm.com    ::testing::Mock::$method(
11513481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
11613481Sgiacomo.travaglini@arm.com  }
11713481Sgiacomo.travaglini@arm.com
11813481Sgiacomo.travaglini@arm.com
11913481Sgiacomo.travaglini@arm.com]]
12013481Sgiacomo.travaglini@arm.com  virtual ~$clazz() {
12113481Sgiacomo.travaglini@arm.com    ::testing::Mock::UnregisterCallReaction(
12213481Sgiacomo.travaglini@arm.com        internal::ImplicitCast_<MockClass*>(this));
12313481Sgiacomo.travaglini@arm.com  }
12413481Sgiacomo.travaglini@arm.com
12513481Sgiacomo.travaglini@arm.com private:
12613481Sgiacomo.travaglini@arm.com  GTEST_DISALLOW_COPY_AND_ASSIGN_($clazz);
12713481Sgiacomo.travaglini@arm.com};
12813481Sgiacomo.travaglini@arm.com
12913481Sgiacomo.travaglini@arm.com]]
13013481Sgiacomo.travaglini@arm.com
13113481Sgiacomo.travaglini@arm.com// The following specializations catch some (relatively more common)
13213481Sgiacomo.travaglini@arm.com// user errors of nesting nice and strict mocks.  They do NOT catch
13313481Sgiacomo.travaglini@arm.com// all possible errors.
13413481Sgiacomo.travaglini@arm.com
13513481Sgiacomo.travaglini@arm.com// These specializations are declared but not defined, as NiceMock,
13613481Sgiacomo.travaglini@arm.com// NaggyMock, and StrictMock cannot be nested.
13713481Sgiacomo.travaglini@arm.com
13813481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
13913481Sgiacomo.travaglini@arm.comclass NiceMock<NiceMock<MockClass> >;
14013481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
14113481Sgiacomo.travaglini@arm.comclass NiceMock<NaggyMock<MockClass> >;
14213481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
14313481Sgiacomo.travaglini@arm.comclass NiceMock<StrictMock<MockClass> >;
14413481Sgiacomo.travaglini@arm.com
14513481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
14613481Sgiacomo.travaglini@arm.comclass NaggyMock<NiceMock<MockClass> >;
14713481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
14813481Sgiacomo.travaglini@arm.comclass NaggyMock<NaggyMock<MockClass> >;
14913481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
15013481Sgiacomo.travaglini@arm.comclass NaggyMock<StrictMock<MockClass> >;
15113481Sgiacomo.travaglini@arm.com
15213481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
15313481Sgiacomo.travaglini@arm.comclass StrictMock<NiceMock<MockClass> >;
15413481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
15513481Sgiacomo.travaglini@arm.comclass StrictMock<NaggyMock<MockClass> >;
15613481Sgiacomo.travaglini@arm.comtemplate <typename MockClass>
15713481Sgiacomo.travaglini@arm.comclass StrictMock<StrictMock<MockClass> >;
15813481Sgiacomo.travaglini@arm.com
15913481Sgiacomo.travaglini@arm.com}  // namespace testing
16013481Sgiacomo.travaglini@arm.com
16113481Sgiacomo.travaglini@arm.com#endif  // GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_NICE_STRICT_H_
162