You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
201 lines
6.2 KiB
201 lines
6.2 KiB
/** |
|
* Timer test suite |
|
*/ |
|
|
|
#include <stdio.h> |
|
|
|
#include "SDL.h" |
|
#include "SDL_test.h" |
|
|
|
/* Flag indicating if the param should be checked */ |
|
int _paramCheck = 0; |
|
|
|
/* Userdata value to check */ |
|
int _paramValue = 0; |
|
|
|
/* Flag indicating that the callback was called */ |
|
int _timerCallbackCalled = 0; |
|
|
|
/* Fixture */ |
|
|
|
void |
|
_timerSetUp(void *arg) |
|
{ |
|
/* Start SDL timer subsystem */ |
|
int ret = SDL_InitSubSystem( SDL_INIT_TIMER ); |
|
SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_TIMER)"); |
|
SDLTest_AssertCheck(ret==0, "Check result from SDL_InitSubSystem(SDL_INIT_TIMER)"); |
|
if (ret != 0) { |
|
SDLTest_LogError("%s", SDL_GetError()); |
|
} |
|
} |
|
|
|
/* Test case functions */ |
|
|
|
/** |
|
* @brief Call to SDL_GetPerformanceCounter |
|
*/ |
|
int |
|
timer_getPerformanceCounter(void *arg) |
|
{ |
|
Uint64 result; |
|
|
|
result = SDL_GetPerformanceCounter(); |
|
SDLTest_AssertPass("Call to SDL_GetPerformanceCounter()"); |
|
SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %"SDL_PRIu64, result); |
|
|
|
return TEST_COMPLETED; |
|
} |
|
|
|
/** |
|
* @brief Call to SDL_GetPerformanceFrequency |
|
*/ |
|
int |
|
timer_getPerformanceFrequency(void *arg) |
|
{ |
|
Uint64 result; |
|
|
|
result = SDL_GetPerformanceFrequency(); |
|
SDLTest_AssertPass("Call to SDL_GetPerformanceFrequency()"); |
|
SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %"SDL_PRIu64, result); |
|
|
|
return TEST_COMPLETED; |
|
} |
|
|
|
/** |
|
* @brief Call to SDL_Delay and SDL_GetTicks |
|
*/ |
|
int |
|
timer_delayAndGetTicks(void *arg) |
|
{ |
|
const Uint32 testDelay = 100; |
|
const Uint32 marginOfError = 25; |
|
Uint32 result; |
|
Uint32 result2; |
|
Uint32 difference; |
|
|
|
/* Zero delay */ |
|
SDL_Delay(0); |
|
SDLTest_AssertPass("Call to SDL_Delay(0)"); |
|
|
|
/* Non-zero delay */ |
|
SDL_Delay(1); |
|
SDLTest_AssertPass("Call to SDL_Delay(1)"); |
|
|
|
SDL_Delay(SDLTest_RandomIntegerInRange(5, 15)); |
|
SDLTest_AssertPass("Call to SDL_Delay()"); |
|
|
|
/* Get ticks count - should be non-zero by now */ |
|
result = SDL_GetTicks(); |
|
SDLTest_AssertPass("Call to SDL_GetTicks()"); |
|
SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %d", result); |
|
|
|
/* Delay a bit longer and measure ticks and verify difference */ |
|
SDL_Delay(testDelay); |
|
SDLTest_AssertPass("Call to SDL_Delay(%d)", testDelay); |
|
result2 = SDL_GetTicks(); |
|
SDLTest_AssertPass("Call to SDL_GetTicks()"); |
|
SDLTest_AssertCheck(result2 > 0, "Check result value, expected: >0, got: %d", result2); |
|
difference = result2 - result; |
|
SDLTest_AssertCheck(difference > (testDelay - marginOfError), "Check difference, expected: >%d, got: %d", testDelay - marginOfError, difference); |
|
SDLTest_AssertCheck(difference < (testDelay + marginOfError), "Check difference, expected: <%d, got: %d", testDelay + marginOfError, difference); |
|
|
|
return TEST_COMPLETED; |
|
} |
|
|
|
/* Test callback */ |
|
Uint32 SDLCALL _timerTestCallback(Uint32 interval, void *param) |
|
{ |
|
_timerCallbackCalled = 1; |
|
|
|
if (_paramCheck != 0) { |
|
SDLTest_AssertCheck(param != NULL, "Check param pointer, expected: non-NULL, got: %s", (param != NULL) ? "non-NULL" : "NULL"); |
|
if (param != NULL) { |
|
SDLTest_AssertCheck(*(int *)param == _paramValue, "Check param value, expected: %i, got: %i", _paramValue, *(int *)param); |
|
} |
|
} |
|
|
|
return 0; |
|
} |
|
|
|
/** |
|
* @brief Call to SDL_AddTimer and SDL_RemoveTimer |
|
*/ |
|
int |
|
timer_addRemoveTimer(void *arg) |
|
{ |
|
SDL_TimerID id; |
|
SDL_bool result; |
|
int param; |
|
|
|
/* Reset state */ |
|
_paramCheck = 0; |
|
_timerCallbackCalled = 0; |
|
|
|
/* Set timer with a long delay */ |
|
id = SDL_AddTimer(10000, _timerTestCallback, NULL); |
|
SDLTest_AssertPass("Call to SDL_AddTimer(10000,...)"); |
|
SDLTest_AssertCheck(id > 0, "Check result value, expected: >0, got: %d", id); |
|
|
|
/* Remove timer again and check that callback was not called */ |
|
result = SDL_RemoveTimer(id); |
|
SDLTest_AssertPass("Call to SDL_RemoveTimer()"); |
|
SDLTest_AssertCheck(result == SDL_TRUE, "Check result value, expected: %i, got: %i", SDL_TRUE, result); |
|
SDLTest_AssertCheck(_timerCallbackCalled == 0, "Check callback WAS NOT called, expected: 0, got: %i", _timerCallbackCalled); |
|
|
|
/* Try to remove timer again (should be a NOOP) */ |
|
result = SDL_RemoveTimer(id); |
|
SDLTest_AssertPass("Call to SDL_RemoveTimer()"); |
|
SDLTest_AssertCheck(result == SDL_FALSE, "Check result value, expected: %i, got: %i", SDL_FALSE, result); |
|
|
|
/* Reset state */ |
|
param = SDLTest_RandomIntegerInRange(-1024, 1024); |
|
_paramCheck = 1; |
|
_paramValue = param; |
|
_timerCallbackCalled = 0; |
|
|
|
/* Set timer with a short delay */ |
|
id = SDL_AddTimer(10, _timerTestCallback, (void *)¶m); |
|
SDLTest_AssertPass("Call to SDL_AddTimer(10, param)"); |
|
SDLTest_AssertCheck(id > 0, "Check result value, expected: >0, got: %d", id); |
|
|
|
/* Wait to let timer trigger callback */ |
|
SDL_Delay(100); |
|
SDLTest_AssertPass("Call to SDL_Delay(100)"); |
|
|
|
/* Remove timer again and check that callback was called */ |
|
result = SDL_RemoveTimer(id); |
|
SDLTest_AssertPass("Call to SDL_RemoveTimer()"); |
|
SDLTest_AssertCheck(result == SDL_FALSE, "Check result value, expected: %i, got: %i", SDL_FALSE, result); |
|
SDLTest_AssertCheck(_timerCallbackCalled == 1, "Check callback WAS called, expected: 1, got: %i", _timerCallbackCalled); |
|
|
|
return TEST_COMPLETED; |
|
} |
|
|
|
/* ================= Test References ================== */ |
|
|
|
/* Timer test cases */ |
|
static const SDLTest_TestCaseReference timerTest1 = |
|
{ (SDLTest_TestCaseFp)timer_getPerformanceCounter, "timer_getPerformanceCounter", "Call to SDL_GetPerformanceCounter", TEST_ENABLED }; |
|
|
|
static const SDLTest_TestCaseReference timerTest2 = |
|
{ (SDLTest_TestCaseFp)timer_getPerformanceFrequency, "timer_getPerformanceFrequency", "Call to SDL_GetPerformanceFrequency", TEST_ENABLED }; |
|
|
|
static const SDLTest_TestCaseReference timerTest3 = |
|
{ (SDLTest_TestCaseFp)timer_delayAndGetTicks, "timer_delayAndGetTicks", "Call to SDL_Delay and SDL_GetTicks", TEST_ENABLED }; |
|
|
|
static const SDLTest_TestCaseReference timerTest4 = |
|
{ (SDLTest_TestCaseFp)timer_addRemoveTimer, "timer_addRemoveTimer", "Call to SDL_AddTimer and SDL_RemoveTimer", TEST_ENABLED }; |
|
|
|
/* Sequence of Timer test cases */ |
|
static const SDLTest_TestCaseReference *timerTests[] = { |
|
&timerTest1, &timerTest2, &timerTest3, &timerTest4, NULL |
|
}; |
|
|
|
/* Timer test suite (global) */ |
|
SDLTest_TestSuiteReference timerTestSuite = { |
|
"Timer", |
|
_timerSetUp, |
|
timerTests, |
|
NULL |
|
};
|
|
|