m_watch.Start();
}
- virtual void addFailure(const CppUnit::TestFailure& failure) {
+ virtual void addFailure(const CppUnit::TestFailure& failure)
+ {
m_result = failure.isError() ? RESULT_ERROR : RESULT_FAIL;
}
}
protected :
- enum ResultType {
+ enum ResultType
+ {
RESULT_OK = 0,
RESULT_FAIL,
- RESULT_ERROR
+ RESULT_ERROR,
+ RESULT_MAX
};
- wxString GetResultStr(ResultType type) const {
- static const wxChar* ResultTypeNames[] = {
- wxT("OK"),
- wxT(" F"),
- wxT("ER")
+ wxString GetResultStr(ResultType type) const
+ {
+ static const char *resultTypeNames[] =
+ {
+ " OK",
+ "FAIL",
+ " ERR"
};
- wxCHECK_MSG(static_cast<size_t>(type) < WXSIZEOF(ResultTypeNames),
- ResultTypeNames[RESULT_ERROR], "invalid entry type");
- return ResultTypeNames[type];
+
+ wxCOMPILE_TIME_ASSERT( WXSIZEOF(resultTypeNames) == RESULT_MAX,
+ ResultTypeNamesMismatch );
+
+ return resultTypeNames[type];
}
bool m_timing;
private:
void List(Test *test, const string& parent = "") const;
+ // call List() if m_list or runner.addTest() otherwise
+ void AddTest(CppUnit::TestRunner& runner, Test *test)
+ {
+ if (m_list)
+ List(test);
+ else
+ runner.addTest(test);
+ }
+
// command lines options/parameters
bool m_list;
bool m_longlist;
bool m_detail;
bool m_timing;
wxArrayString m_registries;
+ wxLocale *m_locale;
// event handling hooks
FilterEventFunc m_filterEventFunc;
{
m_filterEventFunc = NULL;
m_processEventFunc = NULL;
+
+ m_locale = NULL;
}
// Init
{ wxCMD_LINE_SWITCH, "t", "timing",
"print names and mesure running time of individual test, run them",
wxCMD_LINE_VAL_NONE, 0 },
+ { wxCMD_LINE_OPTION, "", "locale",
+ "locale to use when running the program",
+ wxCMD_LINE_VAL_STRING, 0 },
{ wxCMD_LINE_PARAM, NULL, NULL, "REGISTRY", wxCMD_LINE_VAL_STRING,
wxCMD_LINE_PARAM_OPTIONAL | wxCMD_LINE_PARAM_MULTIPLE },
wxCMD_LINE_DESC_END
bool TestApp::OnCmdLineParsed(wxCmdLineParser& parser)
{
if (parser.GetParamCount())
+ {
for (size_t i = 0; i < parser.GetParamCount(); i++)
m_registries.push_back(parser.GetParam(i));
- else
- m_registries.push_back("");
+ }
- m_longlist = parser.Found(_T("longlist"));
- m_list = m_longlist || parser.Found(_T("list"));
- m_timing = parser.Found(_T("timing"));
- m_detail = !m_timing && parser.Found(_T("detail"));
+ m_longlist = parser.Found("longlist");
+ m_list = m_longlist || parser.Found("list");
+ m_timing = parser.Found("timing");
+ m_detail = !m_timing && parser.Found("detail");
+
+ wxString loc;
+ if ( parser.Found("locale", &loc) )
+ {
+ const wxLanguageInfo * const info = wxLocale::FindLanguageInfo(loc);
+ if ( !info )
+ {
+ cerr << "Locale \"" << string(loc.mb_str()) << "\" is unknown.\n";
+ return false;
+ }
+
+ m_locale = new wxLocale(info->Language);
+ if ( !m_locale->IsOk() )
+ {
+ cerr << "Using locale \"" << string(loc.mb_str()) << "\" failed.\n";
+ return false;
+ }
+ }
return TestAppBase::OnCmdLineParsed(parser);
}
wxGetApp().SetProcessEventFunc(func);
}
+// helper of OnRun(): gets the test with the given name, returning NULL (and
+// not an empty test suite) if there is no such test
+static Test *GetTestByName(const wxString& name)
+{
+ Test *
+ test = TestFactoryRegistry::getRegistry(string(name.mb_str())).makeTest();
+ if ( test )
+ {
+ TestSuite * const suite = dynamic_cast<TestSuite *>(test);
+ if ( !suite || !suite->countTestCases() )
+ {
+ // it's a bogus test, don't use it
+ delete test;
+ test = NULL;
+ }
+ }
+
+ return test;
+}
+
// Run
//
int TestApp::OnRun()
{
+#if wxUSE_LOG
+ // Switch off logging unless --verbose
+ bool verbose = wxLog::GetVerbose();
+ wxLog::EnableLogging(verbose);
+#else
+ bool verbose = false;
+#endif
+
CppUnit::TextTestRunner runner;
- for (size_t i = 0; i < m_registries.size(); i++)
+ if ( m_registries.empty() )
{
- wxString reg = m_registries[i];
- if (!reg.empty() && !reg.EndsWith("TestCase"))
- reg += "TestCase";
- // allow the user to specify the name of the testcase "in short form"
- // (all wx test cases end with TestCase postfix)
-
- auto_ptr<Test> test(reg.empty() ?
- TestFactoryRegistry::getRegistry().makeTest() :
- TestFactoryRegistry::getRegistry(string(reg.mb_str())).makeTest());
-
- TestSuite *suite = dynamic_cast<TestSuite*>(test.get());
-
- if (suite && suite->countTestCases() == 0)
- wxLogError(_T("No such test suite: %s"), reg);
- else if (m_list)
- List(test.get());
- else
- runner.addTest(test.release());
+ // run or list all tests
+ AddTest(runner, TestFactoryRegistry::getRegistry().makeTest());
+ }
+ else // run only the selected tests
+ {
+ for (size_t i = 0; i < m_registries.size(); i++)
+ {
+ const wxString reg = m_registries[i];
+ Test *test = GetTestByName(reg);
+
+ if ( !test && !reg.EndsWith("TestCase") )
+ {
+ test = GetTestByName(reg + "TestCase");
+ }
+
+ if ( !test )
+ {
+ cerr << "No such test suite: " << string(reg.mb_str()) << endl;
+ return 2;
+ }
+
+ AddTest(runner, test);
+ }
}
if ( m_list )
runner.setOutputter(new CppUnit::CompilerOutputter(&runner.result(), cout));
-#if wxUSE_LOG
- // Switch off logging unless --verbose
- bool verbose = wxLog::GetVerbose();
- wxLog::EnableLogging(verbose);
-#else
- bool verbose = false;
-#endif
-
// there is a bug
// (http://sf.net/tracker/index.php?func=detail&aid=1649369&group_id=11795&atid=111795)
// in some versions of cppunit: they write progress dots to cout (and not
int TestApp::OnExit()
{
+ delete m_locale;
+
#if wxUSE_GUI
delete GetTopWindow();
#endif // wxUSE_GUI