// 28 may 2019 // define allcallsHeader and include test.h and thread.h before including this // TODO rename to FunctionsFailBeforeInit? #define allcallsCase(f, ...) \ TestNoInit(CallBeforeInitIsProgrammerError_ ## f) \ { \ void *ctx; \ ctx = beginCheckProgrammerError("attempt to call " #f "() before uiInit()"); \ f(__VA_ARGS__); \ endCheckProgrammerError(ctx); \ } #include allcallsHeader #undef allcallsCase // TODO rename to FunctionsFailOnWrongThread? #define allcallsCase(f, ...) \ static void threadTest ## f(void *data) \ { \ f(__VA_ARGS__); \ } \ Test(CallOnWrongThreadIsProgrammerError_ ## f) \ { \ threadThread *thread; \ threadSysError err; \ void *ctx; \ ctx = beginCheckProgrammerError("attempt to call " #f "() on a thread other than the GUI thread"); \ err = threadNewThread(threadTest ## f, NULL, &thread); \ if (err != 0) \ TestFatalf("error creating thread: " threadSysErrorFmt, threadSysErrorFmtArg(err)); \ err = threadThreadWaitAndFree(thread); \ if (err != 0) \ TestFatalf("error waiting for thread to finish: " threadSysErrorFmt, threadSysErrorFmtArg(err)); \ endCheckProgrammerError(ctx); \ } #include allcallsHeader #undef allcallsCase