28 #define COMPILE_ASSERT_POINTER_TO(ISTYPE,POINTER) \
29 STATIC_ASSERT(TypeT<POINTER>::IsPtrT && \
30 TypeT<CompountT<POINTER>::BaseT>::ISTYPE)
32 typedef int (*somefun)(
const char *);
33 static int myfun(
const char *) {
return 0; }
34 static somefun sfun = myfun;
36 enum someenum {
A, B };
38 class someclass {
public :
int memfun() {
return -1; } };
48 COMPILE_ASSERT_POINTER_TO(
IsFundaT,
int*);
49 COMPILE_ASSERT_POINTER_TO(IsPtrT,
int**);
59 COMPILE_ASSERT_POINTER_TO(IsFuncT, somefun);
61 COMPILE_ASSERT_POINTER_TO(IsFuncT, typeof(sfun));
70 COMPILE_ASSERT_POINTER_TO(
IsEnumT, someenum*);
79 COMPILE_ASSERT_POINTER_TO(
IsClassT, someclass*);
102 # define CONST_VARIANT_REQUIRED_TESTED CONST_VARIANT_REQUIRED
105 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int) ==
false);
106 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
volatile int) ==
false);
107 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const volatile int) ==
false);
108 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
volatile const int) ==
false);
111 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int&) ==
false);
113 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*) ==
false);
114 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
int*
const) ==
true);
115 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*
const) ==
false);
139 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*&) ==
true);
140 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
int*
const&) ==
false);
141 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*
const&) ==
false);
144 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int**) ==
true);
145 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
int*
const*) ==
false);
146 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*
const*) ==
false);
147 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int**
const) ==
true);
148 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
int**
const) ==
true);
149 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
int*
const*
const) ==
false);
150 STATIC_ASSERT(CONST_VARIANT_REQUIRED_TESTED(
const int*
const*
const) ==
false);
160 static uint32_t traceChecksum;
167 int printed = vsnprintf(traceBuffer, BUFFERSIZE, format, parg);
171 fputs(traceBuffer, stdout);
173 if (printed >= BUFFERSIZE) {
174 printf(
"\nprinted=%i\n", printed);
179 for (
int p = 0; p<printed; ++p) {
180 traceChecksum = (traceChecksum<<1)^(traceChecksum>>31)^traceBuffer[p];
188 static bool fake_bool =
false;
195 static void rcb1(
AW_root *r,
const char *name) {
197 tracef(
"rcb1(%s)\n", name);
199 static void rcb2(
AW_root *r,
const char *name,
int val) {
201 tracef(
"rcb2(%s=%i) [int]\n", name, val);
203 static void rcb2(
AW_root *r,
const char *name,
long val) {
205 tracef(
"rcb2(%s=%li) [long]\n", name, val);
212 static void wcb1(
AW_window *w,
const char *name) {
214 tracef(
"wcb1(%s)\n", name);
216 static void wcb1(
AW_window *w,
string *name) {
218 tracef(
"wcb1(%s) [string]\n", name->c_str());
220 static void wcb2(
AW_window *w,
const char *name,
const char *val) {
222 tracef(
"wcb2(%s=%s) [const char/const char]\n", name, val);
224 static void wcb2(
AW_window *w,
const string *name,
const string *val) {
226 tracef(
"wcb2(%s=%s) [string/string]\n", name->c_str(), val->c_str());
228 static void wcb2(
AW_window *w,
const char *name,
int val) {
230 tracef(
"wcb2(%s=%i) [int]\n", name, val);
232 static void wcb2(
AW_window *w,
const char *name,
long val) {
234 tracef(
"wcb2(%s=%li) [long]\n", name, val);
236 static void wcb2(
AW_window *w,
char c,
long long val) {
238 tracef(
"wcb2(%c=%lli) [long long]\n", c, val);
241 static void tacb0(
AW_awar *a) {
245 static void tacb1(
AW_awar *a,
bool b) {
250 static void tacb2(
AW_awar *a,
bool b,
const char *name) {
253 tracef(
"tacb2(%s)\n", name);
255 static void tacb2(
AW_awar *a,
bool b,
int val) {
258 tracef(
"tacb2(%i)\n", val);
264 static void ucb1(
UNFIXED,
const char *name) {
265 tracef(
"ucb1(%s)\n", name);
267 static void ucb2(
UNFIXED,
const char *name,
int val) {
268 tracef(
"ucb2(%s=%i) [int]\n", name, val);
270 static void ucb2(
UNFIXED,
const char *name,
long val) {
271 tracef(
"ucb2(%s=%li) [long]\n", name, val);
281 tracef(
"cwcb1(%i)\n", x);
286 tracef(
"cwcb1(%li) [long ptr]\n", *lp);
291 tracef(
"cwcb1(%i) [const ptr]\n", *x);
296 tracef(
"cwcb1(%i) [mutable ptr]\n", *x);
302 tracef(
"cwcb1(%s) [mutable]\n", s);
307 tracef(
"cwcb1(%s) [const]\n", s);
312 tracef(
"cwcb2(%s,%s) [const const]\n", s1, s2);
317 tracef(
"cwcb2(%s,%s) [const mutable]\n", s1, s2);
323 tracef(
"cwcb3(%s,%s) [const const]\n", s1, s2);
328 tracef(
"cwcb3(%s,%s) [const mutable]\n", s1, s2);
333 tracef(
"cwcb3(%s,%s) [mutable const]\n", s1, s2);
338 tracef(
"cwcb3(%s,%s) [mutable mutable]\n", s1, s2);
342 static void dbcb01(
GBDATA *gbd) {
344 tracef(
"dbcb01()\n");
348 tracef(
"dbcb012()\n");
351 tracef(
"dbcb02(%i)\n",
int(t));
355 tracef(
"dbcb1(%i) [int]\n", x);
359 tracef(
"dbcb1(%s) [const char]\n", n);
362 static void ccb11(
const char *
str) {
363 tracef(
"ccb11(%s)\n", str);
365 static void ccb12(
int i) {
366 tracef(
"ccb12(%i)\n", i);
368 static void ccb2(
int i,
const char *
str) {
369 tracef(
"ccb2(%i,%s)\n", i, str);
372 static void plaincb() {
373 tracef(
"plaincb()\n");
376 tracef(
"cwcb_plain()\n");
380 inline void call(
const RootCallback& rcb) { rcb(fake_root); }
381 inline void call(
const WindowCallback& wcb) { wcb(fake_win); }
382 inline void call(
const CreateWindowCallback& cwcb) {
TEST_EXPECT(cwcb(fake_root) == fake_win); }
383 inline void call(
const DatabaseCallback& dbcb) { dbcb(fake_gbd, fake_gbtype); }
384 inline void call(
const TreeAwarCallback& tacb) { tacb(fake_awar, fake_bool); }
385 inline void call(
const CustomCallback& ccb) { ccb(); }
387 #define TEST_CB(cb,expectedChecksum) do { \
388 traceChecksum = -666; \
390 TEST_EXPECT_EQUAL(traceChecksum, (uint32_t)expectedChecksum); \
393 #define TEST_CB_TRACE(cb,expectedOutput) do { \
395 TEST_EXPECT_EQUAL(traceBuffer, expectedOutput); \
398 #define TEST_CB_TRACE__BROKEN(cb,expectedOutput) do { \
400 TEST_EXPECT_EQUAL__BROKEN(traceBuffer, expectedOutput); \
404 static void freeCharp(
char *
str) { free(str); }
405 static void freeCharp(
char *str1,
char *str2) { free(str1); free(str2); }
406 static void deleteString(
string *
str) {
delete str; }
407 static void deleteString(
string *str1,
string *str2) {
delete str1;
delete str2; }
413 TEST_CB_TRACE(makeRootCallback(plaincb),
"plaincb()\n");
414 TEST_CB_TRACE(makeRootCallback(rcb0),
"rcb0()\n");
415 TEST_CB_TRACE(makeRootCallback(rcb1,
"dispatched"),
"rcb1(dispatched)\n");
416 TEST_CB_TRACE(makeRootCallback(rcb2,
"age", 46),
"rcb2(age=46) [int]\n");
417 TEST_CB_TRACE(makeRootCallback(rcb2,
"size", 178L),
"rcb2(size=178) [long]\n");
419 TEST_CB_TRACE(makeWindowCallback(plaincb),
"plaincb()\n");
420 TEST_CB_TRACE(makeWindowCallback(wcb0),
"wcb0()\n");
421 TEST_CB_TRACE(makeWindowCallback(wcb1,
"dispatched"),
"wcb1(dispatched)\n");
422 TEST_CB_TRACE(makeWindowCallback(wcb2,
"age", 46),
"wcb2(age=46) [int]\n");
423 TEST_CB_TRACE(makeWindowCallback(wcb2,
"size", 178L),
"wcb2(size=178) [long]\n");
425 TEST_CB_TRACE(makeTreeAwarCallback(plaincb),
"plaincb()\n");
426 TEST_CB_TRACE(makeTreeAwarCallback(tacb0),
"tacb0()\n");
427 TEST_CB_TRACE(makeTreeAwarCallback(tacb1),
"tacb1()\n");
428 TEST_CB_TRACE(makeTreeAwarCallback(tacb2,
"dispatched"),
"tacb2(dispatched)\n");
429 TEST_CB_TRACE(makeTreeAwarCallback(tacb2, 46),
"tacb2(46)\n");
434 TEST_CB_TRACE(makeRootCallback(ucb0),
"ucb0()\n");
435 TEST_CB_TRACE(makeRootCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
436 TEST_CB_TRACE(makeRootCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
437 TEST_CB_TRACE(makeRootCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
439 TEST_CB_TRACE(makeWindowCallback(ucb0),
"ucb0()\n");
440 TEST_CB_TRACE(makeWindowCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
441 TEST_CB_TRACE(makeWindowCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
442 TEST_CB_TRACE(makeWindowCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
445 TEST_CB_TRACE(makeWindowCallback(wcb2,
'l', 49710827735915452LL),
"wcb2(l=49710827735915452) [long long]\n");
448 TEST_CB_TRACE(makeCreateWindowCallback(cwcb_plain),
"cwcb_plain()\n");
449 TEST_CB_TRACE(makeCreateWindowCallback(cwcb0),
"cwcb0()\n");
450 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, 77),
"cwcb1(77)\n");
453 TEST_CB_TRACE(makeDatabaseCallback(dbcb01),
"dbcb01()\n");
454 TEST_CB_TRACE(makeDatabaseCallback(dbcb012),
"dbcb012()\n");
455 TEST_CB_TRACE(makeDatabaseCallback(dbcb02),
"dbcb02(2)\n");
456 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, 77),
"dbcb1(77) [int]\n");
458 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, freeCharp, strdup(
"test")),
"dbcb1(test) [const char]\n");
463 TEST_CB_TRACE(makeWindowCallback(wcb1, freeCharp, strdup(
"leak")),
"wcb1(leak)\n");
465 TEST_CB_TRACE(makeWindowCallback(wcb1, deleteString,
new string(
"leak")),
"wcb1(leak) [string]\n");
467 TEST_CB_TRACE(makeWindowCallback(wcb2, freeCharp, strdup(
"hue"), strdup(
"hott")),
"wcb2(hue=hott) [const char/const char]\n");
468 TEST_CB_TRACE(makeWindowCallback(wcb2, deleteString,
new string(
"hue"),
new string(
"hott")),
"wcb2(hue=hott) [string/string]\n");
471 char *mut = strdup(
"mut");
472 const char *con =
"con";
475 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, con, con),
"cwcb2(con,con) [const const]\n");
476 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, mut, con),
"cwcb2(mut,con) [const const]\n");
477 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, con, mut),
"cwcb2(con,mut) [const mutable]\n");
478 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, mut, mut),
"cwcb2(mut,mut) [const mutable]\n");
481 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, con, con),
"cwcb3(con,con) [const const]\n");
482 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, mut, con),
"cwcb3(mut,con) [mutable const]\n");
483 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, con, mut),
"cwcb3(con,mut) [const mutable]\n");
484 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, mut, mut),
"cwcb3(mut,mut) [mutable mutable]\n");
490 const long lcon = 775L;
492 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, imut),
"cwcb1(17)\n");
493 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, icon),
"cwcb1(23)\n");
494 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &lcon),
"cwcb1(775) [long ptr]\n");
496 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
497 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
499 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(17) [mutable ptr]\n");
500 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(34) [mutable ptr]\n");
501 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(68) [mutable ptr]\n");
503 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, mut),
"cwcb1(mut) [mutable]\n");
504 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, con),
"cwcb1(con) [const]\n");
509 TEST_CB_TRACE(makeCustomCallback(plaincb),
"plaincb()\n");
510 TEST_CB_TRACE(makeCustomCallback(ccb11,
"helo"),
"ccb11(helo)\n");
511 TEST_CB_TRACE(makeCustomCallback(ccb12, 4711),
"ccb12(4711)\n");
512 TEST_CB_TRACE(makeCustomCallback(ccb2, 4711,
"helo"),
"ccb2(4711,helo)\n");
514 TEST_CB_TRACE(makeCustomCallback(ccb11, freeCharp, strdup(
"dup")),
"ccb11(dup)\n");
AliDataPtr format(AliDataPtr data, const size_t wanted_len, GB_ERROR &error)
#define __ATTR__FORMAT(pos)
struct Unfixed_cb_parameter * UNFIXED
#define TEST_PUBLISH(testfunction)
#define TEST_EXPECT(cond)
DECLARE_CBTYPE_VV_AND_BUILDERS(StoreConfigCallback, char *)
fputs(TRACE_PREFIX, stderr)
STATIC_ASSERT(sizeof(int *)==sizeof(AW_CL))
GB_write_int const char s