From e77dc839af87a1ad330a55689318e9f98fffbe9e Mon Sep 17 00:00:00 2001 From: Vadim Zeitlin Date: Wed, 3 Jul 2013 00:25:46 +0000 Subject: [PATCH] Use normal event loop in GUI test program. Don't create an event loop manually, let the port-specific code do it and run it as usual in the GUI unit tests. This has several advantages: - No need to manage the event loop manually in the test. - No need for Mac-specific code in the test itself. - Code being tested runs in the same context as in a normal GUI program, which is especially important for event-loop related tests under wxOSX as the main event loop is special there. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74334 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775 --- tests/test.cpp | 83 ++++++++++++++++++++++++++++++++++---------------- 1 file changed, 56 insertions(+), 27 deletions(-) diff --git a/tests/test.cpp b/tests/test.cpp index 9f304346b4..5173474d84 100644 --- a/tests/test.cpp +++ b/tests/test.cpp @@ -296,7 +296,6 @@ public: virtual void OnInitCmdLine(wxCmdLineParser& parser); virtual bool OnCmdLineParsed(wxCmdLineParser& parser); virtual bool OnInit(); - virtual int OnRun(); virtual int OnExit(); // used by events propagation test @@ -306,6 +305,46 @@ public: void SetFilterEventFunc(FilterEventFunc f) { m_filterEventFunc = f; } void SetProcessEventFunc(ProcessEventFunc f) { m_processEventFunc = f; } + // In console applications we run the tests directly from the overridden + // OnRun(), but in the GUI ones we run them when we get the first call to + // our EVT_IDLE handler to ensure that we do everything from inside the + // main event loop. This is especially important under wxOSX/Cocoa where + // the main event loop is different from the others but it's also safer to + // do it like this in the other ports as we test the GUI code in the same + // context as it's used usually, in normal programs, and it might behave + // differently without the event loop. +#if wxUSE_GUI + void OnIdle(wxIdleEvent& event) + { + if ( m_runTests ) + { + m_runTests = false; + +#ifdef __WXOSX__ + // we need to wait until the window is activated and fully ready + // otherwise no events can be posted + wxEventLoopBase* const loop = wxEventLoop::GetActive(); + if ( loop ) + { + loop->DispatchTimeout(1000); + loop->Yield(); + } +#endif // __WXOSX__ + + m_exitcode = RunTests(); + ExitMainLoop(); + } + + event.Skip(); + } +#else // !wxUSE_GUI + virtual int OnRun() + { + m_exitcode = RunTests(); + return m_exitcode; + } +#endif // wxUSE_GUI/!wxUSE_GUI + private: void List(Test *test, const string& parent = "") const; @@ -318,6 +357,11 @@ private: runner.addTest(test); } + int RunTests(); + + // flag telling us whether we should run tests from our EVT_IDLE handler + bool m_runTests; + // command lines options/parameters bool m_list; bool m_longlist; @@ -326,12 +370,12 @@ private: wxArrayString m_registries; wxLocale *m_locale; - // event loop for GUI tests - wxEventLoop* m_eventloop; - // event handling hooks FilterEventFunc m_filterEventFunc; ProcessEventFunc m_processEventFunc; + + // the program exit code + int m_exitcode; }; IMPLEMENT_APP_NO_MAIN(TestApp) @@ -431,7 +475,7 @@ extern bool IsAutomaticTest() return s_isAutomatic == 1; } -// helper of OnRun(): gets the test with the given name, returning NULL (and +// helper of RunTests(): 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) { @@ -460,11 +504,14 @@ TestApp::TestApp() : m_list(false), m_longlist(false) { + m_runTests = true; + m_filterEventFunc = NULL; m_processEventFunc = NULL; m_locale = NULL; - m_eventloop = NULL; + + m_exitcode = EXIT_SUCCESS; } // Init @@ -495,16 +542,7 @@ bool TestApp::OnInit() wxTestableFrame* frame = new wxTestableFrame(); frame->Show(); - m_eventloop = new wxEventLoop; - wxEventLoop::SetActive(m_eventloop); - -#ifdef __WXOSX__ - // we need to wait until the window is activated and fully ready - // otherwise no events can be posted - m_eventloop->DispatchTimeout(1000); - m_eventloop->Yield(); -#endif - + Connect(wxEVT_IDLE, wxIdleEventHandler(TestApp::OnIdle)); #endif // wxUSE_GUI return true; @@ -595,15 +633,8 @@ bool TestApp::ProcessEvent(wxEvent& event) // Run // -int TestApp::OnRun() +int TestApp::RunTests() { -#if wxUSE_GUI -#ifdef __WXOSX__ - // make sure there's always an autorelease pool ready - wxMacAutoreleasePool autoreleasepool; -#endif -#endif - #if wxUSE_LOG // Switch off logging unless --verbose bool verbose = wxLog::GetVerbose(); @@ -683,11 +714,9 @@ int TestApp::OnExit() #if wxUSE_GUI delete GetTopWindow(); - wxEventLoop::SetActive(NULL); - delete m_eventloop; #endif // wxUSE_GUI - return 0; + return m_exitcode; } // List the tests -- 2.45.2