Manak  2.0.0
manak_macros.hpp
Go to the documentation of this file.
1 
5 #define MANAK_SUITE(Name) \
6 ( new manak::ManakSuite(#Name) )
7 
8 #define MANAK_AUTO_SUITE(Name) \
9 static manak::RegisterManakSuite STRING_JOIN(X, STRING_JOIN(invoker, __LINE__))(#Name) \
10 
11 #define MANAK_AUTO_TEST(Name, X) static const size_t Name = 0
12 
13 #define MANAK_AUTO_SUITE_END() \
14 static manak::DeRegisterManakSuite STRING_JOIN(destroy, __LINE__)
15 
19 
20 #define MANAK_ADD_CASE(bench) \
21 class STRING_JOIN(unamed, STRING_JOIN(_, __LINE__)) \
22 { \
23  static manak::ManakCase* static_temp; \
24 }; \
25 manak::ManakCase* \
26 STRING_JOIN(unamed, STRING_JOIN(_, __LINE__))::static_temp = \
27 manak::ManakSuite::GetMasterSuite().GetCurrentSuite()->AddCase(bench)
28 
29 #define _MANAK_CASE_TIS(Type, Name, Library, Function, Tol, Iter, SP) \
30 ( new manak::Type(#Name, #Library, Function, Tol, Iter, SP) )
31 
35 
36 #define _MANAK_AUTO_CASE_TIS(Type, Name, Library, Tol, Iter, SP) \
37 struct STRING_JOIN(Name ## _ ## Library, __LINE__) \
38 { \
39  static void Run(); \
40  static manak::ManakCase* static_temp; \
41 }; \
42 manak::ManakCase* STRING_JOIN(Name ## _ ## Library, __LINE__)::static_temp = \
43 manak::ManakSuite::GetMasterSuite().GetCurrentSuite()-> \
44 AddCase(_MANAK_CASE_TIS(Type, \
45  Name, \
46  Library, \
47  STRING_JOIN(Name ## _ ## Library, __LINE__)::Run, \
48  Tol, \
49  Iter, \
50  SP)); \
51 void STRING_JOIN(Name ## _ ## Library, __LINE__)::Run()
52 
56 
57 #define _MANAK_CREATE_WITH_TEMPLATE_TIS(Type, Name, Library, Function, Tol, Iter, SP) \
58 ( manak::CTManakCase<manak::Type>(#Name, #Library, Function, Tol, Iter, SP) )
59 
63 
64 #define MANAK_GROUP(Name) \
65 class MG ## _ ## Name \
66 { \
67  public: \
68  MG ## _ ## Name() \
69  {} \
70  \
71  ~MG ## _ ## Name() \
72  { \
73  TDCaller<decltype(GetType())>(0); \
74  } \
75  \
76  template<typename... ABCDE> \
77  void InitCaller(ABCDE... abcde) \
78  { \
79  Manak_Group_Initialize(abcde...); \
80  } \
81  \
82  template<typename abcde> \
83  void TDCaller(manak::utils::manak_group_test<abcde, &abcde::Manak_Group_TearDown>*) \
84  { \
85  static_cast<abcde*>(this)->Manak_Group_TearDown(); \
86  } \
87  template<typename> \
88  void TDCaller(...) \
89  {} \
90  \
91  bool AddManakCase(manak::ManakCase* mc) \
92  { \
93  cases.push_back(mc); \
94  return true; \
95  } \
96  \
97  std::list<manak::ManakCase*> cases; \
98  \
99  static MG ## _ ## Name& Global() \
100  { \
101  static MG ## _ ## Name singleton; \
102  return singleton; \
103  } \
104  static MG ## _ ## Name GetType() \
105  { \
106  MG ## _ ## Name t; \
107  return t; \
108  }; \
109  \
110  void ACCaller() \
111  { \
112  AddCase<__LINE__, size_t> a; \
113  } \
114  \
115  template<size_t ABCDE, typename ABCDEF> \
116  struct AddCase \
117  { \
118  AddCase() \
119  { \
120  AddCase<ABCDE + 1, ABCDEF>(); \
121  } \
122  };
123 
124 
125 #define MANAK_GROUP_END() \
126  template<typename ABCDE> \
127  struct AddCase<__LINE__, ABCDE> \
128  {}; \
129 };
130 
131 #define GINIT \
132 void Manak_Group_Initialize
133 
134 #define GDOWN void Manak_Group_TearDown
135 
136 #define MANAK_GROUP_FUNCTION(Name) manak::utils::BindToObject(&decltype(GetType())::Name, &Global())
137 
141 
142 #define MANAK_ADD_GROUP(Name, ...) \
143 struct STRING_JOIN(Manak_unamed, __LINE__ ) \
144 { \
145  static bool value; \
146 }; \
147 bool STRING_JOIN(Manak_unamed,__LINE__)::value = \
148  manak::ManakSuite::GetMasterSuite().GetCurrentSuite()-> \
149  AddGroup<MG ## _ ## Name>(__VA_ARGS__)
150 
154 
155 #define F_MANAK_ADD_GROUP(X) MANAK_ADD_GROUP(X)
156 #define F_MANAK_GROUP(X) MANAK_GROUP(X)
157 
158 #define MANAK_AUTO_GROUP() \
159 class STRING_JOIN(MG_unamed, __LINE__); \
160 F_MANAK_ADD_GROUP(STRING_JOIN(unamed, __LINE__)); \
161 F_MANAK_GROUP(STRING_JOIN(unamed, __LINE__));
162 
163 #define MANAK_AUTO_GROUP_END() \
164 MANAK_GROUP_END();
165 
169 
170 #define F_MANAK_ADD_TO_GROUP(X) MANAK_ADD_TO_GROUP(X)
171 
172 #define MANAK_ADD_TO_GROUP(case) \
173 void STRING_JOIN(group_caller, __LINE__)() \
174 { \
175  Global().AddManakCase(case); \
176 } \
177 template<typename abcde> \
178 struct AddCase<__LINE__, abcde> \
179 { \
180  AddCase() \
181  { \
182  manak::utils::BindToObject(&decltype(GetType())::STRING_JOIN(group_caller, __LINE__), &Global())(); \
183  AddCase<__LINE__ + 1, abcde>(); \
184  } \
185 }
186 
187 #define _MANAK_GROUP_CASE_TIS(Type, Name, Library, Function, Tol, Iter, SP) \
188 ( new manak::Type(Name, Library, manak::utils::BindToObject(&decltype(GetType())::Function, &Global()), Tol, Iter, SP) )
189 
193 
194 #define _MANAK_AUTO_GROUP_CASE_TIS(Type, Name, Lib, Tol, Iter, SP) \
195 MANAK_ADD_TO_GROUP(_MANAK_GROUP_CASE_TIS(Type, Name, Lib, STRING_JOIN(manak_auto_fun, __LINE__), Tol, Iter, SP)); \
196 void STRING_JOIN(manak_auto_fun, __LINE__)()
197 
201 
202 #define _MANAK_CREATE_GROUP_WITH_TEMPLATE_TIS(Type, Name, Lib, Fun, Tol, Iter, SP) \
203 ( manak::CTManakCase<manak::Type>(Name, Lib, manak::utils::BindToObject(&decltype(GetType())::Fun, &Global()), Tol, Iter, SP) )
204