X-Git-Url: https://git.saurik.com/wxWidgets.git/blobdiff_plain/20ba398d1a99deaac8b75778daae521aa7bd8ce7..603cfe42185349e119ba4c69bd56a79998babcc4:/tests/test.cpp?ds=inline diff --git a/tests/test.cpp b/tests/test.cpp index 5e05c09423..983bc4f3ce 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -4,7 +4,7 @@ // Author: Mike Wetherell // RCS-ID: $Id$ // Copyright: (c) 2004 Mike Wetherell -// Licence: wxWidgets licence +// Licence: wxWindows licence /////////////////////////////////////////////////////////////////////////////// // ---------------------------------------------------------------------------- @@ -34,6 +34,7 @@ #include #include #include +#include #ifdef __VISUALC__ #pragma warning(default:4100) @@ -41,6 +42,7 @@ #include "wx/afterstd.h" #include "wx/cmdline.h" +#include #include #ifdef __WXMSW__ @@ -51,7 +53,12 @@ #include "wx/osx/private.h" #endif +#if wxUSE_GUI + #include "testableframe.h" +#endif + #include "wx/socket.h" +#include "wx/evtloop.h" using namespace std; @@ -99,16 +106,33 @@ static void TestAssertHandler(const wxString& file, const wxString& cond, const wxString& msg) { - // can't throw from other threads, die immediately + // Determine whether we can safely throw an exception to just make the test + // fail or whether we need to abort (in this case "msg" will contain the + // explanation why did we decide to do it). + wxString abortReason; if ( !wxIsMainThread() ) { - wxPrintf("%s in a worker thread -- aborting.", - FormatAssertMessage(file, line, func, cond, msg)); - fflush(stdout); - _exit(-1); + // 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"; + } + 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"; + } + else // Can "safely" throw from here. + { + throw TestAssertFailure(file, line, func, cond, msg); } - throw TestAssertFailure(file, line, func, cond, msg); + wxFprintf(stderr, "%s %s -- aborting.", + FormatAssertMessage(file, line, func, cond, msg), + abortReason); + fflush(stderr); + _exit(-1); } #endif // wxDEBUG_LEVEL @@ -204,7 +228,7 @@ public: m_watch.Pause(); wxPrintf(GetResultStr(m_result)); if (m_timing) - wxPrintf(" %6d ms", m_watch.Time()); + wxPrintf(" %6ld ms", m_watch.Time()); wxPrintf("\n"); } @@ -284,6 +308,9 @@ private: wxArrayString m_registries; wxLocale *m_locale; + // event loop for GUI tests + wxEventLoop* m_eventloop; + // event handling hooks FilterEventFunc m_filterEventFunc; ProcessEventFunc m_processEventFunc; @@ -400,6 +427,7 @@ TestApp::TestApp() m_processEventFunc = NULL; m_locale = NULL; + m_eventloop = NULL; } // Init @@ -418,7 +446,11 @@ bool TestApp::OnInit() #if wxUSE_GUI // create a hidden parent window to be used as parent for the GUI controls - new wxFrame(NULL, wxID_ANY, "Hidden wx test frame"); + wxTestableFrame* frame = new wxTestableFrame(); + frame->Show(); + + m_eventloop = new wxEventLoop; + wxEventLoop::SetActive(m_eventloop); #endif // wxUSE_GUI return true; @@ -586,7 +618,9 @@ int TestApp::OnRun() runner.eventManager().pushProtector(new wxUnitTestProtector); bool printProgress = !(verbose || m_detail || m_timing); - return runner.run("", false, true, printProgress) ? EXIT_SUCCESS : EXIT_FAILURE; + runner.run("", false, true, printProgress); + + return runner.result().testFailures() == 0 ? EXIT_SUCCESS : EXIT_FAILURE; } int TestApp::OnExit() @@ -595,6 +629,8 @@ int TestApp::OnExit() #if wxUSE_GUI delete GetTopWindow(); + wxEventLoop::SetActive(NULL); + delete m_eventloop; #endif // wxUSE_GUI return 0;