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