Refactoring the massive main() to smaller functions.
authorMarkus Kauppila <markus.kauppila@gmail.com>
Thu, 26 May 2011 18:38:56 +0300
changeset 5667 4c0d0d32414c
parent 5666 8feff411cc08
child 5668 3a9b790c00e9
Refactoring the massive main() to smaller functions.
test/test-automation/Makefile.am
test/test-automation/configure.ac
test/test-automation/runner.c
test/test-automation/tests/Makefile.am
test/test-automation/tests/SDL_test.c
test/test-automation/tests/SDL_test.h
test/test-automation/tests/asserts.c
test/test-automation/tests/asserts.h
test/test-automation/tests/test.c
--- a/test/test-automation/Makefile.am	Wed May 25 09:45:03 2011 -0700
+++ b/test/test-automation/Makefile.am	Thu May 26 18:38:56 2011 +0300
@@ -3,7 +3,7 @@
 SUBDIRS = tests
 
 bin_PROGRAMS = runner
-runner_SOURCES = runner.c
+runner_SOURCES = runner.c tests/SDL_test.c
 runner_CLAGS = -W -Wall -Wextra -g `sdl-config --cflags` -DSDL_NO_COMPAT
 runner_LDFLAGS = `sdl-config --libs`
 
--- a/test/test-automation/configure.ac	Wed May 25 09:45:03 2011 -0700
+++ b/test/test-automation/configure.ac	Thu May 26 18:38:56 2011 +0300
@@ -26,6 +26,9 @@
 
 # Checks for typedefs, structures, and compiler characteristics.
 
+# without this debugging information will be stripped (at least on OS X)
+CFLAGS="-g"
+
 # Checks for library functions.
 AC_FUNC_FORK
 
--- a/test/test-automation/runner.c	Wed May 25 09:45:03 2011 -0700
+++ b/test/test-automation/runner.c	Thu May 26 18:38:56 2011 +0300
@@ -25,21 +25,13 @@
 #include <unistd.h>
 #include <sys/types.h>
 
-
-int main(int argc, char *argv[]) {
-
-	// Handle command line arguments
+#include "tests/SDL_test.h"
 
-	// print: Testing againts SDL version fuu (rev: bar)
-
-	int failureCount = 0, passCount = 0;
-
-	const Uint32 startTicks = SDL_GetTicks();
-
+void *LoadLibrary() {
 #if defined(linux) || defined( __linux)
 	char *libName = "tests/libtest.so";
-#else 
-	char *libName = "tests/libtest.0.dylib";
+#else
+	char *libName = "tests/libtest.dylib";
 #endif
 
 	void *library = SDL_LoadObject(libName);
@@ -48,71 +40,100 @@
 		printf("%s\n", SDL_GetError());
 	}
 
-	const char **(*suite)(void);
-	suite = (const char **(*)(void)) SDL_LoadFunction(library, "suite");
+	return library;
+}
+
+char **QueryTestCases(void *library) {
+	char **(*suite)(void);
+
+	suite = (char **(*)(void)) SDL_LoadFunction(library, "queryTestNames");
 	if(suite == NULL) {
-		printf("Retrieving test names failed, suite == NULL\n");
+		printf("Quering test names failed, suite == NULL\n");
 		printf("%s\n", SDL_GetError());
-	} else {
-		const char **tests = suite();
+	}
 
-		char *testname = NULL;
-		int counter = 0;
-		for(; (testname = (char *) tests[counter]); ++counter) {
-			int childpid = fork();
+	char **tests = suite();
+	if(tests == NULL) {
+		printf("Failed to load test cases. tests == NULL\n");
+		printf("%s\n", SDL_GetError());
+	}
+
+	return tests;
+}
 
-			if(childpid == 0) {
-				void (*test)(void *arg);
+int HandleTestReturnValue(int stat_lock) {
+	if(WIFEXITED(stat_lock)) {
+		int returnValue = WEXITSTATUS(stat_lock);
 
-				test = (void (*)(void *)) SDL_LoadFunction(library, testname);
-				if(test == NULL) {
-					printf("Loading test failed, tests == NULL\n");
-					printf("%s\n", SDL_GetError());
-				} else {
-					test(0x0);
-				}
-				return 0; // exit the child if the test didn't exit
-			} else {
-				int stat_lock = -1;
-				int child = wait(&stat_lock);
+		if(returnValue == 0) {
+			return  1;
+		}
+	} else if(WIFSIGNALED(stat_lock)) {
+		int signal = WTERMSIG(stat_lock);
+		printf("FAILURE: test was aborted due to signal nro %d\n", signal);
+		//errorMsg =
+		//errorMsg = SDL_malloc(256 * sizeof(char));
+		//sprintf(errorMsg, "was aborted due to signal nro %d", signal);
+
+	} else if(WIFSTOPPED(stat_lock)) {
+		//int signal = WSTOPSIG(stat_lock);
+		//printf("%d: %d was stopped by signal nro %d\n", pid, child, signal);
+	}
+
+	return 0;
+}
+
 
-				char *errorMsg = NULL;
-				int passed = -1;
-				if(WIFEXITED(stat_lock)) {
-					int returnValue = WEXITSTATUS(stat_lock);
+int main(int argc, char *argv[]) {
+
+	// Handle command line arguments
+
+	// print: Testing againts SDL version fuu (rev: bar)
+
+	int failureCount = 0, passCount = 0;
+	char *testname = NULL;
+	int counter = 0;
 
-					if(returnValue == 0) {
-						passed = 1;
-					} else {
-						passed = 0;
-					}
-				} else if(WIFSIGNALED(stat_lock)) {
-					int signal = WTERMSIG(stat_lock);
-					//printf("%d: %d was killed by signal nro %d\n", pid, child, signal);
-					//errorMsg =
-					errorMsg = SDL_malloc(256 * sizeof(char));
-					sprintf(errorMsg, "was aborted due to signal nro %d", signal);
+	char *libName = "libtest";
+
+	const Uint32 startTicks = SDL_GetTicks();
+
+	void *library = LoadLibrary();
+	char **tests = QueryTestCases(library);
+
+	for(testname = tests[counter]; testname; testname = tests[++counter]) {
+		printf("Running %s (in %s):\n", testname, libName);
 
-					passed = 0;
-				} else if(WIFSTOPPED(stat_lock)) {
-					//int signal = WSTOPSIG(stat_lock);
-					//printf("%d: %d was stopped by signal nro %d\n", pid, child, signal);
-				}
+		int childpid = fork();
+		if(childpid == 0) {
+			void (*test)(void *arg);
 
-				printf("%s (in %s):", testname, libName);
-				if(passed) {
-					passCount++;
-					printf("\tok\n");
-				} else {
-					failureCount++;
-					printf("\tfailed\n");
-					if(errorMsg) {
-						printf("\t%s\n", errorMsg);
-						SDL_free(errorMsg);
-					}
-				}
+			test = (void (*)(void *)) SDL_LoadFunction(library, testname);
+			if(test == NULL) {
+				printf("Loading test failed, tests == NULL\n");
+				printf("%s\n", SDL_GetError());
+			} else {
+				test(0x0);
+			}
+			return 0; // exit the child if the test didn't exit
+		} else {
+			int stat_lock = -1;
+			int child = wait(&stat_lock);
+
+			int passed = -1;
+
+			passed = HandleTestReturnValue(stat_lock);
+
+			if(passed) {
+				passCount++;
+				printf("%s (in %s): ok\n", testname, libName);
+			} else {
+				failureCount++;
+				printf("%s (in %s): failed\n", testname, libName);
 			}
 		}
+
+		printf("\n");
 	}
 	
 	SDL_UnloadObject(library);
--- a/test/test-automation/tests/Makefile.am	Wed May 25 09:45:03 2011 -0700
+++ b/test/test-automation/tests/Makefile.am	Thu May 26 18:38:56 2011 +0300
@@ -1,6 +1,6 @@
 lib_LTLIBRARIES = libtest.la
-libtest_la_SOURCES = test.c asserts.c
-libtest_la_CLAGS = -fPIC
+libtest_la_SOURCES = test.c sdl_test.c
+libtest_la_CLAGS = -fPIC -g
 libtest_la_LDFLAGS = `sdl-config --libs`
 
 distclean-local:
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/test-automation/tests/SDL_test.c	Thu May 26 18:38:56 2011 +0300
@@ -0,0 +1,54 @@
+/*
+  Copyright (C) 2011 Markus Kauppila <markus.kauppila@gmail.com>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef _SDL_TEST_C
+#define _SDL_TEST_C
+
+#include "SDL_test.h"
+
+#include <stdlib.h>
+
+static int _testReturnValue;
+
+void
+TestInit()
+{
+	_testReturnValue = 0;
+}
+
+void
+TestQuit()
+{
+	exit(_testReturnValue);
+}
+
+void
+AssertEquals(char *message, Uint32 expected, Uint32 actual)
+{
+	if(expected != actual) {
+		printf("\n===============================\n");
+		printf("Assert failed: %s\n", message);
+		printf("Expected %d, got %d\n", expected, actual);
+		printf("===============================\n");
+		_testReturnValue = 1;
+	}
+}
+
+#endif
--- /dev/null	Thu Jan 01 00:00:00 1970 +0000
+++ b/test/test-automation/tests/SDL_test.h	Thu May 26 18:38:56 2011 +0300
@@ -0,0 +1,31 @@
+/*
+  Copyright (C) 2011 Markus Kauppila <markus.kauppila@gmail.com>
+
+  This software is provided 'as-is', without any express or implied
+  warranty.  In no event will the authors be held liable for any damages
+  arising from the use of this software.
+
+  Permission is granted to anyone to use this software for any purpose,
+  including commercial applications, and to alter it and redistribute it
+  freely, subject to the following restrictions:
+
+  1. The origin of this software must not be misrepresented; you must not
+     claim that you wrote the original software. If you use this software
+     in a product, an acknowledgment in the product documentation would be
+     appreciated but is not required.
+  2. Altered source versions must be plainly marked as such, and must not be
+     misrepresented as being the original software.
+  3. This notice may not be removed or altered from any source distribution.
+*/
+
+#ifndef _SDL_TEST_H
+#define _SDL_TEST_H
+
+#include <SDL/SDL.h>
+
+void TestInit();
+void TestQuit();
+
+void AssertEquals(char *message, Uint32 expected, Uint32 actual);
+
+#endif
--- a/test/test-automation/tests/asserts.c	Wed May 25 09:45:03 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,39 +0,0 @@
-/*
-  Copyright (C) 2011 Markus Kauppila <markus.kauppila@gmail.com>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-
-#ifndef _ASSERTS_C
-#define _ASSERTS_C
-
-#include "asserts.h"
-
-#include <stdlib.h>
-
-void
-assertEquals(char *message, Uint32 expected, Uint32 actual)
-{
-	if(expected != actual) {
-		printf("===============================\n");
-		printf("Assert failed: %s\n", message);
-		printf("Expected %d, got %d\n", expected, actual);
-		printf("===============================\n");
-	}
-}
-
-#endif
--- a/test/test-automation/tests/asserts.h	Wed May 25 09:45:03 2011 -0700
+++ /dev/null	Thu Jan 01 00:00:00 1970 +0000
@@ -1,28 +0,0 @@
-/*
-  Copyright (C) 2011 Markus Kauppila <markus.kauppila@gmail.com>
-
-  This software is provided 'as-is', without any express or implied
-  warranty.  In no event will the authors be held liable for any damages
-  arising from the use of this software.
-
-  Permission is granted to anyone to use this software for any purpose,
-  including commercial applications, and to alter it and redistribute it
-  freely, subject to the following restrictions:
-
-  1. The origin of this software must not be misrepresented; you must not
-     claim that you wrote the original software. If you use this software
-     in a product, an acknowledgment in the product documentation would be
-     appreciated but is not required.
-  2. Altered source versions must be plainly marked as such, and must not be
-     misrepresented as being the original software.
-  3. This notice may not be removed or altered from any source distribution.
-*/
-
-#ifndef _ASSERTS_H
-#define _ASSERTS_H
-
-#include <SDL/SDL.h>
-
-void assertEquals(char *message, Uint32 expected, Uint32 actual);
-
-#endif
--- a/test/test-automation/tests/test.c	Wed May 25 09:45:03 2011 -0700
+++ b/test/test-automation/tests/test.c	Thu May 26 18:38:56 2011 +0300
@@ -25,30 +25,42 @@
 
 #include <SDL/SDL.h>
 
-#include "asserts.h"
+#include "SDL_test.h"
 
-const char *names[] = {"hello", "hello2", "hello3"};
+char *names[] = {"hello", "hello2", "hello3", NULL};
 
-const char **suite() {
+char **queryTestNames() {
 	return names;
 }
 
 void hello(void *arg){
+	TestInit();
+
 	const char *revision = SDL_GetRevision();
 
 	printf("Revision is %s\n", revision);
-	assertEquals("will fail", 3, 5);
+	AssertEquals("will fail", 3, 5);
+
+	TestQuit();
 }
 
 void hello2(void *arg) {
+	TestInit();
+
+	// why this isn't segfaulting?
 	char *msg = "eello";
 	msg[0] = 'H';
+
+	TestQuit();
 }
 
 void hello3(void *arg) {
-	printf("hello\n");
+	TestInit();
+	printf("hello3\n");
 
-	assertEquals("passes", 3, 3);
+	AssertEquals("passes", 3, 3);
+
+	TestQuit();
 }
 
 #endif