Added a data parameter to test scaffolds; this is currently NULL, but subtests will use it (the subtest function is called directly, not through a scaffold).

This commit is contained in:
Pietro Gagliardi 2019-05-20 21:10:29 -04:00
parent bd666b8ec9
commit 3c9ff9c4bc
2 changed files with 15 additions and 10 deletions

View File

@ -29,7 +29,8 @@ struct testingT {
// set at test creation time // set at test creation time
const char *name; const char *name;
char *computedName; char *computedName;
void (*f)(testingT *); void (*f)(testingT *, void *);
void *data;
const char *file; const char *file;
long line; long line;
@ -52,11 +53,12 @@ struct testingT {
#pragma warning(pop) #pragma warning(pop)
#endif #endif
static void initTest(testingT *t, const char *name, void (*f)(testingT *), const char *file, long line) static void initTest(testingT *t, const char *name, void (*f)(testingT *, void *), void *data, const char *file, long line)
{ {
memset(t, 0, sizeof (testingT)); memset(t, 0, sizeof (testingT));
t->name = name; t->name = name;
t->f = f; t->f = f;
t->data = data;
t->file = file; t->file = file;
t->line = line; t->line = line;
} }
@ -67,7 +69,7 @@ struct testingSet {
static testingSet mainTests = { testingprivArrayStaticInit(testingT, 32, "testingT[]") }; static testingSet mainTests = { testingprivArrayStaticInit(testingT, 32, "testingT[]") };
void testingprivSetRegisterTest(testingSet **pset, const char *name, void (*f)(testingT *), const char *file, long line) void testingprivSetRegisterTest(testingSet **pset, const char *name, void (*f)(testingT *, void *), void *data, const char *file, long line)
{ {
testingSet *set; testingSet *set;
testingT *t; testingT *t;
@ -82,7 +84,7 @@ void testingprivSetRegisterTest(testingSet **pset, const char *name, void (*f)(t
} }
} }
t = (testingT *) testingprivArrayAppend(&(set->tests), 1); t = (testingT *) testingprivArrayAppend(&(set->tests), 1);
initTest(t, name, f, file, line); initTest(t, name, f, data, file, line);
t->computedName = testingprivStrdup(name); t->computedName = testingprivStrdup(name);
} }
@ -131,7 +133,7 @@ static int testingprivTRun(testingT *t, const testingOptions *options, testingpr
start = timerMonotonicNow(); start = timerMonotonicNow();
if (setjmp(t->returnNowBuf) == 0) if (setjmp(t->returnNowBuf) == 0)
(*(t->f))(t); (*(t->f))(t, t->data);
end = timerMonotonicNow(); end = timerMonotonicNow();
t->returned = 1; t->returned = 1;
runDefers(t); runDefers(t);
@ -241,6 +243,8 @@ void testingTDefer(testingT *t, void (*f)(testingT *t, void *data), void *data)
} }
void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t, void *data), void *data) void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t, void *data), void *data)
{}
#if 0
{ {
testingT *subt; testingT *subt;
testingprivOutbuf *rewrittenName; testingprivOutbuf *rewrittenName;
@ -276,7 +280,7 @@ void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t,
} }
subt = testingprivNew(testingT); subt = testingprivNew(testingT);
initTest(subt, xxxxx); initTest(subt, subfunc, data, xxxxxx);
subt->computedName = testingSmprintf("%s/%s", t->name, testingprivOutbufString(rewrittenName)); subt->computedName = testingSmprintf("%s/%s", t->name, testingprivOutbufString(rewrittenName));
testingprivOutbufFree(rewrittenName); testingprivOutbufFree(rewrittenName);
@ -286,3 +290,4 @@ void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t,
uiprivFree(subt->computedName); uiprivFree(subt->computedName);
uiprivFree(subt); uiprivFree(subt);
} }
#endif

View File

@ -7,7 +7,7 @@
#define testingprivScaffoldName(basename) testingprivScaffold ## basename #define testingprivScaffoldName(basename) testingprivScaffold ## basename
#define testingprivMkScaffold(basename, argtype, argname) \ #define testingprivMkScaffold(basename, argtype, argname) \
static void testingprivScaffoldName(basename)(argtype *argname) { testingprivImplName(basename)(argname); } static void testingprivScaffoldName(basename)(argtype *argname, void *data) { testingprivImplName(basename)(argname); }
// references: // references:
// - https://gitlab.gnome.org/GNOME/glib/blob/master/glib/gconstructor.h // - https://gitlab.gnome.org/GNOME/glib/blob/master/glib/gconstructor.h
@ -17,10 +17,10 @@
#define testingprivCtorPtrName(basename) testingprivCtorPtr ## basename #define testingprivCtorPtrName(basename) testingprivCtorPtr ## basename
#if defined(__GNUC__) #if defined(__GNUC__)
#define testingprivMkCtor(basename, pset) \ #define testingprivMkCtor(basename, pset) \
__attribute__((constructor)) static void testingprivCtorName(basename)(void) { testingprivSetRegisterTest(pset, #basename, testingprivScaffoldName(basename), __FILE__, __LINE__); } __attribute__((constructor)) static void testingprivCtorName(basename)(void) { testingprivSetRegisterTest(pset, #basename, testingprivScaffoldName(basename), NULL, __FILE__, __LINE__); }
#elif defined(_MSC_VER) #elif defined(_MSC_VER)
#define testingprivMkCtor(basename, pset) \ #define testingprivMkCtor(basename, pset) \
static int testingprivCtorName(basename)(void) { testingprivSetRegisterTest(pset, #basename, testingprivScaffoldName(basename), __FILE__, __LINE__); return 0; } \ static int testingprivCtorName(basename)(void) { testingprivSetRegisterTest(pset, #basename, testingprivScaffoldName(basename), NULL, __FILE__, __LINE__); return 0; } \
__pragma(section(".CRT$XCU",read)) \ __pragma(section(".CRT$XCU",read)) \
__declspec(allocate(".CRT$XCU")) static int (*testingprivCtorPtrName(basename))(void) = testingprivCtorName(basename); __declspec(allocate(".CRT$XCU")) static int (*testingprivCtorPtrName(basename))(void) = testingprivCtorName(basename);
#else #else
@ -70,7 +70,7 @@ extern void testingTSkipNow(testingT *t);
extern void testingTDefer(testingT *t, void (*f)(testingT *t, void *data), void *data); extern void testingTDefer(testingT *t, void (*f)(testingT *t, void *data), void *data);
extern void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t, void *data), void *data); extern void testingTRun(testingT *t, const char *subname, void (*subfunc)(testingT *t, void *data), void *data);
extern void testingprivSetRegisterTest(testingSet **pset, const char *, void (*)(testingT *), const char *, long); extern void testingprivSetRegisterTest(testingSet **pset, const char *, void (*)(testingT *, void *), void *, const char *, long);
// see https://stackoverflow.com/questions/32399191/va-args-expansion-using-msvc // see https://stackoverflow.com/questions/32399191/va-args-expansion-using-msvc
#define testingprivExpand(x) x #define testingprivExpand(x) x
#define testingprivTLogfThen(then, t, ...) ((testingprivTLogfFull(t, __FILE__, __LINE__, __VA_ARGS__)), (then(t))) #define testingprivTLogfThen(then, t, ...) ((testingprivTLogfFull(t, __FILE__, __LINE__, __VA_ARGS__)), (then(t)))