Mercurial > hg > th-libs
changeset 259:33652234f162
Work on tests.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Feb 2016 12:36:06 +0200 |
parents | d746fd5975f4 |
children | ab18ebbb5529 |
files | tests.c |
diffstat | 1 files changed, 80 insertions(+), 56 deletions(-) [+] |
line wrap: on
line diff
--- a/tests.c Tue Feb 16 23:11:38 2016 +0200 +++ b/tests.c Wed Feb 17 12:36:06 2016 +0200 @@ -5,65 +5,89 @@ #define SET_BUF_SIZE 128 -int failed, passed; +char *test_str_header = NULL, + *test_str_res = NULL; + +int tests_failed, tests_passed, tests_total; + char buf1[SET_BUF_SIZE+2], buf2[SET_BUF_SIZE+2]; -int test_snprintf_do2(size_t len, const char *fmt, va_list ap) +void test_start_v(const char *fmt, va_list ap) +{ + tests_total++; + + th_free_r(&test_str_header); + th_free_r(&test_str_res); + + test_str_header = th_strdup_vprintf(fmt, ap); +} + + +void test_start(const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + test_start_v(fmt, ap); + va_end(ap); +} + + +void test_result_msg_v(BOOL check, const char *fmt, va_list ap) { - int ret1, ret2, ret = 0; + if (check) + { + THPRINT(1, "%s: OK\n", test_str_header); + tests_passed++; + } + else + { + THPRINT(0, "%s: ", test_str_header); + if (fmt != NULL) + THPRINT_V(0, fmt, ap); + THPRINT(0, "\n%s\n", test_str_res); + tests_failed++; + } +} + + +void test_result_msg(BOOL check, const char *fmt, ...) +{ + va_list ap; + va_start(ap, fmt); + test_result_msg_v(check, fmt, ap); + va_end(ap); +} + + +void test_result(BOOL check) +{ + test_result_msg_v(check, NULL, NULL); +} + + +#define SET_SENTINEL_BYTE 0x0e5 + +void test_snprintf_do(size_t len, const char *fmt, va_list ap, const char *msg) +{ + int ret1, ret2; va_list tmp; - memset(buf1, 0xe5, SET_BUF_SIZE+2); buf1[SET_BUF_SIZE+1] = 0; - memset(buf2, 0xe5, SET_BUF_SIZE+2); buf2[SET_BUF_SIZE+1] = 0; + test_start("th_vsnprintf('%s', %s)", fmt, msg); + + memset(buf1, SET_SENTINEL_BYTE, SET_BUF_SIZE+2); buf1[SET_BUF_SIZE+1] = 0; + memset(buf2, SET_SENTINEL_BYTE, SET_BUF_SIZE+2); buf2[SET_BUF_SIZE+1] = 0; va_copy(tmp, ap); ret1 = th_vsnprintf(buf1, len, fmt, ap); ret2 = vsnprintf(buf2, len, fmt, tmp); - - if (ret1 != ret2) - { - THPRINT(1, " retval mismatch (%d != %d)\n", ret1, ret2); - ret = -1; - } - - if (strcmp(buf1, buf2)) - { - THPRINT(1, " result mismatch:\n'%s' VS\n'%s'\n", buf1, buf2); - ret = -2; - } - - if ((unsigned char) buf1[len] != 0xe5) - { - THPRINT(1, " buffer #1 overflow, sentinel 0x%02x\n", buf1[len]); - ret = -2; - } - - if ((unsigned char) buf2[len] != 0xe5) - { - THPRINT(1, " buffer #2 overflow, sentinel 0x%02x\n", buf2[len]); - ret = -2; - } - - if (ret != 0) - THPRINT(1, "th_vsnprintf(%" TH_PRIu_SIZE_T ", '%s'): ", len, fmt); - - if (ret == 0) - THPRINT(1, "OK\n"); - - return ret; -} - - -void test_snprintf_do(size_t len, const char *fmt, va_list ap) -{ - int ret = test_snprintf_do2(len, fmt, ap); - if (ret == 0) - passed++; - else - failed++; + test_result_msg(ret1 == ret2, "retval mismatch %d != %d", ret1, ret2); + test_result_msg(strcmp(buf1, buf2) == 0, "result mismatch '%s' != '%s'", buf1, buf2); + + test_result_msg((unsigned char) buf1[len] == SET_SENTINEL_BYTE, "buffer #1 overflow, sentinel 0x%02x", buf1[len]); + test_result_msg((unsigned char) buf2[len] == SET_SENTINEL_BYTE, "buffer #2 overflow, sentinel 0x%02x", buf2[len]); } @@ -72,11 +96,11 @@ va_list ap, tmp; THPRINT(1, "----------------------------------------------\n"); va_start(ap, fmt); - va_copy(tmp, ap); test_snprintf_do(0, fmt, tmp); - va_copy(tmp, ap); test_snprintf_do(1, fmt, tmp); - va_copy(tmp, ap); test_snprintf_do(2, fmt, tmp); - va_copy(tmp, ap); test_snprintf_do(16, fmt, tmp); - va_copy(tmp, ap); test_snprintf_do(SET_BUF_SIZE, fmt, tmp); + va_copy(tmp, ap); test_snprintf_do(0, fmt, tmp, "0"); + va_copy(tmp, ap); test_snprintf_do(1, fmt, tmp, "1"); + va_copy(tmp, ap); test_snprintf_do(2, fmt, tmp, "2"); + va_copy(tmp, ap); test_snprintf_do(16, fmt, tmp, "16"); + va_copy(tmp, ap); test_snprintf_do(SET_BUF_SIZE, fmt, tmp, "SET_BUF_SIZE"); va_end(ap); THPRINT(1, "----------------------------------------------\n"); } @@ -91,7 +115,7 @@ // Initialization // th_init("th-test", "th-libs unit tests", "0.0.1", NULL, NULL); - th_verbosityLevel = 0; + th_verbosityLevel = 1; if (sizeof(char) != sizeof(unsigned char)) { @@ -99,7 +123,7 @@ return -1; } - failed = passed = 0; + tests_failed = tests_passed = tests_total = 0; // // Test series #1 @@ -126,8 +150,8 @@ // // Print summary and exit // - THPRINT(0, "%d tests failed, %d passed.\n", - failed, passed); + THPRINT(0, "%d tests failed, %d passed (%d main tests).\n", + tests_failed, tests_passed, tests_total); return 0; }