Refactoring the TestCaseInit and TestCaseQuit functions
authorMarkus Kauppila <markus.kauppila@gmail.com>
Sat, 04 Jun 2011 17:50:23 +0300
changeset 5678 50401a6c3c95
parent 5677 ecb455bdc5a5
child 5679 10a5199c4169
Refactoring the TestCaseInit and TestCaseQuit functions to be caller from the Runner.
test/test-automation/Makefile.am
test/test-automation/SDL_test.c
test/test-automation/SDL_test.h
test/test-automation/runner.c
test/test-automation/testrect/testrect.c
test/test-automation/tests/Makefile.am
test/test-automation/tests/test.c
--- a/test/test-automation/Makefile.am	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/Makefile.am	Sat Jun 04 17:50:23 2011 +0300
@@ -5,7 +5,7 @@
 bin_PROGRAMS = runner
 runner_SOURCES = runner.c SDL_test.c
 runner_CLAGS = -W -Wall -Wextra -g `sdl-config --cflags` -DSDL_NO_COMPAT
-runner_LDFLAGS = `sdl-config --libs`
+runner_LDFLAGS = `sdl-config --libs` 
 
 install: install-tests
 install-tests:
--- a/test/test-automation/SDL_test.c	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/SDL_test.c	Sat Jun 04 17:50:23 2011 +0300
@@ -27,13 +27,16 @@
 #include "SDL_test.h"
 
 /*! \brief return value of test case. Non-zero value means that the test failed */
-static int _testReturnValue;
+int _testReturnValue;
 
-static int _testAssertsFailed;
-static int _testAssertsPassed;
+/*! \brief counts the failed asserts */
+int _testAssertsFailed;
+
+/*! \brief counts the passed asserts */
+int _testAssertsPassed;
 
 void
-TestCaseInit()
+_TestCaseInit()
 {
 	_testReturnValue = 0;
 	_testAssertsFailed = 0;
@@ -41,13 +44,14 @@
 }
 
 int
-TestCaseQuit()
+_TestCaseQuit()
 {
-        printf("Asserts: passed %d, failed %d\n", _testAssertsPassed, _testAssertsFailed);
+	//! \todo make the test fail, if it does not contain any asserts
+	printf("Asserts: passed %d, failed %d\n", _testAssertsPassed, _testAssertsFailed);fflush(stdout);
 	return _testReturnValue;
 }
 
-void 
+void
 AssertEquals(Uint32 expected, Uint32 actual, char* message, ...)
 {
    va_list args;
@@ -57,7 +61,7 @@
       va_start( args, message );
       SDL_vsnprintf( buf, sizeof(buf), message, args );
       va_end( args );
-      printf("Assert Equals failed: expected %d, got %d; %s\n", expected, actual, buf);
+      printf("Assert Equals failed: expected %d, got %d; %s\n", expected, actual, buf); fflush(stdout);
       _testReturnValue = 1;
       _testAssertsFailed++;
    } else {
@@ -65,7 +69,7 @@
    }
 }
 
-void 
+void
 AssertTrue(int condition, char *message, ...)
 {
    va_list args;
--- a/test/test-automation/SDL_test.h	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/SDL_test.h	Sat Jun 04 17:50:23 2011 +0300
@@ -23,11 +23,14 @@
 
 #include <SDL/SDL.h>
 
+extern int _testReturnValue;
+extern int _testAssertsFailed;
+extern int _testAssertsPassed;
+
 // \todo Should these be consts?
 #define TEST_ENABLED  1
 #define TEST_DISABLED 0
 
-
 /*!
  * Holds information about a test case
  */
@@ -38,23 +41,28 @@
 	long requirements;  /*!< Set to TEST_REQUIRES_OPENGL, TEST_REQUIRES_AUDIO, ... */
 } TestCaseReference;
 
-/*! \fn TestCaseInit
+/*! \fn _TestCaseInit
  *  Initialized the test case. Must be called at
  *  the beginning of every test case, before doing
  *  anything else.
  */
-void TestCaseInit();
+void _TestCaseInit();
 
-/*! \fn TestCaseQuit
+/*! \fn _TestCaseQuit
  *  Deinitializes and exits the test case
  *
  * \return 0 if test succeeded, otherwise 1
  */
-int TestCaseQuit();
+int _TestCaseQuit();
 
-
+/*!
+ * todo add comment
+ */
 void AssertEquals(Uint32 expected, Uint32 actual, char *message, ...);
 
+/*!
+ * todo add comment
+ */
 void AssertTrue(int condition, char *message, ...);
 
 #endif
--- a/test/test-automation/runner.c	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/runner.c	Sat Jun 04 17:50:23 2011 +0300
@@ -28,7 +28,11 @@
 #include "SDL_test.h"
 
 //!< Function pointer to a test case function
-typedef int (*TestCase)(void *arg);
+typedef void (*TestCase)(void *arg);
+//!< Function pointer to a test case init function
+typedef void (*TestCaseInit)(void);
+//!< Function pointer to a test case quit function
+typedef int  (*TestCaseQuit)(void);
 
 //!< Flag for executing tests in-process
 static int execute_inproc = 0;
@@ -99,6 +103,7 @@
 	return tests;
 }
 
+
 /*!
  * Loads test case from a test suite
  *
@@ -110,7 +115,7 @@
 TestCase
 LoadTestCase(void *suite, char *testName)
 {
-	TestCase test = (int (*)(void *)) SDL_LoadFunction(suite, testName);
+	TestCase test = (TestCase) SDL_LoadFunction(suite, testName);
 	if(test == NULL) {
 		fprintf(stderr, "Loading test failed, tests == NULL\n");
 		fprintf(stderr, "%s\n", SDL_GetError());
@@ -119,6 +124,43 @@
 	return test;
 }
 
+/*!
+ * Loads function that initialises the test case from the
+ * given test suite.
+ *
+ * \param suite Used test suite
+ *
+ * \return Function pointer (TestCaseInit) which points to loaded init function. NULL if function fails.
+ */
+TestCaseInit
+LoadTestCaseInit(void *suite) {
+	TestCaseInit testCaseInit = (TestCaseInit) SDL_LoadFunction(suite, "_TestCaseInit");
+	if(testCaseInit == NULL) {
+		fprintf(stderr, "Loading TestCaseInit function failed, testCaseInit == NULL\n");
+		fprintf(stderr, "%s\n", SDL_GetError());
+	}
+
+	return testCaseInit;
+}
+
+/*!
+ * Loads function that deinitialises the executed test case from the
+ * given test suite.
+ *
+ * \param suite Used test suite
+ *
+ * \return Function pointer (TestCaseInit) which points to loaded init function. NULL if function fails.
+ */
+TestCaseQuit
+LoadTestCaseQuit(void *suite) {
+	TestCaseQuit testCaseQuit = (TestCaseQuit) SDL_LoadFunction(suite, "_TestCaseQuit");
+	if(testCaseQuit == NULL) {
+		fprintf(stderr, "Loading TestCaseQuit function failed, testCaseQuit == NULL\n");
+		fprintf(stderr, "%s\n", SDL_GetError());
+	}
+
+	return testCaseQuit;
+}
 
 /*!
  * If using out-of-proc execution of tests. This function
@@ -148,6 +190,16 @@
 }
 
 /*!
+ * Prints usage information
+ */
+void printUsage() {
+	  printf("Usage: ./runner [--in-proc] [--help]\n");
+	  printf("Options:\n");
+	  printf(" --in-proc        Executes tests in-process\n");
+	  printf(" --help           Print this help\n");
+}
+
+/*!
  * Parse command line arguments
  *
  * \param argc Count of command line arguments
@@ -164,13 +216,13 @@
          execute_inproc = 1;
       }
       else if(SDL_strcmp(arg, "--help") == 0 || SDL_strcmp(arg, "-h") == 0) {
-    	  printf("Usage: ./runner [--in-proc] [--help]\n");
-    	  printf("Options:\n");
-    	  printf(" --in-proc        Executes tests in-process\n");
-    	  printf(" --help           Print this help.:\n");
+    	  printUsage();
+    	  exit(0);
+      } else {
+    	  printf("runner: unknown command '%s'\n", arg);
+    	  printUsage();
     	  exit(0);
       }
-      // \todo print error for unknown option
    }
 }
 
@@ -206,15 +258,25 @@
 
 			printf("Running %s (in %s):\n", testname, testSuiteName);
 
+			TestCaseInit testCaseInit = LoadTestCaseInit(suite);
+			TestCaseQuit testCaseQuit = LoadTestCaseQuit(suite);
+			TestCase test = (TestCase) LoadTestCase(suite, testname);
+
 			int retVal = 1;
 			if(execute_inproc) {
-				TestCase test = (TestCase) LoadTestCase(suite, testname);
-				retVal = test(0x0);
+				testCaseInit();
+
+				test(0x0);
+
+				retVal = testCaseQuit();
 			} else {
 				int childpid = fork();
 				if(childpid == 0) {
-					TestCase test = (TestCase) LoadTestCase(suite, testname);
-					return test(0x0);
+					testCaseInit();
+
+					test(0x0);
+
+					return testCaseQuit();
 				} else {
 					int stat_lock = -1;
 					int child = wait(&stat_lock);
--- a/test/test-automation/testrect/testrect.c	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/testrect/testrect.c	Sat Jun 04 17:50:23 2011 +0300
@@ -21,8 +21,8 @@
 	return (TestCaseReference **)testSuite;
 }
 
-/**
- * @brief Tests SDL_IntersectRectAndLine()
+/*!
+ * \brief Tests SDL_IntersectRectAndLine()
  */
 int rect_testIntersectRectAndLine (void *arg)
 {
@@ -31,8 +31,6 @@
     int x2, y2;
     SDL_bool clipped;
 
-    TestCaseInit();
-
     x1 = -10;
     y1 = 0;
     x2 = -10;
@@ -132,6 +130,4 @@
                    x1 == 0 && y1 == 31 && x2 == 31 && y2 == 0,
         "diagonal line to upper right was incorrectly clipped: %d,%d - %d,%d",
         x1, y1, x2, y2);
-
-    return TestCaseQuit();
 }
--- a/test/test-automation/tests/Makefile.am	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/tests/Makefile.am	Sat Jun 04 17:50:23 2011 +0300
@@ -1,6 +1,6 @@
 lib_LTLIBRARIES = libtest.la
 libtest_la_SOURCES = test.c ../SDL_test.c
-libtest_la_CLAGS = -fPIC -g
+libtest_la_CLAGS = -fPIC -g 
 libtest_la_LDFLAGS = `sdl-config --libs`
 
 distclean-local:
--- a/test/test-automation/tests/test.c	Wed Jun 01 18:03:09 2011 -0700
+++ b/test/test-automation/tests/test.c	Sat Jun 04 17:50:23 2011 +0300
@@ -48,36 +48,25 @@
 }
 
 /* Test case functions */
-int hello(void *arg)
+void hello(void *arg)
 {
-	TestCaseInit();
-
 	const char *revision = SDL_GetRevision();
 
 	printf("Revision is %s\n", revision);
+
 	AssertEquals(3, 5, "fails");
-
-	return TestCaseQuit();
 }
 
-int hello2(void *arg)
+void hello2(void *arg)
 {
-	TestCaseInit();
-
 	char *msg = "eello";
 	//msg[0] = 'H';
-
-	return TestCaseQuit();
+	AssertTrue(0, "fails");
 }
 
-int hello3(void *arg)
+void hello3(void *arg)
 {
-	TestCaseInit();
-	printf("hello3\n");
-
-	AssertEquals(3, 3, "passes");
-
-	return TestCaseQuit();
+	AssertTrue(1, "passes");
 }
 
 #endif