ADTF  3.18.2
testmacros.h
Go to the documentation of this file.
1 
7 #ifndef _TEST_MACROS_INCLUDES_
8 #define _TEST_MACROS_INCLUDES_
9 
10 namespace A_UTILS_NS
11 {
12 #ifdef _ASSERT_BASE
21  #define __a_utils_local_assert_fn(_expr, _msg) \
22  (void) ((!!(_expr)) || \
23  (1 != _CrtDbgReport(_CRT_ASSERT, __FILE__, __LINE__, nullptr, A_UTILS_NS::cString(_msg).GetPtr())) || \
24  (_CrtDbgBreak(), 0));
25 
34  #define __a_utils_test_assert(_msg, _expr) \
35  __a_utils_local_assert_fn((_expr), A_UTILS_NS::cString(_msg).GetPtr())
36 
44  #define __a_utils_test_report(_msg) \
45  __a_utils_local_assert_fn(false, A_UTILS_NS::cString(_msg).GetPtr())
46 
54  #define __a_utils_test_log(_msg) \
55  printf("%s(%d) %s %s\n", __FILE__, __LINE__, __FUNCTION__, A_UTILS_NS::cString(_msg).GetPtr()); \
56  OutputDebugStringWrapper(_msg)
57 #else
66  #define __a_utils_test_assert(_msg, _expr) \
67  _assert((_expr), __FILE__, __LINE__)
68 
76  #define __a_utils_test_report(_msg) \
77  _assert(false, __FILE__, __LINE__)
78 
86  #define __a_utils_test_log(_msg) \
87  printf("%s(%d) %s\n", __FILE__, __LINE__, A_UTILS_NS::cString(_msg).GetPtr())
88 #endif
89 
90 #if (defined(ENABLE_INTERACTIVE_TEST) && defined(_DEBUG))
91 
99  #define __a_utils_interactive_test(_expr) \
100  if (!(_expr)) \
101  { \
102  __a_utils_test_report("test failed: (" #_expr ")"); \
103  RETURN_TEST_ERROR(ERR_FAILED); \
104  } \
105  else \
106  { \
107  __a_utils_test_pass(_expr); \
108  }
109 
117  #define __a_utils_interactive_test_err(_expr) \
118  if ((_expr)) \
119  { \
120  __a_utils_test_report("bad case test failed: (" #_expr ")"); \
121  RETURN_TEST_ERROR(ERR_FAILED); \
122  } \
123  else \
124  { \
125  __a_utils_test_pass(_expr); \
126  }
127 
135  #define __a_utils_interactive_test_result(_expr) \
136  { \
137  tResult __result = (_expr); \
138  if (IS_FAILED(__result)) \
139  { \
140  __a_utils_test_report("test failed: (" #_expr " == OK)"); \
141  RETURN_TEST_ERROR(__result); \
142  } \
143  else \
144  { \
145  __a_utils_test_pass_result(_expr); \
146  } \
147  }
148 
156  #define __a_utils_interactive_test_err_result(_expr) \
157  { \
158  tResult __result = (_expr); \
159  if (IS_OK(__result)) \
160  { \
161  __a_utils_test_report("bad case test failed: (" #_expr " == OK)"); \
162  RETURN_TEST_ERROR(__result); \
163  } \
164  else \
165  { \
166  __a_utils_test_pass_result(_expr); \
167  } \
168  }
169 
177  #define __a_utils_interactive_test_pointer(_ptr) \
178  if ((void*)(_ptr) == nullptr) \
179  { \
180  __a_utils_test_report("test failed: (" #_ptr " != nullptr)"); \
181  RETURN_TEST_ERROR(_errcode_POINTER); \
182  } \
183  else \
184  { \
185  __a_utils_test_pass_pointer(_ptr); \
186  }
187 
195  #define __a_utils_interactive_test_pointer_null(_ptr) \
196  if ((void*)(_ptr) != nullptr) \
197  { \
198  __a_utils_test_report("bad case test failed: (" #_ptr " != nullptr)"); \
199  RETURN_TEST_ERROR(_errcode_POINTER); \
200  } \
201  else \
202  { \
203  __a_utils_test_pass_pointer(_ptr); \
204  }
205 
213  #define __a_utils_test_pass(_expr)
214 
222  #define __a_utils_test_pass_result(_expr)
223 
231  #define __a_utils_test_pass_pointer(_ptr)
232 
240  #define __a_utils_test(_expr) \
241  __a_utils_interactive_test(_expr)
242 
249  #define __a_utils_test_err(_expr) \
250  __a_utils_interactive_test_err(_expr)
251 
259  #define __a_utils_test_result(_expr) \
260  __a_utils_interactive_test_result(_expr)
261 
269  #define __a_utils_test_err_result(_expr) \
270  __a_utils_interactive_test_err_result(_expr)
271 
280  #define __a_utils_test_err_result_code(_expected, _expr) \
281  __a_utils_log_test("test failed: (" #_expr " == OK)", (_expr) == (_expected))
282 
289  #define __a_utils_test_pointer(_ptr) \
290  __a_utils_interactive_test_pointer(_ptr)
291 
298  #define __a_utils_test_pointer_null(_ptr) \
299  __a_utils_interactive_test_pointer_null(_ptr)
300 
301 #else // ENABLE_INTERACTIVE_TEST
302 
309  #define __a_utils_log_test_fail(_msg, _expr, _umsg) \
310  { \
311  __get_testbench()->Log(ITestBench::TEST_LOG_FAILED, _msg, #_expr, __FILE__, __LINE__, __FUNCTION__, _umsg); \
312  throw "test failed"; \
313  }
314 
321  #define __a_utils_log_test_succ(_msg, _expr, _umsg) \
322  { \
323  __get_testbench()->Log(ITestBench::TEST_LOG_PASSED, _msg, #_expr, __FILE__, __LINE__, __FUNCTION__, _umsg); \
324  }
325 
333  #define __a_utils_log_test(_msg, _expr) \
334  if (!(_expr)) \
335  { \
336  __a_utils_log_test_fail(_msg, _expr, nullptr) \
337  } \
338  else \
339  { \
340  __a_utils_log_test_succ(_msg, _expr, nullptr) \
341  }
342 
351  #define __a_utils_log_test_ext(_msg, _expr, _umsg) \
352  if (!(_expr)) \
353  { \
354  __a_utils_log_test_fail(_msg, _expr, _umsg) \
355  } \
356  else \
357  { \
358  __a_utils_log_test_succ(_msg, _expr, _umsg) \
359  }
360 
368  #define __a_utils_test(_expr) \
369  __a_utils_log_test("test failed: (" #_expr ")", (_expr))
370 
379  #define __a_utils_test_err(_expr) \
380  __a_utils_log_test("bad case test failed: (" #_expr ")", (!(_expr)))
381 
390  #define __a_utils_test_result(_expr) \
391  {\
392  tResult __nHelperResult = _expr; \
393  if (IS_FAILED(__nHelperResult)) \
394  {\
395  __a_utils_test_log(A_UTILS_NS::cString::Format(#_expr " returned error code: %d (description: %s)", __nHelperResult.GetErrorCode().value, __nHelperResult.GetDescription()));\
396  __a_utils_log_test_fail("test failed: IS_OK(" #_expr ")", IS_OK(_expr), nullptr);\
397  }\
398  else \
399  { \
400  __a_utils_log_test_succ("test failed: IS_OK(" #_expr ")", IS_OK(_expr), nullptr);\
401  } \
402  }
403 
412  #define __a_utils_test_err_result(_expr) \
413  __a_utils_log_test("bad case test failed: IS_FAILED(" #_expr ")", (IS_FAILED(_expr)))
414 
423  #define __a_utils_test_pointer(_ptr) \
424  __a_utils_log_test("test failed: (" #_ptr " != nullptr)", ((_ptr)!=nullptr))
425 
434  #define __a_utils_test_pointer_null(_ptr) \
435  __a_utils_log_test("bad case test failed: (" #_ptr " != nullptr)", ((_ptr)==nullptr))
436 
446  #define __a_utils_test_ext(_expr, _msg) \
447  __a_utils_log_test_ext("test failed: (" #_expr ")", (_expr), (_msg))
448 
457  #define __a_utils_test_err_ext(_expr, _msg) \
458  __a_utils_log_test_ext("bad case test failed: (" #_expr ")", (!(_expr)), (_msg))
459 
468  #define __a_utils_test_result_ext(_expr, _msg)\
469  {\
470  tResult __nHelperResult = _expr; \
471  if (IS_FAILED(__nHelperResult)) \
472  {\
473  __a_utils_test_log(A_UTILS_NS::cString::Format(#_expr " returned error code: %d", __nHelperResult.GetErrorCode()));\
474  __a_utils_log_test_fail("test failed: IS_OK(" #_expr ")", IS_OK(_expr), (_msg));\
475  }\
476  else \
477  { \
478  __a_utils_log_test_succ("test failed: IS_OK(" #_expr ")", IS_OK(_expr), (_msg));\
479  } \
480  }
481 
490  #define __a_utils_test_err_result_ext(_expr, _msg) \
491  __a_utils_log_test_ext("bad case test failed: IS_FAILED(" #_expr ")", (IS_FAILED(_expr)), (_msg))
492 
501  #define __a_utils_test_pointer_ext(_ptr, _msg) \
502  __a_utils_log_test_ext("test failed: (" #_ptr " != nullptr)", ((_ptr)!=nullptr), (_msg))
503 
512  #define __a_utils_test_pointer_null_ext(_ptr, _msg) \
513  __a_utils_log_test_ext("bad case test failed: (" #_ptr " != nullptr)", ((_ptr)==nullptr), (_msg))
514 
523  #define __a_utils_test_file_exists(_filename)\
524  __a_utils_test_ext(A_UTILS_NS::cFileSystem::Exists(_filename), _filename + A_UTILS_NS::cString(" does not exist"));
525 
526 
527 #endif // ENABLE_INTERACTIVE_TEST
528 
530 // ENABLE WHITEBOX TESTS
532 
536 #define DECLARE_TESTER_FRIEND(_tester, _whitebox) \
537  class _testable_##_whitebox : public _whitebox \
538  { friend class _tester; };
539 
543 #define __a_utils_test_friend(_whitebox) _testable_##_whitebox
544 
546 // IMPLEMENTATION SUPPORT MACROS
548 
554 #define RETURN_TEST_NOERROR
555 
563 #define RETURN_TEST_ERROR(_code)
564 
573 #define DECLARE_TESTER_CLASS(_classname) \
574  class _classname : public ITester
575 
584 #define BEGIN_TESTER_MAP(_classname) \
585  public: \
586  _classname(); \
587  const char* getClassName(); \
588  virtual void run() {
589 
597 #define DECLARE_TESTER_FUNCTION(_func) \
598  extern tTestDoc sFunctionDoc_##_func; \
599  __get_testbench()->LogStartFunction(&sFunctionDoc_##_func); \
600  if (sFunctionDoc_##_func.bActive) \
601  { \
602  try \
603  { \
604  setUp(); \
605  _func(); \
606  } \
607  catch (const char*) { } \
608  try \
609  { \
610  tearDown(); \
611  } \
612  catch (const char*) { } \
613  } \
614  __get_testbench()->LogStopFunction(&sFunctionDoc_##_func); \
615 
616 
622 #define END_TESTER_MAP() \
623  } \
624  tTestGroupDoc* getDoc();
625 
633 #define DECLARE_TESTER_CLASS(_classname) \
634  class _classname : public ITester
635 
647 #define IMPLEMENT_TESTER_CLASS(_classname, _id, _title, _desc, _req) \
648  static _classname _instance_##_classname; \
649  _classname::_classname() \
650  { __get_testbench()->RegisterTester(this); } \
651  const char* _classname::getClassName() \
652  { return #_classname; } \
653  tTestGroupDoc* _classname::getDoc() \
654  { \
655  static tTestGroupDoc sDoc= { _id, _title, _desc, _req }; \
656  return &sDoc; \
657  }
658 
660 // For internal use only
661 #define IMPLEMENT_TESTER_CLASS_CLASSNAME(_classname, _id, _title, _desc, _req) \
662  static _classname _instance_##_classname; \
663  _classname::_classname() \
664  { __get_testbench()->RegisterTester(this); } \
665  const char* _classname::getClassName() \
666  { return #_classname; } \
667  tTestGroupDoc* _classname::getDoc() \
668  { \
669  static tTestGroupDoc sDoc= { _id, #_classname, _desc, _req }; \
670  return &sDoc; \
671  }
673 
698 #define DEFINE_TEST(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
699  tTestDoc sFunctionDoc_##_func = { _id, _title, _desc, _strat, _passedif, _remarks, __FILE__, tTrue, _req, _user }; \
700  tTestResult _classname::_func()
701 
703 // For internal use only
704 #define DEFINE_TEST_FUNCNAME(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
705  tTestDoc sFunctionDoc_##_func = { _id, #_classname "::" #_func, _desc, _strat, _passedif, _remarks, __FILE__, tTrue, _req, _user }; \
706  tTestResult _classname::_func()
708 
716 #define DEFINE_TEST_INACTIVE(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
717  tTestDoc sFunctionDoc_##_func = { _id, _title, _desc, _strat, _passedif, _remarks, __FILE__, tFalse, _req, _user }; \
718  tTestResult _classname::_func()
719 
721 // For internal use only
722 #define DEFINE_TEST_INACTIVE_FUNCNAME(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
723  tTestDoc sFunctionDoc_##_func = { _id, #_classname "::" #_func "_INACTIVE", _desc, _strat, _passedif, _remarks, __FILE__, tFalse, _req, _user }; \
724  tTestResult _classname::_func()
726 
727 #ifdef A_UTILS_TESTER_USE_CLASS_AND_FUNC_NAMES
728  #undef IMPLEMENT_TESTER_CLASS
729  #undef DEFINE_TEST
730  #undef DEFINE_TEST_INACTIVE
731 
732  #define IMPLEMENT_TESTER_CLASS(_classname, _id, _title, _desc, _req) \
733  IMPLEMENT_TESTER_CLASS_CLASSNAME(_classname, _id, _title, _desc, _req)
734  #define DEFINE_TEST(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
735  DEFINE_TEST_FUNCNAME(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user)
736  #define DEFINE_TEST_INACTIVE(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user) \
737  DEFINE_TEST_INACTIVE_FUNCNAME(_classname, _func, _id, _title, _desc, _strat, _passedif, _remarks, _req, _user)
738 #endif
739 
740 } // namespace
741 
742 #endif // _TEST_MACROS_INCLUDES_
ADTF A_UTIL Namespace - Within adtf this is used as adtf::util or adtf_util.
Definition: d_ptr.h:11