419480cf22
We shouldn't add thousands separators nor remove trailing zeros for the numbers in scientific format. Also avoid "-0" as output. See #15625. git-svn-id: https://svn.wxwidgets.org/svn/wx/wxWidgets/trunk@75560 c3d73ce0-8a6f-49c7-b76d-6d57e0e08775
350 lines
12 KiB
C++
350 lines
12 KiB
C++
///////////////////////////////////////////////////////////////////////////////
|
|
// Name: tests/strings/numformat.cpp
|
|
// Purpose: wxNumberFormatter unit test
|
|
// Author: Vadim Zeitlin
|
|
// Created: 2011-01-15
|
|
// Copyright: (c) 2011 Vadim Zeitlin <vadim@wxwidgets.org>
|
|
///////////////////////////////////////////////////////////////////////////////
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// headers
|
|
// ----------------------------------------------------------------------------
|
|
|
|
#include "testprec.h"
|
|
|
|
#ifdef __BORLANDC__
|
|
#pragma hdrstop
|
|
#endif
|
|
|
|
#include "wx/numformatter.h"
|
|
#include "wx/intl.h"
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// test class
|
|
// ----------------------------------------------------------------------------
|
|
|
|
class NumFormatterTestCase : public CppUnit::TestCase
|
|
{
|
|
public:
|
|
NumFormatterTestCase() { m_locale = NULL; }
|
|
|
|
virtual void setUp()
|
|
{
|
|
// We need to use a locale with known decimal point and which uses the
|
|
// thousands separator for the tests to make sense.
|
|
m_locale = new wxLocale(wxLANGUAGE_ENGLISH_UK,
|
|
wxLOCALE_DONT_LOAD_DEFAULT);
|
|
if ( !m_locale->IsOk() )
|
|
tearDown();
|
|
}
|
|
|
|
virtual void tearDown()
|
|
{
|
|
delete m_locale;
|
|
m_locale = NULL;
|
|
}
|
|
|
|
private:
|
|
CPPUNIT_TEST_SUITE( NumFormatterTestCase );
|
|
CPPUNIT_TEST( LongToString );
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
CPPUNIT_TEST( LongLongToString );
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
CPPUNIT_TEST( DoubleToString );
|
|
CPPUNIT_TEST( NoTrailingZeroes );
|
|
CPPUNIT_TEST( LongFromString );
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
CPPUNIT_TEST( LongLongFromString );
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
CPPUNIT_TEST( DoubleFromString );
|
|
CPPUNIT_TEST_SUITE_END();
|
|
|
|
void LongToString();
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
void LongLongToString();
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
void DoubleToString();
|
|
void NoTrailingZeroes();
|
|
void LongFromString();
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
void LongLongFromString();
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
void DoubleFromString();
|
|
|
|
wxLocale *m_locale;
|
|
|
|
wxDECLARE_NO_COPY_CLASS(NumFormatterTestCase);
|
|
};
|
|
|
|
// register in the unnamed registry so that these tests are run by default
|
|
CPPUNIT_TEST_SUITE_REGISTRATION( NumFormatterTestCase );
|
|
|
|
// also include in its own registry so that these tests can be run alone
|
|
CPPUNIT_TEST_SUITE_NAMED_REGISTRATION( NumFormatterTestCase, "NumFormatterTestCase" );
|
|
|
|
// ----------------------------------------------------------------------------
|
|
// tests themselves
|
|
// ----------------------------------------------------------------------------
|
|
|
|
void NumFormatterTestCase::LongToString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
CPPUNIT_ASSERT_EQUAL( "1", wxNumberFormatter::ToString( 1L));
|
|
CPPUNIT_ASSERT_EQUAL( "-1", wxNumberFormatter::ToString( -1L));
|
|
CPPUNIT_ASSERT_EQUAL( "12", wxNumberFormatter::ToString( 12L));
|
|
CPPUNIT_ASSERT_EQUAL( "-12", wxNumberFormatter::ToString( -12L));
|
|
CPPUNIT_ASSERT_EQUAL( "123", wxNumberFormatter::ToString( 123L));
|
|
CPPUNIT_ASSERT_EQUAL( "-123", wxNumberFormatter::ToString( -123L));
|
|
CPPUNIT_ASSERT_EQUAL( "1,234", wxNumberFormatter::ToString( 1234L));
|
|
CPPUNIT_ASSERT_EQUAL( "-1,234", wxNumberFormatter::ToString( -1234L));
|
|
CPPUNIT_ASSERT_EQUAL( "12,345", wxNumberFormatter::ToString( 12345L));
|
|
CPPUNIT_ASSERT_EQUAL( "-12,345", wxNumberFormatter::ToString( -12345L));
|
|
CPPUNIT_ASSERT_EQUAL( "123,456", wxNumberFormatter::ToString( 123456L));
|
|
CPPUNIT_ASSERT_EQUAL( "-123,456", wxNumberFormatter::ToString( -123456L));
|
|
CPPUNIT_ASSERT_EQUAL( "1,234,567", wxNumberFormatter::ToString( 1234567L));
|
|
CPPUNIT_ASSERT_EQUAL( "-1,234,567", wxNumberFormatter::ToString( -1234567L));
|
|
CPPUNIT_ASSERT_EQUAL( "12,345,678", wxNumberFormatter::ToString( 12345678L));
|
|
CPPUNIT_ASSERT_EQUAL("-12,345,678", wxNumberFormatter::ToString( -12345678L));
|
|
CPPUNIT_ASSERT_EQUAL("123,456,789", wxNumberFormatter::ToString( 123456789L));
|
|
}
|
|
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
|
|
void NumFormatterTestCase::LongLongToString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
CPPUNIT_ASSERT_EQUAL( "1", wxNumberFormatter::ToString(wxLL( 1)));
|
|
CPPUNIT_ASSERT_EQUAL( "12", wxNumberFormatter::ToString(wxLL( 12)));
|
|
CPPUNIT_ASSERT_EQUAL( "123", wxNumberFormatter::ToString(wxLL( 123)));
|
|
CPPUNIT_ASSERT_EQUAL( "1,234", wxNumberFormatter::ToString(wxLL( 1234)));
|
|
CPPUNIT_ASSERT_EQUAL( "12,345", wxNumberFormatter::ToString(wxLL( 12345)));
|
|
CPPUNIT_ASSERT_EQUAL( "123,456", wxNumberFormatter::ToString(wxLL( 123456)));
|
|
CPPUNIT_ASSERT_EQUAL( "1,234,567", wxNumberFormatter::ToString(wxLL( 1234567)));
|
|
CPPUNIT_ASSERT_EQUAL( "12,345,678", wxNumberFormatter::ToString(wxLL( 12345678)));
|
|
CPPUNIT_ASSERT_EQUAL("123,456,789", wxNumberFormatter::ToString(wxLL( 123456789)));
|
|
}
|
|
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
|
|
void NumFormatterTestCase::DoubleToString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
CPPUNIT_ASSERT_EQUAL("1.0", wxNumberFormatter::ToString(1., 1));
|
|
CPPUNIT_ASSERT_EQUAL("0.123456", wxNumberFormatter::ToString(0.123456, 6));
|
|
CPPUNIT_ASSERT_EQUAL("1.234567", wxNumberFormatter::ToString(1.234567, 6));
|
|
CPPUNIT_ASSERT_EQUAL("12.34567", wxNumberFormatter::ToString(12.34567, 5));
|
|
CPPUNIT_ASSERT_EQUAL("123.4567", wxNumberFormatter::ToString(123.4567, 4));
|
|
CPPUNIT_ASSERT_EQUAL("1,234.56", wxNumberFormatter::ToString(1234.56, 2));
|
|
CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
|
|
CPPUNIT_ASSERT_EQUAL("12,345.6", wxNumberFormatter::ToString(12345.6, 1));
|
|
CPPUNIT_ASSERT_EQUAL("123,456,789.0",
|
|
wxNumberFormatter::ToString(123456789., 1));
|
|
CPPUNIT_ASSERT_EQUAL("123,456,789.012",
|
|
wxNumberFormatter::ToString(123456789.012, 3));
|
|
CPPUNIT_ASSERT_EQUAL("12,345",
|
|
wxNumberFormatter::ToString(12345.012, -1));
|
|
CPPUNIT_ASSERT_EQUAL("-123.1230",
|
|
wxNumberFormatter::ToString(-123.123, 4, wxNumberFormatter::Style_None));
|
|
CPPUNIT_ASSERT_EQUAL("0.0",
|
|
wxNumberFormatter::ToString(0.02, 1, wxNumberFormatter::Style_None));
|
|
CPPUNIT_ASSERT_EQUAL("-0.0",
|
|
wxNumberFormatter::ToString(-0.02, 1, wxNumberFormatter::Style_None));
|
|
}
|
|
|
|
void NumFormatterTestCase::NoTrailingZeroes()
|
|
{
|
|
WX_ASSERT_FAILS_WITH_ASSERT
|
|
(
|
|
wxNumberFormatter::ToString(123L, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123.000",
|
|
wxNumberFormatter::ToString(123., 3)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123",
|
|
wxNumberFormatter::ToString(123., 3, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123",
|
|
wxNumberFormatter::ToString(123., 9, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123.456",
|
|
wxNumberFormatter::ToString(123.456, 3, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123.456000000",
|
|
wxNumberFormatter::ToString(123.456, 9)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123.456",
|
|
wxNumberFormatter::ToString(123.456, 9, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123.12",
|
|
wxNumberFormatter::ToString(123.123, 2, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123",
|
|
wxNumberFormatter::ToString(123.123, 0, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"0",
|
|
wxNumberFormatter::ToString(-0.000123, 3, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"123",
|
|
wxNumberFormatter::ToString(123., -1, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
|
|
CPPUNIT_ASSERT_EQUAL
|
|
(
|
|
"1e-120",
|
|
wxNumberFormatter::ToString(1e-120, -1, wxNumberFormatter::Style_NoTrailingZeroes)
|
|
);
|
|
}
|
|
|
|
void NumFormatterTestCase::LongFromString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
WX_ASSERT_FAILS_WITH_ASSERT
|
|
(
|
|
wxNumberFormatter::FromString("123", static_cast<long *>(0))
|
|
);
|
|
|
|
long l;
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &l) );
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("foo", &l) );
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("1.234", &l) );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 123, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1234", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 12345, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 123456, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234567, l );
|
|
}
|
|
|
|
#ifdef wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
|
|
void NumFormatterTestCase::LongLongFromString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
WX_ASSERT_FAILS_WITH_ASSERT
|
|
(
|
|
wxNumberFormatter::FromString("123", static_cast<wxLongLong_t *>(0))
|
|
);
|
|
|
|
wxLongLong_t l;
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &l) );
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("foo", &l) );
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("1.234", &l) );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 123, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1234", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 12345, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 123456, l );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567", &l) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234567, l );
|
|
}
|
|
|
|
#endif // wxHAS_LONG_LONG_T_DIFFERENT_FROM_LONG
|
|
|
|
void NumFormatterTestCase::DoubleFromString()
|
|
{
|
|
if ( !m_locale )
|
|
return;
|
|
|
|
WX_ASSERT_FAILS_WITH_ASSERT
|
|
(
|
|
wxNumberFormatter::FromString("123", static_cast<double *>(0))
|
|
);
|
|
|
|
double d;
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("", &d) );
|
|
CPPUNIT_ASSERT( !wxNumberFormatter::FromString("bar", &d) );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 123., d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123.456789012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 123.456789012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234.56789012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234.56789012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345.6789012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 12345.6789012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456.789012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 123456.789012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("1,234,567.89012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 1234567.89012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("12,345,678.9012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 12345678.9012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123,456,789.012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
|
|
|
|
CPPUNIT_ASSERT( wxNumberFormatter::FromString("123456789.012", &d) );
|
|
CPPUNIT_ASSERT_EQUAL( 123456789.012, d );
|
|
}
|