X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/bb5a951418acd22d69a7f1973319f47190fbac79..968b44d37b9fcdc5232fb68312a65e4fc6b5f4ab:/tests/test.cpp diff --git a/tests/test.cpp b/tests/test.cpp index bdd531d5ed..6619dd21c5 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -87,6 +87,9 @@ struct CrtAssertFailure #if wxDEBUG_LEVEL +// Information about the last not yet handled assertion. +static wxString s_lastAssertMessage; + static wxString FormatAssertMessage(const wxString& file, int line, const wxString& func, @@ -110,27 +113,42 @@ static void TestAssertHandler(const wxString& file, // fail or whether we need to abort (in this case "msg" will contain the // explanation why did we decide to do it). wxString abortReason; + + const wxString + assertMessage = FormatAssertMessage(file, line, func, cond, msg); + if ( !wxIsMainThread() ) { // Exceptions thrown from worker threads are not caught currently and // so we'd just die without any useful information -- abort instead. - abortReason = "in a worker thread"; + abortReason << assertMessage << "in a worker thread."; } else if ( uncaught_exception() ) { // Throwing while already handling an exception would result in // terminate() being called and we wouldn't get any useful information // about why the test failed then. - abortReason = "while handling an exception"; + if ( s_lastAssertMessage.empty() ) + { + abortReason << assertMessage << "while handling an exception"; + } + else // In this case the exception is due to a previous assert. + { + abortReason << s_lastAssertMessage << "\n and another " + << assertMessage << " while handling it."; + } } else // Can "safely" throw from here. { + // Remember this in case another assert happens while handling this + // exception: we want to show the original assert as it's usually more + // useful to determine the real root of the problem. + s_lastAssertMessage = assertMessage; + throw TestAssertFailure(file, line, func, cond, msg); } - wxFprintf(stderr, "%s %s -- aborting.", - FormatAssertMessage(file, line, func, cond, msg), - abortReason); + wxFputs(abortReason, stderr); fflush(stderr); _exit(-1); } @@ -147,10 +165,10 @@ static string GetExceptionMessage() throw; } #if wxDEBUG_LEVEL - catch ( TestAssertFailure& e ) + catch ( TestAssertFailure& ) { - msg << FormatAssertMessage(e.m_file, e.m_line, e.m_func, - e.m_cond, e.m_msg); + msg = s_lastAssertMessage; + s_lastAssertMessage.clear(); } #endif // wxDEBUG_LEVEL #ifdef wxUSE_VC_CRTDBG @@ -213,7 +231,7 @@ public: virtual void startTest(CppUnit::Test *test) { - wxPrintf(" %-60s ", test->getName()); + printf(" %-60s ", test->getName().c_str()); m_result = RESULT_OK; m_watch.Start(); } @@ -226,10 +244,10 @@ public: virtual void endTest(CppUnit::Test * WXUNUSED(test)) { m_watch.Pause(); - wxPrintf(GetResultStr(m_result)); + printf("%s", GetResultStr(m_result)); if (m_timing) - wxPrintf(" %6ld ms", m_watch.Time()); - wxPrintf("\n"); + printf(" %6ld ms", m_watch.Time()); + printf("\n"); } protected : @@ -241,7 +259,7 @@ protected : RESULT_MAX }; - wxString GetResultStr(ResultType type) const + const char* GetResultStr(ResultType type) const { static const char *resultTypeNames[] = { @@ -394,6 +412,23 @@ extern bool IsNetworkAvailable() return online; } +extern bool IsAutomaticTest() +{ + static int s_isAutomatic = -1; + if ( s_isAutomatic == -1 ) + { + // Allow setting an environment variable to emulate buildslave user for + // testing. + wxString username; + if ( !wxGetEnv("WX_TEST_USER", &username) ) + username = wxGetUserId(); + + s_isAutomatic = username.Lower().Matches("buildslave*"); + } + + return s_isAutomatic == 1; +} + // 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) @@ -444,6 +479,13 @@ bool TestApp::OnInit() #endif << "build: " << WX_BUILD_OPTIONS_SIGNATURE << std::endl; + if ( m_detail ) + { + // Output some important information about the test environment. + cout << "Running under " << wxGetOsDescription() << ", " + "locale is " << setlocale(LC_ALL, NULL) << std::endl; + } + #if wxUSE_GUI // create a hidden parent window to be used as parent for the GUI controls wxTestableFrame* frame = new wxTestableFrame();