| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157 |
- #include "precompile.h"
- #include "stest.h"
- #include "memutil.h"
- #include "hashset.h"
- #include "array.h"
- #include <stdarg.h>
- typedef struct case_t {
- const char *key;
- st_case_func func;
- }case_t;
- struct st_case_set
- {
- array_header_t *arr_case;
- int curr_attr;
- };
- #define FUNC_BEGIN_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
- #define FUNC_END_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED)
- #define FUNC_FAIL_ATTR (FOREGROUND_RED | FOREGROUND_INTENSITY)
- #define FUNC_ASSERT_ATTR (FOREGROUND_RED | FOREGROUND_INTENSITY)
- #define FUNC_NORMAL_ATTR (FOREGROUND_BLUE | FOREGROUND_GREEN | FOREGROUND_RED | FOREGROUND_INTENSITY)
- static int txt_vprintf(st_case_set *cset, int attr, const char *fmt, va_list arg)
- {
- if (cset->curr_attr != attr) {
- SetConsoleTextAttribute(GetStdHandle(STD_OUTPUT_HANDLE), attr);
- cset->curr_attr = attr;
- }
- return vprintf(fmt, arg);
- }
- static int txt_printf(st_case_set *cset, int attr, const char *fmt, ...)
- {
- va_list arg;
- int rc;
- va_start(arg, fmt);
- rc = txt_vprintf(cset, attr, fmt, arg);
- va_end(arg);
- return rc;
- }
- TOOLKIT_API st_case_set* st_init()
- {
- st_case_set *cset;
- CONSOLE_SCREEN_BUFFER_INFO info;
- BOOL bRet;
- bRet = GetConsoleScreenBufferInfo(GetStdHandle(STD_OUTPUT_HANDLE), &info);
- if (!bRet)
- return NULL;
- cset = MALLOC_T(st_case_set);
- cset->curr_attr = info.wAttributes;
- cset->arr_case = array_make(16, sizeof(case_t*));
- return cset;
- }
- TOOLKIT_API void st_term(st_case_set *cset)
- {
- array_free2(cset->arr_case);
- free(cset);
- }
- TOOLKIT_API int st_run(st_case_set *cset)
- {
- int i;
- int rc = 0;
- int ok_cnt = 0;
- int failed_cnt = 0;
- for (i = 0; i < cset->arr_case->nelts; ++i) {
- case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
- int tmp_rc;
- txt_printf(cset, FUNC_BEGIN_ATTR, "=====test %s begin======\n", cs->key);
- __try {
- tmp_rc = cs->func(cset);
- } __except(EXCEPTION_EXECUTE_HANDLER) {
- txt_printf(cset, FUNC_FAIL_ATTR, "catch exception!!!\n");
- tmp_rc = -1;
- }
- txt_printf(cset, FUNC_END_ATTR, "=====test %s end=====\n", cs->key);
- if (!tmp_rc) {
- txt_printf(cset, FUNC_NORMAL_ATTR, "[pass]\n");
- } else {
- txt_printf(cset, FUNC_FAIL_ATTR, "[failed]\n");
- }
- if (tmp_rc) {
- failed_cnt ++;
- rc = tmp_rc;
- } else {
- ok_cnt ++;
- }
- printf("\n");
- }
- txt_printf(cset, FUNC_NORMAL_ATTR, "num of ok case: %d\n", ok_cnt);
- txt_printf(cset, FUNC_NORMAL_ATTR, "num of failed case: %d\n", failed_cnt);
- txt_printf(cset, FUNC_NORMAL_ATTR, "num of total case: %d\n", ok_cnt+failed_cnt);
- return rc;
- }
- TOOLKIT_API int st_add(st_case_set* cset, const char *key, st_case_func func)
- {
- case_t *cs;
- cs = MALLOC_T(case_t);
- cs->func = func;
- cs->key = key;
- ARRAY_PUSH(cset->arr_case, case_t*) = cs;
- return 0;
- }
- TOOLKIT_API int st_remove(st_case_set* cset, const char *key)
- {
- int i;
- for (i = 0; i < cset->arr_case->nelts; ++i) {
- case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
- if (strcmp(key, cs->key) == 0) {
- ARRAY_DEL(cset->arr_case, i, case_t*);
- free(cs);
- return 0;
- }
- }
- return -1;
- }
- TOOLKIT_API int st_remove_all(st_case_set* cset)
- {
- int i;
- for (i = 0; i < cset->arr_case->nelts; ++i) {
- case_t *cs = ARRAY_IDX(cset->arr_case, i, case_t*);
- free(cs);
- }
- array_clear(cset->arr_case);
- return 0;
- }
- TOOLKIT_API int st_fail_printf(st_case_set* cset, const char *fmt, ...)
- {
- va_list arg;
- int rc;
- va_start(arg, fmt);
- rc = st_fail_vprintf(cset, fmt, arg);
- va_end(arg);
- return rc;
- }
- TOOLKIT_API int st_fail_vprintf(st_case_set* cset, const char *fmt, va_list arg)
- {
- int rc;
- rc = txt_printf(cset, FUNC_FAIL_ATTR, "[FAIL] ");
- if (rc >= 0)
- rc += txt_vprintf(cset, FUNC_FAIL_ATTR, fmt, arg);
- if (rc >= 0)
- rc += printf("\n");
- return rc;
- }
|