Mercurial > hg > th-libs
annotate tests.c @ 266:3a020aa05f28
More tests.
author | Matti Hamalainen <ccr@tnsp.org> |
---|---|
date | Wed, 17 Feb 2016 13:42:02 +0200 |
parents | effb2786f6a6 |
children | 03c327ff9203 |
rev | line source |
---|---|
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
1 #include "th_types.h" |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
2 #include "th_util.h" |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
3 #include "th_string.h" |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
4 #include "th_crypto.h" |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
5 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
6 #define SET_BUF_SIZE 128 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
7 |
259 | 8 char *test_str_header = NULL, |
9 *test_str_res = NULL; | |
10 | |
265 | 11 int tests_failed, tests_passed, tests_total, tests_set; |
259 | 12 |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
13 char buf1[SET_BUF_SIZE+2], buf2[SET_BUF_SIZE+2]; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
14 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
15 |
259 | 16 void test_start_v(const char *fmt, va_list ap) |
17 { | |
18 tests_total++; | |
19 | |
20 th_free_r(&test_str_header); | |
21 th_free_r(&test_str_res); | |
22 | |
23 test_str_header = th_strdup_vprintf(fmt, ap); | |
24 } | |
25 | |
26 | |
27 void test_start(const char *fmt, ...) | |
28 { | |
29 va_list ap; | |
30 va_start(ap, fmt); | |
31 test_start_v(fmt, ap); | |
32 va_end(ap); | |
33 } | |
34 | |
35 | |
36 void test_result_msg_v(BOOL check, const char *fmt, va_list ap) | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
37 { |
259 | 38 if (check) |
39 { | |
40 THPRINT(1, "%s: OK\n", test_str_header); | |
41 tests_passed++; | |
42 } | |
43 else | |
44 { | |
263 | 45 THPRINT(0, "%s: FAIL\n", test_str_header); |
259 | 46 if (fmt != NULL) |
263 | 47 { |
48 THPRINT(0, " - "); | |
259 | 49 THPRINT_V(0, fmt, ap); |
263 | 50 THPRINT(0, "\n"); |
51 } | |
52 if (test_str_res != NULL) | |
53 THPRINT(0, "%s\n", test_str_res); | |
259 | 54 tests_failed++; |
55 } | |
56 } | |
57 | |
58 | |
59 void test_result_msg(BOOL check, const char *fmt, ...) | |
60 { | |
61 va_list ap; | |
62 va_start(ap, fmt); | |
63 test_result_msg_v(check, fmt, ap); | |
64 va_end(ap); | |
65 } | |
66 | |
67 | |
68 void test_result(BOOL check) | |
69 { | |
70 test_result_msg_v(check, NULL, NULL); | |
71 } | |
72 | |
73 | |
74 #define SET_SENTINEL_BYTE 0x0e5 | |
75 | |
76 void test_snprintf_do(size_t len, const char *fmt, va_list ap, const char *msg) | |
77 { | |
78 int ret1, ret2; | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
79 va_list tmp; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
80 |
263 | 81 // Test basic *printf() functionality |
259 | 82 test_start("th_vsnprintf('%s', %s)", fmt, msg); |
83 | |
84 memset(buf1, SET_SENTINEL_BYTE, SET_BUF_SIZE+2); buf1[SET_BUF_SIZE+1] = 0; | |
85 memset(buf2, SET_SENTINEL_BYTE, SET_BUF_SIZE+2); buf2[SET_BUF_SIZE+1] = 0; | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
86 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
87 va_copy(tmp, ap); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
88 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
89 ret1 = th_vsnprintf(buf1, len, fmt, ap); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
90 ret2 = vsnprintf(buf2, len, fmt, tmp); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
91 |
259 | 92 test_result_msg(ret1 == ret2, "retval mismatch %d != %d", ret1, ret2); |
93 test_result_msg(strcmp(buf1, buf2) == 0, "result mismatch '%s' != '%s'", buf1, buf2); | |
94 | |
95 test_result_msg((unsigned char) buf1[len] == SET_SENTINEL_BYTE, "buffer #1 overflow, sentinel 0x%02x", buf1[len]); | |
96 test_result_msg((unsigned char) buf2[len] == SET_SENTINEL_BYTE, "buffer #2 overflow, sentinel 0x%02x", buf2[len]); | |
261 | 97 |
263 | 98 // Test th_strdup_vprintf() |
261 | 99 test_start("th_strdup_vprintf('%s')", fmt); |
100 char *str = th_strdup_vprintf(fmt, ap); | |
101 test_result_msg(str != NULL, "result NULL"); | |
102 th_free(str); | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
103 } |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
104 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
105 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
106 void test_snprintf(const char *fmt, ...) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
107 { |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
108 va_list ap, tmp; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
109 va_start(ap, fmt); |
259 | 110 va_copy(tmp, ap); test_snprintf_do(0, fmt, tmp, "0"); |
111 va_copy(tmp, ap); test_snprintf_do(1, fmt, tmp, "1"); | |
112 va_copy(tmp, ap); test_snprintf_do(2, fmt, tmp, "2"); | |
113 va_copy(tmp, ap); test_snprintf_do(16, fmt, tmp, "16"); | |
114 va_copy(tmp, ap); test_snprintf_do(SET_BUF_SIZE, fmt, tmp, "SET_BUF_SIZE"); | |
255 | 115 va_end(ap); |
116 THPRINT(1, "----------------------------------------------\n"); | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
117 } |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
118 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
119 |
264
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
120 void tests_header(const char *str) |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
121 { |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
122 THPRINT(0, |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
123 "======================================================\n" |
265 | 124 " Set #%d : %s tests\n" |
264
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
125 "======================================================\n", |
265 | 126 ++tests_set, |
264
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
127 str); |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
128 } |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
129 |
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
130 |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
131 int main(int argc, char *argv[]) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
132 { |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
133 (void) argc; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
134 (void) argv; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
135 |
255 | 136 // |
137 // Initialization | |
138 // | |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
139 th_init("th-test", "th-libs unit tests", "0.0.1", NULL, NULL); |
263 | 140 th_verbosityLevel = 1; |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
141 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
142 if (sizeof(char) != sizeof(unsigned char)) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
143 { |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
144 THERR("sizeof(char) != sizeof(unsigned char)???\n"); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
145 return -1; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
146 } |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
147 |
265 | 148 tests_failed = tests_passed = tests_total = tests_set = 0; |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
149 |
255 | 150 // |
151 // Test series #1 | |
152 // | |
264
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
153 tests_header("printf() function family"); |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
154 int i_vals[] = { 2, 612342, -2, -612342, 0x1fff, 0x8000000, }; |
261 | 155 char *i_fmts[] = { "%d", "%x", "%05d", "%5d", "%-5d", "%05x", "%5x", "", }; |
255 | 156 size_t i1, i2; |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
157 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
158 for (i1 = 0; i1 < sizeof(i_vals) / sizeof(i_vals[0]); i1++) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
159 for (i2 = 0; i2 < sizeof(i_fmts) / sizeof(i_fmts[0]); i2++) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
160 test_snprintf(i_fmts[i2], i_vals); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
161 |
261 | 162 char *s_vals[] = { "", "asdf", "xxx yyy zzz ppp fff", NULL, "X", "abcde", }; |
255 | 163 char *s_fmts[] = { "%s", "%2s", "%-2s", "%5s", "%-5s", "%16s", "%-16s", "%1s", "%-1s", }; |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
164 |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
165 for (i1 = 0; i1 < sizeof(s_vals) / sizeof(s_vals[0]); i1++) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
166 for (i2 = 0; i2 < sizeof(s_fmts) / sizeof(s_fmts[0]); i2++) |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
167 test_snprintf(s_fmts[i2], s_vals); |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
168 |
257 | 169 test_snprintf("a%cBC", 'x'); |
261 | 170 test_snprintf("%c", 'x'); |
171 test_snprintf("", 'x'); | |
257 | 172 |
263 | 173 // |
174 // String matching functions | |
175 // | |
264
9b6fd2953d8c
Add test header printing function.
Matti Hamalainen <ccr@tnsp.org>
parents:
263
diff
changeset
|
176 tests_header("String matching"); |
263 | 177 |
178 #define TEST2(fun, str1, str2, ret) do { \ | |
179 test_start(# fun "('%s', '%s')", str1, str2); \ | |
180 test_result(( fun (str1, str2) == 0) == ret); \ | |
181 } while (0) | |
182 | |
266 | 183 #define TEST2B(fun, str1, str2, ret) do { \ |
184 test_start(# fun "('%s', '%s')", str1, str2); \ | |
185 test_result( fun (str1, str2) == ret); \ | |
186 } while (0) | |
187 | |
263 | 188 #define TEST3(fun, str1, str2, len, ret) do { \ |
189 test_start(# fun "('%s', '%s', %d)", str1, str2, len); \ | |
190 test_result(( fun (str1, str2, len) == 0) == ret); \ | |
191 } while (0) | |
192 | |
193 TEST2(th_strcasecmp, "aSdFq", "asdfq", TRUE); | |
194 TEST2(th_strcasecmp, "aSdFq", "asFfq", FALSE); | |
265 | 195 TEST2(th_strcasecmp, "abcde", "abcde", TRUE); |
196 TEST2(th_strcasecmp, "öäå", "öäå", TRUE); | |
197 TEST2(th_strcasecmp, "aöäå", "aöäå", TRUE); | |
198 | |
263 | 199 TEST3(th_strncasecmp, "aSdFq", "asFfq", 4, FALSE); |
200 TEST3(th_strncasecmp, "aSdFq", "asFfq", 2, TRUE); | |
201 TEST3(th_strncasecmp, "aSdFq", "asDfq", 3, TRUE); | |
202 TEST3(th_strncasecmp, "aSdFq", "asDfq", 2, TRUE); | |
203 TEST3(th_strncasecmp, "aSdFq", "asDfq", 0, TRUE); | |
204 TEST3(th_strncasecmp, "aSdFq", "QsDfq", 0, TRUE); | |
205 TEST3(th_strncasecmp, "aSdFq", "QsDfq", 1, FALSE); | |
255 | 206 |
266 | 207 TEST2B(th_strmatch, "abba ABBAkukka lol", "*lol", TRUE); |
208 TEST2B(th_strmatch, "abba ABBAkukka lol", "*lo*", TRUE); | |
209 TEST2B(th_strmatch, "abba ABBAkukka lol", "*lo", FALSE); | |
210 TEST2B(th_strmatch, "abba ABBAkukka lol", "abba", FALSE); | |
211 TEST2B(th_strmatch, "abba ABBAkukka lol", "abba*", TRUE); | |
212 TEST2B(th_strmatch, "abba ABBAkukka lol", "abbak*", FALSE); | |
213 TEST2B(th_strcasematch, "abba ABBAkukka lol", "abbak*", FALSE); | |
214 TEST2B(th_strcasematch, "abba ABBAkukka lol", "*abbak*", TRUE); | |
215 TEST2B(th_strcasematch, "abba ABBAkukka lol", "*abbak?", FALSE); | |
216 TEST2B(th_strcasematch, "abba ABBAkukka lol", "?bba?abba*", TRUE); | |
217 | |
265 | 218 // Tests that test for things that do not work correctly yet |
219 // Unicode / multibyte UTF-8 causes problems here | |
220 TEST2(th_strcasecmp, "ÖÄÅ", "öäå", FALSE); // SHOULD match | |
221 TEST3(th_strncasecmp, "Aäöå", "aöå", 2, TRUE); // should NOT match | |
222 | |
266 | 223 |
255 | 224 // |
225 // Print summary and exit | |
226 // | |
259 | 227 THPRINT(0, "%d tests failed, %d passed (%d main tests).\n", |
228 tests_failed, tests_passed, tests_total); | |
255 | 229 |
254
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
230 return 0; |
3d1e2af4e4e6
Start of a very simplistic unit test suite. Initially handling just printf()
Matti Hamalainen <ccr@tnsp.org>
parents:
diff
changeset
|
231 } |