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 */ |
11 | int _paramCheck = 0; |
12 | |
13 | /* Userdata value to check */ |
14 | int _paramValue = 0; |
15 | |
16 | /* Flag indicating that the callback was called */ |
17 | int _timerCallbackCalled = 0; |
18 | |
19 | /* Fixture */ |
20 | |
21 | void |
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 | */ |
38 | int |
39 | timer_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: %" SDL_PRIu64, result); |
46 | |
47 | return TEST_COMPLETED; |
48 | } |
49 | |
50 | /** |
51 | * @brief Call to SDL_GetPerformanceFrequency |
52 | */ |
53 | int |
54 | timer_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: %" SDL_PRIu64, result); |
61 | |
62 | return TEST_COMPLETED; |
63 | } |
64 | |
65 | /** |
66 | * @brief Call to SDL_Delay and SDL_GetTicks |
67 | */ |
68 | int |
69 | timer_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 */ |
107 | Uint32 SDLCALL _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 | */ |
124 | int |
125 | timer_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 */ |
178 | static const SDLTest_TestCaseReference timerTest1 = |
179 | { (SDLTest_TestCaseFp)timer_getPerformanceCounter, "timer_getPerformanceCounter" , "Call to SDL_GetPerformanceCounter" , TEST_ENABLED }; |
180 | |
181 | static const SDLTest_TestCaseReference timerTest2 = |
182 | { (SDLTest_TestCaseFp)timer_getPerformanceFrequency, "timer_getPerformanceFrequency" , "Call to SDL_GetPerformanceFrequency" , TEST_ENABLED }; |
183 | |
184 | static const SDLTest_TestCaseReference timerTest3 = |
185 | { (SDLTest_TestCaseFp)timer_delayAndGetTicks, "timer_delayAndGetTicks" , "Call to SDL_Delay and SDL_GetTicks" , TEST_ENABLED }; |
186 | |
187 | static 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 */ |
191 | static const SDLTest_TestCaseReference *timerTests[] = { |
192 | &timerTest1, &timerTest2, &timerTest3, &timerTest4, NULL |
193 | }; |
194 | |
195 | /* Timer test suite (global) */ |
196 | SDLTest_TestSuiteReference timerTestSuite = { |
197 | "Timer" , |
198 | _timerSetUp, |
199 | timerTests, |
200 | NULL |
201 | }; |
202 | |