wxWidgets/tests/html/htmlwindow.cpp
Vadim Zeitlin 8686ca62e7 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.
2016-06-29 18:26:11 +02:00

169 lines
4.1 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/html/htmlwindow.cpp
// Purpose: wxHtmlWindow tests
// Author: Vaclav Slavik
// Created: 2008-10-15
// Copyright: (c) 2008 Vaclav Slavik <vslavik@fastmail.fm>
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#if wxUSE_HTML
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/app.h"
#endif // WX_PRECOMP
#include "wx/html/htmlwin.h"
#include "wx/uiaction.h"
#include "testableframe.h"
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class HtmlWindowTestCase : public CppUnit::TestCase
{
public:
HtmlWindowTestCase() { }
virtual void setUp();
virtual void tearDown();
private:
CPPUNIT_TEST_SUITE( HtmlWindowTestCase );
CPPUNIT_TEST( SelectionToText );
CPPUNIT_TEST( Title );
#if wxUSE_UIACTIONSIMULATOR
WXUISIM_TEST( CellClick );
WXUISIM_TEST( LinkClick );
#endif // wxUSE_UIACTIONSIMULATOR
CPPUNIT_TEST( AppendToPage );
CPPUNIT_TEST_SUITE_END();
void SelectionToText();
void Title();
void CellClick();
void LinkClick();
void AppendToPage();
wxHtmlWindow *m_win;
wxDECLARE_NO_COPY_CLASS(HtmlWindowTestCase);
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( HtmlWindowTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( HtmlWindowTestCase, "HtmlWindowTestCase" );
// ----------------------------------------------------------------------------
// test initialization
// ----------------------------------------------------------------------------
void HtmlWindowTestCase::setUp()
{
m_win = new wxHtmlWindow(wxTheApp->GetTopWindow(), wxID_ANY,
wxDefaultPosition, wxSize(400, 200));
}
void HtmlWindowTestCase::tearDown()
{
DeleteTestWindow(m_win);
m_win = NULL;
}
// ----------------------------------------------------------------------------
// tests themselves
// ----------------------------------------------------------------------------
static const char *TEST_MARKUP =
"<html><body>"
"<title>Page</title>"
" Title<p>"
" A longer line<br>"
" and the last line."
"</body></html>";
static const char *TEST_MARKUP_LINK =
"<html><body>"
"<a href=\"link\">link<\\a> "
"</body></html>";
static const char *TEST_PLAIN_TEXT =
"Title\nA longer line\nand the last line.";
void HtmlWindowTestCase::SelectionToText()
{
m_win->SetPage(TEST_MARKUP);
m_win->SelectAll();
CPPUNIT_ASSERT_EQUAL( TEST_PLAIN_TEXT, m_win->SelectionToText() );
}
void HtmlWindowTestCase::Title()
{
m_win->SetPage(TEST_MARKUP);
CPPUNIT_ASSERT_EQUAL("Page", m_win->GetOpenedPageTitle());
}
#if wxUSE_UIACTIONSIMULATOR
void HtmlWindowTestCase::CellClick()
{
EventCounter clicked(m_win, wxEVT_HTML_CELL_CLICKED);
wxUIActionSimulator sim;
m_win->SetPage(TEST_MARKUP);
m_win->Update();
m_win->Refresh();
sim.MouseMove(m_win->ClientToScreen(wxPoint(15, 15)));
wxYield();
sim.MouseClick();
wxYield();
CPPUNIT_ASSERT_EQUAL(1, clicked.GetCount());
}
void HtmlWindowTestCase::LinkClick()
{
EventCounter clicked(m_win, wxEVT_HTML_LINK_CLICKED);
wxUIActionSimulator sim;
m_win->SetPage(TEST_MARKUP_LINK);
m_win->Update();
m_win->Refresh();
sim.MouseMove(m_win->ClientToScreen(wxPoint(15, 15)));
wxYield();
sim.MouseClick();
wxYield();
CPPUNIT_ASSERT_EQUAL(1, clicked.GetCount());
}
#endif // wxUSE_UIACTIONSIMULATOR
void HtmlWindowTestCase::AppendToPage()
{
m_win->SetPage(TEST_MARKUP_LINK);
m_win->AppendToPage("A new paragraph");
CPPUNIT_ASSERT_EQUAL("link A new paragraph", m_win->ToText());
}
#endif //wxUSE_HTML