1 /*
2  * Copyright (c) 2003, 2004
3  * Zdenek Nemec
4  *
5  * This material is provided "as is", with absolutely no warranty expressed
6  * or implied. Any use is at your own risk.
7  *
8  * Permission to use or copy this software for any purpose is hereby granted
9  * without fee, provided the above notices are retained on all copies.
10  * Permission to modify the code and to distribute modified code is granted,
11  * provided the above notices are retained, and a notice that the code was
12  * modified is included with the above copyright notice.
13  *
14  */
15 
16 #include "cppunit_proxy.h"
17 #include "file_reporter.h"
18 #include "cppunit_timer.h"
19 
20 #include "stdio.h"
21 
22 #if 0
23 namespace CPPUNIT_NS
24 {
25 #endif
26   int TestCase::m_numErrors = 0;
27   int TestCase::m_numTests = 0;
28 
29   TestCase *TestCase::m_root = 0;
30   Reporter *TestCase::m_reporter = 0;
31 
32   void TestCase::registerTestCase(TestCase *in_testCase) {
33     in_testCase->m_next = m_root;
34     m_root = in_testCase;
35   }
36 
37   int TestCase::run(Reporter *in_reporter, const char *in_testName, bool invert) {
38     TestCase::m_reporter = in_reporter;
39 
40     m_numErrors = 0;
41     m_numTests = 0;
42 
43     TestCase *tmp = m_root;
44     while (tmp != 0) {
45       tmp->myRun(in_testName, invert);
46       tmp = tmp->m_next;
47     }
48     return m_numErrors;
49   }
50 #if 0
51 }
52 #endif
53 
54 static void usage(const char* name)
55 {
56   printf("Usage : %s [-t=<class>[::<test>]] [-x=<class>[::<test>]] [-f=<file>]%s\n",
57          name, Timer::supported() ? " [-m]": "");
58   printf("\t[-t=<class>[::<test>]] : test class or class::test to execute;\n");
59   printf("\t[-x=<class>[::<test>]] : test class or class::test to exclude from execution;\n");
60   printf("\t[-f=<file>] : output file");
61   if (Timer::supported())
62     printf(";\n\t[-m] : monitor test execution, display time duration for each test\n");
63   else
64     printf("\n");
65 }
66 
67 int main(int argc, char** argv) {
68 
69   // CppUnit(mini) test launcher
70   // command line option syntax:
71   // test [OPTIONS]
72   // where OPTIONS are
73   //  -t=CLASS[::TEST]    run the test class CLASS or member test CLASS::TEST
74   //  -x=CLASS[::TEST]    run all except the test class CLASS or member test CLASS::TEST
75   //  -f=FILE             save output in file FILE instead of stdout
76   //  -m                  monitor test(s) execution
77   const char *fileName = 0;
78   const char *testName = "";
79   const char *xtestName = "";
80   bool doMonitoring = false;
81 
82   for (int i = 1; i < argc; ++i) {
83     if (argv[i][0] == '-') {
84       if (!strncmp(argv[i], "-t=", 3)) {
85         testName = argv[i]+3;
86         continue;
87       }
88       else if (!strncmp(argv[i], "-f=", 3)) {
89         fileName = argv[i]+3;
90         continue;
91       }
92       else if (!strncmp(argv[i], "-x=", 3)) {
93         xtestName = argv[i]+3;
94         continue;
95       }
96       else if (Timer::supported() && !strncmp(argv[i], "-m", 2)) {
97         doMonitoring = true;
98         continue;
99       }
100     }
101 
102 		// invalid option, we display normal usage.
103     usage(argv[0]);
104     return 1;
105   }
106 
107   CPPUNIT_NS::Reporter* reporter;
108   if (fileName != 0)
109     reporter = new FileReporter(fileName, doMonitoring);
110   else
111     reporter = new FileReporter(stdout, doMonitoring);
112 
113   int num_errors;
114   if (xtestName[0] != 0) {
115     num_errors = CPPUNIT_NS::TestCase::run(reporter, xtestName, true);
116   } else {
117     num_errors = CPPUNIT_NS::TestCase::run(reporter, testName);
118   }
119 
120   reporter->printSummary();
121   delete reporter;
122 
123   return num_errors;
124 }
125 
126 // See doc/README.intel for explanation about this code
127 #if defined (STLPORT) && defined (__ICL) && (__ICL >= 900) && \
128             (_STLP_MSVC_LIB < 1300) && defined (_STLP_USE_DYNAMIC_LIB)
129 #  include <exception>
130 
131 #  undef std
132 namespace std
133 {
134   void _STLP_CALL unexpected() {
135     unexpected_handler hdl;
136     set_unexpected(hdl = set_unexpected((unexpected_handler)0));
137     hdl();
138   }
139 }
140 #endif
141