b736d59eb5
After the changes of r53758 wxMSW didn't generate any wxEVT_TEXT events but this was still the case for the generic version (and hence for wxSpinCtrlDouble under MSW too) and wasn't documented. Fix all versions to avoid sending events for programmatic actions, add unit tests checking this behaviour and document it. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@74631 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
226 lines
5.8 KiB
C++
226 lines
5.8 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: tests/controls/spinctrltest.cpp
|
|
// Purpose: wxSpinCtrl unit test
|
|
// Author: Steven Lamerton
|
|
// Created: 2010-07-21
|
|
// Copyright: (c) 2010 Steven Lamerton
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "testprec.h"
|
|
|
|
#if wxUSE_SPINCTRL
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#endif // WX_PRECOMP
|
|
|
|
#include "testableframe.h"
|
|
#include "wx/uiaction.h"
|
|
#include "wx/spinctrl.h"
|
|
|
|
class SpinCtrlTestCase : public CppUnit::TestCase
|
|
{
|
|
public:
|
|
SpinCtrlTestCase() { }
|
|
|
|
void setUp();
|
|
void tearDown();
|
|
|
|
private:
|
|
CPPUNIT_TEST_SUITE( SpinCtrlTestCase );
|
|
CPPUNIT_TEST( Initial );
|
|
CPPUNIT_TEST( NoEventsInCtor );
|
|
WXUISIM_TEST( Arrows );
|
|
WXUISIM_TEST( Wrap );
|
|
CPPUNIT_TEST( Range );
|
|
CPPUNIT_TEST( Value );
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
void Initial();
|
|
void NoEventsInCtor();
|
|
void Arrows();
|
|
void Wrap();
|
|
void Range();
|
|
void Value();
|
|
|
|
wxSpinCtrl* m_spin;
|
|
|
|
DECLARE_NO_COPY_CLASS(SpinCtrlTestCase)
|
|
};
|
|
|
|
// register in the unnamed registry so that these tests are run by default
|
|
CPPUNIT_TEST_SUITE_REGISTRATION( SpinCtrlTestCase );
|
|
|
|
// also include in its own registry so that these tests can be run alone
|
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( SpinCtrlTestCase, "SpinCtrlTestCase" );
|
|
|
|
void SpinCtrlTestCase::setUp()
|
|
{
|
|
m_spin = new wxSpinCtrl(wxTheApp->GetTopWindow());
|
|
}
|
|
|
|
void SpinCtrlTestCase::tearDown()
|
|
{
|
|
wxDELETE(m_spin);
|
|
}
|
|
|
|
void SpinCtrlTestCase::Initial()
|
|
{
|
|
// Initial value is defined by "initial" argument which is 0 by default.
|
|
CPPUNIT_ASSERT_EQUAL( 0, m_spin->GetValue() );
|
|
|
|
wxWindow* const parent = m_spin->GetParent();
|
|
|
|
// Recreate the control with another "initial" to check this.
|
|
delete m_spin;
|
|
m_spin = new wxSpinCtrl(parent, wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize, 0,
|
|
0, 100, 17);
|
|
CPPUNIT_ASSERT_EQUAL( 17, m_spin->GetValue() );
|
|
|
|
// Recreate the control with another "initial" outside of standard spin
|
|
// ctrl range.
|
|
delete m_spin;
|
|
m_spin = new wxSpinCtrl(parent, wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize, 0,
|
|
0, 200, 150);
|
|
CPPUNIT_ASSERT_EQUAL( 150, m_spin->GetValue() );
|
|
|
|
// But if the text string is specified, it takes precedence.
|
|
delete m_spin;
|
|
m_spin = new wxSpinCtrl(parent, wxID_ANY, "99",
|
|
wxDefaultPosition, wxDefaultSize, 0,
|
|
0, 100, 17);
|
|
CPPUNIT_ASSERT_EQUAL( 99, m_spin->GetValue() );
|
|
}
|
|
|
|
void SpinCtrlTestCase::NoEventsInCtor()
|
|
{
|
|
// Verify that creating the control does not generate any events. This is
|
|
// unexpected and shouldn't happen.
|
|
wxWindow* const parent = m_spin->GetParent();
|
|
delete m_spin;
|
|
m_spin = new wxSpinCtrl;
|
|
|
|
EventCounter updatedSpin(m_spin, wxEVT_SPINCTRL);
|
|
EventCounter updatedText(m_spin, wxEVT_TEXT);
|
|
|
|
m_spin->Create(parent, wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize, 0,
|
|
0, 100, 17);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedSpin.GetCount());
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedText.GetCount());
|
|
}
|
|
|
|
void SpinCtrlTestCase::Arrows()
|
|
{
|
|
#if wxUSE_UIACTIONSIMULATOR
|
|
EventCounter updated(m_spin, wxEVT_SPINCTRL);
|
|
|
|
wxUIActionSimulator sim;
|
|
|
|
m_spin->SetFocus();
|
|
|
|
sim.Char(WXK_UP);
|
|
|
|
wxYield();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, updated.GetCount());
|
|
CPPUNIT_ASSERT_EQUAL(1, m_spin->GetValue());
|
|
updated.Clear();
|
|
|
|
sim.Char(WXK_DOWN);
|
|
|
|
wxYield();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(1, updated.GetCount());
|
|
CPPUNIT_ASSERT_EQUAL(0, m_spin->GetValue());
|
|
#endif
|
|
}
|
|
|
|
void SpinCtrlTestCase::Wrap()
|
|
{
|
|
#if wxUSE_UIACTIONSIMULATOR
|
|
wxDELETE(m_spin);
|
|
m_spin = new wxSpinCtrl(wxTheApp->GetTopWindow(), wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize,
|
|
wxSP_ARROW_KEYS | wxSP_WRAP);
|
|
|
|
wxUIActionSimulator sim;
|
|
|
|
m_spin->SetFocus();
|
|
|
|
sim.Char(WXK_DOWN);
|
|
|
|
wxYield();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(100, m_spin->GetValue());
|
|
|
|
sim.Char(WXK_UP);
|
|
|
|
wxYield();
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, m_spin->GetValue());
|
|
#endif
|
|
}
|
|
|
|
void SpinCtrlTestCase::Range()
|
|
{
|
|
CPPUNIT_ASSERT_EQUAL(0, m_spin->GetMin());
|
|
CPPUNIT_ASSERT_EQUAL(100, m_spin->GetMax());
|
|
|
|
// Test that the value is adjusted to be inside the new valid range but
|
|
// that this doesn't result in any events (as this is not something done by
|
|
// the user).
|
|
{
|
|
EventCounter updatedSpin(m_spin, wxEVT_SPINCTRL);
|
|
EventCounter updatedText(m_spin, wxEVT_TEXT);
|
|
|
|
m_spin->SetRange(1, 10);
|
|
CPPUNIT_ASSERT_EQUAL(1, m_spin->GetValue());
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedSpin.GetCount());
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedText.GetCount());
|
|
}
|
|
|
|
//Test negative ranges
|
|
m_spin->SetRange(-10, 10);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(-10, m_spin->GetMin());
|
|
CPPUNIT_ASSERT_EQUAL(10, m_spin->GetMax());
|
|
|
|
//Test backwards ranges
|
|
m_spin->SetRange(75, 50);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(75, m_spin->GetMin());
|
|
CPPUNIT_ASSERT_EQUAL(50, m_spin->GetMax());
|
|
}
|
|
|
|
void SpinCtrlTestCase::Value()
|
|
{
|
|
EventCounter updatedSpin(m_spin, wxEVT_SPINCTRL);
|
|
EventCounter updatedText(m_spin, wxEVT_TEXT);
|
|
|
|
CPPUNIT_ASSERT_EQUAL(0, m_spin->GetValue());
|
|
|
|
m_spin->SetValue(50);
|
|
CPPUNIT_ASSERT_EQUAL(50, m_spin->GetValue());
|
|
|
|
m_spin->SetValue(-10);
|
|
CPPUNIT_ASSERT_EQUAL(0, m_spin->GetValue());
|
|
|
|
m_spin->SetValue(110);
|
|
CPPUNIT_ASSERT_EQUAL(100, m_spin->GetValue());
|
|
|
|
// Calling SetValue() shouldn't have generated any events.
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedSpin.GetCount());
|
|
CPPUNIT_ASSERT_EQUAL(0, updatedText.GetCount());
|
|
}
|
|
|
|
#endif
|