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*);
105 static uint32_t traceChecksum;
112 int printed = vsnprintf(traceBuffer, BUFFERSIZE, format, parg);
116 fputs(traceBuffer, stdout);
118 if (printed >= BUFFERSIZE) {
119 printf(
"\nprinted=%i\n", printed);
124 for (
int p = 0; p<printed; ++p) {
125 traceChecksum = (traceChecksum<<1)^(traceChecksum>>31)^traceBuffer[p];
133 static bool fake_bool =
false;
140 static void rcb1(
AW_root *r,
const char *name) {
142 tracef(
"rcb1(%s)\n", name);
144 static void rcb2(
AW_root *r,
const char *name,
int val) {
146 tracef(
"rcb2(%s=%i) [int]\n", name, val);
148 static void rcb2(
AW_root *r,
const char *name,
long val) {
150 tracef(
"rcb2(%s=%li) [long]\n", name, val);
157 static void wcb1(
AW_window *w,
const char *name) {
159 tracef(
"wcb1(%s)\n", name);
161 static void wcb1(
AW_window *w,
string *name) {
163 tracef(
"wcb1(%s) [string]\n", name->c_str());
165 static void wcb2(
AW_window *w,
const char *name,
const char *val) {
167 tracef(
"wcb2(%s=%s) [const char/const char]\n", name, val);
169 static void wcb2(
AW_window *w,
const string *name,
const string *val) {
171 tracef(
"wcb2(%s=%s) [string/string]\n", name->c_str(), val->c_str());
173 static void wcb2(
AW_window *w,
const char *name,
int val) {
175 tracef(
"wcb2(%s=%i) [int]\n", name, val);
177 static void wcb2(
AW_window *w,
const char *name,
long val) {
179 tracef(
"wcb2(%s=%li) [long]\n", name, val);
181 static void wcb2(
AW_window *w,
char c,
long long val) {
183 tracef(
"wcb2(%c=%lli) [long long]\n", c, val);
186 static void tacb0(
AW_awar *a) {
190 static void tacb1(
AW_awar *a,
bool b) {
195 static void tacb2(
AW_awar *a,
bool b,
const char *name) {
198 tracef(
"tacb2(%s)\n", name);
200 static void tacb2(
AW_awar *a,
bool b,
int val) {
203 tracef(
"tacb2(%i)\n", val);
209 static void ucb1(
UNFIXED,
const char *name) {
210 tracef(
"ucb1(%s)\n", name);
212 static void ucb2(
UNFIXED,
const char *name,
int val) {
213 tracef(
"ucb2(%s=%i) [int]\n", name, val);
215 static void ucb2(
UNFIXED,
const char *name,
long val) {
216 tracef(
"ucb2(%s=%li) [long]\n", name, val);
226 tracef(
"cwcb1(%i)\n", x);
231 tracef(
"cwcb1(%li) [long ptr]\n", *lp);
236 tracef(
"cwcb1(%i) [const ptr]\n", *x);
241 tracef(
"cwcb1(%i) [mutable ptr]\n", *x);
247 tracef(
"cwcb1(%s) [mutable]\n", s);
252 tracef(
"cwcb1(%s) [const]\n", s);
257 tracef(
"cwcb2(%s,%s) [const const]\n", s1, s2);
262 tracef(
"cwcb2(%s,%s) [const mutable]\n", s1, s2);
268 tracef(
"cwcb3(%s,%s) [const const]\n", s1, s2);
273 tracef(
"cwcb3(%s,%s) [const mutable]\n", s1, s2);
278 tracef(
"cwcb3(%s,%s) [mutable const]\n", s1, s2);
283 tracef(
"cwcb3(%s,%s) [mutable mutable]\n", s1, s2);
287 static void dbcb01(
GBDATA *gbd) {
289 tracef(
"dbcb01()\n");
293 tracef(
"dbcb012()\n");
296 tracef(
"dbcb02(%i)\n",
int(t));
300 tracef(
"dbcb1(%i) [int]\n", x);
304 tracef(
"dbcb1(%s) [const char]\n", n);
307 static void ccb11(
const char *
str) {
308 tracef(
"ccb11(%s)\n", str);
310 static void ccb12(
int i) {
311 tracef(
"ccb12(%i)\n", i);
313 static void ccb2(
int i,
const char *
str) {
314 tracef(
"ccb2(%i,%s)\n", i, str);
317 static void plaincb() {
318 tracef(
"plaincb()\n");
321 tracef(
"cwcb_plain()\n");
325 inline void call(
const RootCallback& rcb) { rcb(fake_root); }
326 inline void call(
const WindowCallback& wcb) { wcb(fake_win); }
327 inline void call(
const CreateWindowCallback& cwcb) {
TEST_EXPECT(cwcb(fake_root) == fake_win); }
328 inline void call(
const DatabaseCallback& dbcb) { dbcb(fake_gbd, fake_gbtype); }
329 inline void call(
const TreeAwarCallback& tacb) { tacb(fake_awar, fake_bool); }
330 inline void call(
const CustomCallback& ccb) { ccb(); }
332 #define TEST_CB(cb,expectedChecksum) do { \
333 traceChecksum = -666; \
335 TEST_EXPECT_EQUAL(traceChecksum, (uint32_t)expectedChecksum); \
338 #define TEST_CB_TRACE(cb,expectedOutput) do { \
340 TEST_EXPECT_EQUAL(traceBuffer, expectedOutput); \
343 #define TEST_CB_TRACE__BROKEN(cb,expectedOutput) do { \
345 TEST_EXPECT_EQUAL__BROKEN(traceBuffer, expectedOutput); \
349 static void freeCharp(
char *
str) { free(str); }
350 static void freeCharp(
char *str1,
char *str2) { free(str1); free(str2); }
351 static void deleteString(
string *
str) {
delete str; }
352 static void deleteString(
string *str1,
string *str2) {
delete str1;
delete str2; }
358 TEST_CB_TRACE(makeRootCallback(plaincb),
"plaincb()\n");
359 TEST_CB_TRACE(makeRootCallback(rcb0),
"rcb0()\n");
360 TEST_CB_TRACE(makeRootCallback(rcb1,
"dispatched"),
"rcb1(dispatched)\n");
361 TEST_CB_TRACE(makeRootCallback(rcb2,
"age", 46),
"rcb2(age=46) [int]\n");
362 TEST_CB_TRACE(makeRootCallback(rcb2,
"size", 178L),
"rcb2(size=178) [long]\n");
364 TEST_CB_TRACE(makeWindowCallback(plaincb),
"plaincb()\n");
365 TEST_CB_TRACE(makeWindowCallback(wcb0),
"wcb0()\n");
366 TEST_CB_TRACE(makeWindowCallback(wcb1,
"dispatched"),
"wcb1(dispatched)\n");
367 TEST_CB_TRACE(makeWindowCallback(wcb2,
"age", 46),
"wcb2(age=46) [int]\n");
368 TEST_CB_TRACE(makeWindowCallback(wcb2,
"size", 178L),
"wcb2(size=178) [long]\n");
370 TEST_CB_TRACE(makeTreeAwarCallback(plaincb),
"plaincb()\n");
371 TEST_CB_TRACE(makeTreeAwarCallback(tacb0),
"tacb0()\n");
372 TEST_CB_TRACE(makeTreeAwarCallback(tacb1),
"tacb1()\n");
373 TEST_CB_TRACE(makeTreeAwarCallback(tacb2,
"dispatched"),
"tacb2(dispatched)\n");
374 TEST_CB_TRACE(makeTreeAwarCallback(tacb2, 46),
"tacb2(46)\n");
379 TEST_CB_TRACE(makeRootCallback(ucb0),
"ucb0()\n");
380 TEST_CB_TRACE(makeRootCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
381 TEST_CB_TRACE(makeRootCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
382 TEST_CB_TRACE(makeRootCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
384 TEST_CB_TRACE(makeWindowCallback(ucb0),
"ucb0()\n");
385 TEST_CB_TRACE(makeWindowCallback(ucb1,
"dispatched"),
"ucb1(dispatched)\n");
386 TEST_CB_TRACE(makeWindowCallback(ucb2,
"age", 46),
"ucb2(age=46) [int]\n");
387 TEST_CB_TRACE(makeWindowCallback(ucb2,
"size", 178L),
"ucb2(size=178) [long]\n");
390 TEST_CB_TRACE(makeWindowCallback(wcb2,
'l', 49710827735915452LL),
"wcb2(l=49710827735915452) [long long]\n");
393 TEST_CB_TRACE(makeCreateWindowCallback(cwcb_plain),
"cwcb_plain()\n");
394 TEST_CB_TRACE(makeCreateWindowCallback(cwcb0),
"cwcb0()\n");
395 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, 77),
"cwcb1(77)\n");
398 TEST_CB_TRACE(makeDatabaseCallback(dbcb01),
"dbcb01()\n");
399 TEST_CB_TRACE(makeDatabaseCallback(dbcb012),
"dbcb012()\n");
400 TEST_CB_TRACE(makeDatabaseCallback(dbcb02),
"dbcb02(2)\n");
401 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, 77),
"dbcb1(77) [int]\n");
403 TEST_CB_TRACE(makeDatabaseCallback(dbcb1, freeCharp, strdup(
"test")),
"dbcb1(test) [const char]\n");
408 TEST_CB_TRACE(makeWindowCallback(wcb1, freeCharp, strdup(
"leak")),
"wcb1(leak)\n");
410 TEST_CB_TRACE(makeWindowCallback(wcb1, deleteString,
new string(
"leak")),
"wcb1(leak) [string]\n");
412 TEST_CB_TRACE(makeWindowCallback(wcb2, freeCharp, strdup(
"hue"), strdup(
"hott")),
"wcb2(hue=hott) [const char/const char]\n");
413 TEST_CB_TRACE(makeWindowCallback(wcb2, deleteString,
new string(
"hue"),
new string(
"hott")),
"wcb2(hue=hott) [string/string]\n");
416 char *mut = strdup(
"mut");
417 const char *con =
"con";
420 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, con, con),
"cwcb2(con,con) [const const]\n");
421 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, mut, con),
"cwcb2(mut,con) [const const]\n");
422 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, con, mut),
"cwcb2(con,mut) [const mutable]\n");
423 TEST_CB_TRACE(makeCreateWindowCallback(cwcb2, mut, mut),
"cwcb2(mut,mut) [const mutable]\n");
426 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, con, con),
"cwcb3(con,con) [const const]\n");
427 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, mut, con),
"cwcb3(mut,con) [mutable const]\n");
428 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, con, mut),
"cwcb3(con,mut) [const mutable]\n");
429 TEST_CB_TRACE(makeCreateWindowCallback(cwcb3, mut, mut),
"cwcb3(mut,mut) [mutable mutable]\n");
435 const long lcon = 775L;
437 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, imut),
"cwcb1(17)\n");
438 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, icon),
"cwcb1(23)\n");
439 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &lcon),
"cwcb1(775) [long ptr]\n");
441 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
442 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &icon),
"cwcb1(23) [const ptr]\n");
444 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(17) [mutable ptr]\n");
445 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(34) [mutable ptr]\n");
446 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, &imut),
"cwcb1(68) [mutable ptr]\n");
448 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, mut),
"cwcb1(mut) [mutable]\n");
449 TEST_CB_TRACE(makeCreateWindowCallback(cwcb1, con),
"cwcb1(con) [const]\n");
454 TEST_CB_TRACE(makeCustomCallback(plaincb),
"plaincb()\n");
455 TEST_CB_TRACE(makeCustomCallback(ccb11,
"helo"),
"ccb11(helo)\n");
456 TEST_CB_TRACE(makeCustomCallback(ccb12, 4711),
"ccb12(4711)\n");
457 TEST_CB_TRACE(makeCustomCallback(ccb2, 4711,
"helo"),
"ccb2(4711,helo)\n");
459 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)
fputs(TRACE_PREFIX, stderr)
STATIC_ASSERT(sizeof(int *)==sizeof(AW_CL))
DECLARE_CBTYPE_VV_AND_BUILDERS(StoreConfigCallback, char *)
GB_write_int const char s