00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018
00019
00020
00021
00022
00023
00024
00129 #ifndef SU_TYPES_H
00130 #include <sofia-sip/su_types.h>
00131 #endif
00132
00133 SOFIA_BEGIN_DECLS
00134
00135 #if HAVE_FUNC
00136 #define TSTNAME name, __func__, "() "
00137 #elif HAVE_FUNCTION
00138 #define TSTNAME name, __FUNCTION__, "() "
00139 #else
00140 #define TSTNAME name, "", ""
00141 #endif
00142
00143 enum {
00145 tst_verbatim = 1,
00147 tst_abort = 2,
00149 tst_log = 4
00150 };
00151
00152 #ifndef TSTFLAGS
00153 #error <TSTFLAGS is not defined>
00154 #endif
00155
00157 #define BEGIN() BEGIN_(TSTFLAGS); { extern int tstdef_dummy
00158
00159 #define END() (void) tstdef_dummy; } END_(TSTFLAGS)
00160
00163 #define TEST0(suite) TEST_1_(TSTFLAGS, suite)
00164
00165 #define TEST_1(suite) TEST_1_(TSTFLAGS, suite)
00166
00167 #define TEST_VOID(suite) TEST_VOID_(TSTFLAGS, suite)
00168
00169 #define TEST(suite, expected) TEST_(TSTFLAGS, suite, expected)
00170
00171 #define TEST_P(suite, expected) TEST_P_(TSTFLAGS, suite, expected)
00172
00173 #define TEST64(suite, expected) TEST64_(TSTFLAGS, suite, expected)
00174
00175 #define TEST_D(suite, expected) TEST_D_(TSTFLAGS, suite, expected)
00176
00177 #define TEST_S(suite, expected) TEST_S_(TSTFLAGS, suite, expected)
00178
00179 #define TEST_M(suite, expected, len) TEST_M_(TSTFLAGS, suite, expected, len)
00180
00181 #define TEST_SIZE(suite, expected) TEST_SIZE_(TSTFLAGS, suite, expected)
00182
00184 #define TEST_LOG(x) \
00185 do { \
00186 if (tstflags & tst_log) \
00187 printf x; \
00188 } while(0)
00189
00190 #define TEST_FAILED(flags) \
00191 (((flags) & tst_abort) || getenv("SOFIA_SIP_TEST_ABORT")) \
00192 ? abort() : (void)0; return 1
00193
00195 #define TEST_1_(flags, suite) do { \
00196 if (flags & tst_verbatim) { \
00197 printf("%s: %s%stesting %s\n", TSTNAME, #suite); \
00198 fflush(stdout); } \
00199 if ((suite)) { if (flags & tst_verbatim) \
00200 printf("%s: %s%sok: (%s)\n", TSTNAME, #suite); break ; } \
00201 fprintf(stderr, "%s:%u: %s %s%sFAILED: (%s)\n", \
00202 __FILE__, __LINE__, TSTNAME, #suite); fflush(stderr); \
00203 TEST_FAILED(flags); } \
00204 while(0)
00205
00207 #define TEST_VOID_(flags, suite) do { \
00208 if (flags & tst_verbatim) { \
00209 printf("%s: %s%stesting %s\n", TSTNAME, #suite); \
00210 fflush(stdout); } \
00211 (suite); } while(0)
00212
00214 #define TEST_(flags, suite, expect) do { \
00215 uintptr_t _value, _expect; \
00216 if (flags & tst_verbatim) { \
00217 printf("%s: %s%stesting %s == %s\n", TSTNAME, #suite, #expect); \
00218 fflush(stdout); } \
00219 _value = (uintptr_t)(suite); \
00220 _expect = (uintptr_t)(expect); \
00221 if (_value == _expect) { \
00222 if (flags & tst_verbatim) \
00223 printf("%s: %s%sok: %s == %s \n", \
00224 TSTNAME, #suite, #expect); \
00225 break; \
00226 } \
00227 fprintf(stderr, "%s:%u: %s %s%sFAILED: " \
00228 "%s != %s or "MOD_ZU" != "MOD_ZU"\n", \
00229 __FILE__, __LINE__, TSTNAME, \
00230 #suite, #expect, (size_t)_value, (size_t)_expect); \
00231 fflush(stderr); \
00232 TEST_FAILED(flags); \
00233 } while(0)
00234
00236 #define TEST_P_(flags, suite, expect) do { \
00237 void const * _value, * _expect; \
00238 if (flags & tst_verbatim) { \
00239 printf("%s: %s%stesting %s == %s\n", TSTNAME, #suite, #expect); \
00240 fflush(stdout); } \
00241 if ((_value = (suite)) == (_expect = (expect))) { \
00242 if (flags & tst_verbatim) \
00243 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect); \
00244 break; \
00245 } \
00246 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s or %p != %p\n", \
00247 __FILE__, __LINE__, TSTNAME, \
00248 #suite, #expect, _value, _expect); fflush(stderr); \
00249 TEST_FAILED(flags); \
00250 } while(0)
00251
00253 #define TEST_SIZE_(flags, suite, expect) do { \
00254 size_t _value, _expect; \
00255 if (flags & tst_verbatim) { \
00256 printf("%s: %s%stesting %s == %s\n", TSTNAME, #suite, #expect); \
00257 fflush(stdout); } \
00258 if ((_value = (size_t)(suite)) == \
00259 (_expect = (size_t)(expect))) \
00260 { if (flags & tst_verbatim) \
00261 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect); break; } \
00262 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s or "MOD_ZU" != "MOD_ZU"\n", \
00263 __FILE__, __LINE__, TSTNAME, \
00264 #suite, #expect, _value, _expect); fflush(stderr); \
00265 TEST_FAILED(flags); \
00266 } while(0)
00267
00268
00270 #define TEST64_(flags, suite, expect) do { \
00271 uint64_t _value, _expect; \
00272 if (flags & tst_verbatim) { \
00273 printf("%s: %s%stesting %s == %s\n", TSTNAME, #suite, #expect); \
00274 fflush(stdout); } \
00275 if ((_value = (uint64_t)(suite)) == (_expect = (uint64_t)(expect))) \
00276 { if (flags & tst_verbatim) \
00277 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect); break; } \
00278 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s or "LLU" != "LLU"\n", \
00279 __FILE__, __LINE__, TSTNAME, \
00280 #suite, #expect, (unsigned longlong)_value, \
00281 (unsigned longlong)_expect); fflush(stderr); \
00282 TEST_FAILED(flags); \
00283 } while(0)
00284
00286 #define TEST_D_(flags, suite, expect) do { \
00287 double _value, _expect; \
00288 if (flags & tst_verbatim) { \
00289 printf("%s: %s%stesting %s == %s\n", TSTNAME, #suite, #expect); \
00290 fflush(stdout); } \
00291 if ((_value = (double)(suite)) == (_expect = (double)(expect))) \
00292 { if (flags & tst_verbatim) \
00293 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect); break; } \
00294 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s or %g != %g\n", \
00295 __FILE__, __LINE__, TSTNAME, \
00296 #suite, #expect, _value, _expect); fflush(stderr); \
00297 TEST_FAILED(flags); \
00298 } while(0)
00299
00301 #define TEST_S_(flags, suite, expect) do { \
00302 char const * _value, * _expect; \
00303 if (flags & tst_verbatim) { \
00304 printf("%s: %s%stesting %s is %s\n", TSTNAME, #suite, #expect); \
00305 fflush(stdout); } \
00306 _value = (suite); \
00307 _expect = (expect); \
00308 if (((_value == NULL || _expect == NULL) && _value == _expect) || \
00309 (_value != NULL && _expect != NULL && strcmp(_value, _expect) == 0)) \
00310 { if (flags & tst_verbatim) \
00311 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect);break;}\
00312 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s or %s%s%s != \"%s\"\n", \
00313 __FILE__, __LINE__, TSTNAME, \
00314 #suite, #expect, \
00315 _value ? "\"" : "", _value ? _value : "NULL", _value ? "\"" : "", \
00316 _expect); fflush(stderr); \
00317 TEST_FAILED(flags); \
00318 } while(0)
00319
00321 #define TEST_M_(flags, suite, expect, len) do { \
00322 void const * _value, * _expect; \
00323 size_t _len; \
00324 if (flags & tst_verbatim) { \
00325 printf("%s: %s%stesting %s is %s\n", TSTNAME, #suite, #expect); \
00326 fflush(stdout); } \
00327 _value = (suite); \
00328 _expect = (expect); \
00329 _len = (size_t)(len); \
00330 if (((_value == NULL || _expect == NULL) && _value == _expect) || \
00331 memcmp(_value, _expect, _len) == 0) \
00332 { if (flags & tst_verbatim) \
00333 printf("%s: %s%sok: %s == %s \n", TSTNAME, #suite, #expect);break;}\
00334 fprintf(stderr, "%s:%u: %s %s%sFAILED: %s != %s "\
00335 "or \"%.*s\" != \"%.*s\"\n", \
00336 __FILE__, __LINE__, TSTNAME, \
00337 #suite, #expect, (int)_len, \
00338 (char *)_value, (int)_len, (char *)_expect); \
00339 fflush(stderr); \
00340 TEST_FAILED(flags); \
00341 } while(0)
00342
00344 #define BEGIN_(flags) \
00345 if (flags & tst_verbatim) printf("%s: %s%sstarting\n", TSTNAME)
00346
00348 #define END_(flags) \
00349 if (flags & tst_verbatim) \
00350 printf("%s: %s%sfinished fully successful\n", TSTNAME); \
00351 return 0
00352
00353 SOFIA_END_DECLS