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