Avoid asserts when destroying windows with mouse capture in tests

Destroying a window with mouse capture results in an assert, which is
translated into an exception when running the test suite. As this exception is
thrown from wxWindowBase dtor, it results in an immediate program termination
when using C++11 and can also have the same effect even when using C++98 if
this exception is thrown while already handling another exception due to a
test failure.

Try to avoid this by using a "safe" DeleteTestWindow() function instead of
deleting the window directly. Currently this function ensures that the window
doesn't have mouse capture before deleting it, but it could also be used to
check for other things later. Also, this commit only uses this function for
the two controls which do happen to be destroyed with mouse capture currently
(at least when using wxGTK), but it should probably be generalized to all
controls in the future.
This commit is contained in:
Vadim Zeitlin
2016-06-29 18:22:05 +02:00
parent dae164b8aa
commit 8686ca62e7
4 changed files with 30 additions and 2 deletions

View File

@@ -82,7 +82,7 @@ void ListCtrlTestCase::setUp()
void ListCtrlTestCase::tearDown() void ListCtrlTestCase::tearDown()
{ {
delete m_list; DeleteTestWindow(m_list);
m_list = NULL; m_list = NULL;
} }

View File

@@ -78,7 +78,8 @@ void HtmlWindowTestCase::setUp()
void HtmlWindowTestCase::tearDown() void HtmlWindowTestCase::tearDown()
{ {
wxDELETE(m_win); DeleteTestWindow(m_win);
m_win = NULL;
} }
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------

View File

@@ -513,6 +513,25 @@ static Test *GetTestByName(const wxString& name)
return test; return test;
} }
#if wxUSE_GUI
void DeleteTestWindow(wxWindow* win)
{
if ( !win )
return;
wxWindow* const capture = wxWindow::GetCapture();
if ( capture )
{
if ( capture == win ||
capture->GetMainWindowOfCompositeControl() == win )
capture->ReleaseMouse();
}
delete win;
}
#endif // wxUSE_GUI
// ---------------------------------------------------------------------------- // ----------------------------------------------------------------------------
// TestApp // TestApp

View File

@@ -165,6 +165,14 @@ private:
wxDECLARE_NO_COPY_CLASS(CLocaleSetter); wxDECLARE_NO_COPY_CLASS(CLocaleSetter);
}; };
#if wxUSE_GUI
// Helper function deleting the window without asserts (and hence exceptions
// thrown from its dtor!) even if it has mouse capture.
void DeleteTestWindow(wxWindow* win);
#endif // wxUSE_GUI
// Macro that can be used to register the test with the given name in both the // Macro that can be used to register the test with the given name in both the
// global unnamed registry so that it is ran by default and a registry with the // global unnamed registry so that it is ran by default and a registry with the
// same name as this test to allow running just this test individually. // same name as this test to allow running just this test individually.