Skip to main content
Rollback to Revision 2
Source Link
/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)                       \
class MockingClass : public MockedClass {                           \
 public: 

#define INJECTION_SET(FuncName, Substitute)                                     \
private:                                                                        \
                                                                                \
template<class T>                                                               \T>\
class FuncName##Class {                                                         \
    public:                                                                     \
        FuncName##Class():m_func((T)Substitute){}                               \
        T m_func;                                                               \m_func;\
};                                                                              \
                                                                                \;\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;                      \m_##FuncName##Class;\
mutable int m_##FuncName##CallCounter = 0;                                      \
                                                                                \0;\
public:                                                                         \
                                                                                \
void Inject##FuncName(decltype(Substitute) sub){                                \
m_##FuncName##Class.m_func = sub;                                               \
}                                                                               \
                                                                                \
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;              \
}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)                                                     \
ReturnType FuncName Signature override {                                                \override\
m_##FuncName##CallCounter++;                                                           { \m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);                                         \
}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)  \
INJECTION_SET(FuncName, Substitute)                                                             \
ReturnType FuncName Signature const override{                                                   \override\
m_##FuncName##CallCounter++;                                                                   { \m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);                                                 \
}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                \
private:                                                                                    \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;          \m_##FuncName##Class##overloadedMethodNumber;\
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;                          \
                                                                                            \0;\
public:                                                                                     \
void Inject##FuncName(decltype(Substitute) sub){                                            \
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;                                   \
}                                                                                           \
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                        \
ReturnType FuncName Signature override{                                                                                     \override\
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                       { \m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                     \
}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)  \
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                                \
ReturnType FuncName Signature const override{                                                                                       \override\
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                               { \m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                             \
}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD
 
/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)                       \
class MockingClass : public MockedClass {                           \
 public:

#define INJECTION_SET(FuncName, Substitute)                                     \
private:                                                                        \
                                                                                \
template<class T>                                                               \
class FuncName##Class {                                                         \
    public:                                                                     \
        FuncName##Class():m_func((T)Substitute){}                               \
        T m_func;                                                               \
};                                                                              \
                                                                                \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;                      \
mutable int m_##FuncName##CallCounter = 0;                                      \
                                                                                \
public:                                                                         \
                                                                                \
void Inject##FuncName(decltype(Substitute) sub){                                \
m_##FuncName##Class.m_func = sub;                                               \
}                                                                               \
                                                                                \
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;              \
}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)                                                     \
ReturnType FuncName Signature override {                                                \
m_##FuncName##CallCounter++;                                                            \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                         \
}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)  \
INJECTION_SET(FuncName, Substitute)                                                             \
ReturnType FuncName Signature const override{                                                   \
m_##FuncName##CallCounter++;                                                                    \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                                 \
}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                \
private:                                                                                    \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;          \
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;                          \
                                                                                            \
public:                                                                                     \
void Inject##FuncName(decltype(Substitute) sub){                                            \
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;                                   \
}                                                                                           \
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                        \
ReturnType FuncName Signature override{                                                                                     \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                        \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                     \
}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)  \
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                                \
ReturnType FuncName Signature const override{                                                                                       \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                                \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                             \
}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD
 
/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)\
class MockingClass : public MockedClass {\
 public: 

#define INJECTION_SET(FuncName, Substitute)\
private:\
template<class T>\
class FuncName##Class {\
public:\
FuncName##Class():m_func((T)Substitute){}\
T m_func;\
};\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;\
mutable int m_##FuncName##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class.m_func = sub;}\
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature const override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
private:\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;\
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;}\
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature const override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD
Reformatting code for readability.
Source Link
muaz
  • 121
  • 3
/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)                       \
class MockingClass : public MockedClass {                           \
 public: 

#define INJECTION_SET(FuncName, Substitute)                                     \
private:                                                                        \
                                                                                \
template<class T>\T>                                                               \
class FuncName##Class {                                                         \
    public:                                                                     \
        FuncName##Class():m_func((T)Substitute){}                               \
        T m_func;\m_func;                                                               \
};\;                                                                              \
                                                                                \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;\m_##FuncName##Class;                      \
mutable int m_##FuncName##CallCounter = 0;\0;                                      \
                                                                                \
public:                                                                         \
                                                                                \
void Inject##FuncName(decltype(Substitute) sub){                                \
m_##FuncName##Class.m_func = sub;                                               \
}                                                                               \
                                                                                \
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;              \
}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)                                                     \
ReturnType FuncName Signature override\
override { m_##FuncName##CallCounter++;\                                               \
m_##FuncName##CallCounter++;                                                            \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                         \
}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)  \
INJECTION_SET(FuncName, Substitute)                                                             \
ReturnType FuncName Signature const override\
override{ m_##FuncName##CallCounter++;\                                                  \
m_##FuncName##CallCounter++;                                                                    \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                                 \
}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                \
private:                                                                                    \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;\m_##FuncName##Class##overloadedMethodNumber;          \
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;\0;                          \
                                                                                            \
public:                                                                                     \
void Inject##FuncName(decltype(Substitute) sub){                                            \
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;                                   \
}                                                                                           \
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                        \
ReturnType FuncName Signature override\
override{ m_##FuncName##overloadedMethodNumber##CallCounter++;\                                                                                    \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                        \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                     \
}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)  \
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                                \
ReturnType FuncName Signature const override\
override{ m_##FuncName##overloadedMethodNumber##CallCounter++;\                                                                                      \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                                \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                             \
}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD 

/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)\
class MockingClass : public MockedClass {\
 public: 

#define INJECTION_SET(FuncName, Substitute)\
private:\
template<class T>\
class FuncName##Class {\
public:\
FuncName##Class():m_func((T)Substitute){}\
T m_func;\
};\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;\
mutable int m_##FuncName##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class.m_func = sub;}\
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature const override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
private:\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;\
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;}\
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature const override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD
/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)                       \
class MockingClass : public MockedClass {                           \
 public:

#define INJECTION_SET(FuncName, Substitute)                                     \
private:                                                                        \
                                                                                \
template<class T>                                                               \
class FuncName##Class {                                                         \
    public:                                                                     \
        FuncName##Class():m_func((T)Substitute){}                               \
        T m_func;                                                               \
};                                                                              \
                                                                                \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;                      \
mutable int m_##FuncName##CallCounter = 0;                                      \
                                                                                \
public:                                                                         \
                                                                                \
void Inject##FuncName(decltype(Substitute) sub){                                \
m_##FuncName##Class.m_func = sub;                                               \
}                                                                               \
                                                                                \
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;              \
}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)                                                     \
ReturnType FuncName Signature override {                                                \
m_##FuncName##CallCounter++;                                                            \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                         \
}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)  \
INJECTION_SET(FuncName, Substitute)                                                             \
ReturnType FuncName Signature const override{                                                   \
m_##FuncName##CallCounter++;                                                                    \
return m_##FuncName##Class.m_func(__VA_ARGS__);                                                 \
}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                \
private:                                                                                    \
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;          \
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;                          \
                                                                                            \
public:                                                                                     \
void Inject##FuncName(decltype(Substitute) sub){                                            \
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;                                   \
}                                                                                           \
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                        \
ReturnType FuncName Signature override{                                                                                     \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                        \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                     \
}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)  \
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)                                                                \
ReturnType FuncName Signature const override{                                                                                       \
m_##FuncName##overloadedMethodNumber##CallCounter++;                                                                                \
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);                                                             \
}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD 

Post Reopened by Sᴀᴍ Onᴇᴌᴀ, Stephen Rauch, pacmaninbw, forsvarir, Billal BEGUERADJ
added 2715 characters in body
Source Link
muaz
  • 121
  • 3

I have developed Mockingbird a mocking framework for c++, it depends on function injection, here is the code from the repository:

/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)\
class MockingClass : public MockedClass {\
 public: 

#define INJECTION_SET(FuncName, Substitute)\
private:\
template<class T>\
class FuncName##Class {\
public:\
FuncName##Class():m_func((T)Substitute){}\
T m_func;\
};\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;\
mutable int m_##FuncName##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class.m_func = sub;}\
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature const override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
private:\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;\
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;}\
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature const override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD

and here is an example on how it works:

I have developed Mockingbird a mocking framework for c++, it depends on function injection, and here is an example on how it works:

I have developed Mockingbird a mocking framework for c++, it depends on function injection, here is the code from the repository:

/*
 *  Mockingbird is a simple and a powerful mocking framework for c++.
 *  Copyright (c) Mouaz Chamieh April 2021.
 *  Distributed under the MIT License. Please refer to the LICENSE file at:
 *  https://github.com/muazsh/Mockingbird
 */

#pragma once
#ifndef MOCKINGBIRD
#define MOCKINGBIRD

#define START_MOCK(MockingClass, MockedClass)\
class MockingClass : public MockedClass {\
 public: 

#define INJECTION_SET(FuncName, Substitute)\
private:\
template<class T>\
class FuncName##Class {\
public:\
FuncName##Class():m_func((T)Substitute){}\
T m_func;\
};\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class;\
mutable int m_##FuncName##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class.m_func = sub;}\
int Get##FuncName##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define CONST_FUNCTION(FuncName,ReturnType, Signature, Substitute, .../*signature variables*/)\
INJECTION_SET(FuncName, Substitute)\
ReturnType FuncName Signature const override\
{ m_##FuncName##CallCounter++;\
return m_##FuncName##Class.m_func(__VA_ARGS__);}

#define OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
private:\
FuncName##Class<decltype(Substitute)> m_##FuncName##Class##overloadedMethodNumber;\
mutable int m_##FuncName##overloadedMethodNumber##CallCounter = 0;\
public:\
void Inject##FuncName(decltype(Substitute) sub){\
m_##FuncName##Class##overloadedMethodNumber.m_func = sub;}\
int Get##FuncName##overloadedMethodNumber##CallCounter(){return m_##FuncName##CallCounter;}

#define FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define CONST_FUNCTION_OVERLOADING(FuncName,ReturnType, Signature, Substitute, overloadedMethodNumber, .../*signature variables*/)\
OVERLOAD_INJECTION_SET(FuncName, Substitute, overloadedMethodNumber)\
ReturnType FuncName Signature const override\
{ m_##FuncName##overloadedMethodNumber##CallCounter++;\
return m_##FuncName##Class##overloadedMethodNumber.m_func(__VA_ARGS__);}

#define END_MOCK(MockingClass)\
};

#endif // !MOCKINGBIRD

and here is an example on how it works:

Post Closed as "Not suitable for this site" by pacmaninbw, Sᴀᴍ Onᴇᴌᴀ, G. Sliepen, Ben A, Toby Speight
Source Link
muaz
  • 121
  • 3
Loading