stest.c 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157
  1. #include "precompile.h"
  2. #include "stest.h"
  3. #include "memutil.h"
  4. #include "hashset.h"
  5. #include "array.h"
  6. #include <stdarg.h>
  7. typedef struct case_t {
  8. const char *key;
  9. st_case_func func;
  10. }case_t;
  11. struct st_case_set
  12. {
  13. array_header_t *arr_case;
  14. int curr_attr;
  15. };
  16. #define FUNC_BEGIN_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
  17. #define FUNC_END_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
  18. #define FUNC_FAIL_ATTR (FOREGROUND_RED | FOREGROUND_INTENSITY)
  19. #define FUNC_ASSERT_ATTR (FOREGROUND_RED | FOREGROUND_INTENSITY)
  20. #define FUNC_NORMAL_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
  21. static int txt_vprintf(st_case_set *cset, int attr, const char *fmt, va_list arg)
  22. {
  23. if (cset->curr_attr != attr) {
  24. SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attr);
  25. cset->curr_attr = attr;
  26. }
  27. return vprintf(fmt, arg);
  28. }
  29. static int txt_printf(st_case_set *cset, int attr, const char *fmt, ...)
  30. {
  31. va_list arg;
  32. int rc;
  33. va_start(arg, fmt);
  34. rc = txt_vprintf(cset, attr, fmt, arg);
  35. va_end(arg);
  36. return rc;
  37. }
  38. TOOLKIT_API st_case_set* st_init()
  39. {
  40. st_case_set *cset;
  41. CONSOLE_SCREEN_BUFFER_INFO info;
  42. BOOL bRet;
  43. bRet = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
  44. if (!bRet)
  45. return NULL;
  46. cset = MALLOC_T(st_case_set);
  47. cset->curr_attr = info.wAttributes;
  48. cset->arr_case = array_make(16, sizeof(case_t*));
  49. return cset;
  50. }
  51. TOOLKIT_API void st_term(st_case_set *cset)
  52. {
  53. array_free2(cset->arr_case);
  54. free(cset);
  55. }
  56. TOOLKIT_API int st_run(st_case_set *cset)
  57. {
  58. int i;
  59. int rc = 0;
  60. int ok_cnt = 0;
  61. int failed_cnt = 0;
  62. for (i = 0; i < cset->arr_case->nelts; ++i) {
  63. case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
  64. int tmp_rc;
  65. txt_printf(cset, FUNC_BEGIN_ATTR, "=====test %s begin======\n", cs->key);
  66. __try {
  67. tmp_rc = cs->func(cset);
  68. } __except(EXCEPTION_EXECUTE_HANDLER) {
  69. txt_printf(cset, FUNC_FAIL_ATTR, "catch exception!!!\n");
  70. tmp_rc = -1;
  71. }
  72. txt_printf(cset, FUNC_END_ATTR, "=====test %s end=====\n", cs->key);
  73. if (!tmp_rc) {
  74. txt_printf(cset, FUNC_NORMAL_ATTR, "[pass]\n");
  75. } else {
  76. txt_printf(cset, FUNC_FAIL_ATTR, "[failed]\n");
  77. }
  78. if (tmp_rc) {
  79. failed_cnt ++;
  80. rc = tmp_rc;
  81. } else {
  82. ok_cnt ++;
  83. }
  84. printf("\n");
  85. }
  86. txt_printf(cset, FUNC_NORMAL_ATTR, "num of ok case: %d\n", ok_cnt);
  87. txt_printf(cset, FUNC_NORMAL_ATTR, "num of failed case: %d\n", failed_cnt);
  88. txt_printf(cset, FUNC_NORMAL_ATTR, "num of total case: %d\n", ok_cnt+failed_cnt);
  89. return rc;
  90. }
  91. TOOLKIT_API int st_add(st_case_set* cset, const char *key, st_case_func func)
  92. {
  93. case_t *cs;
  94. cs = MALLOC_T(case_t);
  95. cs->func = func;
  96. cs->key = key;
  97. ARRAY_PUSH(cset->arr_case, case_t*) = cs;
  98. return 0;
  99. }
  100. TOOLKIT_API int st_remove(st_case_set* cset, const char *key)
  101. {
  102. int i;
  103. for (i = 0; i < cset->arr_case->nelts; ++i) {
  104. case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
  105. if (strcmp(key, cs->key) == 0) {
  106. ARRAY_DEL(cset->arr_case, i, case_t*);
  107. free(cs);
  108. return 0;
  109. }
  110. }
  111. return -1;
  112. }
  113. TOOLKIT_API int st_remove_all(st_case_set* cset)
  114. {
  115. int i;
  116. for (i = 0; i < cset->arr_case->nelts; ++i) {
  117. case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
  118. free(cs);
  119. }
  120. array_clear(cset->arr_case);
  121. return 0;
  122. }
  123. TOOLKIT_API int st_fail_printf(st_case_set* cset, const char *fmt, ...)
  124. {
  125. va_list arg;
  126. int rc;
  127. va_start(arg, fmt);
  128. rc = st_fail_vprintf(cset, fmt, arg);
  129. va_end(arg);
  130. return rc;
  131. }
  132. TOOLKIT_API int st_fail_vprintf(st_case_set* cset, const char *fmt, va_list arg)
  133. {
  134. int rc;
  135. rc = txt_printf(cset, FUNC_FAIL_ATTR, "[FAIL] ");
  136. if (rc >= 0)
  137. rc += txt_vprintf(cset, FUNC_FAIL_ATTR, fmt, arg);
  138. if (rc >= 0)
  139. rc += printf("\n");
  140. return rc;
  141. }