wxWidgets/tests/controls/listctrltest.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

157 lines
4.0 KiB
C++

///////////////////////////////////////////////////////////////////////////////
// Name: tests/controls/listctrltest.cpp
// Purpose: wxListCtrl unit test
// Author: Vadim Zeitlin
// Created: 2008-11-26
// Copyright: (c) 2008 Vadim Zeitlin <vadim@wxwidgets.org>
// (c) 2010 Steven Lamerton
///////////////////////////////////////////////////////////////////////////////
// ----------------------------------------------------------------------------
// headers
// ----------------------------------------------------------------------------
#include "testprec.h"
#if wxUSE_LISTCTRL
#ifdef __BORLANDC__
#pragma hdrstop
#endif
#ifndef WX_PRECOMP
#include "wx/app.h"
#endif // WX_PRECOMP
#include "wx/listctrl.h"
#include "listbasetest.h"
#include "testableframe.h"
#include "wx/uiaction.h"
// ----------------------------------------------------------------------------
// test class
// ----------------------------------------------------------------------------
class ListCtrlTestCase : public ListBaseTestCase, public CppUnit::TestCase
{
public:
ListCtrlTestCase() { }
virtual void setUp();
virtual void tearDown();
virtual wxListCtrl *GetList() const { return m_list; }
private:
CPPUNIT_TEST_SUITE( ListCtrlTestCase );
wxLIST_BASE_TESTS();
CPPUNIT_TEST( EditLabel );
WXUISIM_TEST( ColumnClick );
WXUISIM_TEST( ColumnDrag );
CPPUNIT_TEST_SUITE_END();
void EditLabel();
#if wxUSE_UIACTIONSIMULATOR
// Column events are only supported in wxListCtrl currently so we test them
// here rather than in ListBaseTest
void ColumnClick();
void ColumnDrag();
#endif // wxUSE_UIACTIONSIMULATOR
wxListCtrl *m_list;
wxDECLARE_NO_COPY_CLASS(ListCtrlTestCase);
};
// register in the unnamed registry so that these tests are run by default
CPPUNIT_TEST_SUITE_REGISTRATION( ListCtrlTestCase );
// also include in its own registry so that these tests can be run alone
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( ListCtrlTestCase, "ListCtrlTestCase" );
// ----------------------------------------------------------------------------
// test initialization
// ----------------------------------------------------------------------------
void ListCtrlTestCase::setUp()
{
m_list = new wxListCtrl(wxTheApp->GetTopWindow());
m_list->SetWindowStyle(wxLC_REPORT);
m_list->SetSize(400, 200);
}
void ListCtrlTestCase::tearDown()
{
DeleteTestWindow(m_list);
m_list = NULL;
}
void ListCtrlTestCase::EditLabel()
{
m_list->InsertColumn(0, "Column 0");
m_list->InsertItem(0, "foo");
m_list->EditLabel(0);
}
#if wxUSE_UIACTIONSIMULATOR
void ListCtrlTestCase::ColumnDrag()
{
EventCounter begindrag(m_list, wxEVT_LIST_COL_BEGIN_DRAG);
EventCounter dragging(m_list, wxEVT_LIST_COL_DRAGGING);
EventCounter enddrag(m_list, wxEVT_LIST_COL_END_DRAG);
m_list->InsertColumn(0, "Column 0");
m_list->InsertColumn(1, "Column 1");
m_list->InsertColumn(2, "Column 2");
m_list->Update();
m_list->SetFocus();
wxUIActionSimulator sim;
wxPoint pt = m_list->ClientToScreen(wxPoint(m_list->GetColumnWidth(0), 5));
sim.MouseMove(pt);
wxYield();
sim.MouseDown();
wxYield();
sim.MouseMove(pt.x + 50, pt.y);
wxYield();
sim.MouseUp();
wxYield();
CPPUNIT_ASSERT_EQUAL(1, begindrag.GetCount());
CPPUNIT_ASSERT(dragging.GetCount() > 0);
CPPUNIT_ASSERT_EQUAL(1, enddrag.GetCount());
m_list->ClearAll();
}
void ListCtrlTestCase::ColumnClick()
{
EventCounter colclick(m_list, wxEVT_LIST_COL_CLICK);
EventCounter colrclick(m_list, wxEVT_LIST_COL_RIGHT_CLICK);
m_list->InsertColumn(0, "Column 0", wxLIST_FORMAT_LEFT, 60);
wxUIActionSimulator sim;
sim.MouseMove(m_list->ClientToScreen(wxPoint(4, 4)));
wxYield();
sim.MouseClick();
sim.MouseClick(wxMOUSE_BTN_RIGHT);
wxYield();
CPPUNIT_ASSERT_EQUAL(1, colclick.GetCount());
CPPUNIT_ASSERT_EQUAL(1, colrclick.GetCount());
m_list->ClearAll();
}
#endif // wxUSE_UIACTIONSIMULATOR
#endif // wxUSE_LISTCTRL