//========= Copyright Valve Corporation, All rights reserved. ============// // // Purpose: exposes testing thread functions // //============================================================================= #ifndef TESTTHREAD_H #define TESTTHREAD_H #ifdef _WIN32 #pragma once #endif #include "tier0/dbg.h" // test callback typedef void(STDCALL *TestFunc)(void *pv); // runs the test function DBG_INTERFACE void Test_RunTest(TestFunc func, void *pvArg); // call to give the test thread a chance to run // calling thread will block until the test thread yields // doesn't do anything if no tests are running DBG_INTERFACE void Test_RunFrame(); // true if any tests are running, or have ran DBG_INTERFACE bool Test_IsActive(); // sets that the test has failed DBG_INTERFACE void Test_SetFailed(); // true if any tests have failed, due to an assert, warning, or explicit fail DBG_INTERFACE bool Test_HasFailed(); // true if any tests have completed DBG_INTERFACE bool Test_HasFinished(); // terminates the test thread DBG_INTERFACE void Test_TerminateThread(); // the following functions should only be called from the test thread // yields to the main thread for a single frame // passing in is a count of the number of frames that have been yielded by this // yield macro can be used to assert if a test thread is blocked foor DBG_INTERFACE void TestThread_Yield(); // utility functions to pause the test frame until the selected condition is // true #define YIELD_UNTIL(x) \ { \ int iYieldCount = 0; \ while (!(x)) { \ TestThread_Yield(); \ iYieldCount++; \ if (iYieldCount >= 100) { \ AssertMsg(false, #x); \ break; \ } \ } \ } // use this like a while(1) loop, with break; to stop yielding #define YIELD_UNTIL_BREAK() for (; true; TestThread_Yield()) // yields for a single frame #define YIELD_FRAME() \ { TestThread_Yield(); } #define YIELD_TWO_FRAMES() \ { \ TestThread_Yield(); \ TestThread_Yield(); \ } #endif // TESTTHREAD_H