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