summaryrefslogtreecommitdiffstats
path: root/Templates/TestDriver.cxx.in
diff options
context:
space:
mode:
authorBill Hoffman <bill.hoffman@kitware.com>2004-04-28 16:31:18 (GMT)
committerBill Hoffman <bill.hoffman@kitware.com>2004-04-28 16:31:18 (GMT)
commite539cf9f7c39b2c25b5566925e0c43a39f2ee868 (patch)
tree94903e4002cfa3d55d7d3efd62f72739692e96d9 /Templates/TestDriver.cxx.in
parentdf31c576dcfdbb7b7b9e2ba26498bae5af9f4e93 (diff)
downloadCMake-e539cf9f7c39b2c25b5566925e0c43a39f2ee868.zip
CMake-e539cf9f7c39b2c25b5566925e0c43a39f2ee868.tar.gz
CMake-e539cf9f7c39b2c25b5566925e0c43a39f2ee868.tar.bz2
ENH: make test driver more flexible by using a configured file instead of generating all the code. fixes bug 28
Diffstat (limited to 'Templates/TestDriver.cxx.in')
-rw-r--r--Templates/TestDriver.cxx.in180
1 files changed, 180 insertions, 0 deletions
diff --git a/Templates/TestDriver.cxx.in b/Templates/TestDriver.cxx.in
new file mode 100644
index 0000000..6a3839f
--- /dev/null
+++ b/Templates/TestDriver.cxx.in
@@ -0,0 +1,180 @@
+#include <ctype.h>
+#include <stdio.h>
+#include <string.h>
+#include <stdlib.h>
+
+#if defined(_MSC_VER) && defined(_DEBUG)
+/* MSVC debug hook to prevent dialogs when running from DART. */
+# include <crtdbg.h>
+static int TestDriverDebugReport(int type, char* message, int* retVal)
+{
+ (void)type; (void)retVal;
+ fprintf(stderr, message);
+ exit(1);
+ return 0;
+}
+#endif
+
+#if defined(_WIN32) && !defined(__CYGWIN__)
+# include <windows.h>
+static LONG __stdcall
+TestDriverUnhandledExceptionFilter(EXCEPTION_POINTERS* e)
+{
+ ExitProcess(e->ExceptionRecord->ExceptionCode);
+ return 0;
+}
+static void TestDriverEnableWindowsExceptionFilter()
+{
+ if(getenv("DART_TEST_FROM_DART"))
+ {
+ SetUnhandledExceptionFilter(&TestDriverUnhandledExceptionFilter);
+ }
+}
+#else
+static void TestDriverEnableWindowsExceptionFilter()
+{
+}
+#endif
+@CMAKE_TESTDRIVER_EXTRA_INCLUDES@
+
+
+/* Forward declare test functions. */
+@CMAKE_FORWARD_DECLARE_TESTS@
+
+/* Create map. */
+
+typedef int (*MainFuncPointer)(int , char*[]);
+typedef struct
+{
+ const char* name;
+ MainFuncPointer func;
+} functionMapEntry;
+
+functionMapEntry cmakeGeneratedFunctionMapEntries[] = {
+ @CMAKE_FUNCTION_TABLE_ENTIRES@
+ {0,0}
+};
+
+/* Allocate and create a lowercased copy of string
+ (note that it has to be free'd manually) */
+
+char* lowercase(const char *string)
+{
+ char *new_string, *p;
+ new_string = (char *)malloc(sizeof(char) * (size_t)(strlen(string) + 1));
+ if (!new_string)
+ {
+ return 0;
+ }
+ strcpy(new_string, string);
+ p = new_string;
+ while (*p != 0)
+ {
+ *p = (char)tolower(*p);
+ ++p;
+ }
+ return new_string;
+}
+
+int main(int ac, char *av[])
+{
+ int i, NumTests, testNum, partial_match;
+ char *arg, *test_name;
+ int count;
+ int result;
+ int testToRun = -1;
+
+ @CMAKE_TESTDRIVER_ARGVC_FUNCTION@
+
+#if defined(_MSC_VER) && defined(_DEBUG)
+ /* If running from DART, put in debug hook. */
+ if(getenv("DART_TEST_FROM_DART"))
+ {
+ _CrtSetReportHook(TestDriverDebugReport);
+ }
+#endif
+ TestDriverEnableWindowsExceptionFilter();
+ for(count =0; cmakeGeneratedFunctionMapEntries[count].name != 0; count++)
+ {
+ }
+ NumTests = count;
+ /* If no test name was given */
+ /* process command line with user function. */
+ @CMAKE_TESTDRIVER_ARGVC_FUNCTION@
+ if (ac < 2)
+ {
+ /* Ask for a test. */
+ printf("Available tests:\n");
+ for (i =0; i < NumTests; ++i)
+ {
+ printf("%3d. %s\n", i, cmakeGeneratedFunctionMapEntries[i].name);
+ }
+ printf("To run a test, enter the test number: ");
+ testNum = 0;
+ scanf("%d", &testNum);
+ if (testNum >= NumTests)
+ {
+ printf("%3d is an invalid test number.\n", testNum);
+ return -1;
+ }
+ testToRun = testNum;
+ ac--;
+ av++;
+ }
+ partial_match = 0;
+ arg = 0;
+ /* If partial match is requested. */
+ if(testToRun == -1 && ac > 1)
+ {
+ partial_match = (strcmp(av[1], "-R") == 0) ? 1 : 0;
+ }
+ if (partial_match && ac < 3)
+ {
+ printf("-R needs an additional parameter.\n");
+ return -1;
+ }
+ if(testToRun == -1)
+ {
+ arg = lowercase(av[1 + partial_match]);
+ }
+ for (i =0; i < NumTests && testToRun == -1; ++i)
+ {
+ test_name = lowercase(cmakeGeneratedFunctionMapEntries[i].name);
+ if (partial_match && strstr(test_name, arg) != NULL)
+ {
+ testToRun = i;
+ ac -=2;
+ av += 2;
+ }
+ else if (!partial_match && strcmp(test_name, arg) == 0)
+ {
+ testToRun = i;
+ ac--;
+ av++;
+ }
+ free(test_name);
+ }
+ if(arg)
+ {
+ free(arg);
+ }
+ if(testToRun != -1)
+ {
+ int result;
+@CMAKE_TESTDRIVER_BEFORE_TESTMAIN@
+ result = (*cmakeGeneratedFunctionMapEntries[testToRun].func)(ac, av);
+@CMAKE_TESTDRIVER_AFTER_TESTMAIN@
+ return result;
+ }
+
+
+ /* Nothing was run, display the test names. */
+ printf("Available tests:\n");
+ for (i =0; i < NumTests; ++i)
+ {
+ printf("%3d. %s\n", i, cmakeGeneratedFunctionMapEntries[i].name);
+ }
+ printf("Failed: %s is an invalid test name.\n", av[1]);
+
+ return -1;
+}