Added timer test suite
authorAndreas Schiffler <aschiffler@ferzkopp.net>
Mon, 14 Jan 2013 08:14:53 -0800
changeset 6815 5fefa916e039
parent 6814 fccdef204fcf
child 6816 b3d3ef1e15b5
Added timer test suite
VisualC/tests/testautomation/testautomation_vs2010.vcxproj
VisualC/tests/testautomation/testautomation_vs2012.vcxproj
test/Makefile.in
test/testautomation_suites.h
test/testautomation_timer.c
--- a/VisualC/tests/testautomation/testautomation_vs2010.vcxproj	Mon Jan 14 07:20:55 2013 -0800
+++ b/VisualC/tests/testautomation/testautomation_vs2010.vcxproj	Mon Jan 14 08:14:53 2013 -0800
@@ -189,6 +189,7 @@
     <ClCompile Include="..\..\..\test\testautomation_video.c" />
     <ClCompile Include="..\..\..\test\testautomation_syswm.c" />
     <ClCompile Include="..\..\..\test\testautomation_mouse.c" />
+    <ClCompile Include="..\..\..\test\testautomation_timer.c" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\test\testautomation_suites.h" />
--- a/VisualC/tests/testautomation/testautomation_vs2012.vcxproj	Mon Jan 14 07:20:55 2013 -0800
+++ b/VisualC/tests/testautomation/testautomation_vs2012.vcxproj	Mon Jan 14 08:14:53 2013 -0800
@@ -193,6 +193,7 @@
     <ClCompile Include="..\..\..\test\testautomation_video.c" />
     <ClCompile Include="..\..\..\test\testautomation_syswm.c" />
     <ClCompile Include="..\..\..\test\testautomation_mouse.c" />
+    <ClCompile Include="..\..\..\test\testautomation_timer.c" />
   </ItemGroup>
   <ItemGroup>
     <ClInclude Include="..\..\..\test\testautomation_suites.h" />
--- a/test/Makefile.in	Mon Jan 14 07:20:55 2013 -0800
+++ b/test/Makefile.in	Mon Jan 14 08:14:53 2013 -0800
@@ -80,7 +80,8 @@
 		      $(srcdir)/testautomation_keyboard.c \
 		      $(srcdir)/testautomation_video.c \
 		      $(srcdir)/testautomation_syswm.c \
-		      $(srcdir)/testautomation_mouse.c
+		      $(srcdir)/testautomation_mouse.c \
+		      $(srcdir)/testautomation_timer.c
 	$(CC) -o $@ $^ $(CFLAGS) -lSDL2_test $(LIBS) 
 
 testmultiaudio$(EXE): $(srcdir)/testmultiaudio.c
--- a/test/testautomation_suites.h	Mon Jan 14 07:20:55 2013 -0800
+++ b/test/testautomation_suites.h	Mon Jan 14 08:14:53 2013 -0800
@@ -21,6 +21,7 @@
 extern SDLTest_TestSuiteReference syswmTestSuite;
 extern SDLTest_TestSuiteReference videoTestSuite;
 extern SDLTest_TestSuiteReference mouseTestSuite;
+extern SDLTest_TestSuiteReference timerTestSuite;
 
 // All test suites
 SDLTest_TestSuiteReference *testSuites[] =  {
@@ -36,6 +37,7 @@
 	&syswmTestSuite,
 	&videoTestSuite,
 	&mouseTestSuite,
+	&timerTestSuite,
 	NULL
 };
 
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/testautomation_timer.c	Mon Jan 14 08:14:53 2013 -0800
@@ -0,0 +1,202 @@
+/**
+ * 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: %lu", 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: %lu", 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 mesure 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 _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;
+  return interval;
+}
+
+/**
+ * @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 temove 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 *)&param);
+  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
+};