diff options
-rw-r--r-- | utests/utest.cpp | 26 | ||||
-rw-r--r-- | utests/utest.hpp | 16 | ||||
-rw-r--r-- | utests/utest_run.cpp | 98 |
3 files changed, 116 insertions, 24 deletions
diff --git a/utests/utest.cpp b/utests/utest.cpp index 24045c76..0bd7b1b3 100644 --- a/utests/utest.cpp +++ b/utests/utest.cpp @@ -32,7 +32,7 @@ using namespace std; vector<UTest> *UTest::utestList = NULL; void releaseUTestList(void) { delete UTest::utestList; } -UTest::UTest(Function fn, const char *name) : fn(fn), name(name) { +UTest::UTest(Function fn, const char *name, bool haveIssue) : fn(fn), name(name), haveIssue(haveIssue) { if (utestList == NULL) { utestList = new vector<UTest>; atexit(releaseUTestList); @@ -40,7 +40,7 @@ UTest::UTest(Function fn, const char *name) : fn(fn), name(name) { utestList->push_back(*this); } -UTest::UTest(void) : fn(NULL), name(NULL) {} +UTest::UTest(void) : fn(NULL), name(NULL), haveIssue(false) {} static bool strequal(const char *s1, const char *s2) { if (strcmp(s1, s2) == 0) return true; @@ -52,7 +52,7 @@ void UTest::run(const char *name) { if (utestList == NULL) return; for (size_t i = 0; i < utestList->size(); ++i) { const UTest &utest = (*utestList)[i]; - if (utest.name == NULL || utest.fn == NULL) continue; + if (utest.name == NULL || utest.fn == NULL || utest.haveIssue) continue; if (strequal(utest.name, name)) { std::cout << utest.name << ":" << std::endl; (utest.fn)(); @@ -76,11 +76,25 @@ void UTest::runAll(void) { } } -void UTest::listAll(void) { +void UTest::runAllNoIssue(void) { if (utestList == NULL) return; for (size_t i = 0; i < utestList->size(); ++i) { const UTest &utest = (*utestList)[i]; - if (utest.fn == NULL) continue; - std::cout << utest.name << std::endl; + if (utest.fn == NULL || utest.haveIssue) continue; + std::cout << utest.name << ":" << std::endl; + (utest.fn)(); + std::cout << std::endl; + cl_kernel_destroy(); + cl_buffer_destroy(); } } + +void UTest::listAllCases() +{ + if (utestList == NULL) return; + for (size_t i = 0; i < utestList->size(); ++i) { + const UTest &utest = (*utestList)[i]; + if (utest.fn == NULL) continue; + std::cout << utest.name << std::endl; + } +} diff --git a/utests/utest.hpp b/utests/utest.hpp index 93b3d875..d3a6a6fa 100644 --- a/utests/utest.hpp +++ b/utests/utest.hpp @@ -39,19 +39,23 @@ struct UTest /*! Empty test */ UTest(void); /*! Build a new unit test and append it to the unit test list */ - UTest(Function fn, const char *name); + UTest(Function fn, const char *name, bool haveIssue = false); /*! Function to execute */ Function fn; /*! Name of the test */ const char *name; + /*! Indicate whether current test cases has issue to be fixes */ + bool haveIssue; /*! The tests that are registered */ static std::vector<UTest> *utestList; /*! Run the test with the given name */ static void run(const char *name); + /*! Run all the tests without known issue*/ + static void runAllNoIssue(void); /*! Run all the tests */ static void runAll(void); - /*! List all the tests */ - static void listAll(void); + /*! List all test cases */ + static void listAllCases(void); }; /*! Register a new unit test */ @@ -62,6 +66,12 @@ struct UTest static void __ANON__##FN##__(void) { UTEST_EXPECT_SUCCESS(FN()); } \ static const UTest __##FN##__(__ANON__##FN##__, #FN); +/*! Register a test case which has issue to be fixed */ +#define MAKE_UTEST_FROM_FUNCTION_WITH_ISSUE(FN) \ + static void __ANON__##FN##__(void) { UTEST_EXPECT_SUCCESS(FN()); } \ + static const UTest __##FN##__(__ANON__##FN##__, #FN, true); + + /*! No assert is expected */ #define UTEST_EXPECT_SUCCESS(EXPR) \ do { \ diff --git a/utests/utest_run.cpp b/utests/utest_run.cpp index 86536d74..94fbbee0 100644 --- a/utests/utest_run.cpp +++ b/utests/utest_run.cpp @@ -25,26 +25,94 @@ */ #include "utest_helper.hpp" #include "utest_exception.hpp" -#include <string.h> #include <iostream> +#include <getopt.h> + +static const char *shortopts = "c:lanh"; +struct option longopts[] = { +{"casename", required_argument, NULL, 'c'}, +{"list", no_argument, NULL, 'l'}, +{"all", no_argument, NULL, 'a'}, +{"allnoissue", no_argument, NULL, 'n'}, +{"help", no_argument, NULL, 'h'}, +{0, 0, 0, 0}, +}; + +void usage() +{ + std::cout << "\ +Usage:\n\ + ./utest_run <option>\n\ +\n\ + option:\n\ + -c <casename>: run sub-case named 'casename'\n\ + -l : list all the available case name\n\ + -a : run all test cases\n\ + -n : run all test cases without known issue (default option)\n\ + -h : display this usage\n\ +\ + "<< std::endl; +} int main(int argc, char *argv[]) { - try { - if (argc == 2 && !strcmp(argv[1], "--list")) { - UTest::listAll(); - return 0; - } - cl_ocl_init(); - if (argc >= 2) - for (int i = 1; i < argc; ++i) - UTest::run(argv[i]); - else - UTest::runAll(); - cl_ocl_destroy(); - } catch (Exception e) { - std::cout << " " << e.what() << " [SUCCESS]" << std::endl; + int c = 0; + cl_ocl_init(); + + c = getopt_long (argc, argv, shortopts, longopts, NULL); + + if (argc == 1) + c = 'n'; + if (argc == 2 && c < 1 ){ + c = 'c'; + optarg = argv[1]; } + + { + switch (c) + { + case 'c': + try { + UTest::run(optarg); + } + catch (Exception e){ + std::cout << " " << e.what() << " [SUCCESS]" << std::endl; + } + + break; + + case 'l': + UTest::listAllCases(); + break; + + case 'a': + try { + UTest::runAll(); + } + catch (Exception e){ + std::cout << " " << e.what() << " [SUCCESS]" << std::endl; + } + + break; + + case 'n': + try { + UTest::runAllNoIssue(); + } + catch (Exception e){ + std::cout << " " << e.what() << " [SUCCESS]" << std::endl; + } + + break; + + case 'h': + default: + usage(); + exit(1); + } + } while ((c = getopt_long (argc, argv, shortopts, longopts, NULL)) != -1) + + cl_ocl_destroy(); } |