Path: blob/main/contrib/googletest/googlemock/include/gmock/gmock-function-mocker.h
48375 views
// Copyright 2007, Google Inc.1// All rights reserved.2//3// Redistribution and use in source and binary forms, with or without4// modification, are permitted provided that the following conditions are5// met:6//7// * Redistributions of source code must retain the above copyright8// notice, this list of conditions and the following disclaimer.9// * Redistributions in binary form must reproduce the above10// copyright notice, this list of conditions and the following disclaimer11// in the documentation and/or other materials provided with the12// distribution.13// * Neither the name of Google Inc. nor the names of its14// contributors may be used to endorse or promote products derived from15// this software without specific prior written permission.16//17// THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS18// "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT19// LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR20// A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT21// OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,22// SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT23// LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,24// DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY25// THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT26// (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE27// OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.2829// Google Mock - a framework for writing C++ mock classes.30//31// This file implements MOCK_METHOD.3233// IWYU pragma: private, include "gmock/gmock.h"34// IWYU pragma: friend gmock/.*3536#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_37#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_3839#include <cstddef>40#include <type_traits> // IWYU pragma: keep41#include <utility> // IWYU pragma: keep4243#include "gmock/gmock-spec-builders.h"44#include "gmock/internal/gmock-internal-utils.h"45#include "gmock/internal/gmock-pp.h"4647namespace testing {48namespace internal {49template <typename T>50using identity_t = T;5152template <typename Pattern>53struct ThisRefAdjuster {54template <typename T>55using AdjustT = typename std::conditional<56std::is_const<typename std::remove_reference<Pattern>::type>::value,57typename std::conditional<std::is_lvalue_reference<Pattern>::value,58const T&, const T&&>::type,59typename std::conditional<std::is_lvalue_reference<Pattern>::value, T&,60T&&>::type>::type;6162template <typename MockType>63static AdjustT<MockType> Adjust(const MockType& mock) {64return static_cast<AdjustT<MockType>>(const_cast<MockType&>(mock));65}66};6768constexpr bool PrefixOf(const char* a, const char* b) {69return *a == 0 || (*a == *b && internal::PrefixOf(a + 1, b + 1));70}7172template <size_t N, size_t M>73constexpr bool StartsWith(const char (&prefix)[N], const char (&str)[M]) {74return N <= M && internal::PrefixOf(prefix, str);75}7677template <size_t N, size_t M>78constexpr bool EndsWith(const char (&suffix)[N], const char (&str)[M]) {79return N <= M && internal::PrefixOf(suffix, str + M - N);80}8182template <size_t N, size_t M>83constexpr bool Equals(const char (&a)[N], const char (&b)[M]) {84return N == M && internal::PrefixOf(a, b);85}8687template <size_t N>88constexpr bool ValidateSpec(const char (&spec)[N]) {89return internal::Equals("const", spec) ||90internal::Equals("override", spec) ||91internal::Equals("final", spec) ||92internal::Equals("noexcept", spec) ||93(internal::StartsWith("noexcept(", spec) &&94internal::EndsWith(")", spec)) ||95internal::Equals("ref(&)", spec) ||96internal::Equals("ref(&&)", spec) ||97(internal::StartsWith("Calltype(", spec) &&98internal::EndsWith(")", spec));99}100101} // namespace internal102103// The style guide prohibits "using" statements in a namespace scope104// inside a header file. However, the FunctionMocker class template105// is meant to be defined in the ::testing namespace. The following106// line is just a trick for working around a bug in MSVC 8.0, which107// cannot handle it if we define FunctionMocker in ::testing.108using internal::FunctionMocker;109} // namespace testing110111#define MOCK_METHOD(...) \112GMOCK_INTERNAL_WARNING_PUSH() \113GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \114GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) \115GMOCK_INTERNAL_WARNING_POP()116117#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \118GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)119120#define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \121GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)122123#define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \124GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ())125126#define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \127GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \128GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \129GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \130GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \131GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \132GMOCK_INTERNAL_MOCK_METHOD_IMPL( \133GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \134GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \135GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \136GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \137GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \138(GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)))139140#define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \141GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)142143#define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \144GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)145146#define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \147GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)148149#define GMOCK_INTERNAL_WRONG_ARITY(...) \150static_assert( \151false, \152"MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \153"_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \154"enclosed in parentheses. If _Ret is a type with unprotected commas, " \155"it must also be enclosed in parentheses.")156157#define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \158static_assert( \159GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \160GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.")161162#define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \163static_assert( \164std::is_function<__VA_ARGS__>::value, \165"Signature must be a function type, maybe return type contains " \166"unprotected comma."); \167static_assert( \168::testing::tuple_size<typename ::testing::internal::Function< \169__VA_ARGS__>::ArgumentTuple>::value == _N, \170"This method does not take " GMOCK_PP_STRINGIZE( \171_N) " arguments. Parenthesize all types with unprotected commas.")172173#define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \174GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec)175176#define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \177_Override, _Final, _NoexceptSpec, \178_CallType, _RefSpec, _Signature) \179typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS( \180_Signature)>::Result \181GMOCK_INTERNAL_EXPAND(_CallType) \182_MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \183GMOCK_PP_IF(_Constness, const, ) \184_RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \185GMOCK_PP_IF(_Final, final, ) { \186GMOCK_MOCKER_(_N, _Constness, _MethodName) \187.SetOwnerAndName(this, #_MethodName); \188return GMOCK_MOCKER_(_N, _Constness, _MethodName) \189.Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \190} \191::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \192GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \193GMOCK_PP_IF(_Constness, const, ) _RefSpec { \194GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \195return GMOCK_MOCKER_(_N, _Constness, _MethodName) \196.With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \197} \198::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \199const ::testing::internal::WithoutMatchers&, \200GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \201GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \202return ::testing::internal::ThisRefAdjuster<GMOCK_PP_IF( \203_Constness, const, ) int _RefSpec>::Adjust(*this) \204.gmock_##_MethodName(GMOCK_PP_REPEAT( \205GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \206} \207mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)> \208GMOCK_MOCKER_(_N, _Constness, _MethodName)209210#define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__211212// Valid modifiers.213#define GMOCK_INTERNAL_HAS_CONST(_Tuple) \214GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple))215216#define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \217GMOCK_PP_HAS_COMMA( \218GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple))219220#define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \221GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple))222223#define GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Tuple) \224GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT, ~, _Tuple)225226#define GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT(_i, _, _elem) \227GMOCK_PP_IF( \228GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \229_elem, )230231#define GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Tuple) \232GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE, ~, _Tuple)233234#define GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE(_i, _, _elem) \235GMOCK_PP_IF( \236GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem)), \237GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), )238239#define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \240GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple)241242#define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem) \243GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \244GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), )245246#ifdef GMOCK_INTERNAL_STRICT_SPEC_ASSERT247#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \248static_assert( \249::testing::internal::ValidateSpec(GMOCK_PP_STRINGIZE(_elem)), \250"Token \'" GMOCK_PP_STRINGIZE( \251_elem) "\' cannot be recognized as a valid specification " \252"modifier. Is a ',' missing?");253#else254#define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \255static_assert( \256(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \257GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \258GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \259GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \260GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) + \261GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem))) == 1, \262GMOCK_PP_STRINGIZE( \263_elem) " cannot be recognized as a valid specification modifier.");264#endif // GMOCK_INTERNAL_STRICT_SPEC_ASSERT265266// Modifiers implementation.267#define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \268GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem)269270#define GMOCK_INTERNAL_DETECT_CONST_I_const ,271272#define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \273GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem)274275#define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override ,276277#define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \278GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem)279280#define GMOCK_INTERNAL_DETECT_FINAL_I_final ,281282#define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \283GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem)284285#define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept ,286287#define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \288GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem)289290#define GMOCK_INTERNAL_DETECT_REF_I_ref ,291292#define GMOCK_INTERNAL_UNPACK_ref(x) x293294#define GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem) \295GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CALLTYPE_I_, _elem)296297#define GMOCK_INTERNAL_DETECT_CALLTYPE_I_Calltype ,298299#define GMOCK_INTERNAL_UNPACK_Calltype(...) __VA_ARGS__300301// Note: The use of `identity_t` here allows _Ret to represent return types that302// would normally need to be specified in a different way. For example, a method303// returning a function pointer must be written as304//305// fn_ptr_return_t (*method(method_args_t...))(fn_ptr_args_t...)306//307// But we only support placing the return type at the beginning. To handle this,308// we wrap all calls in identity_t, so that a declaration will be expanded to309//310// identity_t<fn_ptr_return_t (*)(fn_ptr_args_t...)> method(method_args_t...)311//312// This allows us to work around the syntactic oddities of function/method313// types.314#define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \315::testing::internal::identity_t<GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), \316GMOCK_PP_REMOVE_PARENS, \317GMOCK_PP_IDENTITY)(_Ret)>( \318GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args))319320#define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \321GMOCK_PP_COMMA_IF(_i) \322GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \323GMOCK_PP_IDENTITY) \324(_elem)325326#define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \327GMOCK_PP_COMMA_IF(_i) \328GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \329gmock_a##_i330331#define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \332GMOCK_PP_COMMA_IF(_i) \333::std::forward<GMOCK_INTERNAL_ARG_O( \334_i, GMOCK_PP_REMOVE_PARENS(_Signature))>(gmock_a##_i)335336#define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \337GMOCK_PP_COMMA_IF(_i) \338GMOCK_INTERNAL_MATCHER_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \339gmock_a##_i340341#define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \342GMOCK_PP_COMMA_IF(_i) \343gmock_a##_i344345#define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \346GMOCK_PP_COMMA_IF(_i) \347::testing::A<GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature))>()348349#define GMOCK_INTERNAL_ARG_O(_i, ...) \350typename ::testing::internal::Function<__VA_ARGS__>::template Arg<_i>::type351352#define GMOCK_INTERNAL_MATCHER_O(_i, ...) \353const ::testing::Matcher<typename ::testing::internal::Function< \354__VA_ARGS__>::template Arg<_i>::type>&355356#define MOCK_METHOD0(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 0, __VA_ARGS__)357#define MOCK_METHOD1(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 1, __VA_ARGS__)358#define MOCK_METHOD2(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 2, __VA_ARGS__)359#define MOCK_METHOD3(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 3, __VA_ARGS__)360#define MOCK_METHOD4(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 4, __VA_ARGS__)361#define MOCK_METHOD5(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 5, __VA_ARGS__)362#define MOCK_METHOD6(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 6, __VA_ARGS__)363#define MOCK_METHOD7(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 7, __VA_ARGS__)364#define MOCK_METHOD8(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 8, __VA_ARGS__)365#define MOCK_METHOD9(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 9, __VA_ARGS__)366#define MOCK_METHOD10(m, ...) \367GMOCK_INTERNAL_MOCK_METHODN(, , m, 10, __VA_ARGS__)368369#define MOCK_CONST_METHOD0(m, ...) \370GMOCK_INTERNAL_MOCK_METHODN(const, , m, 0, __VA_ARGS__)371#define MOCK_CONST_METHOD1(m, ...) \372GMOCK_INTERNAL_MOCK_METHODN(const, , m, 1, __VA_ARGS__)373#define MOCK_CONST_METHOD2(m, ...) \374GMOCK_INTERNAL_MOCK_METHODN(const, , m, 2, __VA_ARGS__)375#define MOCK_CONST_METHOD3(m, ...) \376GMOCK_INTERNAL_MOCK_METHODN(const, , m, 3, __VA_ARGS__)377#define MOCK_CONST_METHOD4(m, ...) \378GMOCK_INTERNAL_MOCK_METHODN(const, , m, 4, __VA_ARGS__)379#define MOCK_CONST_METHOD5(m, ...) \380GMOCK_INTERNAL_MOCK_METHODN(const, , m, 5, __VA_ARGS__)381#define MOCK_CONST_METHOD6(m, ...) \382GMOCK_INTERNAL_MOCK_METHODN(const, , m, 6, __VA_ARGS__)383#define MOCK_CONST_METHOD7(m, ...) \384GMOCK_INTERNAL_MOCK_METHODN(const, , m, 7, __VA_ARGS__)385#define MOCK_CONST_METHOD8(m, ...) \386GMOCK_INTERNAL_MOCK_METHODN(const, , m, 8, __VA_ARGS__)387#define MOCK_CONST_METHOD9(m, ...) \388GMOCK_INTERNAL_MOCK_METHODN(const, , m, 9, __VA_ARGS__)389#define MOCK_CONST_METHOD10(m, ...) \390GMOCK_INTERNAL_MOCK_METHODN(const, , m, 10, __VA_ARGS__)391392#define MOCK_METHOD0_T(m, ...) MOCK_METHOD0(m, __VA_ARGS__)393#define MOCK_METHOD1_T(m, ...) MOCK_METHOD1(m, __VA_ARGS__)394#define MOCK_METHOD2_T(m, ...) MOCK_METHOD2(m, __VA_ARGS__)395#define MOCK_METHOD3_T(m, ...) MOCK_METHOD3(m, __VA_ARGS__)396#define MOCK_METHOD4_T(m, ...) MOCK_METHOD4(m, __VA_ARGS__)397#define MOCK_METHOD5_T(m, ...) MOCK_METHOD5(m, __VA_ARGS__)398#define MOCK_METHOD6_T(m, ...) MOCK_METHOD6(m, __VA_ARGS__)399#define MOCK_METHOD7_T(m, ...) MOCK_METHOD7(m, __VA_ARGS__)400#define MOCK_METHOD8_T(m, ...) MOCK_METHOD8(m, __VA_ARGS__)401#define MOCK_METHOD9_T(m, ...) MOCK_METHOD9(m, __VA_ARGS__)402#define MOCK_METHOD10_T(m, ...) MOCK_METHOD10(m, __VA_ARGS__)403404#define MOCK_CONST_METHOD0_T(m, ...) MOCK_CONST_METHOD0(m, __VA_ARGS__)405#define MOCK_CONST_METHOD1_T(m, ...) MOCK_CONST_METHOD1(m, __VA_ARGS__)406#define MOCK_CONST_METHOD2_T(m, ...) MOCK_CONST_METHOD2(m, __VA_ARGS__)407#define MOCK_CONST_METHOD3_T(m, ...) MOCK_CONST_METHOD3(m, __VA_ARGS__)408#define MOCK_CONST_METHOD4_T(m, ...) MOCK_CONST_METHOD4(m, __VA_ARGS__)409#define MOCK_CONST_METHOD5_T(m, ...) MOCK_CONST_METHOD5(m, __VA_ARGS__)410#define MOCK_CONST_METHOD6_T(m, ...) MOCK_CONST_METHOD6(m, __VA_ARGS__)411#define MOCK_CONST_METHOD7_T(m, ...) MOCK_CONST_METHOD7(m, __VA_ARGS__)412#define MOCK_CONST_METHOD8_T(m, ...) MOCK_CONST_METHOD8(m, __VA_ARGS__)413#define MOCK_CONST_METHOD9_T(m, ...) MOCK_CONST_METHOD9(m, __VA_ARGS__)414#define MOCK_CONST_METHOD10_T(m, ...) MOCK_CONST_METHOD10(m, __VA_ARGS__)415416#define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \417GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 0, __VA_ARGS__)418#define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \419GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 1, __VA_ARGS__)420#define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \421GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 2, __VA_ARGS__)422#define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \423GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 3, __VA_ARGS__)424#define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \425GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 4, __VA_ARGS__)426#define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \427GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 5, __VA_ARGS__)428#define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \429GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 6, __VA_ARGS__)430#define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \431GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 7, __VA_ARGS__)432#define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \433GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 8, __VA_ARGS__)434#define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \435GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 9, __VA_ARGS__)436#define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \437GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 10, __VA_ARGS__)438439#define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \440GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 0, __VA_ARGS__)441#define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \442GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 1, __VA_ARGS__)443#define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \444GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 2, __VA_ARGS__)445#define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \446GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 3, __VA_ARGS__)447#define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \448GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 4, __VA_ARGS__)449#define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \450GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 5, __VA_ARGS__)451#define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \452GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 6, __VA_ARGS__)453#define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \454GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 7, __VA_ARGS__)455#define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \456GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 8, __VA_ARGS__)457#define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \458GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 9, __VA_ARGS__)459#define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \460GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 10, __VA_ARGS__)461462#define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \463MOCK_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__)464#define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \465MOCK_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__)466#define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \467MOCK_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__)468#define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \469MOCK_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__)470#define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \471MOCK_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__)472#define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \473MOCK_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__)474#define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \475MOCK_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__)476#define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \477MOCK_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__)478#define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \479MOCK_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__)480#define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \481MOCK_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__)482#define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \483MOCK_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__)484485#define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \486MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__)487#define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \488MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__)489#define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \490MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__)491#define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \492MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__)493#define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \494MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__)495#define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \496MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__)497#define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \498MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__)499#define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \500MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__)501#define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \502MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__)503#define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \504MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__)505#define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \506MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__)507508#define GMOCK_INTERNAL_MOCK_METHODN(constness, ct, Method, args_num, ...) \509GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \510args_num, ::testing::internal::identity_t<__VA_ARGS__>); \511GMOCK_INTERNAL_MOCK_METHOD_IMPL( \512args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \513(::testing::internal::identity_t<__VA_ARGS__>))514515#define GMOCK_MOCKER_(arity, constness, Method) \516GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)517518#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_519520521