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:
@@ -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;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@@ -78,7 +78,8 @@ void HtmlWindowTestCase::setUp()
|
|||||||
|
|
||||||
void HtmlWindowTestCase::tearDown()
|
void HtmlWindowTestCase::tearDown()
|
||||||
{
|
{
|
||||||
wxDELETE(m_win);
|
DeleteTestWindow(m_win);
|
||||||
|
m_win = NULL;
|
||||||
}
|
}
|
||||||
|
|
||||||
// ----------------------------------------------------------------------------
|
// ----------------------------------------------------------------------------
|
||||||
|
@@ -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
|
||||||
|
@@ -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.
|
||||||
|
Reference in New Issue
Block a user