This is consistent with using the value of the increment specified in
the ctor for setting the initial number of digits, it was surprising
that creating the control with some value of the increment (e.g. 0.1)
and calling SetIncrement(0.1) later resulted in very different outcomes,
as in the former case the value was shown with a digit after the period
while in the latter case only the integer part was shown.
This also makes the behaviour compatible with that of the previous
versions of the generic wxSpinCtrlDouble, which used "%g" to format the
number before the changes of edc553870f
(Fix displaying wxSpinCtrlDouble
values with default precision, 2020-05-18), as they did show the
fractional part even in the latter case.
Add a test checking that this works as expected: before this commit, the
test failed with "1 == 1.2" and "1 == 1.23" errors.
278 lines
7.2 KiB
C++
278 lines
7.2 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: tests/controls/spinctrldbltest.cpp
|
|
// Purpose: wxSpinCtrlDouble unit test
|
|
// Author: Steven Lamerton
|
|
// Created: 2010-07-22
|
|
// Copyright: (c) 2010 Steven Lamerton
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
#include "testprec.h"
|
|
|
|
#if wxUSE_SPINCTRL
|
|
|
|
|
|
#ifndef WX_PRECOMP
|
|
#include "wx/app.h"
|
|
#endif // WX_PRECOMP
|
|
|
|
#include "testableframe.h"
|
|
#include "wx/uiaction.h"
|
|
#include "wx/scopedptr.h"
|
|
#include "wx/spinctrl.h"
|
|
|
|
class SpinCtrlDoubleTestCase
|
|
{
|
|
public:
|
|
SpinCtrlDoubleTestCase(int style = wxSP_ARROW_KEYS)
|
|
: m_spin(new wxSpinCtrlDouble(wxTheApp->GetTopWindow(), wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize,
|
|
style))
|
|
{
|
|
}
|
|
|
|
~SpinCtrlDoubleTestCase()
|
|
{
|
|
delete m_spin;
|
|
}
|
|
|
|
protected:
|
|
wxSpinCtrlDouble* const m_spin;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(SpinCtrlDoubleTestCase);
|
|
};
|
|
|
|
class SpinCtrlDoubleTestCaseWrap : public SpinCtrlDoubleTestCase
|
|
{
|
|
public:
|
|
SpinCtrlDoubleTestCaseWrap()
|
|
: SpinCtrlDoubleTestCase(wxSP_ARROW_KEYS | wxSP_WRAP)
|
|
{
|
|
}
|
|
};
|
|
|
|
|
|
TEST_CASE("SpinCtrlDouble::NoEventsInCtor", "[spinctrl][spinctrldouble]")
|
|
{
|
|
// Verify that creating the control does not generate any events. This is
|
|
// unexpected and shouldn't happen.
|
|
wxScopedPtr<wxSpinCtrlDouble> m_spin(new wxSpinCtrlDouble);
|
|
|
|
EventCounter updatedSpin(m_spin.get(), wxEVT_SPINCTRLDOUBLE);
|
|
EventCounter updatedText(m_spin.get(), wxEVT_TEXT);
|
|
|
|
m_spin->Create(wxTheApp->GetTopWindow(), wxID_ANY, "",
|
|
wxDefaultPosition, wxDefaultSize, 0,
|
|
0., 100., 17.);
|
|
|
|
CHECK( updatedSpin.GetCount() == 0 );
|
|
CHECK( updatedText.GetCount() == 0 );
|
|
}
|
|
|
|
#if wxUSE_UIACTIONSIMULATOR
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
|
|
"SpinCtrlDouble::Arrows", "[spinctrl][spinctrldouble]")
|
|
{
|
|
EventCounter updated(m_spin, wxEVT_SPINCTRLDOUBLE);
|
|
|
|
wxUIActionSimulator sim;
|
|
|
|
m_spin->SetFocus();
|
|
wxYield();
|
|
|
|
sim.Char(WXK_UP);
|
|
wxYield();
|
|
|
|
CHECK( updated.GetCount() == 1 );
|
|
CHECK( m_spin->GetValue() == 1.0 );
|
|
updated.Clear();
|
|
|
|
sim.Char(WXK_DOWN);
|
|
wxYield();
|
|
|
|
CHECK( updated.GetCount() == 1 );
|
|
CHECK( m_spin->GetValue() == 0.0 );
|
|
}
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCaseWrap,
|
|
"SpinCtrlDouble::Wrap", "[spinctrl][spinctrldouble]")
|
|
{
|
|
wxUIActionSimulator sim;
|
|
|
|
m_spin->SetFocus();
|
|
wxYield();
|
|
|
|
sim.Char(WXK_DOWN);
|
|
|
|
wxYield();
|
|
|
|
CHECK( m_spin->GetValue() == 100.0 );
|
|
|
|
sim.Char(WXK_UP);
|
|
|
|
wxYield();
|
|
|
|
CHECK( m_spin->GetValue() == 0.0 );
|
|
}
|
|
#endif // wxUSE_UIACTIONSIMULATOR
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
|
|
"SpinCtrlDouble::Range", "[spinctrl][spinctrldouble]")
|
|
{
|
|
CHECK( m_spin->GetMin() == 0.0 );
|
|
CHECK( m_spin->GetMax() == 100.0 );
|
|
|
|
// 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_SPINCTRLDOUBLE);
|
|
EventCounter updatedText(m_spin, wxEVT_TEXT);
|
|
|
|
m_spin->SetRange(1., 10.);
|
|
CHECK( m_spin->GetValue() == 1. );
|
|
|
|
CHECK( updatedSpin.GetCount() == 0 );
|
|
CHECK( updatedText.GetCount() == 0 );
|
|
}
|
|
|
|
//Test negative ranges
|
|
m_spin->SetRange(-10.0, 10.0);
|
|
|
|
CHECK( m_spin->GetMin() == -10.0 );
|
|
CHECK( m_spin->GetMax() == 10.0 );
|
|
|
|
//Test backwards ranges
|
|
m_spin->SetRange(75.0, 50.0);
|
|
|
|
CHECK( m_spin->GetMin() == 75.0 );
|
|
CHECK( m_spin->GetMax() == 50.0 );
|
|
}
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
|
|
"SpinCtrlDouble::Value", "[spinctrl][spinctrldouble]")
|
|
{
|
|
EventCounter updatedSpin(m_spin, wxEVT_SPINCTRLDOUBLE);
|
|
EventCounter updatedText(m_spin, wxEVT_TEXT);
|
|
|
|
m_spin->SetDigits(2);
|
|
m_spin->SetIncrement(0.1);
|
|
|
|
CHECK( m_spin->GetValue() == 0.0 );
|
|
|
|
m_spin->SetValue(50.0);
|
|
CHECK( m_spin->GetValue() == 50.0 );
|
|
|
|
m_spin->SetValue(49.1);
|
|
CHECK( m_spin->GetValue() == 49.1 );
|
|
|
|
// Calling SetValue() shouldn't have generated any events.
|
|
CHECK( updatedSpin.GetCount() == 0 );
|
|
CHECK( updatedText.GetCount() == 0 );
|
|
|
|
// Also test that setting the text value works.
|
|
CHECK( m_spin->GetTextValue() == "49.10" );
|
|
|
|
m_spin->SetValue("57.30");
|
|
CHECK( m_spin->GetTextValue() == "57.30" );
|
|
CHECK( m_spin->GetValue() == 57.3 );
|
|
|
|
CHECK( updatedSpin.GetCount() == 0 );
|
|
CHECK( updatedText.GetCount() == 0 );
|
|
|
|
m_spin->SetValue("");
|
|
CHECK( m_spin->GetTextValue() == "" );
|
|
CHECK( m_spin->GetValue() == 0 );
|
|
|
|
CHECK( updatedSpin.GetCount() == 0 );
|
|
CHECK( updatedText.GetCount() == 0 );
|
|
}
|
|
|
|
#if wxUSE_UIACTIONSIMULATOR
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
|
|
"SpinCtrlDouble::Increment", "[spinctrl][spinctrldouble]")
|
|
{
|
|
CHECK( m_spin->GetIncrement() == 1.0 );
|
|
|
|
m_spin->SetDigits(1);
|
|
m_spin->SetIncrement(0.1);
|
|
|
|
CHECK( m_spin->GetIncrement() == 0.1 );
|
|
|
|
wxUIActionSimulator sim;
|
|
|
|
m_spin->SetFocus();
|
|
wxYield();
|
|
|
|
sim.Char(WXK_UP);
|
|
|
|
wxYield();
|
|
|
|
CHECK( m_spin->GetValue() == 0.1 );
|
|
}
|
|
|
|
#endif // wxUSE_UIACTIONSIMULATOR
|
|
|
|
TEST_CASE_METHOD(SpinCtrlDoubleTestCase,
|
|
"SpinCtrlDouble::Digits", "[spinctrl][spinctrldouble]")
|
|
{
|
|
// Setting increment should adjust the number of digits shown to be big
|
|
// enough to show numbers with the corresponding granularity.
|
|
m_spin->SetIncrement(0.1);
|
|
m_spin->SetValue(1.23456789);
|
|
CHECK( m_spin->GetTextValue() == "1.2" );
|
|
|
|
m_spin->SetIncrement(0.01);
|
|
m_spin->SetValue(1.23456789);
|
|
CHECK( m_spin->GetTextValue() == "1.23" );
|
|
|
|
m_spin->SetDigits(5);
|
|
CHECK( m_spin->GetDigits() == 5 );
|
|
m_spin->SetValue(1.23456789);
|
|
CHECK( m_spin->GetTextValue() == "1.23457" );
|
|
}
|
|
|
|
static inline unsigned int GetInitialDigits(double inc)
|
|
{
|
|
wxScopedPtr<wxSpinCtrlDouble> sc(new wxSpinCtrlDouble
|
|
(
|
|
wxTheApp->GetTopWindow(),
|
|
wxID_ANY,
|
|
wxEmptyString,
|
|
wxDefaultPosition,
|
|
wxDefaultSize,
|
|
wxSP_ARROW_KEYS,
|
|
0, 50, 0,
|
|
inc
|
|
));
|
|
return sc->GetDigits();
|
|
}
|
|
|
|
TEST_CASE("SpinCtrlDouble::InitialDigits", "[spinctrldouble][initialdigits]")
|
|
{
|
|
REQUIRE(GetInitialDigits(15) == 0);
|
|
REQUIRE(GetInitialDigits(10) == 0);
|
|
REQUIRE(GetInitialDigits(1) == 0);
|
|
REQUIRE(GetInitialDigits(0.999) == 1);
|
|
REQUIRE(GetInitialDigits(0.15) == 1);
|
|
REQUIRE(GetInitialDigits(0.11) == 1);
|
|
REQUIRE(GetInitialDigits(0.1) == 1);
|
|
REQUIRE(GetInitialDigits(0.0999) == 2);
|
|
REQUIRE(GetInitialDigits(0.015) == 2);
|
|
REQUIRE(GetInitialDigits(0.011) == 2);
|
|
REQUIRE(GetInitialDigits(0.01) == 2);
|
|
REQUIRE(GetInitialDigits(9.99e-5) == 5);
|
|
REQUIRE(GetInitialDigits(1e-5) == 5);
|
|
REQUIRE(GetInitialDigits(9.9999e-10) == 10);
|
|
REQUIRE(GetInitialDigits(1e-10) == 10);
|
|
REQUIRE(GetInitialDigits(9.9999e-20) == 20);
|
|
REQUIRE(GetInitialDigits(1e-20) == 20);
|
|
REQUIRE(GetInitialDigits(9.9999e-21) == 20);
|
|
REQUIRE(GetInitialDigits(1e-21) == 20);
|
|
REQUIRE(GetInitialDigits(9.9999e-22) == 20);
|
|
REQUIRE(GetInitialDigits(1e-22) == 20);
|
|
}
|
|
|
|
#endif
|