diff options
author | Bill Hoffman <bill.hoffman@kitware.com> | 2004-04-28 16:31:18 (GMT) |
---|---|---|
committer | Bill Hoffman <bill.hoffman@kitware.com> | 2004-04-28 16:31:18 (GMT) |
commit | e539cf9f7c39b2c25b5566925e0c43a39f2ee868 (patch) | |
tree | 94903e4002cfa3d55d7d3efd62f72739692e96d9 /Templates/TestDriver.cxx.in | |
parent | df31c576dcfdbb7b7b9e2ba26498bae5af9f4e93 (diff) | |
download | CMake-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.in | 180 |
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; +} |