1 ///////////////////////////////////////////////////////////////////////////////
2 // Name: tests/strings/numformat.cpp
3 // Purpose: wxNumberFormatter unit test
4 // Author: Vadim Zeitlin
5 // Created: 2011-01-15
6 // Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
7 ///////////////////////////////////////////////////////////////////////////////
8
9 // ----------------------------------------------------------------------------
10 // headers
11 // ----------------------------------------------------------------------------
12
13 #include "testprec.h"
14
15 #ifdef __BORLANDC__
16 #pragma hdrstop
17 #endif
18
19 #include "wx/numformatter.h"
20 #include "wx/intl.h"
21
22 // ----------------------------------------------------------------------------
23 // test class
24 // ----------------------------------------------------------------------------
25
26 class NumFormatterTestCase : public CppUnit::TestCase
27 {
28 public:
NumFormatterTestCase()29 NumFormatterTestCase() { m_locale = NULL; }
30
setUp()31 virtual void setUp()
32 {
33 // We need to use a locale with known decimal point and which uses the
34 // thousands separator for the tests to make sense.
35 m_locale = new wxLocale(wxLANGUAGE_ENGLISH_UK,
36 wxLOCALE_DONT_LOAD_DEFAULT);
37 if ( !m_locale->IsOk() )
38 tearDown();
39 }
40
tearDown()41 virtual void tearDown()
42 {
43 delete m_locale;
44 m_locale = NULL;
45 }
46
47 private:
48 CPPUNIT_TEST_SUITE( NumFormatterTestCase );
49 CPPUNIT_TEST( LongToString );
50 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
51 CPPUNIT_TEST( LongLongToString );
52 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
53 CPPUNIT_TEST( DoubleToString );
54 CPPUNIT_TEST( NoTrailingZeroes );
55 CPPUNIT_TEST( LongFromString );
56 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
57 CPPUNIT_TEST( LongLongFromString );
58 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
59 CPPUNIT_TEST( DoubleFromString );
60 CPPUNIT_TEST_SUITE_END();
61
62 void LongToString();
63 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
64 void LongLongToString();
65 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
66 void DoubleToString();
67 void NoTrailingZeroes();
68 void LongFromString();
69 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
70 void LongLongFromString();
71 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
72 void DoubleFromString();
73
74 wxLocale *m_locale;
75
76 wxDECLARE_NO_COPY_CLASS(NumFormatterTestCase);
77 };
78
79 // register in the unnamed registry so that these tests are run by default
80 CPPUNIT_TEST_SUITE_REGISTRATION( NumFormatterTestCase );
81
82 // also include in its own registry so that these tests can be run alone
83 CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( NumFormatterTestCase, "NumFormatterTestCase" );
84
85 // ----------------------------------------------------------------------------
86 // tests themselves
87 // ----------------------------------------------------------------------------
88
LongToString()89 void NumFormatterTestCase::LongToString()
90 {
91 if ( !m_locale )
92 return;
93
94 CPPUNIT_ASSERT_EQUAL( "1", wxNumberFormatter::ToString( 1L));
95 CPPUNIT_ASSERT_EQUAL( "-1", wxNumberFormatter::ToString( -1L));
96 CPPUNIT_ASSERT_EQUAL( "12", wxNumberFormatter::ToString( 12L));
97 CPPUNIT_ASSERT_EQUAL( "-12", wxNumberFormatter::ToString( -12L));
98 CPPUNIT_ASSERT_EQUAL( "123", wxNumberFormatter::ToString( 123L));
99 CPPUNIT_ASSERT_EQUAL( "-123", wxNumberFormatter::ToString( -123L));
100 CPPUNIT_ASSERT_EQUAL( "1,234", wxNumberFormatter::ToString( 1234L));
101 CPPUNIT_ASSERT_EQUAL( "-1,234", wxNumberFormatter::ToString( -1234L));
102 CPPUNIT_ASSERT_EQUAL( "12,345", wxNumberFormatter::ToString( 12345L));
103 CPPUNIT_ASSERT_EQUAL( "-12,345", wxNumberFormatter::ToString( -12345L));
104 CPPUNIT_ASSERT_EQUAL( "123,456", wxNumberFormatter::ToString( 123456L));
105 CPPUNIT_ASSERT_EQUAL( "-123,456", wxNumberFormatter::ToString( -123456L));
106 CPPUNIT_ASSERT_EQUAL( "1,234,567", wxNumberFormatter::ToString( 1234567L));
107 CPPUNIT_ASSERT_EQUAL( "-1,234,567", wxNumberFormatter::ToString( -1234567L));
108 CPPUNIT_ASSERT_EQUAL( "12,345,678", wxNumberFormatter::ToString( 12345678L));
109 CPPUNIT_ASSERT_EQUAL("-12,345,678", wxNumberFormatter::ToString( -12345678L));
110 CPPUNIT_ASSERT_EQUAL("123,456,789", wxNumberFormatter::ToString( 123456789L));
111 }
112
113 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
114
LongLongToString()115 void NumFormatterTestCase::LongLongToString()
116 {
117 if ( !m_locale )
118 return;
119
120 CPPUNIT_ASSERT_EQUAL( "1", wxNumberFormatter::ToString(wxLL( 1)));
121 CPPUNIT_ASSERT_EQUAL( "12", wxNumberFormatter::ToString(wxLL( 12)));
122 CPPUNIT_ASSERT_EQUAL( "123", wxNumberFormatter::ToString(wxLL( 123)));
123 CPPUNIT_ASSERT_EQUAL( "1,234", wxNumberFormatter::ToString(wxLL( 1234)));
124 CPPUNIT_ASSERT_EQUAL( "12,345", wxNumberFormatter::ToString(wxLL( 12345)));
125 CPPUNIT_ASSERT_EQUAL( "123,456", wxNumberFormatter::ToString(wxLL( 123456)));
126 CPPUNIT_ASSERT_EQUAL( "1,234,567", wxNumberFormatter::ToString(wxLL( 1234567)));
127 CPPUNIT_ASSERT_EQUAL( "12,345,678", wxNumberFormatter::ToString(wxLL( 12345678)));
128 CPPUNIT_ASSERT_EQUAL("123,456,789", wxNumberFormatter::ToString(wxLL( 123456789)));
129 }
130
131 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
132
DoubleToString()133 void NumFormatterTestCase::DoubleToString()
134 {
135 if ( !m_locale )
136 return;
137
138 CPPUNIT_ASSERT_EQUAL("1.0", wxNumberFormatter::ToString(1., 1));
139 CPPUNIT_ASSERT_EQUAL("0.123456", wxNumberFormatter::ToString(0.123456, 6));
140 CPPUNIT_ASSERT_EQUAL("1.234567", wxNumberFormatter::ToString(1.234567, 6));
141 CPPUNIT_ASSERT_EQUAL("12.34567", wxNumberFormatter::ToString(12.34567, 5));
142 CPPUNIT_ASSERT_EQUAL("123.4567", wxNumberFormatter::ToString(123.4567, 4));
143 CPPUNIT_ASSERT_EQUAL("1,234.56", wxNumberFormatter::ToString(1234.56, 2));
144 CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
145 CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
146 CPPUNIT_ASSERT_EQUAL("123,456,789.0",
147 wxNumberFormatter::ToString(123456789., 1));
148 CPPUNIT_ASSERT_EQUAL("123,456,789.012",
149 wxNumberFormatter::ToString(123456789.012, 3));
150 CPPUNIT_ASSERT_EQUAL("12,345",
151 wxNumberFormatter::ToString(12345.012, -1));
152 CPPUNIT_ASSERT_EQUAL("-123.1230",
153 wxNumberFormatter::ToString(-123.123, 4, wxNumberFormatter::Style_None));
154 CPPUNIT_ASSERT_EQUAL("0.0",
155 wxNumberFormatter::ToString(0.02, 1, wxNumberFormatter::Style_None));
156 CPPUNIT_ASSERT_EQUAL("-0.0",
157 wxNumberFormatter::ToString(-0.02, 1, wxNumberFormatter::Style_None));
158 }
159
NoTrailingZeroes()160 void NumFormatterTestCase::NoTrailingZeroes()
161 {
162 WX_ASSERT_FAILS_WITH_ASSERT
163 (
164 wxNumberFormatter::ToString(123L, wxNumberFormatter::Style_NoTrailingZeroes)
165 );
166
167 if ( !m_locale )
168 return;
169
170 CPPUNIT_ASSERT_EQUAL
171 (
172 "123.000",
173 wxNumberFormatter::ToString(123., 3)
174 );
175
176 CPPUNIT_ASSERT_EQUAL
177 (
178 "123",
179 wxNumberFormatter::ToString(123., 3, wxNumberFormatter::Style_NoTrailingZeroes)
180 );
181
182 CPPUNIT_ASSERT_EQUAL
183 (
184 "123",
185 wxNumberFormatter::ToString(123., 9, wxNumberFormatter::Style_NoTrailingZeroes)
186 );
187
188 CPPUNIT_ASSERT_EQUAL
189 (
190 "123.456",
191 wxNumberFormatter::ToString(123.456, 3, wxNumberFormatter::Style_NoTrailingZeroes)
192 );
193
194 CPPUNIT_ASSERT_EQUAL
195 (
196 "123.456000000",
197 wxNumberFormatter::ToString(123.456, 9)
198 );
199
200 CPPUNIT_ASSERT_EQUAL
201 (
202 "123.456",
203 wxNumberFormatter::ToString(123.456, 9, wxNumberFormatter::Style_NoTrailingZeroes)
204 );
205
206 CPPUNIT_ASSERT_EQUAL
207 (
208 "123.12",
209 wxNumberFormatter::ToString(123.123, 2, wxNumberFormatter::Style_NoTrailingZeroes)
210 );
211
212 CPPUNIT_ASSERT_EQUAL
213 (
214 "123",
215 wxNumberFormatter::ToString(123.123, 0, wxNumberFormatter::Style_NoTrailingZeroes)
216 );
217
218 CPPUNIT_ASSERT_EQUAL
219 (
220 "0",
221 wxNumberFormatter::ToString(-0.000123, 3, wxNumberFormatter::Style_NoTrailingZeroes)
222 );
223
224 CPPUNIT_ASSERT_EQUAL
225 (
226 "123",
227 wxNumberFormatter::ToString(123., -1, wxNumberFormatter::Style_NoTrailingZeroes)
228 );
229
230 CPPUNIT_ASSERT_EQUAL
231 (
232 "1e-120",
233 wxNumberFormatter::ToString(1e-120, -1, wxNumberFormatter::Style_NoTrailingZeroes)
234 );
235 }
236
LongFromString()237 void NumFormatterTestCase::LongFromString()
238 {
239 if ( !m_locale )
240 return;
241
242 WX_ASSERT_FAILS_WITH_ASSERT
243 (
244 wxNumberFormatter::FromString("123", static_cast<long *>(0))
245 );
246
247 long l;
248 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &l) );
249 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("foo", &l) );
250 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("1.234", &l) );
251
252 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &l) );
253 CPPUNIT_ASSERT_EQUAL( 123, l );
254
255 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1234", &l) );
256 CPPUNIT_ASSERT_EQUAL( 1234, l );
257
258 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234", &l) );
259 CPPUNIT_ASSERT_EQUAL( 1234, l );
260
261 CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345", &l) );
262 CPPUNIT_ASSERT_EQUAL( 12345, l );
263
264 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456", &l) );
265 CPPUNIT_ASSERT_EQUAL( 123456, l );
266
267 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567", &l) );
268 CPPUNIT_ASSERT_EQUAL( 1234567, l );
269 }
270
271 #ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
272
LongLongFromString()273 void NumFormatterTestCase::LongLongFromString()
274 {
275 if ( !m_locale )
276 return;
277
278 WX_ASSERT_FAILS_WITH_ASSERT
279 (
280 wxNumberFormatter::FromString("123", static_cast<wxLongLong_t *>(0))
281 );
282
283 wxLongLong_t l;
284 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &l) );
285 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("foo", &l) );
286 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("1.234", &l) );
287
288 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &l) );
289 CPPUNIT_ASSERT_EQUAL( 123, l );
290
291 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1234", &l) );
292 CPPUNIT_ASSERT_EQUAL( 1234, l );
293
294 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234", &l) );
295 CPPUNIT_ASSERT_EQUAL( 1234, l );
296
297 CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345", &l) );
298 CPPUNIT_ASSERT_EQUAL( 12345, l );
299
300 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456", &l) );
301 CPPUNIT_ASSERT_EQUAL( 123456, l );
302
303 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567", &l) );
304 CPPUNIT_ASSERT_EQUAL( 1234567, l );
305 }
306
307 #endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
308
DoubleFromString()309 void NumFormatterTestCase::DoubleFromString()
310 {
311 if ( !m_locale )
312 return;
313
314 WX_ASSERT_FAILS_WITH_ASSERT
315 (
316 wxNumberFormatter::FromString("123", static_cast<double *>(0))
317 );
318
319 double d;
320 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &d) );
321 CPPUNIT_ASSERT( !wxNumberFormatter::FromString("bar", &d) );
322
323 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &d) );
324 CPPUNIT_ASSERT_EQUAL( 123., d );
325
326 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123.456789012", &d) );
327 CPPUNIT_ASSERT_EQUAL( 123.456789012, d );
328
329 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234.56789012", &d) );
330 CPPUNIT_ASSERT_EQUAL( 1234.56789012, d );
331
332 CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345.6789012", &d) );
333 CPPUNIT_ASSERT_EQUAL( 12345.6789012, d );
334
335 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456.789012", &d) );
336 CPPUNIT_ASSERT_EQUAL( 123456.789012, d );
337
338 CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567.89012", &d) );
339 CPPUNIT_ASSERT_EQUAL( 1234567.89012, d );
340
341 CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345,678.9012", &d) );
342 CPPUNIT_ASSERT_EQUAL( 12345678.9012, d );
343
344 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456,789.012", &d) );
345 CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
346
347 CPPUNIT_ASSERT( wxNumberFormatter::FromString("123456789.012", &d) );
348 CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
349 }
350