1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/validators/valnum.cpp
3 // Purpose: Unit tests for numeric validators.
4 // Author: Vadim Zeitlin
7 // Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
8 ///////////////////////////////////////////////////////////////////////////////
19 #include "wx/textctrl.h"
20 #include "wx/validate.h"
23 #include "wx/valnum.h"
25 #include "asserthelper.h"
26 #include "testableframe.h"
27 #include "wx/uiaction.h"
29 class NumValidatorTestCase
: public CppUnit
::TestCase
32 NumValidatorTestCase() { }
38 CPPUNIT_TEST_SUITE( NumValidatorTestCase
);
39 CPPUNIT_TEST( TransferInt
);
40 CPPUNIT_TEST( TransferUnsigned
);
41 CPPUNIT_TEST( TransferFloat
);
42 CPPUNIT_TEST( ZeroAsBlank
);
43 CPPUNIT_TEST( NoTrailingZeroes
);
44 WXUISIM_TEST( Interactive
);
45 CPPUNIT_TEST_SUITE_END();
48 void TransferUnsigned();
51 void NoTrailingZeroes();
52 #if wxUSE_UIACTIONSIMULATOR
54 #endif // wxUSE_UIACTIONSIMULATOR
58 wxDECLARE_NO_COPY_CLASS(NumValidatorTestCase
);
61 // register in the unnamed registry so that these tests are run by default
62 CPPUNIT_TEST_SUITE_REGISTRATION( NumValidatorTestCase
);
64 // also include in it's own registry so that these tests can be run alone
65 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( NumValidatorTestCase
, "NumValidatorTestCase" );
67 void NumValidatorTestCase
::setUp()
69 m_text
= new wxTextCtrl(wxTheApp
->GetTopWindow(), wxID_ANY
);
72 void NumValidatorTestCase
::tearDown()
74 wxTheApp
->GetTopWindow()->DestroyChildren();
77 void NumValidatorTestCase
::TransferInt()
80 wxIntegerValidator
<int> valInt(&value
);
81 valInt
.SetWindow(m_text
);
83 CPPUNIT_ASSERT( valInt
.TransferToWindow() );
84 CPPUNIT_ASSERT_EQUAL( "0", m_text
->GetValue() );
87 CPPUNIT_ASSERT( valInt
.TransferToWindow() );
88 CPPUNIT_ASSERT_EQUAL( "17", m_text
->GetValue() );
91 m_text
->ChangeValue("foobar");
92 CPPUNIT_ASSERT( !valInt
.TransferFromWindow() );
94 m_text
->ChangeValue("-234");
95 CPPUNIT_ASSERT( valInt
.TransferFromWindow() );
96 CPPUNIT_ASSERT_EQUAL( -234, value
);
98 m_text
->ChangeValue("9223372036854775808"); // == LLONG_MAX + 1
99 CPPUNIT_ASSERT( !valInt
.TransferFromWindow() );
102 CPPUNIT_ASSERT( !valInt
.TransferFromWindow() );
105 void NumValidatorTestCase
::TransferUnsigned()
108 wxIntegerValidator
<unsigned> valUnsigned(&value
);
109 valUnsigned
.SetWindow(m_text
);
111 CPPUNIT_ASSERT( valUnsigned
.TransferToWindow() );
112 CPPUNIT_ASSERT_EQUAL( "0", m_text
->GetValue() );
115 CPPUNIT_ASSERT( valUnsigned
.TransferToWindow() );
116 CPPUNIT_ASSERT_EQUAL( "17", m_text
->GetValue() );
119 m_text
->ChangeValue("foobar");
120 CPPUNIT_ASSERT( !valUnsigned
.TransferFromWindow() );
122 m_text
->ChangeValue("-234");
123 CPPUNIT_ASSERT( !valUnsigned
.TransferFromWindow() );
125 m_text
->ChangeValue("234");
126 CPPUNIT_ASSERT( valUnsigned
.TransferFromWindow() );
127 CPPUNIT_ASSERT_EQUAL( 234, value
);
129 m_text
->ChangeValue("18446744073709551616"); // == ULLONG_MAX + 1
130 CPPUNIT_ASSERT( !valUnsigned
.TransferFromWindow() );
133 CPPUNIT_ASSERT( !valUnsigned
.TransferFromWindow() );
136 void NumValidatorTestCase
::TransferFloat()
139 wxFloatingPointValidator
<float> valFloat(3, &value
);
140 valFloat
.SetWindow(m_text
);
142 CPPUNIT_ASSERT( valFloat
.TransferToWindow() );
143 CPPUNIT_ASSERT_EQUAL( "0.000", m_text
->GetValue() );
146 CPPUNIT_ASSERT( valFloat
.TransferToWindow() );
147 CPPUNIT_ASSERT_EQUAL( "1.234", m_text
->GetValue() );
150 CPPUNIT_ASSERT( valFloat
.TransferToWindow() );
151 CPPUNIT_ASSERT_EQUAL( "1.235", m_text
->GetValue() );
154 m_text
->ChangeValue("foobar");
155 CPPUNIT_ASSERT( !valFloat
.TransferFromWindow() );
157 m_text
->ChangeValue("-234.567");
158 CPPUNIT_ASSERT( valFloat
.TransferFromWindow() );
159 CPPUNIT_ASSERT_EQUAL( -234.567f
, value
);
162 CPPUNIT_ASSERT( !valFloat
.TransferFromWindow() );
165 void NumValidatorTestCase
::ZeroAsBlank()
168 m_text
->SetValidator(
169 wxMakeIntegerValidator(&value
, wxNUM_VAL_ZERO_AS_BLANK
));
171 wxValidator
* const val
= m_text
->GetValidator();
173 CPPUNIT_ASSERT( val
->TransferToWindow() );
174 CPPUNIT_ASSERT_EQUAL( "", m_text
->GetValue() );
177 CPPUNIT_ASSERT( val
->TransferFromWindow() );
178 CPPUNIT_ASSERT_EQUAL( 0, value
);
181 void NumValidatorTestCase
::NoTrailingZeroes()
184 m_text
->SetValidator(
185 wxMakeFloatingPointValidator(3, &value
, wxNUM_VAL_NO_TRAILING_ZEROES
));
187 wxValidator
* const val
= m_text
->GetValidator();
189 CPPUNIT_ASSERT( val
->TransferToWindow() );
190 CPPUNIT_ASSERT_EQUAL( "1.2", m_text
->GetValue() );
193 CPPUNIT_ASSERT( val
->TransferToWindow() );
194 CPPUNIT_ASSERT_EQUAL( "1.234", m_text
->GetValue() );
197 #if wxUSE_UIACTIONSIMULATOR
199 void NumValidatorTestCase
::Interactive()
201 // Set a locale using comma as thousands separator character.
202 wxLocale
loc(wxLANGUAGE_ENGLISH_UK
, wxLOCALE_DONT_LOAD_DEFAULT
);
204 m_text
->SetValidator(
205 wxIntegerValidator
<unsigned>(NULL
, wxNUM_VAL_THOUSANDS_SEPARATOR
));
207 // Create a sibling text control to be able to switch focus and thus
208 // trigger the control validation/normalization.
209 wxTextCtrl
* const text2
= new wxTextCtrl(m_text
->GetParent(), wxID_ANY
);
210 text2
->Move(10, 80); // Just to see it better while debugging...
211 wxFloatingPointValidator
<float> valFloat(3);
212 valFloat
.SetRange(-10., 10.);
213 text2
->SetValidator(valFloat
);
215 wxUIActionSimulator sim
;
217 // Entering '-' in a control with positive range is not allowed.
221 CPPUNIT_ASSERT_EQUAL( "", m_text
->GetValue() );
223 // Neither is entering '.' or any non-digit character.
226 CPPUNIT_ASSERT_EQUAL( "", m_text
->GetValue() );
228 // Entering digits should work though and after leaving the control the
229 // contents should be normalized.
235 CPPUNIT_ASSERT_EQUAL( "1,234,567", m_text
->GetValue() );
237 CPPUNIT_ASSERT_EQUAL( "1234567", m_text
->GetValue() );
240 // Entering both '-' and '.' in this control should work but only in the
244 CPPUNIT_ASSERT_EQUAL( "-", text2
->GetValue() );
246 text2
->SetInsertionPoint(0);
249 CPPUNIT_ASSERT_EQUAL( "-", text2
->GetValue() );
251 text2
->SetInsertionPointEnd();
254 CPPUNIT_ASSERT_EQUAL( "-.", text2
->GetValue() );
256 // Adding up to three digits after the point should work.
259 CPPUNIT_ASSERT_EQUAL( "-.987", text2
->GetValue() );
264 CPPUNIT_ASSERT_EQUAL( "-.987", text2
->GetValue() );
266 // We can remove one digit and another one though.
271 CPPUNIT_ASSERT_EQUAL( "-.96", text2
->GetValue() );
274 // Also test the range constraint.
279 CPPUNIT_ASSERT_EQUAL( "9", text2
->GetValue() );
283 CPPUNIT_ASSERT_EQUAL( "9", text2
->GetValue() );
286 #endif // wxUSE_UIACTIONSIMULATOR