34 #include "gmock/gmock-function-mocker.h"
41 #endif // GTEST_OS_WINDOWS
46 #include <type_traits>
48 #include "gmock/gmock.h"
49 #include "gtest/gtest.h"
52 namespace gmock_function_mocker_test {
69 class TemplatedCopyable {
84 virtual bool Unary(
int x) = 0;
85 virtual long Binary(
short x,
int y) = 0;
86 virtual int Decimal(
bool b,
char c,
short d,
int e,
long f,
87 float g,
double h,
unsigned i,
char* j,
104 virtual int TypeWithComma(
const std::map<int, std::string>& a_map) = 0;
122 STDMETHOD_(
int, CTNullary)() = 0;
123 STDMETHOD_(
bool, CTUnary)(
int x) = 0;
124 STDMETHOD_(
int, CTDecimal)
125 (
bool b,
char c,
short d,
int e,
long f,
126 float g,
double h,
unsigned i,
char* j,
const std::string&
k) = 0;
127 STDMETHOD_(
char, CTConst)(
int x)
const = 0;
128 #endif // GTEST_OS_WINDOWS
136 # pragma warning(push)
137 # pragma warning(disable : 4373)
152 (
bool,
char,
short,
int,
long,
float,
161 MOCK_METHOD((std::map<int, std::string>), ReturnTypeWithComma, (), ());
162 MOCK_METHOD((std::map<int, std::string>), ReturnTypeWithComma, (
int),
183 MOCK_METHOD(
int, CTNullary, (), (Calltype(STDMETHODCALLTYPE)));
184 MOCK_METHOD(
bool, CTUnary, (
int), (Calltype(STDMETHODCALLTYPE)));
186 (
bool b,
char c,
short d,
int e,
long f,
float g,
double h,
188 (Calltype(STDMETHODCALLTYPE)));
189 MOCK_METHOD(
char, CTConst, (
int), (
const, Calltype(STDMETHODCALLTYPE)));
190 MOCK_METHOD((std::map<int, std::string>), CTReturnTypeWithComma, (),
191 (Calltype(STDMETHODCALLTYPE)));
192 #endif // GTEST_OS_WINDOWS
229 MOCK_METHOD0(ReturnTypeWithComma, std::map<int, std::string>());
231 std::map<int, std::string>(
int));
244 int(
const std::map<int, std::string>&));
255 int(
bool b,
char c,
short d,
int e,
256 long f,
float g,
double h,
263 std::map<int, std::string>());
264 #endif // GTEST_OS_WINDOWS
282 # pragma warning(pop)
299 this->foo_->VoidReturning(0);
330 Decimal(
true,
'a', 0, 0, 1
L, A<float>(),
Lt(100), 5U, NULL,
"hi"))
333 EXPECT_EQ(5, this->foo_->Decimal(
true,
'a', 0, 0, 1, 0, 0, 5,
nullptr,
"hi"));
349 .WillOnce(
Return(
"Hello"));
351 EXPECT_EQ(
"Hello", this->foo_->TakesConstReference(
a));
363 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentNumber())
365 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentNumber(
_))
368 EXPECT_EQ(2, this->foo_->OverloadedOnArgumentNumber(1));
369 EXPECT_EQ(1, this->foo_->OverloadedOnArgumentNumber());
374 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentType(An<int>()))
376 EXPECT_CALL(this->mock_foo_, OverloadedOnArgumentType(TypedEq<char>(
'a')))
379 EXPECT_EQ(1, this->foo_->OverloadedOnArgumentType(0));
380 EXPECT_EQ(
'b', this->foo_->OverloadedOnArgumentType(
'a'));
385 EXPECT_CALL(this->mock_foo_, OverloadedOnConstness());
389 EXPECT_EQ(0, this->foo_->OverloadedOnConstness());
394 const std::map<int, std::string> a_map;
398 EXPECT_EQ(a_map, this->mock_foo_.ReturnTypeWithComma());
399 EXPECT_EQ(a_map, this->mock_foo_.ReturnTypeWithComma(42));
403 EXPECT_CALL(this->mock_foo_, TypeWithTemplatedCopyCtor(
_))
410 TYPED_TEST(FunctionMockerTest, MocksNullaryFunctionWithCallType) {
420 TYPED_TEST(FunctionMockerTest, MocksUnaryFunctionWithCallType) {
431 TYPED_TEST(FunctionMockerTest, MocksDecimalFunctionWithCallType) {
433 Lt(100), 5U, NULL,
"hi"))
436 EXPECT_EQ(10, this->foo_->CTDecimal(
true,
'a', 0, 0, 1, 0, 0, 5, NULL,
"hi"));
440 TYPED_TEST(FunctionMockerTest, MocksFunctionsConstFunctionWithCallType) {
446 TYPED_TEST(FunctionMockerTest, MocksReturnTypeWithCommaAndCallType) {
447 const std::map<int, std::string> a_map;
450 EXPECT_EQ(a_map, this->mock_foo_.CTReturnTypeWithComma());
453 #endif // GTEST_OS_WINDOWS
460 RefQualifiedConstRefRef)
483 .RefQualifiedOverloaded(),
509 template <
typename T>
533 template <
typename T>
534 class StackInterface {
540 virtual void Pop() = 0;
541 virtual int GetSize()
const = 0;
543 virtual const T&
GetTop()
const = 0;
546 template <
typename T>
547 class MockStack :
public StackInterface<T> {
557 MOCK_METHOD((std::map<int, int>), ReturnTypeWithComma, (), ());
558 MOCK_METHOD((std::map<int, int>), ReturnTypeWithComma, (
int), (
const));
564 template <
typename T>
582 template <
typename T>
614 const std::map<int, int> a_map;
620 EXPECT_EQ(a_map, mock.ReturnTypeWithComma());
621 EXPECT_EQ(a_map, mock.ReturnTypeWithComma(1));
627 template <
typename T>
628 class StackInterfaceWithCallType {
630 virtual ~StackInterfaceWithCallType() {}
633 STDMETHOD_(
void, Push)(
const T&
value) = 0;
634 STDMETHOD_(
void,
Pop)() = 0;
635 STDMETHOD_(
int, GetSize)()
const = 0;
637 STDMETHOD_(
const T&, GetTop)()
const = 0;
640 template <
typename T>
641 class MockStackWithCallType :
public StackInterfaceWithCallType<T> {
643 MockStackWithCallType() {}
646 (Calltype(STDMETHODCALLTYPE),
override));
647 MOCK_METHOD(
void,
Pop, (), (Calltype(STDMETHODCALLTYPE),
override));
648 MOCK_METHOD(
int, GetSize, (), (Calltype(STDMETHODCALLTYPE),
override,
const));
650 (Calltype(STDMETHODCALLTYPE),
override,
const));
656 template <
typename T>
657 class LegacyMockStackWithCallType :
public StackInterfaceWithCallType<T> {
659 LegacyMockStackWithCallType() {}
670 template <
typename T>
672 using TemplateMockTestWithCallTypeTypes =
674 LegacyMockStackWithCallType<int>>;
676 TemplateMockTestWithCallTypeTypes);
679 TYPED_TEST(TemplateMockTestWithCallType, Works) {
700 #endif // GTEST_OS_WINDOWS
702 #define MY_MOCK_METHODS1_ \
703 MOCK_METHOD(void, Overloaded, ()); \
704 MOCK_METHOD(int, Overloaded, (int), (const)); \
705 MOCK_METHOD(bool, Overloaded, (bool f, int n))
707 #define LEGACY_MY_MOCK_METHODS1_ \
708 MOCK_METHOD0(Overloaded, void()); \
709 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
710 MOCK_METHOD2(Overloaded, bool(bool f, int n))
712 class MockOverloadedOnArgNumber {
732 template <
typename T>
750 #define MY_MOCK_METHODS2_ \
751 MOCK_CONST_METHOD1(Overloaded, int(int n)); \
752 MOCK_METHOD1(Overloaded, int(int n))
754 class MockOverloadedOnConstness {
764 TEST(MockMethodOverloadedMockMethodTest, CanOverloadOnConstnessInMacroBody) {
765 MockOverloadedOnConstness mock;
766 const MockOverloadedOnConstness* const_mock = &mock;
774 TEST(MockMethodMockFunctionTest, WorksForVoidNullary) {
775 MockFunction<void()>
foo;
780 TEST(MockMethodMockFunctionTest, WorksForNonVoidNullary) {
789 TEST(MockMethodMockFunctionTest, WorksForVoidUnary) {
790 MockFunction<void(
int)>
foo;
795 TEST(MockMethodMockFunctionTest, WorksForNonVoidBinary) {
796 MockFunction<
int(
bool,
int)>
foo;
807 TEST(MockMethodMockFunctionTest, WorksFor10Arguments) {
808 MockFunction<
int(
bool a0,
char a1,
int a2,
int a3,
int a4,
809 int a5,
int a6,
char a7,
int a8,
bool a9)>
foo;
810 EXPECT_CALL(
foo,
Call(
_,
'a',
_,
_,
_,
_,
_,
_,
_,
_))
813 EXPECT_EQ(1,
foo.Call(
false,
'a', 0, 0, 0, 0, 0,
'b', 0,
true));
814 EXPECT_EQ(2,
foo.Call(
true,
'a', 0, 0, 0, 0, 0,
'b', 1,
false));
817 TEST(MockMethodMockFunctionTest, AsStdFunction) {
818 MockFunction<
int(
int)>
foo;
828 TEST(MockMethodMockFunctionTest, AsStdFunctionReturnsReference) {
829 MockFunction<
int&()>
foo;
832 int&
ref =
foo.AsStdFunction()();
838 TEST(MockMethodMockFunctionTest, AsStdFunctionWithReferenceParameter) {
839 MockFunction<
int(
int &)>
foo;
850 template <
typename Expected,
typename F>
851 static constexpr
bool IsMockFunctionTemplateArgumentDeducedTo(
852 const internal::MockFunction<F>&) {
858 template <
typename F>
863 int(
bool,
char,
int,
int,
int,
int,
int,
char,
int,
bool)>;
868 IsMockFunctionTemplateArgumentDeducedForRawSignature) {
869 using Argument = TypeParam;
871 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(
foo));
875 IsMockFunctionTemplateArgumentDeducedForStdFunction) {
876 using Argument = std::function<TypeParam>;
878 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(
foo));
883 IsMockFunctionCallMethodSignatureTheSameForRawSignatureAndStdFunction) {
885 using ForStdFunction =
890 template <
typename F>
895 IsMockFunctionTemplateArgumentDeducedForAlternateCallable) {
898 EXPECT_TRUE(IsMockFunctionTemplateArgumentDeducedTo<TypeParam>(
foo));
903 IsMockFunctionCallMethodSignatureTheSameForAlternateCallable) {
905 using ForStdFunction =
911 struct MockMethodSizes0 {
914 struct MockMethodSizes1 {
917 struct MockMethodSizes2 {
920 struct MockMethodSizes3 {
923 struct MockMethodSizes4 {
944 TEST(MockMethodMockFunctionTest, MockMethodSizeOverhead) {
973 TEST(MockMethodMockFunctionTest, NoexceptSpecifierPreserved) {
974 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func1()));
975 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func2()));
976 EXPECT_FALSE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func3()));
977 EXPECT_FALSE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func4()));
978 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func5()));
979 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func6()));
980 EXPECT_TRUE(noexcept(std::declval<MockMethodNoexceptSpecifier>().func7()));
981 EXPECT_EQ(noexcept(std::declval<MockMethodNoexceptSpecifier>().func8()),