128f6c2f2SEnji Cooper // Copyright 2007, Google Inc. 228f6c2f2SEnji Cooper // All rights reserved. 328f6c2f2SEnji Cooper // 428f6c2f2SEnji Cooper // Redistribution and use in source and binary forms, with or without 528f6c2f2SEnji Cooper // modification, are permitted provided that the following conditions are 628f6c2f2SEnji Cooper // met: 728f6c2f2SEnji Cooper // 828f6c2f2SEnji Cooper // * Redistributions of source code must retain the above copyright 928f6c2f2SEnji Cooper // notice, this list of conditions and the following disclaimer. 1028f6c2f2SEnji Cooper // * Redistributions in binary form must reproduce the above 1128f6c2f2SEnji Cooper // copyright notice, this list of conditions and the following disclaimer 1228f6c2f2SEnji Cooper // in the documentation and/or other materials provided with the 1328f6c2f2SEnji Cooper // distribution. 1428f6c2f2SEnji Cooper // * Neither the name of Google Inc. nor the names of its 1528f6c2f2SEnji Cooper // contributors may be used to endorse or promote products derived from 1628f6c2f2SEnji Cooper // this software without specific prior written permission. 1728f6c2f2SEnji Cooper // 1828f6c2f2SEnji Cooper // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 1928f6c2f2SEnji Cooper // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 2028f6c2f2SEnji Cooper // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 2128f6c2f2SEnji Cooper // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT 2228f6c2f2SEnji Cooper // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 2328f6c2f2SEnji Cooper // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 2428f6c2f2SEnji Cooper // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 2528f6c2f2SEnji Cooper // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 2628f6c2f2SEnji Cooper // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 2728f6c2f2SEnji Cooper // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 2828f6c2f2SEnji Cooper // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 2928f6c2f2SEnji Cooper 3028f6c2f2SEnji Cooper // Google Mock - a framework for writing C++ mock classes. 3128f6c2f2SEnji Cooper // 3228f6c2f2SEnji Cooper // This file implements MOCK_METHOD. 3328f6c2f2SEnji Cooper 3428f6c2f2SEnji Cooper // IWYU pragma: private, include "gmock/gmock.h" 3528f6c2f2SEnji Cooper // IWYU pragma: friend gmock/.* 3628f6c2f2SEnji Cooper 3728f6c2f2SEnji Cooper #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ 3828f6c2f2SEnji Cooper #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ 3928f6c2f2SEnji Cooper 40*5ca8c28cSEnji Cooper #include <cstddef> 4128f6c2f2SEnji Cooper #include <type_traits> // IWYU pragma: keep 4228f6c2f2SEnji Cooper #include <utility> // IWYU pragma: keep 4328f6c2f2SEnji Cooper 4428f6c2f2SEnji Cooper #include "gmock/gmock-spec-builders.h" 4528f6c2f2SEnji Cooper #include "gmock/internal/gmock-internal-utils.h" 4628f6c2f2SEnji Cooper #include "gmock/internal/gmock-pp.h" 4728f6c2f2SEnji Cooper 4828f6c2f2SEnji Cooper namespace testing { 4928f6c2f2SEnji Cooper namespace internal { 5028f6c2f2SEnji Cooper template <typename T> 5128f6c2f2SEnji Cooper using identity_t = T; 5228f6c2f2SEnji Cooper 5328f6c2f2SEnji Cooper template <typename Pattern> 5428f6c2f2SEnji Cooper struct ThisRefAdjuster { 5528f6c2f2SEnji Cooper template <typename T> 5628f6c2f2SEnji Cooper using AdjustT = typename std::conditional< 5728f6c2f2SEnji Cooper std::is_const<typename std::remove_reference<Pattern>::type>::value, 5828f6c2f2SEnji Cooper typename std::conditional<std::is_lvalue_reference<Pattern>::value, 5928f6c2f2SEnji Cooper const T&, const T&&>::type, 6028f6c2f2SEnji Cooper typename std::conditional<std::is_lvalue_reference<Pattern>::value, T&, 6128f6c2f2SEnji Cooper T&&>::type>::type; 6228f6c2f2SEnji Cooper 6328f6c2f2SEnji Cooper template <typename MockType> 6428f6c2f2SEnji Cooper static AdjustT<MockType> Adjust(const MockType& mock) { 6528f6c2f2SEnji Cooper return static_cast<AdjustT<MockType>>(const_cast<MockType&>(mock)); 6628f6c2f2SEnji Cooper } 6728f6c2f2SEnji Cooper }; 6828f6c2f2SEnji Cooper 6928f6c2f2SEnji Cooper constexpr bool PrefixOf(const char* a, const char* b) { 7028f6c2f2SEnji Cooper return *a == 0 || (*a == *b && internal::PrefixOf(a + 1, b + 1)); 7128f6c2f2SEnji Cooper } 7228f6c2f2SEnji Cooper 73*5ca8c28cSEnji Cooper template <size_t N, size_t M> 7428f6c2f2SEnji Cooper constexpr bool StartsWith(const char (&prefix)[N], const char (&str)[M]) { 7528f6c2f2SEnji Cooper return N <= M && internal::PrefixOf(prefix, str); 7628f6c2f2SEnji Cooper } 7728f6c2f2SEnji Cooper 78*5ca8c28cSEnji Cooper template <size_t N, size_t M> 7928f6c2f2SEnji Cooper constexpr bool EndsWith(const char (&suffix)[N], const char (&str)[M]) { 8028f6c2f2SEnji Cooper return N <= M && internal::PrefixOf(suffix, str + M - N); 8128f6c2f2SEnji Cooper } 8228f6c2f2SEnji Cooper 83*5ca8c28cSEnji Cooper template <size_t N, size_t M> 8428f6c2f2SEnji Cooper constexpr bool Equals(const char (&a)[N], const char (&b)[M]) { 8528f6c2f2SEnji Cooper return N == M && internal::PrefixOf(a, b); 8628f6c2f2SEnji Cooper } 8728f6c2f2SEnji Cooper 88*5ca8c28cSEnji Cooper template <size_t N> 8928f6c2f2SEnji Cooper constexpr bool ValidateSpec(const char (&spec)[N]) { 9028f6c2f2SEnji Cooper return internal::Equals("const", spec) || 9128f6c2f2SEnji Cooper internal::Equals("override", spec) || 9228f6c2f2SEnji Cooper internal::Equals("final", spec) || 9328f6c2f2SEnji Cooper internal::Equals("noexcept", spec) || 9428f6c2f2SEnji Cooper (internal::StartsWith("noexcept(", spec) && 9528f6c2f2SEnji Cooper internal::EndsWith(")", spec)) || 9628f6c2f2SEnji Cooper internal::Equals("ref(&)", spec) || 9728f6c2f2SEnji Cooper internal::Equals("ref(&&)", spec) || 9828f6c2f2SEnji Cooper (internal::StartsWith("Calltype(", spec) && 9928f6c2f2SEnji Cooper internal::EndsWith(")", spec)); 10028f6c2f2SEnji Cooper } 10128f6c2f2SEnji Cooper 10228f6c2f2SEnji Cooper } // namespace internal 10328f6c2f2SEnji Cooper 10428f6c2f2SEnji Cooper // The style guide prohibits "using" statements in a namespace scope 10528f6c2f2SEnji Cooper // inside a header file. However, the FunctionMocker class template 10628f6c2f2SEnji Cooper // is meant to be defined in the ::testing namespace. The following 10728f6c2f2SEnji Cooper // line is just a trick for working around a bug in MSVC 8.0, which 10828f6c2f2SEnji Cooper // cannot handle it if we define FunctionMocker in ::testing. 10928f6c2f2SEnji Cooper using internal::FunctionMocker; 11028f6c2f2SEnji Cooper } // namespace testing 11128f6c2f2SEnji Cooper 11228f6c2f2SEnji Cooper #define MOCK_METHOD(...) \ 11328f6c2f2SEnji Cooper GMOCK_INTERNAL_WARNING_PUSH() \ 11428f6c2f2SEnji Cooper GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \ 11528f6c2f2SEnji Cooper GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) \ 11628f6c2f2SEnji Cooper GMOCK_INTERNAL_WARNING_POP() 11728f6c2f2SEnji Cooper 11828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \ 11928f6c2f2SEnji Cooper GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) 12028f6c2f2SEnji Cooper 12128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_2(...) \ 12228f6c2f2SEnji Cooper GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) 12328f6c2f2SEnji Cooper 12428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_3(_Ret, _MethodName, _Args) \ 12528f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, ()) 12628f6c2f2SEnji Cooper 12728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_4(_Ret, _MethodName, _Args, _Spec) \ 12828f6c2f2SEnji Cooper GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Args); \ 12928f6c2f2SEnji Cooper GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Spec); \ 13028f6c2f2SEnji Cooper GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ 13128f6c2f2SEnji Cooper GMOCK_PP_NARG0 _Args, GMOCK_INTERNAL_SIGNATURE(_Ret, _Args)); \ 13228f6c2f2SEnji Cooper GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ 13328f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ 13428f6c2f2SEnji Cooper GMOCK_PP_NARG0 _Args, _MethodName, GMOCK_INTERNAL_HAS_CONST(_Spec), \ 13528f6c2f2SEnji Cooper GMOCK_INTERNAL_HAS_OVERRIDE(_Spec), GMOCK_INTERNAL_HAS_FINAL(_Spec), \ 13628f6c2f2SEnji Cooper GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Spec), \ 13728f6c2f2SEnji Cooper GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Spec), \ 13828f6c2f2SEnji Cooper GMOCK_INTERNAL_GET_REF_SPEC(_Spec), \ 13928f6c2f2SEnji Cooper (GMOCK_INTERNAL_SIGNATURE(_Ret, _Args))) 14028f6c2f2SEnji Cooper 14128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_5(...) \ 14228f6c2f2SEnji Cooper GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) 14328f6c2f2SEnji Cooper 14428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_6(...) \ 14528f6c2f2SEnji Cooper GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) 14628f6c2f2SEnji Cooper 14728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_ARG_7(...) \ 14828f6c2f2SEnji Cooper GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) 14928f6c2f2SEnji Cooper 15028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_WRONG_ARITY(...) \ 15128f6c2f2SEnji Cooper static_assert( \ 15228f6c2f2SEnji Cooper false, \ 15328f6c2f2SEnji Cooper "MOCK_METHOD must be called with 3 or 4 arguments. _Ret, " \ 15428f6c2f2SEnji Cooper "_MethodName, _Args and optionally _Spec. _Args and _Spec must be " \ 15528f6c2f2SEnji Cooper "enclosed in parentheses. If _Ret is a type with unprotected commas, " \ 15628f6c2f2SEnji Cooper "it must also be enclosed in parentheses.") 15728f6c2f2SEnji Cooper 15828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ASSERT_PARENTHESIS(_Tuple) \ 15928f6c2f2SEnji Cooper static_assert( \ 16028f6c2f2SEnji Cooper GMOCK_PP_IS_ENCLOSED_PARENS(_Tuple), \ 16128f6c2f2SEnji Cooper GMOCK_PP_STRINGIZE(_Tuple) " should be enclosed in parentheses.") 16228f6c2f2SEnji Cooper 16328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE(_N, ...) \ 16428f6c2f2SEnji Cooper static_assert( \ 16528f6c2f2SEnji Cooper std::is_function<__VA_ARGS__>::value, \ 16628f6c2f2SEnji Cooper "Signature must be a function type, maybe return type contains " \ 16728f6c2f2SEnji Cooper "unprotected comma."); \ 16828f6c2f2SEnji Cooper static_assert( \ 16928f6c2f2SEnji Cooper ::testing::tuple_size<typename ::testing::internal::Function< \ 17028f6c2f2SEnji Cooper __VA_ARGS__>::ArgumentTuple>::value == _N, \ 17128f6c2f2SEnji Cooper "This method does not take " GMOCK_PP_STRINGIZE( \ 17228f6c2f2SEnji Cooper _N) " arguments. Parenthesize all types with unprotected commas.") 17328f6c2f2SEnji Cooper 17428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ASSERT_VALID_SPEC(_Spec) \ 17528f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT, ~, _Spec) 17628f6c2f2SEnji Cooper 17728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHOD_IMPL(_N, _MethodName, _Constness, \ 17828f6c2f2SEnji Cooper _Override, _Final, _NoexceptSpec, \ 17928f6c2f2SEnji Cooper _CallType, _RefSpec, _Signature) \ 18028f6c2f2SEnji Cooper typename ::testing::internal::Function<GMOCK_PP_REMOVE_PARENS( \ 18128f6c2f2SEnji Cooper _Signature)>::Result \ 18228f6c2f2SEnji Cooper GMOCK_INTERNAL_EXPAND(_CallType) \ 18328f6c2f2SEnji Cooper _MethodName(GMOCK_PP_REPEAT(GMOCK_INTERNAL_PARAMETER, _Signature, _N)) \ 18428f6c2f2SEnji Cooper GMOCK_PP_IF(_Constness, const, ) \ 18528f6c2f2SEnji Cooper _RefSpec _NoexceptSpec GMOCK_PP_IF(_Override, override, ) \ 18628f6c2f2SEnji Cooper GMOCK_PP_IF(_Final, final, ) { \ 18728f6c2f2SEnji Cooper GMOCK_MOCKER_(_N, _Constness, _MethodName) \ 18828f6c2f2SEnji Cooper .SetOwnerAndName(this, #_MethodName); \ 18928f6c2f2SEnji Cooper return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ 19028f6c2f2SEnji Cooper .Invoke(GMOCK_PP_REPEAT(GMOCK_INTERNAL_FORWARD_ARG, _Signature, _N)); \ 19128f6c2f2SEnji Cooper } \ 19228f6c2f2SEnji Cooper ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \ 19328f6c2f2SEnji Cooper GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_PARAMETER, _Signature, _N)) \ 19428f6c2f2SEnji Cooper GMOCK_PP_IF(_Constness, const, ) _RefSpec { \ 19528f6c2f2SEnji Cooper GMOCK_MOCKER_(_N, _Constness, _MethodName).RegisterOwner(this); \ 19628f6c2f2SEnji Cooper return GMOCK_MOCKER_(_N, _Constness, _MethodName) \ 19728f6c2f2SEnji Cooper .With(GMOCK_PP_REPEAT(GMOCK_INTERNAL_MATCHER_ARGUMENT, , _N)); \ 19828f6c2f2SEnji Cooper } \ 19928f6c2f2SEnji Cooper ::testing::MockSpec<GMOCK_PP_REMOVE_PARENS(_Signature)> gmock_##_MethodName( \ 20028f6c2f2SEnji Cooper const ::testing::internal::WithoutMatchers&, \ 20128f6c2f2SEnji Cooper GMOCK_PP_IF(_Constness, const, )::testing::internal::Function< \ 20228f6c2f2SEnji Cooper GMOCK_PP_REMOVE_PARENS(_Signature)>*) const _RefSpec _NoexceptSpec { \ 20328f6c2f2SEnji Cooper return ::testing::internal::ThisRefAdjuster<GMOCK_PP_IF( \ 20428f6c2f2SEnji Cooper _Constness, const, ) int _RefSpec>::Adjust(*this) \ 20528f6c2f2SEnji Cooper .gmock_##_MethodName(GMOCK_PP_REPEAT( \ 20628f6c2f2SEnji Cooper GMOCK_INTERNAL_A_MATCHER_ARGUMENT, _Signature, _N)); \ 20728f6c2f2SEnji Cooper } \ 20828f6c2f2SEnji Cooper mutable ::testing::FunctionMocker<GMOCK_PP_REMOVE_PARENS(_Signature)> \ 20928f6c2f2SEnji Cooper GMOCK_MOCKER_(_N, _Constness, _MethodName) 21028f6c2f2SEnji Cooper 21128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_EXPAND(...) __VA_ARGS__ 21228f6c2f2SEnji Cooper 21328f6c2f2SEnji Cooper // Valid modifiers. 21428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_HAS_CONST(_Tuple) \ 21528f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_CONST, ~, _Tuple)) 21628f6c2f2SEnji Cooper 21728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_HAS_OVERRIDE(_Tuple) \ 21828f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA( \ 21928f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_OVERRIDE, ~, _Tuple)) 22028f6c2f2SEnji Cooper 22128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_HAS_FINAL(_Tuple) \ 22228f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_DETECT_FINAL, ~, _Tuple)) 22328f6c2f2SEnji Cooper 22428f6c2f2SEnji Cooper #define GMOCK_INTERNAL_GET_NOEXCEPT_SPEC(_Tuple) \ 22528f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT, ~, _Tuple) 22628f6c2f2SEnji Cooper 22728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_NOEXCEPT_SPEC_IF_NOEXCEPT(_i, _, _elem) \ 22828f6c2f2SEnji Cooper GMOCK_PP_IF( \ 22928f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)), \ 23028f6c2f2SEnji Cooper _elem, ) 23128f6c2f2SEnji Cooper 23228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_GET_CALLTYPE_SPEC(_Tuple) \ 23328f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE, ~, _Tuple) 23428f6c2f2SEnji Cooper 23528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_CALLTYPE_SPEC_IF_CALLTYPE(_i, _, _elem) \ 23628f6c2f2SEnji Cooper GMOCK_PP_IF( \ 23728f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem)), \ 23828f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) 23928f6c2f2SEnji Cooper 24028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_GET_REF_SPEC(_Tuple) \ 24128f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_REF_SPEC_IF_REF, ~, _Tuple) 24228f6c2f2SEnji Cooper 24328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_REF_SPEC_IF_REF(_i, _, _elem) \ 24428f6c2f2SEnji Cooper GMOCK_PP_IF(GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)), \ 24528f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_UNPACK_, _elem), ) 24628f6c2f2SEnji Cooper 24728f6c2f2SEnji Cooper #ifdef GMOCK_INTERNAL_STRICT_SPEC_ASSERT 24828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ 24928f6c2f2SEnji Cooper static_assert( \ 25028f6c2f2SEnji Cooper ::testing::internal::ValidateSpec(GMOCK_PP_STRINGIZE(_elem)), \ 25128f6c2f2SEnji Cooper "Token \'" GMOCK_PP_STRINGIZE( \ 25228f6c2f2SEnji Cooper _elem) "\' cannot be recognized as a valid specification " \ 25328f6c2f2SEnji Cooper "modifier. Is a ',' missing?"); 25428f6c2f2SEnji Cooper #else 25528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ASSERT_VALID_SPEC_ELEMENT(_i, _, _elem) \ 25628f6c2f2SEnji Cooper static_assert( \ 25728f6c2f2SEnji Cooper (GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem)) + \ 25828f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem)) + \ 25928f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem)) + \ 26028f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem)) + \ 26128f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_REF(_i, _, _elem)) + \ 26228f6c2f2SEnji Cooper GMOCK_PP_HAS_COMMA(GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem))) == 1, \ 26328f6c2f2SEnji Cooper GMOCK_PP_STRINGIZE( \ 26428f6c2f2SEnji Cooper _elem) " cannot be recognized as a valid specification modifier."); 26528f6c2f2SEnji Cooper #endif // GMOCK_INTERNAL_STRICT_SPEC_ASSERT 26628f6c2f2SEnji Cooper 26728f6c2f2SEnji Cooper // Modifiers implementation. 26828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_CONST(_i, _, _elem) \ 26928f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CONST_I_, _elem) 27028f6c2f2SEnji Cooper 27128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_CONST_I_const , 27228f6c2f2SEnji Cooper 27328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_OVERRIDE(_i, _, _elem) \ 27428f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_OVERRIDE_I_, _elem) 27528f6c2f2SEnji Cooper 27628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_OVERRIDE_I_override , 27728f6c2f2SEnji Cooper 27828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_FINAL(_i, _, _elem) \ 27928f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_FINAL_I_, _elem) 28028f6c2f2SEnji Cooper 28128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_FINAL_I_final , 28228f6c2f2SEnji Cooper 28328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_NOEXCEPT(_i, _, _elem) \ 28428f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_NOEXCEPT_I_, _elem) 28528f6c2f2SEnji Cooper 28628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_NOEXCEPT_I_noexcept , 28728f6c2f2SEnji Cooper 28828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_REF(_i, _, _elem) \ 28928f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_REF_I_, _elem) 29028f6c2f2SEnji Cooper 29128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_REF_I_ref , 29228f6c2f2SEnji Cooper 29328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_UNPACK_ref(x) x 29428f6c2f2SEnji Cooper 29528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_CALLTYPE(_i, _, _elem) \ 29628f6c2f2SEnji Cooper GMOCK_PP_CAT(GMOCK_INTERNAL_DETECT_CALLTYPE_I_, _elem) 29728f6c2f2SEnji Cooper 29828f6c2f2SEnji Cooper #define GMOCK_INTERNAL_DETECT_CALLTYPE_I_Calltype , 29928f6c2f2SEnji Cooper 30028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_UNPACK_Calltype(...) __VA_ARGS__ 30128f6c2f2SEnji Cooper 30228f6c2f2SEnji Cooper // Note: The use of `identity_t` here allows _Ret to represent return types that 30328f6c2f2SEnji Cooper // would normally need to be specified in a different way. For example, a method 30428f6c2f2SEnji Cooper // returning a function pointer must be written as 30528f6c2f2SEnji Cooper // 30628f6c2f2SEnji Cooper // fn_ptr_return_t (*method(method_args_t...))(fn_ptr_args_t...) 30728f6c2f2SEnji Cooper // 30828f6c2f2SEnji Cooper // But we only support placing the return type at the beginning. To handle this, 30928f6c2f2SEnji Cooper // we wrap all calls in identity_t, so that a declaration will be expanded to 31028f6c2f2SEnji Cooper // 31128f6c2f2SEnji Cooper // identity_t<fn_ptr_return_t (*)(fn_ptr_args_t...)> method(method_args_t...) 31228f6c2f2SEnji Cooper // 31328f6c2f2SEnji Cooper // This allows us to work around the syntactic oddities of function/method 31428f6c2f2SEnji Cooper // types. 31528f6c2f2SEnji Cooper #define GMOCK_INTERNAL_SIGNATURE(_Ret, _Args) \ 31628f6c2f2SEnji Cooper ::testing::internal::identity_t<GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_Ret), \ 31728f6c2f2SEnji Cooper GMOCK_PP_REMOVE_PARENS, \ 31828f6c2f2SEnji Cooper GMOCK_PP_IDENTITY)(_Ret)>( \ 31928f6c2f2SEnji Cooper GMOCK_PP_FOR_EACH(GMOCK_INTERNAL_GET_TYPE, _, _Args)) 32028f6c2f2SEnji Cooper 32128f6c2f2SEnji Cooper #define GMOCK_INTERNAL_GET_TYPE(_i, _, _elem) \ 32228f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 32328f6c2f2SEnji Cooper GMOCK_PP_IF(GMOCK_PP_IS_BEGIN_PARENS(_elem), GMOCK_PP_REMOVE_PARENS, \ 32428f6c2f2SEnji Cooper GMOCK_PP_IDENTITY) \ 32528f6c2f2SEnji Cooper (_elem) 32628f6c2f2SEnji Cooper 32728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_PARAMETER(_i, _Signature, _) \ 32828f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 32928f6c2f2SEnji Cooper GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ 33028f6c2f2SEnji Cooper gmock_a##_i 33128f6c2f2SEnji Cooper 33228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_FORWARD_ARG(_i, _Signature, _) \ 33328f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 33428f6c2f2SEnji Cooper ::std::forward<GMOCK_INTERNAL_ARG_O( \ 33528f6c2f2SEnji Cooper _i, GMOCK_PP_REMOVE_PARENS(_Signature))>(gmock_a##_i) 33628f6c2f2SEnji Cooper 33728f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MATCHER_PARAMETER(_i, _Signature, _) \ 33828f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 33928f6c2f2SEnji Cooper GMOCK_INTERNAL_MATCHER_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature)) \ 34028f6c2f2SEnji Cooper gmock_a##_i 34128f6c2f2SEnji Cooper 34228f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MATCHER_ARGUMENT(_i, _1, _2) \ 34328f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 34428f6c2f2SEnji Cooper gmock_a##_i 34528f6c2f2SEnji Cooper 34628f6c2f2SEnji Cooper #define GMOCK_INTERNAL_A_MATCHER_ARGUMENT(_i, _Signature, _) \ 34728f6c2f2SEnji Cooper GMOCK_PP_COMMA_IF(_i) \ 34828f6c2f2SEnji Cooper ::testing::A<GMOCK_INTERNAL_ARG_O(_i, GMOCK_PP_REMOVE_PARENS(_Signature))>() 34928f6c2f2SEnji Cooper 35028f6c2f2SEnji Cooper #define GMOCK_INTERNAL_ARG_O(_i, ...) \ 35128f6c2f2SEnji Cooper typename ::testing::internal::Function<__VA_ARGS__>::template Arg<_i>::type 35228f6c2f2SEnji Cooper 35328f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MATCHER_O(_i, ...) \ 35428f6c2f2SEnji Cooper const ::testing::Matcher<typename ::testing::internal::Function< \ 35528f6c2f2SEnji Cooper __VA_ARGS__>::template Arg<_i>::type>& 35628f6c2f2SEnji Cooper 35728f6c2f2SEnji Cooper #define MOCK_METHOD0(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 0, __VA_ARGS__) 35828f6c2f2SEnji Cooper #define MOCK_METHOD1(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 1, __VA_ARGS__) 35928f6c2f2SEnji Cooper #define MOCK_METHOD2(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 2, __VA_ARGS__) 36028f6c2f2SEnji Cooper #define MOCK_METHOD3(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 3, __VA_ARGS__) 36128f6c2f2SEnji Cooper #define MOCK_METHOD4(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 4, __VA_ARGS__) 36228f6c2f2SEnji Cooper #define MOCK_METHOD5(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 5, __VA_ARGS__) 36328f6c2f2SEnji Cooper #define MOCK_METHOD6(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 6, __VA_ARGS__) 36428f6c2f2SEnji Cooper #define MOCK_METHOD7(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 7, __VA_ARGS__) 36528f6c2f2SEnji Cooper #define MOCK_METHOD8(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 8, __VA_ARGS__) 36628f6c2f2SEnji Cooper #define MOCK_METHOD9(m, ...) GMOCK_INTERNAL_MOCK_METHODN(, , m, 9, __VA_ARGS__) 36728f6c2f2SEnji Cooper #define MOCK_METHOD10(m, ...) \ 36828f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, , m, 10, __VA_ARGS__) 36928f6c2f2SEnji Cooper 37028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD0(m, ...) \ 37128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 0, __VA_ARGS__) 37228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD1(m, ...) \ 37328f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 1, __VA_ARGS__) 37428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD2(m, ...) \ 37528f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 2, __VA_ARGS__) 37628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD3(m, ...) \ 37728f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 3, __VA_ARGS__) 37828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD4(m, ...) \ 37928f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 4, __VA_ARGS__) 38028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD5(m, ...) \ 38128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 5, __VA_ARGS__) 38228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD6(m, ...) \ 38328f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 6, __VA_ARGS__) 38428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD7(m, ...) \ 38528f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 7, __VA_ARGS__) 38628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD8(m, ...) \ 38728f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 8, __VA_ARGS__) 38828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD9(m, ...) \ 38928f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 9, __VA_ARGS__) 39028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD10(m, ...) \ 39128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, , m, 10, __VA_ARGS__) 39228f6c2f2SEnji Cooper 39328f6c2f2SEnji Cooper #define MOCK_METHOD0_T(m, ...) MOCK_METHOD0(m, __VA_ARGS__) 39428f6c2f2SEnji Cooper #define MOCK_METHOD1_T(m, ...) MOCK_METHOD1(m, __VA_ARGS__) 39528f6c2f2SEnji Cooper #define MOCK_METHOD2_T(m, ...) MOCK_METHOD2(m, __VA_ARGS__) 39628f6c2f2SEnji Cooper #define MOCK_METHOD3_T(m, ...) MOCK_METHOD3(m, __VA_ARGS__) 39728f6c2f2SEnji Cooper #define MOCK_METHOD4_T(m, ...) MOCK_METHOD4(m, __VA_ARGS__) 39828f6c2f2SEnji Cooper #define MOCK_METHOD5_T(m, ...) MOCK_METHOD5(m, __VA_ARGS__) 39928f6c2f2SEnji Cooper #define MOCK_METHOD6_T(m, ...) MOCK_METHOD6(m, __VA_ARGS__) 40028f6c2f2SEnji Cooper #define MOCK_METHOD7_T(m, ...) MOCK_METHOD7(m, __VA_ARGS__) 40128f6c2f2SEnji Cooper #define MOCK_METHOD8_T(m, ...) MOCK_METHOD8(m, __VA_ARGS__) 40228f6c2f2SEnji Cooper #define MOCK_METHOD9_T(m, ...) MOCK_METHOD9(m, __VA_ARGS__) 40328f6c2f2SEnji Cooper #define MOCK_METHOD10_T(m, ...) MOCK_METHOD10(m, __VA_ARGS__) 40428f6c2f2SEnji Cooper 40528f6c2f2SEnji Cooper #define MOCK_CONST_METHOD0_T(m, ...) MOCK_CONST_METHOD0(m, __VA_ARGS__) 40628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD1_T(m, ...) MOCK_CONST_METHOD1(m, __VA_ARGS__) 40728f6c2f2SEnji Cooper #define MOCK_CONST_METHOD2_T(m, ...) MOCK_CONST_METHOD2(m, __VA_ARGS__) 40828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD3_T(m, ...) MOCK_CONST_METHOD3(m, __VA_ARGS__) 40928f6c2f2SEnji Cooper #define MOCK_CONST_METHOD4_T(m, ...) MOCK_CONST_METHOD4(m, __VA_ARGS__) 41028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD5_T(m, ...) MOCK_CONST_METHOD5(m, __VA_ARGS__) 41128f6c2f2SEnji Cooper #define MOCK_CONST_METHOD6_T(m, ...) MOCK_CONST_METHOD6(m, __VA_ARGS__) 41228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD7_T(m, ...) MOCK_CONST_METHOD7(m, __VA_ARGS__) 41328f6c2f2SEnji Cooper #define MOCK_CONST_METHOD8_T(m, ...) MOCK_CONST_METHOD8(m, __VA_ARGS__) 41428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD9_T(m, ...) MOCK_CONST_METHOD9(m, __VA_ARGS__) 41528f6c2f2SEnji Cooper #define MOCK_CONST_METHOD10_T(m, ...) MOCK_CONST_METHOD10(m, __VA_ARGS__) 41628f6c2f2SEnji Cooper 41728f6c2f2SEnji Cooper #define MOCK_METHOD0_WITH_CALLTYPE(ct, m, ...) \ 41828f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 0, __VA_ARGS__) 41928f6c2f2SEnji Cooper #define MOCK_METHOD1_WITH_CALLTYPE(ct, m, ...) \ 42028f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 1, __VA_ARGS__) 42128f6c2f2SEnji Cooper #define MOCK_METHOD2_WITH_CALLTYPE(ct, m, ...) \ 42228f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 2, __VA_ARGS__) 42328f6c2f2SEnji Cooper #define MOCK_METHOD3_WITH_CALLTYPE(ct, m, ...) \ 42428f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 3, __VA_ARGS__) 42528f6c2f2SEnji Cooper #define MOCK_METHOD4_WITH_CALLTYPE(ct, m, ...) \ 42628f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 4, __VA_ARGS__) 42728f6c2f2SEnji Cooper #define MOCK_METHOD5_WITH_CALLTYPE(ct, m, ...) \ 42828f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 5, __VA_ARGS__) 42928f6c2f2SEnji Cooper #define MOCK_METHOD6_WITH_CALLTYPE(ct, m, ...) \ 43028f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 6, __VA_ARGS__) 43128f6c2f2SEnji Cooper #define MOCK_METHOD7_WITH_CALLTYPE(ct, m, ...) \ 43228f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 7, __VA_ARGS__) 43328f6c2f2SEnji Cooper #define MOCK_METHOD8_WITH_CALLTYPE(ct, m, ...) \ 43428f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 8, __VA_ARGS__) 43528f6c2f2SEnji Cooper #define MOCK_METHOD9_WITH_CALLTYPE(ct, m, ...) \ 43628f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 9, __VA_ARGS__) 43728f6c2f2SEnji Cooper #define MOCK_METHOD10_WITH_CALLTYPE(ct, m, ...) \ 43828f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(, ct, m, 10, __VA_ARGS__) 43928f6c2f2SEnji Cooper 44028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, ...) \ 44128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 0, __VA_ARGS__) 44228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, ...) \ 44328f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 1, __VA_ARGS__) 44428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, ...) \ 44528f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 2, __VA_ARGS__) 44628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, ...) \ 44728f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 3, __VA_ARGS__) 44828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, ...) \ 44928f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 4, __VA_ARGS__) 45028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, ...) \ 45128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 5, __VA_ARGS__) 45228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, ...) \ 45328f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 6, __VA_ARGS__) 45428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, ...) \ 45528f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 7, __VA_ARGS__) 45628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, ...) \ 45728f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 8, __VA_ARGS__) 45828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, ...) \ 45928f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 9, __VA_ARGS__) 46028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, ...) \ 46128f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHODN(const, ct, m, 10, __VA_ARGS__) 46228f6c2f2SEnji Cooper 46328f6c2f2SEnji Cooper #define MOCK_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ 46428f6c2f2SEnji Cooper MOCK_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) 46528f6c2f2SEnji Cooper #define MOCK_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ 46628f6c2f2SEnji Cooper MOCK_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) 46728f6c2f2SEnji Cooper #define MOCK_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ 46828f6c2f2SEnji Cooper MOCK_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) 46928f6c2f2SEnji Cooper #define MOCK_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ 47028f6c2f2SEnji Cooper MOCK_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) 47128f6c2f2SEnji Cooper #define MOCK_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ 47228f6c2f2SEnji Cooper MOCK_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) 47328f6c2f2SEnji Cooper #define MOCK_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ 47428f6c2f2SEnji Cooper MOCK_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) 47528f6c2f2SEnji Cooper #define MOCK_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ 47628f6c2f2SEnji Cooper MOCK_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) 47728f6c2f2SEnji Cooper #define MOCK_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ 47828f6c2f2SEnji Cooper MOCK_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) 47928f6c2f2SEnji Cooper #define MOCK_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ 48028f6c2f2SEnji Cooper MOCK_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) 48128f6c2f2SEnji Cooper #define MOCK_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ 48228f6c2f2SEnji Cooper MOCK_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) 48328f6c2f2SEnji Cooper #define MOCK_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ 48428f6c2f2SEnji Cooper MOCK_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) 48528f6c2f2SEnji Cooper 48628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD0_T_WITH_CALLTYPE(ct, m, ...) \ 48728f6c2f2SEnji Cooper MOCK_CONST_METHOD0_WITH_CALLTYPE(ct, m, __VA_ARGS__) 48828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD1_T_WITH_CALLTYPE(ct, m, ...) \ 48928f6c2f2SEnji Cooper MOCK_CONST_METHOD1_WITH_CALLTYPE(ct, m, __VA_ARGS__) 49028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD2_T_WITH_CALLTYPE(ct, m, ...) \ 49128f6c2f2SEnji Cooper MOCK_CONST_METHOD2_WITH_CALLTYPE(ct, m, __VA_ARGS__) 49228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD3_T_WITH_CALLTYPE(ct, m, ...) \ 49328f6c2f2SEnji Cooper MOCK_CONST_METHOD3_WITH_CALLTYPE(ct, m, __VA_ARGS__) 49428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD4_T_WITH_CALLTYPE(ct, m, ...) \ 49528f6c2f2SEnji Cooper MOCK_CONST_METHOD4_WITH_CALLTYPE(ct, m, __VA_ARGS__) 49628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD5_T_WITH_CALLTYPE(ct, m, ...) \ 49728f6c2f2SEnji Cooper MOCK_CONST_METHOD5_WITH_CALLTYPE(ct, m, __VA_ARGS__) 49828f6c2f2SEnji Cooper #define MOCK_CONST_METHOD6_T_WITH_CALLTYPE(ct, m, ...) \ 49928f6c2f2SEnji Cooper MOCK_CONST_METHOD6_WITH_CALLTYPE(ct, m, __VA_ARGS__) 50028f6c2f2SEnji Cooper #define MOCK_CONST_METHOD7_T_WITH_CALLTYPE(ct, m, ...) \ 50128f6c2f2SEnji Cooper MOCK_CONST_METHOD7_WITH_CALLTYPE(ct, m, __VA_ARGS__) 50228f6c2f2SEnji Cooper #define MOCK_CONST_METHOD8_T_WITH_CALLTYPE(ct, m, ...) \ 50328f6c2f2SEnji Cooper MOCK_CONST_METHOD8_WITH_CALLTYPE(ct, m, __VA_ARGS__) 50428f6c2f2SEnji Cooper #define MOCK_CONST_METHOD9_T_WITH_CALLTYPE(ct, m, ...) \ 50528f6c2f2SEnji Cooper MOCK_CONST_METHOD9_WITH_CALLTYPE(ct, m, __VA_ARGS__) 50628f6c2f2SEnji Cooper #define MOCK_CONST_METHOD10_T_WITH_CALLTYPE(ct, m, ...) \ 50728f6c2f2SEnji Cooper MOCK_CONST_METHOD10_WITH_CALLTYPE(ct, m, __VA_ARGS__) 50828f6c2f2SEnji Cooper 50928f6c2f2SEnji Cooper #define GMOCK_INTERNAL_MOCK_METHODN(constness, ct, Method, args_num, ...) \ 51028f6c2f2SEnji Cooper GMOCK_INTERNAL_ASSERT_VALID_SIGNATURE( \ 51128f6c2f2SEnji Cooper args_num, ::testing::internal::identity_t<__VA_ARGS__>); \ 51228f6c2f2SEnji Cooper GMOCK_INTERNAL_MOCK_METHOD_IMPL( \ 51328f6c2f2SEnji Cooper args_num, Method, GMOCK_PP_NARG0(constness), 0, 0, , ct, , \ 51428f6c2f2SEnji Cooper (::testing::internal::identity_t<__VA_ARGS__>)) 51528f6c2f2SEnji Cooper 51628f6c2f2SEnji Cooper #define GMOCK_MOCKER_(arity, constness, Method) \ 51728f6c2f2SEnji Cooper GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) 51828f6c2f2SEnji Cooper 51928f6c2f2SEnji Cooper #endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ 520