7 #ifndef _TEST_MACROS_INCLUDES_
8 #define _TEST_MACROS_INCLUDES_
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())) || \
34 #define __a_utils_test_assert(_msg, _expr) \
35 __a_utils_local_assert_fn((_expr), A_UTILS_NS::cString(_msg).GetPtr())
44 #define __a_utils_test_report(_msg) \
45 __a_utils_local_assert_fn(false, A_UTILS_NS::cString(_msg).GetPtr())
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)
66 #define __a_utils_test_assert(_msg, _expr) \
67 _assert((_expr), __FILE__, __LINE__)
76 #define __a_utils_test_report(_msg) \
77 _assert(false, __FILE__, __LINE__)
86 #define __a_utils_test_log(_msg) \
87 printf("%s(%d) %s\n", __FILE__, __LINE__, A_UTILS_NS::cString(_msg).GetPtr())
90 #if (defined(ENABLE_INTERACTIVE_TEST) && defined(_DEBUG))
99 #define __a_utils_interactive_test(_expr) \
102 __a_utils_test_report("test failed: (" #_expr ")"); \
103 RETURN_TEST_ERROR(ERR_FAILED); \
107 __a_utils_test_pass(_expr); \
117 #define __a_utils_interactive_test_err(_expr) \
120 __a_utils_test_report("bad case test failed: (" #_expr ")"); \
121 RETURN_TEST_ERROR(ERR_FAILED); \
125 __a_utils_test_pass(_expr); \
135 #define __a_utils_interactive_test_result(_expr) \
137 tResult __result = (_expr); \
138 if (IS_FAILED(__result)) \
140 __a_utils_test_report("test failed: (" #_expr " == OK)"); \
141 RETURN_TEST_ERROR(__result); \
145 __a_utils_test_pass_result(_expr); \
156 #define __a_utils_interactive_test_err_result(_expr) \
158 tResult __result = (_expr); \
159 if (IS_OK(__result)) \
161 __a_utils_test_report("bad case test failed: (" #_expr " == OK)"); \
162 RETURN_TEST_ERROR(__result); \
166 __a_utils_test_pass_result(_expr); \
177 #define __a_utils_interactive_test_pointer(_ptr) \
178 if ((void*)(_ptr) == nullptr) \
180 __a_utils_test_report("test failed: (" #_ptr " != nullptr)"); \
181 RETURN_TEST_ERROR(_errcode_POINTER); \
185 __a_utils_test_pass_pointer(_ptr); \
195 #define __a_utils_interactive_test_pointer_null(_ptr) \
196 if ((void*)(_ptr) != nullptr) \
198 __a_utils_test_report("bad case test failed: (" #_ptr " != nullptr)"); \
199 RETURN_TEST_ERROR(_errcode_POINTER); \
203 __a_utils_test_pass_pointer(_ptr); \
213 #define __a_utils_test_pass(_expr)
222 #define __a_utils_test_pass_result(_expr)
231 #define __a_utils_test_pass_pointer(_ptr)
240 #define __a_utils_test(_expr) \
241 __a_utils_interactive_test(_expr)
249 #define __a_utils_test_err(_expr) \
250 __a_utils_interactive_test_err(_expr)
259 #define __a_utils_test_result(_expr) \
260 __a_utils_interactive_test_result(_expr)
269 #define __a_utils_test_err_result(_expr) \
270 __a_utils_interactive_test_err_result(_expr)
280 #define __a_utils_test_err_result_code(_expected, _expr) \
281 __a_utils_log_test("test failed: (" #_expr " == OK)", (_expr) == (_expected))
289 #define __a_utils_test_pointer(_ptr) \
290 __a_utils_interactive_test_pointer(_ptr)
298 #define __a_utils_test_pointer_null(_ptr) \
299 __a_utils_interactive_test_pointer_null(_ptr)
309 #define __a_utils_log_test_fail(_msg, _expr, _umsg) \
311 __get_testbench()->Log(ITestBench::TEST_LOG_FAILED, _msg, #_expr, __FILE__, __LINE__, __FUNCTION__, _umsg); \
312 throw "test failed"; \
321 #define __a_utils_log_test_succ(_msg, _expr, _umsg) \
323 __get_testbench()->Log(ITestBench::TEST_LOG_PASSED, _msg, #_expr, __FILE__, __LINE__, __FUNCTION__, _umsg); \
333 #define __a_utils_log_test(_msg, _expr) \
336 __a_utils_log_test_fail(_msg, _expr, nullptr) \
340 __a_utils_log_test_succ(_msg, _expr, nullptr) \
351 #define __a_utils_log_test_ext(_msg, _expr, _umsg) \
354 __a_utils_log_test_fail(_msg, _expr, _umsg) \
358 __a_utils_log_test_succ(_msg, _expr, _umsg) \
368 #define __a_utils_test(_expr) \
369 __a_utils_log_test("test failed: (" #_expr ")", (_expr))
379 #define __a_utils_test_err(_expr) \
380 __a_utils_log_test("bad case test failed: (" #_expr ")", (!(_expr)))
390 #define __a_utils_test_result(_expr) \
392 tResult __nHelperResult = _expr; \
393 if (IS_FAILED(__nHelperResult)) \
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);\
400 __a_utils_log_test_succ("test failed: IS_OK(" #_expr ")", IS_OK(_expr), nullptr);\
412 #define __a_utils_test_err_result(_expr) \
413 __a_utils_log_test("bad case test failed: IS_FAILED(" #_expr ")", (IS_FAILED(_expr)))
423 #define __a_utils_test_pointer(_ptr) \
424 __a_utils_log_test("test failed: (" #_ptr " != nullptr)", ((_ptr)!=nullptr))
434 #define __a_utils_test_pointer_null(_ptr) \
435 __a_utils_log_test("bad case test failed: (" #_ptr " != nullptr)", ((_ptr)==nullptr))
446 #define __a_utils_test_ext(_expr, _msg) \
447 __a_utils_log_test_ext("test failed: (" #_expr ")", (_expr), (_msg))
457 #define __a_utils_test_err_ext(_expr, _msg) \
458 __a_utils_log_test_ext("bad case test failed: (" #_expr ")", (!(_expr)), (_msg))
468 #define __a_utils_test_result_ext(_expr, _msg)\
470 tResult __nHelperResult = _expr; \
471 if (IS_FAILED(__nHelperResult)) \
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));\
478 __a_utils_log_test_succ("test failed: IS_OK(" #_expr ")", IS_OK(_expr), (_msg));\
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))
501 #define __a_utils_test_pointer_ext(_ptr, _msg) \
502 __a_utils_log_test_ext("test failed: (" #_ptr " != nullptr)", ((_ptr)!=nullptr), (_msg))
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))
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"));
536 #define DECLARE_TESTER_FRIEND(_tester, _whitebox) \
537 class _testable_##_whitebox : public _whitebox \
538 { friend class _tester; };
543 #define __a_utils_test_friend(_whitebox) _testable_##_whitebox
554 #define RETURN_TEST_NOERROR
563 #define RETURN_TEST_ERROR(_code)
573 #define DECLARE_TESTER_CLASS(_classname) \
574 class _classname : public ITester
584 #define BEGIN_TESTER_MAP(_classname) \
587 const char* getClassName(); \
597 #define DECLARE_TESTER_FUNCTION(_func) \
598 extern tTestDoc sFunctionDoc_##_func; \
599 __get_testbench()->LogStartFunction(&sFunctionDoc_##_func); \
600 if (sFunctionDoc_##_func.bActive) \
607 catch (const char*) { } \
612 catch (const char*) { } \
614 __get_testbench()->LogStopFunction(&sFunctionDoc_##_func); \
622 #define END_TESTER_MAP() \
624 tTestGroupDoc* getDoc();
633 #define DECLARE_TESTER_CLASS(_classname) \
634 class _classname : public ITester
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() \
655 static tTestGroupDoc sDoc= { _id, _title, _desc, _req }; \
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() \
669 static tTestGroupDoc sDoc= { _id, #_classname, _desc, _req }; \
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()
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()
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()
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()
727 #ifdef A_UTILS_TESTER_USE_CLASS_AND_FUNC_NAMES
728 #undef IMPLEMENT_TESTER_CLASS
730 #undef DEFINE_TEST_INACTIVE
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)
ADTF A_UTIL Namespace - Within adtf this is used as adtf::util or adtf_util.