testautomation_timer.c (6327B)
1/** 2 * Timer test suite 3 */ 4 5#include <stdio.h> 6 7#include "SDL.h" 8#include "SDL_test.h" 9 10/* Flag indicating if the param should be checked */ 11int _paramCheck = 0; 12 13/* Userdata value to check */ 14int _paramValue = 0; 15 16/* Flag indicating that the callback was called */ 17int _timerCallbackCalled = 0; 18 19/* Fixture */ 20 21void 22_timerSetUp(void *arg) 23{ 24 /* Start SDL timer subsystem */ 25 int ret = SDL_InitSubSystem( SDL_INIT_TIMER ); 26 SDLTest_AssertPass("Call to SDL_InitSubSystem(SDL_INIT_TIMER)"); 27 SDLTest_AssertCheck(ret==0, "Check result from SDL_InitSubSystem(SDL_INIT_TIMER)"); 28 if (ret != 0) { 29 SDLTest_LogError("%s", SDL_GetError()); 30 } 31} 32 33/* Test case functions */ 34 35/** 36 * @brief Call to SDL_GetPerformanceCounter 37 */ 38int 39timer_getPerformanceCounter(void *arg) 40{ 41 Uint64 result; 42 43 result = SDL_GetPerformanceCounter(); 44 SDLTest_AssertPass("Call to SDL_GetPerformanceCounter()"); 45 SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %lu", result); 46 47 return TEST_COMPLETED; 48} 49 50/** 51 * @brief Call to SDL_GetPerformanceFrequency 52 */ 53int 54timer_getPerformanceFrequency(void *arg) 55{ 56 Uint64 result; 57 58 result = SDL_GetPerformanceFrequency(); 59 SDLTest_AssertPass("Call to SDL_GetPerformanceFrequency()"); 60 SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %lu", result); 61 62 return TEST_COMPLETED; 63} 64 65/** 66 * @brief Call to SDL_Delay and SDL_GetTicks 67 */ 68int 69timer_delayAndGetTicks(void *arg) 70{ 71 const Uint32 testDelay = 100; 72 const Uint32 marginOfError = 25; 73 Uint32 result; 74 Uint32 result2; 75 Uint32 difference; 76 77 /* Zero delay */ 78 SDL_Delay(0); 79 SDLTest_AssertPass("Call to SDL_Delay(0)"); 80 81 /* Non-zero delay */ 82 SDL_Delay(1); 83 SDLTest_AssertPass("Call to SDL_Delay(1)"); 84 85 SDL_Delay(SDLTest_RandomIntegerInRange(5, 15)); 86 SDLTest_AssertPass("Call to SDL_Delay()"); 87 88 /* Get ticks count - should be non-zero by now */ 89 result = SDL_GetTicks(); 90 SDLTest_AssertPass("Call to SDL_GetTicks()"); 91 SDLTest_AssertCheck(result > 0, "Check result value, expected: >0, got: %d", result); 92 93 /* Delay a bit longer and measure ticks and verify difference */ 94 SDL_Delay(testDelay); 95 SDLTest_AssertPass("Call to SDL_Delay(%d)", testDelay); 96 result2 = SDL_GetTicks(); 97 SDLTest_AssertPass("Call to SDL_GetTicks()"); 98 SDLTest_AssertCheck(result2 > 0, "Check result value, expected: >0, got: %d", result2); 99 difference = result2 - result; 100 SDLTest_AssertCheck(difference > (testDelay - marginOfError), "Check difference, expected: >%d, got: %d", testDelay - marginOfError, difference); 101 SDLTest_AssertCheck(difference < (testDelay + marginOfError), "Check difference, expected: <%d, got: %d", testDelay + marginOfError, difference); 102 103 return TEST_COMPLETED; 104} 105 106/* Test callback */ 107Uint32 _timerTestCallback(Uint32 interval, void *param) 108{ 109 _timerCallbackCalled = 1; 110 111 if (_paramCheck != 0) { 112 SDLTest_AssertCheck(param != NULL, "Check param pointer, expected: non-NULL, got: %s", (param != NULL) ? "non-NULL" : "NULL"); 113 if (param != NULL) { 114 SDLTest_AssertCheck(*(int *)param == _paramValue, "Check param value, expected: %i, got: %i", _paramValue, *(int *)param); 115 } 116 } 117 118 return 0; 119} 120 121/** 122 * @brief Call to SDL_AddTimer and SDL_RemoveTimer 123 */ 124int 125timer_addRemoveTimer(void *arg) 126{ 127 SDL_TimerID id; 128 SDL_bool result; 129 int param; 130 131 /* Reset state */ 132 _paramCheck = 0; 133 _timerCallbackCalled = 0; 134 135 /* Set timer with a long delay */ 136 id = SDL_AddTimer(10000, _timerTestCallback, NULL); 137 SDLTest_AssertPass("Call to SDL_AddTimer(10000,...)"); 138 SDLTest_AssertCheck(id > 0, "Check result value, expected: >0, got: %d", id); 139 140 /* Remove timer again and check that callback was not called */ 141 result = SDL_RemoveTimer(id); 142 SDLTest_AssertPass("Call to SDL_RemoveTimer()"); 143 SDLTest_AssertCheck(result == SDL_TRUE, "Check result value, expected: %i, got: %i", SDL_TRUE, result); 144 SDLTest_AssertCheck(_timerCallbackCalled == 0, "Check callback WAS NOT called, expected: 0, got: %i", _timerCallbackCalled); 145 146 /* Try to remove timer again (should be a NOOP) */ 147 result = SDL_RemoveTimer(id); 148 SDLTest_AssertPass("Call to SDL_RemoveTimer()"); 149 SDLTest_AssertCheck(result == SDL_FALSE, "Check result value, expected: %i, got: %i", SDL_FALSE, result); 150 151 /* Reset state */ 152 param = SDLTest_RandomIntegerInRange(-1024, 1024); 153 _paramCheck = 1; 154 _paramValue = param; 155 _timerCallbackCalled = 0; 156 157 /* Set timer with a short delay */ 158 id = SDL_AddTimer(10, _timerTestCallback, (void *)¶m); 159 SDLTest_AssertPass("Call to SDL_AddTimer(10, param)"); 160 SDLTest_AssertCheck(id > 0, "Check result value, expected: >0, got: %d", id); 161 162 /* Wait to let timer trigger callback */ 163 SDL_Delay(100); 164 SDLTest_AssertPass("Call to SDL_Delay(100)"); 165 166 /* Remove timer again and check that callback was called */ 167 result = SDL_RemoveTimer(id); 168 SDLTest_AssertPass("Call to SDL_RemoveTimer()"); 169 SDLTest_AssertCheck(result == SDL_FALSE, "Check result value, expected: %i, got: %i", SDL_FALSE, result); 170 SDLTest_AssertCheck(_timerCallbackCalled == 1, "Check callback WAS called, expected: 1, got: %i", _timerCallbackCalled); 171 172 return TEST_COMPLETED; 173} 174 175/* ================= Test References ================== */ 176 177/* Timer test cases */ 178static const SDLTest_TestCaseReference timerTest1 = 179 { (SDLTest_TestCaseFp)timer_getPerformanceCounter, "timer_getPerformanceCounter", "Call to SDL_GetPerformanceCounter", TEST_ENABLED }; 180 181static const SDLTest_TestCaseReference timerTest2 = 182 { (SDLTest_TestCaseFp)timer_getPerformanceFrequency, "timer_getPerformanceFrequency", "Call to SDL_GetPerformanceFrequency", TEST_ENABLED }; 183 184static const SDLTest_TestCaseReference timerTest3 = 185 { (SDLTest_TestCaseFp)timer_delayAndGetTicks, "timer_delayAndGetTicks", "Call to SDL_Delay and SDL_GetTicks", TEST_ENABLED }; 186 187static const SDLTest_TestCaseReference timerTest4 = 188 { (SDLTest_TestCaseFp)timer_addRemoveTimer, "timer_addRemoveTimer", "Call to SDL_AddTimer and SDL_RemoveTimer", TEST_ENABLED }; 189 190/* Sequence of Timer test cases */ 191static const SDLTest_TestCaseReference *timerTests[] = { 192 &timerTest1, &timerTest2, &timerTest3, &timerTest4, NULL 193}; 194 195/* Timer test suite (global) */ 196SDLTest_TestSuiteReference timerTestSuite = { 197 "Timer", 198 _timerSetUp, 199 timerTests, 200 NULL 201};