29 #define COMPILE_ASSERT_POINTER_TO(ISTYPE,POINTER) \
30 STATIC_ASSERT(TypeT<POINTER>::IsPtrT && \
31 TypeT<CompountT<POINTER>::BaseT>::ISTYPE)
33 typedef int (*somefun)(
const char *);
34 static int myfun(
const char *) {
return 0; }
35 static somefun sfun = myfun;
37 enum someenum {
A, B };
39 class someclass {
public :
int memfun() {
return -1; } };
49 COMPILE_ASSERT_POINTER_TO(
IsFundaT,
int*);
50 COMPILE_ASSERT_POINTER_TO(IsPtrT,
int**);
60 COMPILE_ASSERT_POINTER_TO(IsFuncT, somefun);
62 COMPILE_ASSERT_POINTER_TO(IsFuncT, typeof(sfun));
71 COMPILE_ASSERT_POINTER_TO(
IsEnumT, someenum*);
80 COMPILE_ASSERT_POINTER_TO(
IsClassT, someclass*);
166 static uint32_t traceChecksum;
173 int printed = vsnprintf(traceBuffer, BUFFERSIZE, format, parg);
177 fputs(traceBuffer, stdout);
179 if (printed >= BUFFERSIZE) {
180 printf(
"\nprinted=%i\n", printed);
185 for (
int p = 0; p<printed; ++p) {
186 traceChecksum = (traceChecksum<<1)^(traceChecksum>>31)^traceBuffer[p];
192 struct AW_fake_window :
public AW_window { AW_fake_window() { root = fake_root; } };
193 static AW_fake_window instance_fake_win;
194 static AW_window *fake_win = &instance_fake_win;
198 static bool fake_bool =
false;
205 static void rcb1_con(
AW_root *r,
const char *name) {
207 tracef(
"rcb1_con(%s)\n", name);
209 static void rcb1_mut(
AW_root *r,
char *name) {
211 tracef(
"rcb1_mut(%s)\n", name);
213 static void rcb2(
AW_root *r,
const char *name,
int val) {
215 tracef(
"rcb2(%s=%i) [int]\n", name, val);
217 static void rcb2(
AW_root *r,
const char *name,
long val) {
219 tracef(
"rcb2(%s=%li) [long]\n", name, val);
226 static void wcb1(
AW_window *w,
const char *name) {
228 tracef(
"wcb1(%s)\n", name);
230 static void wcb1(
AW_window *w,
string *name) {
232 tracef(
"wcb1(%s) [string]\n", name->c_str());
234 static void wcb2(
AW_window *w,
const char *name,
const char *val) {
236 tracef(
"wcb2(%s=%s) [const char/const char]\n", name, val);
238 static void wcb2(
AW_window *w,
const string *name,
const string *val) {
240 tracef(
"wcb2(%s=%s) [string/string]\n", name->c_str(), val->c_str());
242 static void wcb2(
AW_window *w,
const char *name,
int val) {
244 tracef(
"wcb2(%s=%i) [int]\n", name, val);
246 static void wcb2(
AW_window *w,
const char *name,
long val) {
248 tracef(
"wcb2(%s=%li) [long]\n", name, val);
250 static void wcb2(
AW_window *w,
char c,
long long val) {
252 tracef(
"wcb2(%c=%lli) [long long]\n", c, val);
255 static void tacb0(
AW_awar *a) {
259 static void tacb1(
AW_awar *a,
bool b) {
264 static void tacb2(
AW_awar *a,
bool b,
const char *name) {
267 tracef(
"tacb2(%s)\n", name);
269 static void tacb2(
AW_awar *a,
bool b,
int val) {
272 tracef(
"tacb2(%i)\n", val);
278 static void ucb1(
UNFIXED,
const char *name) {
279 tracef(
"ucb1(%s)\n", name);
281 static void ucb2(
UNFIXED,
const char *name,
int val) {
282 tracef(
"ucb2(%s=%i) [int]\n", name, val);
284 static void ucb2(
UNFIXED,
const char *name,
long val) {
285 tracef(
"ucb2(%s=%li) [long]\n", name, val);
295 tracef(
"cwcb1(%i)\n", x);
300 tracef(
"cwcb1(%li) [long ptr]\n", *lp);
305 tracef(
"cwcb1(%i) [const ptr]\n", *x);
310 tracef(
"cwcb1(%i) [mutable ptr]\n", *x);
316 tracef(
"cwcb1(%s) [mutable]\n", s);
321 tracef(
"cwcb1(%s) [const]\n", s);
326 tracef(
"cwcb2_cc(%s,%s) [const const]\n", s1, s2);
331 tracef(
"cwcb2_cm(%s,%s) [const mutable]\n", s1, s2);
336 tracef(
"cwcb2_mc(%s,%s) [mutable const]\n", s1, s2);
341 tracef(
"cwcb2_mm(%s,%s) [mutable mutable]\n", s1, s2);
345 static void dbcb01(
GBDATA *gbd) {
347 tracef(
"dbcb01()\n");
351 tracef(
"dbcb012()\n");
354 tracef(
"dbcb02(%i)\n",
int(t));
358 tracef(
"dbcb1(%i) [int]\n", x);
362 tracef(
"dbcb1(%s) [const char]\n", n);
365 static void ccb11(
const char *
str) {
366 tracef(
"ccb11(%s)\n", str);
368 static void ccb12(
int i) {
369 tracef(
"ccb12(%i)\n", i);
371 static void ccb13(
const double *d) {
372 tracef(
"ccb13(%5.2f)\n", *d);
374 static void ccb2(
int i,
const char *
str) {
375 tracef(
"ccb2(%i,%s)\n", i, str);
378 static void plaincb() {
379 tracef(
"plaincb()\n");
382 tracef(
"cwcb_plain()\n");
386 inline void call(
const RootCallback& rcb) { rcb(fake_root); }
387 inline void call(
const WindowCallback& wcb) { wcb(fake_win); }
388 inline void call(
const CreateWindowCallback& cwcb) {
TEST_EXPECT(cwcb(fake_root) == fake_win); }
389 inline void call(
const DatabaseCallback& dbcb) { dbcb(fake_gbd, fake_gbtype); }
390 inline void call(
const TreeAwarCallback& tacb) { tacb(fake_awar, fake_bool); }
391 inline void call(
const CustomCallback& ccb) { ccb(); }
393 #define TEST_CB(cb,expectedChecksum) do { \
394 traceChecksum = -666; \
396 TEST_EXPECT_EQUAL(traceChecksum, (uint32_t)expectedChecksum); \
399 #define TEST_CB_TRACE(cb,expectedOutput) do { \
401 TEST_EXPECT_EQUAL(traceBuffer, expectedOutput); \
404 #define TEST_CB_TRACE__BROKEN(cb,expectedOutput) do { \
406 TEST_EXPECT_EQUAL__BROKEN(traceBuffer, expectedOutput); \
410 static void freeCharp(
char *
str) { free(str); }
411 static void freeCharp(
char *str1,
char *str2) { free(str1); free(str2); }
412 static void deleteString(
string *
str) {
delete str; }
413 static void deleteString(
string *str1,
string *str2) {
delete str1;
delete str2; }
419 char patched[] =
"patched";
421 TEST_CB_TRACE(makeRootCallback(plaincb),
"plaincb()\n");
422 TEST_CB_TRACE(makeRootCallback(rcb0),
"rcb0()\n");
424 TEST_CB_TRACE(makeRootCallback(rcb1_con, patched),
"rcb1_con(patched)\n");
425 TEST_CB_TRACE(makeRootCallback(rcb1_mut, patched),
"rcb1_mut(patched)\n");
426 TEST_CB_TRACE(makeRootCallback(rcb1_con,
"dispatched"),
"rcb1_con(dispatched)\n");
429 TEST_CB_TRACE(makeRootCallback(rcb2,
"age", 46),
"rcb2(age=46) [int]\n");
430 TEST_CB_TRACE(makeRootCallback(rcb2,
"size", 178L),
"rcb2(size=178) [long]\n");
432 TEST_CB_TRACE(makeWindowCallback(plaincb),
"plaincb()\n");
433 TEST_CB_TRACE(makeWindowCallback(wcb0),
"wcb0()\n");
434 TEST_CB_TRACE(makeWindowCallback(wcb1,
"dispatched"),
"wcb1(dispatched)\n");
435 TEST_CB_TRACE(makeWindowCallback(wcb2,
"age", 46),
"wcb2(age=46) [int]\n");
436 TEST_CB_TRACE(makeWindowCallback(wcb2,
"size", 178L),
"wcb2(size=178) [long]\n");
438 TEST_CB_TRACE(makeTreeAwarCallback(plaincb),
"plaincb()\n");
439 TEST_CB_TRACE(makeTreeAwarCallback(tacb0),
"tacb0()\n");
440 TEST_CB_TRACE(makeTreeAwarCallback(tacb1),
"tacb1()\n");
441 TEST_CB_TRACE(makeTreeAwarCallback(tacb2,
"dispatched"),
"tacb2(dispatched)\n");
442 TEST_CB_TRACE(makeTreeAwarCallback(tacb2, 46),
"tacb2(46)\n");
447 TEST_CB_TRACE(makeRootCallback(ucb0),
"ucb0()\n");
448 TEST_CB_TRACE(makeRootCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
449 TEST_CB_TRACE(makeRootCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
450 TEST_CB_TRACE(makeRootCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
452 TEST_CB_TRACE(makeWindowCallback(ucb0),
"ucb0()\n");
453 TEST_CB_TRACE(makeWindowCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
454 TEST_CB_TRACE(makeWindowCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
455 TEST_CB_TRACE(makeWindowCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
458 TEST_CB_TRACE(makeWindowCallback(wcb2,
'l', 49710827735915452LL),
"wcb2(l=49710827735915452) [long long]\n");
461 TEST_CB_TRACE(makeCreateWindowCallback(cwcb_plain),
"cwcb_plain()\n");
462 TEST_CB_TRACE(makeCreateWindowCallback(cwcb0),
"cwcb0()\n");
463 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, 77),
"cwcb1(77)\n");
466 TEST_CB_TRACE(makeDatabaseCallback(dbcb01),
"dbcb01()\n");
467 TEST_CB_TRACE(makeDatabaseCallback(dbcb012),
"dbcb012()\n");
468 TEST_CB_TRACE(makeDatabaseCallback(dbcb02),
"dbcb02(2)\n");
469 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, 77),
"dbcb1(77) [int]\n");
471 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, freeCharp, strdup(
"test")),
"dbcb1(test) [const char]\n");
476 TEST_CB_TRACE(makeWindowCallback(wcb1, freeCharp, strdup(
"leak")),
"wcb1(leak)\n");
478 TEST_CB_TRACE(makeWindowCallback(wcb1, deleteString,
new string(
"leak")),
"wcb1(leak) [string]\n");
480 TEST_CB_TRACE(makeWindowCallback(wcb2, freeCharp, strdup(
"hue"), strdup(
"hott")),
"wcb2(hue=hott) [const char/const char]\n");
481 TEST_CB_TRACE(makeWindowCallback(wcb2, deleteString,
new string(
"hue"),
new string(
"hott")),
"wcb2(hue=hott) [string/string]\n");
484 char *mut = strdup(
"mut");
485 const char *con =
"con";
489 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cc, con, con),
"cwcb2_cc(con,con) [const const]\n");
490 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cc, mut, con),
"cwcb2_cc(mut,con) [const const]\n");
491 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cc, con, mut),
"cwcb2_cc(con,mut) [const const]\n");
492 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cc, mut, mut),
"cwcb2_cc(mut,mut) [const const]\n");
495 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_mc, mut, con),
"cwcb2_mc(mut,con) [mutable const]\n");
497 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_mc, mut, mut),
"cwcb2_mc(mut,mut) [mutable const]\n");
501 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cm, con, mut),
"cwcb2_cm(con,mut) [const mutable]\n");
502 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_cm, mut, mut),
"cwcb2_cm(mut,mut) [const mutable]\n");
507 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2_mm, mut, mut),
"cwcb2_mm(mut,mut) [mutable mutable]\n");
513 const long lcon = 775L;
515 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, imut),
"cwcb1(17)\n");
516 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, icon),
"cwcb1(23)\n");
517 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &lcon),
"cwcb1(775) [long ptr]\n");
519 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
520 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
522 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(17) [mutable ptr]\n");
523 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(34) [mutable ptr]\n");
524 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(68) [mutable ptr]\n");
526 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, mut),
"cwcb1(mut) [mutable]\n");
527 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, con),
"cwcb1(con) [const]\n");
533 TEST_CB_TRACE(makeCustomCallback(plaincb),
"plaincb()\n");
534 TEST_CB_TRACE(makeCustomCallback(ccb11,
"helo"),
"ccb11(helo)\n");
535 TEST_CB_TRACE(makeCustomCallback(ccb12, 4711),
"ccb12(4711)\n");
536 TEST_CB_TRACE(makeCustomCallback(ccb13, &d),
"ccb13( 3.14)\n");
537 TEST_CB_TRACE(makeCustomCallback(ccb2, 4711,
"helo"),
"ccb2(4711,helo)\n");
539 TEST_CB_TRACE(makeCustomCallback(ccb11, freeCharp, strdup(
"dup")),
"ccb11(dup)\n");
544 void TEST_RootAsWindowCallback() {
545 char mutableText[] =
"mutable";
AliDataPtr format(AliDataPtr data, const size_t wanted_len, GB_ERROR &error)
#define CONST_VARIANT_REQUIRED(T)
#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))
static WindowCallback simple(void(*root_cb)(AW_root *))
GB_write_int const char s