aboutsummaryrefslogtreecommitdiff
path: root/test/unit/num_put_get_test.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'test/unit/num_put_get_test.cpp')
-rw-r--r--test/unit/num_put_get_test.cpp1266
1 files changed, 0 insertions, 1266 deletions
diff --git a/test/unit/num_put_get_test.cpp b/test/unit/num_put_get_test.cpp
deleted file mode 100644
index 13b250f..0000000
--- a/test/unit/num_put_get_test.cpp
+++ /dev/null
@@ -1,1266 +0,0 @@
-#include <limits>
-
-#if !defined (STLPORT) || !defined (_STLP_USE_NO_IOSTREAMS)
-# include <iomanip>
-# include <string>
-# include <sstream>
-# include <cstdio>
-/*
-# include <iostream>
-# include <ieee754.h>
-*/
-
-# include "complete_digits.h"
-# include "cppunit/cppunit_proxy.h"
-
-# if !defined (STLPORT) || defined(_STLP_USE_NAMESPACES)
-using namespace std;
-# endif
-
-//
-// TestCase class
-//
-class NumPutGetTest : public CPPUNIT_NS::TestCase
-{
- CPPUNIT_TEST_SUITE(NumPutGetTest);
-# if defined (__BORLANDC__)
- /* Ignore FPU exceptions, set FPU precision to 64 bits */
- unsigned int _float_control_word = _control87(0, 0);
- _control87(PC_64|MCW_EM|IC_AFFINE, MCW_PC|MCW_EM|MCW_IC);
-# endif
- CPPUNIT_TEST(num_put_float);
- CPPUNIT_TEST(num_put_integer);
- CPPUNIT_TEST(num_get_float);
- CPPUNIT_TEST(num_get_integer);
- CPPUNIT_TEST(inhex);
- CPPUNIT_TEST(pointer);
- CPPUNIT_TEST(fix_float_long);
- CPPUNIT_TEST(custom_numpunct);
-# if defined (__BORLANDC__)
- /* Reset floating point control word */
- _clear87();
- _control87(_float_control_word, MCW_PC|MCW_EM|MCW_IC);
-# endif
- CPPUNIT_TEST_SUITE_END();
-
-private:
- void num_put_float();
- void num_put_integer();
- void num_get_float();
- void num_get_integer();
- void inhex();
- void pointer();
- void fix_float_long();
- void custom_numpunct();
-
- static bool check_float(float val, float ref)
- {
- float epsilon = numeric_limits<float>::epsilon();
- return val <= ref + epsilon && val >= ref - epsilon;
- }
-
- static bool check_double(double val, double ref)
- {
- double epsilon = numeric_limits<double>::epsilon();
- return val <= ref + epsilon && val >= ref - epsilon;
- }
-
- static string reset_stream(ostringstream &ostr)
- {
- string tmp = ostr.str();
- ostr.str("");
- return tmp;
- }
-
-#if !defined (STLPORT) || !defined (_STLP_NO_MEMBER_TEMPLATES)
- template <class F>
- void check_get_float( F v )
- {
- F in_val_d = v;
- typedef numeric_limits<F> limits;
- {
- stringstream str;
-
- str << "1E+" << limits::max_exponent10;
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != limits::infinity() );
- }
- {
- stringstream str;
-
- str << "-1E+" << limits::max_exponent10;
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != -limits::infinity() );
- }
- {
- stringstream str;
-
- str << "1E" << limits::min_exponent10;
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != F(0.0) );
- }
- {
- stringstream str;
-
- str << "1E+" << (limits::max_exponent10 + 1);
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d == limits::infinity() );
- }
- {
- stringstream str;
-
- str << "-1E+" << (limits::max_exponent10 + 1);
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d == -limits::infinity() );
- }
- {
- stringstream str;
-
- str << "1E" << (limits::min_exponent10 - 1);
-
- str >> in_val_d;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d >= F(0.0) && in_val_d <= limits::min() );
- }
-#if !defined (__MINGW32__)
- {
- stringstream str;
-
- str << limits::max();
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_CHECK( str.str() != "inf" );
- CPPUNIT_CHECK( str.str() != "-inf" );
- CPPUNIT_CHECK( str.str() != "nan" );
- CPPUNIT_CHECK( str.str() != "-nan" );
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- //str.str("");
- //str << limits::max_exponent10;
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- str >> in_val_d;
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != limits::infinity() );
- }
- {
- stringstream str;
-
- str << fixed << limits::max();
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_CHECK( str.str() != "inf" );
- CPPUNIT_CHECK( str.str() != "-inf" );
- CPPUNIT_CHECK( str.str() != "nan" );
- CPPUNIT_CHECK( str.str() != "-nan" );
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- //str.str("");
- //str << limits::max_exponent10;
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- str >> in_val_d;
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != limits::infinity() );
- }
- {
- stringstream str;
-
- str << scientific << setprecision(50) << limits::max();
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_CHECK( str.str() != "inf" );
- CPPUNIT_CHECK( str.str() != "-inf" );
- CPPUNIT_CHECK( str.str() != "nan" );
- CPPUNIT_CHECK( str.str() != "-nan" );
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- //str.str("");
- //str << limits::max_exponent10;
- //CPPUNIT_MESSAGE( str.str().c_str() );
-
- str >> in_val_d;
-
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_CHECK( in_val_d == in_val_d );
- CPPUNIT_CHECK( in_val_d != limits::infinity() );
- }
-#endif
- {
- stringstream str;
-
- str << limits::infinity();
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( !limits::has_infinity || str.str() == "inf" );
- }
- {
- stringstream str;
-
- str << -limits::infinity();
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( !limits::has_infinity || str.str() == "-inf" );
- }
- {
- stringstream str;
-
- str << limits::quiet_NaN();
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( !limits::has_quiet_NaN || str.str() == "nan" );
- }
- {
- stringstream str;
-
- str << -limits::quiet_NaN();
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( !limits::has_quiet_NaN || str.str() == "-nan" );
- }
- {
- stringstream str;
-
- str << "0." << string(limits::max_exponent10, '0') << "1e" << (limits::max_exponent10 + 1);
- CPPUNIT_ASSERT( !str.fail() );
-
- str >> in_val_d;
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( str.eof() );
- CPPUNIT_CHECK( in_val_d == 1 );
- }
- {
- stringstream str;
-
- str << "1" << string(-(limits::min_exponent10 - 1), '0') << "e" << (limits::min_exponent10 - 1);
- CPPUNIT_ASSERT( !str.fail() );
-
- str >> in_val_d;
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( str.eof() );
- CPPUNIT_CHECK( in_val_d == 1 );
- }
-# if defined (_STLPORT_VERSION) && (_STLPORT_VERSION >= 0x530)
- // The following tests are showing that simply changing stream
- // precision lead to different result. Do not seems to be a real
- // problem, simply rounding approximation but additional study should
- // be done after 5.2 release.
- {
- stringstream str;
- str << setprecision(limits::digits10 + 2) << limits::max();
-
- CPPUNIT_MESSAGE(str.str().c_str());
- CPPUNIT_ASSERT( !str.fail() );
-
- F val;
- str >> val;
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( limits::infinity() > val );
- }
- {
- stringstream str;
- str << setprecision(limits::digits10 + 1) << limits::max();
-
- CPPUNIT_MESSAGE(str.str().c_str());
- CPPUNIT_ASSERT( !str.fail() );
-
- F val;
- str >> val;
-
- CPPUNIT_ASSERT( !str.fail() );
- CPPUNIT_ASSERT( limits::infinity() > val );
- }
-# endif
- }
-#else
-# define __check_get_float( F ) \
- void check_get_float( F v ) \
- { \
- F in_val_d = v; \
- { \
- stringstream str; \
- \
- str << "1E+" << numeric_limits<F>::max_exponent10; \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d != numeric_limits<F>::infinity() ); \
- } \
- { \
- stringstream str; \
- \
- str << "-1E+" << numeric_limits<F>::max_exponent10; \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d != -numeric_limits<F>::infinity() ); \
- } \
- { \
- stringstream str; \
- \
- str << "1E" << numeric_limits<F>::min_exponent10; \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d != F(0.0) ); \
- } \
- { \
- stringstream str; \
- \
- str << "1E+" << (numeric_limits<F>::max_exponent10 + 1); \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d == numeric_limits<F>::infinity() ); \
- } \
- { \
- stringstream str; \
- \
- str << "-1E+" << (numeric_limits<F>::max_exponent10 + 1); \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d == -numeric_limits<F>::infinity() ); \
- } \
- { \
- stringstream str; \
- \
- str << "1E" << (numeric_limits<F>::min_exponent10 - 1); \
- \
- str >> in_val_d; \
- CPPUNIT_ASSERT(!str.fail()); \
- CPPUNIT_ASSERT(str.eof()); \
- CPPUNIT_CHECK( in_val_d == in_val_d ); \
- CPPUNIT_CHECK( in_val_d >= F(0.0) && in_val_d <= numeric_limits<F>::min() ); \
- } \
- }
-
- __check_get_float( float )
- __check_get_float( double )
-# if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
- __check_get_float( long double )
-# endif
-# undef __check_get_float
-#endif // _STLP_NO_MEMBER_TEMPLATES
-};
-
-CPPUNIT_TEST_SUITE_REGISTRATION(NumPutGetTest);
-
-#if defined (_MSC_VER)
-# pragma warning (disable : 4056)
-# pragma warning (disable : 4756)
-#endif
-
-//
-// tests implementation
-//
-void NumPutGetTest::num_put_float()
-{
- {
- string output, digits;
-
- {
- ostringstream ostr;
- ostr << 1.23457e+17f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- digits = "17";
- complete_digits(digits);
- CPPUNIT_CHECK(output == string("1.23457e+") + digits );
- }
-
- {
- ostringstream ostr;
- ostr << setprecision(200) << 1.23457e+17f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK( output.size() < 200 );
- }
-
- {
- ostringstream ostr;
- ostr << setprecision(200) << numeric_limits<float>::min();
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK( output.size() < 200 );
- }
-
- {
- ostringstream ostr;
- ostr << fixed << 1.23457e+17f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output.size() == 25);
- CPPUNIT_CHECK(output.substr(0, 5) == "12345");
- CPPUNIT_CHECK(output.substr(18) == ".000000");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << 1.23457e+17f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output.size() == 26);
- CPPUNIT_CHECK(output.substr(0, 6) == "+12345");
- CPPUNIT_CHECK(output.substr(19) == ".000000");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(100) << 1.23457e+17f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output.size() == 120);
- CPPUNIT_CHECK(output.substr(0, 6) == "+12345");
- CPPUNIT_CHECK(output.substr(19) == ".0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" );
- }
-
- {
- ostringstream ostr;
- ostr << scientific << setprecision(8) << 0.12345678f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- digits = "1";
- complete_digits(digits);
- CPPUNIT_CHECK(output == string("1.23456780e-") + digits );
- }
-
- {
- ostringstream ostr;
- ostr << fixed << setprecision(8) << setw(30) << setfill('0') << 0.12345678f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output == "000000000000000000000.12345678");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(8) << setw(30) << setfill('0') << 0.12345678f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output == "0000000000000000000+0.12345678");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(8) << setw(30) << left << setfill('0') << 0.12345678f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output == "+0.123456780000000000000000000");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(8) << setw(30) << internal << setfill('0') << 0.12345678f;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output == "+00000000000000000000.12345678");
- }
-
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(100) << 1.234567e+17;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output.size() == 120);
- CPPUNIT_CHECK(output.substr(0, 6) == "+12345");
- CPPUNIT_CHECK(output.substr(19) == ".0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" );
- }
-
-#if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
- {
- ostringstream ostr;
- ostr << fixed << showpos << setprecision(100) << 1.234567e+17l;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK(output.size() == 120);
- CPPUNIT_CHECK(output.substr(0, 6) == "+12345");
- CPPUNIT_CHECK(output.substr(19) == ".0000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000000" );
- }
-#endif
-
- {
- ostringstream ostr;
- ostr << scientific << setprecision(50) << 0.0;
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- CPPUNIT_CHECK( output == "0.00000000000000000000000000000000000000000000000000e+00" );
- }
- {
- ostringstream ostr;
- ostr << fixed << setprecision(100) << numeric_limits<float>::max();
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- //CPPUNIT_MESSAGE( output.c_str() );
- }
-
- {
- ostringstream ostr;
- ostr << setprecision(100) << numeric_limits<double>::max();
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- //CPPUNIT_MESSAGE( output.c_str() );
- }
-
-#if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
- {
- ostringstream ostr;
- ostr << setprecision(100) << numeric_limits<long double>::max();
- CPPUNIT_ASSERT(ostr.good());
- output = reset_stream(ostr);
- //CPPUNIT_MESSAGE( output.c_str() );
- }
-#endif
-
- //{
- // ostringstream ostr;
- // ostr << setprecision(-numeric_limits<float>::min_exponent10 + numeric_limits<float>::digits10 + 9) << numeric_limits<float>::min();
- // CPPUNIT_ASSERT(ostr.good());
- // output = reset_stream(ostr);
- // //CPPUNIT_MESSAGE( output.c_str() );
- //}
-
- //{
- // ostringstream ostr;
- // ostr << setprecision(-numeric_limits<double>::min_exponent10 + numeric_limits<double>::digits10) << numeric_limits<double>::min();
- // CPPUNIT_ASSERT(ostr.good());
- // output = reset_stream(ostr);
- // //CPPUNIT_MESSAGE( output.c_str() );
- //}
-
-//#if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
-// {
-// ostringstream ostr;
-// ostr << setprecision(-numeric_limits<long double>::min_exponent10 + numeric_limits<long double>::digits10) << numeric_limits<long double>::min();
-// CPPUNIT_ASSERT(ostr.good());
-// output = reset_stream(ostr);
-// CPPUNIT_MESSAGE( output.c_str() );
-// }
-//#endif
- }
-
- {
- ostringstream str;
-
- str.setf(ios::fixed, ios::floatfield);
- str << 1.0e+5;
- // cerr << str.str() << endl;
- CPPUNIT_CHECK( str.str() == "100000.000000" );
-
- reset_stream(str);
- str.precision(0);
- str << 1.0e+5;
- CPPUNIT_CHECK( str.str() == "100000" );
-
- reset_stream(str);
- str.precision(4);
- str << 1.0e+5;
- CPPUNIT_CHECK( str.str() == "100000.0000" );
-
- reset_stream(str);
- str.precision(0);
- str << 1.0e+83;
- CPPUNIT_CHECK( str.str().size() == 84 );
- //printf("\nC result: %.0f\n", 1.0e+83);
- //CPPUNIT_MESSAGE( str.str().c_str() );
- //CPPUNIT_CHECK( str.str() == "100000000000000000000000000000000000000000000000000000000000000000000000000000000000" );
-
- // cerr.setf(ios::fixed, ios::floatfield);
- // cerr << DBL_MAX << endl;
- // cerr << 1.0e+37 << endl;
- }
-}
-
-#define CHECK_COMPLETE(type, val, base, showbase, showpos, casing, width, adjust, expected) \
-{ \
- type tmp = val; \
- ostringstream ostr; \
- ostr << base << showbase << showpos << casing << setw(width) << adjust << tmp; \
- CPPUNIT_CHECK( ostr.str() == expected ); \
-}
-
-#define CHECK(type, val, base, expected) \
- CHECK_COMPLETE(type, val, base, noshowbase, noshowpos, nouppercase, 0, right, expected)
-
-void NumPutGetTest::num_put_integer()
-{
- //octal outputs
- {
- CHECK(short, 0, oct, "0")
- CHECK(short, 1, oct, "1")
- CHECK(short, 12345, oct, "30071")
- if (sizeof(short) == 2) {
- CHECK(short, -1, oct, "177777")
- CHECK(short, -12345, oct, "147707")
- }
-
- CHECK(unsigned short, 0, oct, "0")
- CHECK(unsigned short, 12345, oct, "30071")
-
- CHECK(int, 0, oct, "0")
- CHECK(int, 12345678, oct, "57060516")
- if (sizeof(int) == 4) {
- CHECK(int, -1, oct, "37777777777")
- CHECK(int, -12345678, oct, "37720717262")
- }
-
- CHECK(unsigned int, 0, oct, "0")
- CHECK(unsigned int, 12345678, oct, "57060516")
-
- CHECK(long, 0, oct, "0")
- CHECK(long, 12345678, oct, "57060516")
- if (sizeof(long) == 4) {
- CHECK(long, -1, oct, "37777777777")
- CHECK(long, -12345678, oct, "37720717262")
- }
-
- CHECK(unsigned long, 0, oct, "0")
- CHECK(unsigned long, 12345678, oct, "57060516")
-
-#if defined (STLPORT) && defined (_STLP_LONG_LONG)
- CHECK(_STLP_LONG_LONG, 0, oct, "0")
- CHECK(_STLP_LONG_LONG, 12345678, oct, "57060516")
- if (sizeof(_STLP_LONG_LONG) == 8) {
- CHECK(_STLP_LONG_LONG, -1, oct, "1777777777777777777777")
- CHECK(_STLP_LONG_LONG, -12345678, oct, "1777777777777720717262")
- }
-
- CHECK(unsigned _STLP_LONG_LONG, 0, oct, "0")
- CHECK(unsigned _STLP_LONG_LONG, 12345678, oct, "57060516")
-#endif
-
- //Even with showbase, 0 value gives "0" (see printf documentation)
- CHECK_COMPLETE(short, 0, oct, showbase, noshowpos, nouppercase, 0, right, "0")
- CHECK_COMPLETE(short, 0, oct, showbase, showpos, nouppercase, 6, right, " 0")
-
- CHECK_COMPLETE(short, 1, oct, showbase, noshowpos, nouppercase, 6, right, " 01")
- CHECK_COMPLETE(short, 1, oct, showbase, noshowpos, nouppercase, 6, left, "01 ")
- CHECK_COMPLETE(short, 1, oct, showbase, showpos, nouppercase, 6, internal, " 01")
- }
-
- //decimal outputs
- {
- CHECK(short, 0, dec, "0")
- CHECK(short, -1, dec, "-1")
- CHECK(short, 12345, dec, "12345")
- CHECK(short, -12345, dec, "-12345")
-
- CHECK(unsigned short, 0, dec, "0")
- CHECK(unsigned short, 12345, dec, "12345")
-
- CHECK(int, 0, dec, "0")
- CHECK(int, -1, dec, "-1")
- CHECK(int, 12345678, dec, "12345678")
- CHECK(int, -12345678, dec, "-12345678")
-
- CHECK(unsigned int, 0, dec, "0")
- CHECK(unsigned int, 12345678, dec, "12345678")
-
- CHECK(long, 0, dec, "0")
- CHECK(long, -1, dec, "-1")
- CHECK(long, 12345678, dec, "12345678")
- CHECK(long, -12345678, dec, "-12345678")
-
- CHECK(unsigned long, 0, dec, "0")
- CHECK(unsigned long, 12345678, dec, "12345678")
-#if defined (STLPORT) && defined (_STLP_LONG_LONG)
- CHECK(_STLP_LONG_LONG, 0, dec, "0")
- CHECK(_STLP_LONG_LONG, -1, dec, "-1")
- CHECK(_STLP_LONG_LONG, 12345678, dec, "12345678")
- CHECK(_STLP_LONG_LONG, -12345678, dec, "-12345678")
-
- CHECK(unsigned _STLP_LONG_LONG, 0, dec, "0")
- CHECK(unsigned _STLP_LONG_LONG, 12345678, dec, "12345678")
-#endif
-
- CHECK_COMPLETE(short, 0, dec, showbase, showpos, nouppercase, 0, right, "+0")
- CHECK_COMPLETE(short, 0, dec, showbase, showpos, nouppercase, 6, right, " +0")
- CHECK_COMPLETE(short, 1, dec, showbase, showpos, nouppercase, 6, right, " +1")
- CHECK_COMPLETE(short, 1, dec, showbase, showpos, nouppercase, 6, left, "+1 ")
- CHECK_COMPLETE(short, 1, dec, showbase, showpos, nouppercase, 6, internal, "+ 1")
- }
-
- //hexadecimal outputs
- {
- CHECK(short, 0, hex, "0")
- CHECK(short, 12345, hex, "3039")
- if (sizeof(short) == 2) {
- CHECK(short, -1, hex, "ffff")
- CHECK(short, -12345, hex, "cfc7")
- }
-
- CHECK(unsigned short, 0, hex, "0")
- CHECK(unsigned short, 12345, hex, "3039")
-
- CHECK(int, 0, hex, "0")
- CHECK(int, 12345678, hex, "bc614e")
- if (sizeof(int) == 4) {
- CHECK(int, -1, hex, "ffffffff")
- CHECK(int, -12345678, hex, "ff439eb2")
- }
-
- CHECK(unsigned int, 0, hex, "0")
- CHECK(unsigned int, 12345678, hex, "bc614e")
-
- CHECK(long, 0, hex, "0")
- CHECK(long, 12345678, hex, "bc614e")
- if (sizeof(long) == 4) {
- CHECK(long, -1, hex, "ffffffff")
- CHECK(long, -12345678, hex, "ff439eb2")
- }
-
- CHECK(unsigned long, 0, hex, "0")
- CHECK(unsigned long, 12345678, hex, "bc614e")
-#if defined (STLPORT) && defined (_STLP_LONG_LONG)
- CHECK(_STLP_LONG_LONG, 0, hex, "0")
- CHECK(_STLP_LONG_LONG, 12345678, hex, "bc614e")
- if (sizeof(_STLP_LONG_LONG) == 8) {
- CHECK(_STLP_LONG_LONG, -1, hex, "ffffffffffffffff")
- CHECK(_STLP_LONG_LONG, -12345678, hex, "ffffffffff439eb2")
- }
-
- CHECK(unsigned _STLP_LONG_LONG, 0, hex, "0")
- CHECK(unsigned _STLP_LONG_LONG, 12345678, hex, "bc614e")
-#endif
-
- //Even with showbase, 0 value gives "0" output (see printf documentation)
- CHECK_COMPLETE(short, 0, hex, showbase, showpos, nouppercase, 0, right, "0")
- CHECK_COMPLETE(short, 0, hex, showbase, noshowpos, nouppercase, 6, right, " 0")
- CHECK_COMPLETE(short, 0, hex, showbase, noshowpos, nouppercase, 6, internal, " 0")
-
- CHECK_COMPLETE(short, 1, hex, showbase, noshowpos, nouppercase, 6, right, " 0x1")
- CHECK_COMPLETE(short, 1, hex, showbase, noshowpos, nouppercase, 6, left, "0x1 ")
- CHECK_COMPLETE(short, 1, hex, showbase, noshowpos, nouppercase, 6, internal, "0x 1")
- CHECK_COMPLETE(short, 1, hex, showbase, noshowpos, uppercase, 6, left, "0X1 ")
- CHECK_COMPLETE(short, 1, hex, showbase, showpos, uppercase, 6, internal, "0X 1")
- }
-}
-
-void NumPutGetTest::num_get_float()
-{
- float in_val;
-
- istringstream istr;
-
- istr.str("1.2345");
- istr >> in_val;
- CPPUNIT_ASSERT(!istr.fail());
- CPPUNIT_ASSERT(istr.eof());
- CPPUNIT_ASSERT(check_float(in_val, 1.2345f));
- istr.clear();
-
- istr.str("-1.2345");
- istr >> in_val;
- CPPUNIT_ASSERT(!istr.fail());
- CPPUNIT_ASSERT(istr.eof());
- CPPUNIT_ASSERT(check_float(in_val, -1.2345f));
- istr.clear();
-
- istr.str("+1.2345");
- istr >> in_val;
- CPPUNIT_ASSERT(!istr.fail());
- CPPUNIT_ASSERT(check_float(in_val, 1.2345f));
- istr.clear();
-
- istr.str("000000000000001.234500000000");
- istr >> in_val;
- CPPUNIT_ASSERT(!istr.fail());
- CPPUNIT_ASSERT(istr.eof());
- CPPUNIT_ASSERT(check_float(in_val, 1.2345f));
- istr.clear();
-
- istr.str("1.2345e+04");
- istr >> in_val;
- CPPUNIT_ASSERT(!istr.fail());
- CPPUNIT_ASSERT(istr.eof());
- CPPUNIT_ASSERT(check_float(in_val, 12345.0f));
- istr.clear();
-
- CPPUNIT_MESSAGE( "float" );
- check_get_float( 0.0F );
- CPPUNIT_MESSAGE( "double" );
- check_get_float( 0.0 );
-#if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
- CPPUNIT_MESSAGE( "long double" );
- check_get_float( 0.0L );
-#endif
- {
- stringstream str;
-
- str << "1e" << numeric_limits<double>::max_exponent10;
- CPPUNIT_ASSERT(!str.fail());
-
- float val;
- str >> val;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_ASSERT( numeric_limits<double>::max_exponent10 <= numeric_limits<float>::max_exponent10 ||
- val == numeric_limits<float>::infinity() );
- }
- {
- stringstream str;
-
- str << "1e" << numeric_limits<double>::min_exponent10;
- CPPUNIT_ASSERT(!str.fail());
-
- float val;
- str >> val;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_ASSERT( numeric_limits<double>::min_exponent10 >= numeric_limits<float>::min_exponent10 ||
- val == 0.0f );
- }
-#if !defined (STLPORT) || !defined (_STLP_NO_LONG_DOUBLE)
- {
- stringstream str;
-
- str << "1e" << numeric_limits<long double>::max_exponent10;
- CPPUNIT_ASSERT(!str.fail());
-
- double val;
- str >> val;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_ASSERT( numeric_limits<long double>::max_exponent10 <= numeric_limits<double>::max_exponent10 ||
- val == numeric_limits<double>::infinity() );
- }
- {
- stringstream str;
-
- str << "1e" << numeric_limits<long double>::min_exponent10;
- CPPUNIT_ASSERT(!str.fail());
-
- double val;
- str >> val;
- CPPUNIT_ASSERT(!str.fail());
- CPPUNIT_ASSERT(str.eof());
- CPPUNIT_ASSERT( numeric_limits<long double>::min_exponent10 >= numeric_limits<double>::min_exponent10 ||
- val == 0.0 );
- }
- {
- const char* p = "2.718281828459045235360287471352662497757247093e0";
- std::stringstream s;
- s << p;
- long double x;
- s >> x;
- CPPUNIT_ASSERT( x > 2.70l && x < 2.72l );
- }
-#endif
-}
-
-void NumPutGetTest::num_get_integer()
-{
- //octal input
- {
- istringstream istr;
- istr.str("30071");
- short val;
- istr >> oct >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 12345 );
- istr.clear();
-
- if (sizeof(short) == 2) {
- istr.str("177777");
- istr >> oct >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == -1 );
- istr.clear();
- }
- }
-
- //decimal input
- {
- istringstream istr;
- istr.str("10000");
- short val = -1;
- istr >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 10000 );
- istr.clear();
-
- istr.str("+10000");
- val = -1;
- istr >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 10000 );
- istr.clear();
-
- if (sizeof(short) == 2) {
- val = -1;
- istr.str("10000000");
- istr >> val;
- CPPUNIT_ASSERT( istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == -1 );
- istr.clear();
- }
-
- val = -1;
- istr.str("0x0");
- istr >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( !istr.eof() );
- CPPUNIT_ASSERT( val == 0 );
- istr.clear();
-
- val = -1;
- istr.str("000001");
- istr >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 1 );
- istr.clear();
- }
-
- //hexadecimal input
- {
- istringstream istr;
- istr.str("3039");
- short val = -1;
- istr >> hex >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 12345 );
- istr.clear();
-
- istr.str("x3039");
- val = -1;
- istr >> hex >> val;
- CPPUNIT_ASSERT( istr.fail() );
- CPPUNIT_ASSERT( !istr.eof() );
- CPPUNIT_ASSERT( val == -1 );
- istr.clear();
-
- istr.str("03039");
- val = -1;
- istr >> hex >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 12345 );
- istr.clear();
-
- istr.str("0x3039");
- istr >> hex >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == 12345 );
- istr.clear();
-
- if (sizeof(short) == 2) {
- val = -1;
- istr.str("cfc7");
- istr >> hex >> val;
- CPPUNIT_ASSERT( !istr.fail() );
- CPPUNIT_ASSERT( istr.eof() );
- CPPUNIT_ASSERT( val == -12345 );
- istr.clear();
- }
- }
-}
-
-void NumPutGetTest::inhex()
-{
- {
- ostringstream s;
- s << hex << 0;
- CPPUNIT_CHECK( s.str() == "0" );
- }
- {
- ostringstream s;
- s << hex << 0xff;
- CPPUNIT_CHECK( s.str() == "ff" );
- }
- {
- ostringstream s;
- s << hex << setw( 4 ) << 0xff;
- CPPUNIT_CHECK( s.str() == " ff" );
- }
- {
- ostringstream s;
- s << hex << setw( 4 ) << 0;
- CPPUNIT_CHECK( s.str() == " 0" );
- }
- {
- ostringstream s;
- s << hex << showbase << 0;
- CPPUNIT_CHECK( s.str() == "0" );
- }
- {
- ostringstream s;
- s << hex << showbase << 0xff;
- CPPUNIT_CHECK( s.str() == "0xff" );
- }
- {
- ostringstream s;
- s << hex << showbase << setw( 4 ) << 0xff;
- CPPUNIT_CHECK( s.str() == "0xff" );
- }
- { // special case for regression (partially duplicate CHECK_COMPLETE above):
- ostringstream s;
- s.setf( ios_base::internal, ios_base::adjustfield );
- s << hex << showbase << setw(8+2) << 0;
- CPPUNIT_CHECK( s.str() == " 0" );
- }
-}
-
-void NumPutGetTest::pointer()
-{
- // Problem with printing pointer to null
-
- /*
- * Really C's formatting not help here, due to:
- *
- * p The argument shall be a pointer to void. The value of
- * the pointer is converted to a sequence of printable characters,
- * in an implementation-defined manner.
- */
- {
- /*
- char buf[128];
- void *p = (void *)0xff00;
- sprintf( buf, "%p", p );
- // cerr << buf << endl;
- // Hmmm, I see 0xff00 on box with 32-bits address; pointer like 'unsigned hex'?
- if ( sizeof( p ) == 2 ) {
- CPPUNIT_ASSERT( strcmp( buf, "0xff00" ) == 0 );
- } else if ( sizeof( p ) == 4 ) {
- CPPUNIT_ASSERT( strcmp( buf, "0x0000ff00" ) == 0 );
- } else if ( sizeof( p ) == 8 ) {
- CPPUNIT_ASSERT( strcmp( buf, "0x000000000000ff00" ) == 0 );
- } else {
- CPPUNIT_CHECK( sizeof( p ) == 2 || sizeof( p ) == 4 || sizeof( p ) == 8 );
- }
- */
- }
- {
- /*
- char buf[128];
- void *p = 0;
- */
- // sprintf( buf, "%p", p );
- /* Cool. "%p" print '(nil)'; "%#x" print '0' */
- // sprintf( buf, "%#x", (unsigned)p );
- // cerr << buf << endl;
- }
- {
- ostringstream s;
- void *p = (void *)0xff00;
- s << p;
- CPPUNIT_ASSERT( s.good() );
- if ( sizeof( p ) == 2 ) {
- CPPUNIT_ASSERT( s.str() == "0xff00" );
- } else if ( sizeof( p ) == 4 ) {
- CPPUNIT_ASSERT( s.str() == "0x0000ff00" ); // this pass
- } else if ( sizeof( p ) == 8 ) {
- CPPUNIT_ASSERT( s.str() == "0x000000000000ff00" );
- } else {
- CPPUNIT_CHECK( sizeof( p ) == 2 || sizeof( p ) == 4 || sizeof( p ) == 8 );
- }
- }
- {
- ostringstream s;
- void *p = 0;
- s << p;
- CPPUNIT_ASSERT( s.good() );
- if ( sizeof( p ) == 2 ) {
- CPPUNIT_ASSERT( s.str() == "0x0000" );
- } else if ( sizeof( p ) == 4 ) {
- CPPUNIT_ASSERT( s.str() == "0x00000000" ); // but this will fail, if follow %p
- } else if ( sizeof( p ) == 8 ) {
- CPPUNIT_ASSERT( s.str() == "0x0000000000000000" );
- } else {
- CPPUNIT_CHECK( sizeof( p ) == 2 || sizeof( p ) == 4 || sizeof( p ) == 8 );
- }
- }
-}
-
-void NumPutGetTest::fix_float_long()
-{
- ostringstream str;
-
- str.setf(ios::fixed, ios::floatfield);
- str << 1.0e+5;
- CPPUNIT_CHECK( str.str() == "100000.000000" );
-
- reset_stream(str);
- str.precision(0);
- str << 1.0e+5;
- CPPUNIT_CHECK( str.str() == "100000" );
-
- reset_stream(str);
- str.precision(4);
- str << 1.0e+5;
- CPPUNIT_CHECK( str.str() == "100000.0000" );
-
- reset_stream(str);
- str.precision(0);
- str << 1.0e+83;
- {
- istringstream istr( str.str() );
- double f;
- istr >> f;
- CPPUNIT_CHECK( !istr.fail() );
- if ( int(numeric_limits<double>::digits10) < 83 ) {
- double delta = 1.0;
- for ( int ee = 83 - int(numeric_limits<double>::digits10); ee > 0; --ee ) {
- delta *= 10.0;
- }
- // we may loss some digits here, but not more than mantissa:
- CPPUNIT_CHECK( (f > (1.0e+83 - delta)) && (f < (1.0e+83 + delta)) );
- } else {
- CPPUNIT_CHECK( check_double(f, 1.0e+83) );
- }
- }
-
-#if 0 // #ifndef _STLP_NO_LONG_DOUBLE
- reset_stream(str);
- str.precision(0);
- str << 1.0e+83l;
- {
- istringstream istr( str.str() );
- long double f;
- istr >> f;
- CPPUNIT_CHECK( !istr.fail() );
- if ( int(numeric_limits<long double>::digits10) < 83 ) {
- long double delta = 1.0l;
- for ( int ee = 83 - int(numeric_limits<long double>::digits10); ee > 0; --ee ) {
- delta *= 10.0l;
- }
- // we may loss some digits here, but not more than mantissa:
- cerr << "0123456789012345678901234567890123456789012345678901234567890123456789012345678901234567890123456789" << endl;
- cerr << str.str() << endl;
- cerr << delta << endl;
- cerr << f << endl;
- CPPUNIT_CHECK( (f > (1.0e+83l - delta)) && (f < (1.0e+83l + delta)) );
- } else {
- CPPUNIT_CHECK( check_double(f, 1.0e+83l) );
- }
- }
-#endif
-
- reset_stream(str);
- str.precision(0);
- str << numeric_limits<double>::max();
- {
- istringstream istr( str.str() );
- double f;
- istr >> f;
- CPPUNIT_CHECK( !istr.fail() );
- if ( int(numeric_limits<double>::digits10) < int(numeric_limits<double>::max_exponent10) ) {
- double delta = 9.0;
- for ( int ee = int(numeric_limits<double>::max_exponent10) - int(numeric_limits<double>::digits10); ee > 0; --ee ) {
- delta *= 10.0;
- }
- // we may loss some digits here, but not more than mantissa:
- CPPUNIT_CHECK( (f > (numeric_limits<double>::max() - delta)) );
- }
- }
-
-#if 0 // #ifndef _STLP_NO_LONG_DOUBLE
- reset_stream(str);
- str.precision(0);
- str << numeric_limits<long double>::max();
- {
- istringstream istr( str.str() );
- long double f;
- istr >> f;
- CPPUNIT_CHECK( !istr.fail() );
- if ( int(numeric_limits<long double>::digits10) < int(numeric_limits<long double>::max_exponent10) ) {
- long double delta = 1.0l;
- for ( int ee = int(numeric_limits<long double>::max_exponent10) - int(numeric_limits<long double>::digits10); ee > 0; --ee ) {
- delta *= 10.0l;
- }
- // we may loss some digits here, but not more than mantissa:
- CPPUNIT_CHECK( (f > (numeric_limits<long double>::max() - delta)) );
- }
- }
-#endif
-}
-
-class CommaSepNumPunct : public numpunct<char> {
- char do_thousands_sep() const { return ','; }
- string do_grouping() const { return string("\1\2\3") + (char)CHAR_MAX; }
-};
-
-#define CHECK2(val, expected) \
- os.str(""); os << fixed << setprecision(3) << showpos << val; \
- CPPUNIT_ASSERT( os.str() == expected )
-
-void NumPutGetTest::custom_numpunct()
-{
- ostringstream os;
- locale loc(os.getloc(), new CommaSepNumPunct());
- os.imbue(loc);
-
- CHECK2(1, "+1");
- CHECK2(10, "+1,0");
- CHECK2(100, "+10,0");
- CHECK2(1000, "+1,00,0");
-
- CHECK2(1.234, "+1.234");
- CHECK2(123.456, "+12,3.456");
- CHECK2(1234.567, "+1,23,4.567");
- CHECK2(12345.678, "+12,34,5.678");
- CHECK2(123456.789, "+123,45,6.789");
- CHECK2(1234567.891, "+1,234,56,7.891");
- CHECK2(123456789.123, "+123,456,78,9.123");
- //CHECK2(100000000000000000000000000000.0, "+100000000000000000000000,000,00,0.000");
- CHECK2(numeric_limits<double>::infinity(), "+inf");
-
- CHECK2(-1.234, "-1.234");
- CHECK2(-123.456, "-12,3.456");
- CHECK2(-1234.567, "-1,23,4.567");
- CHECK2(-12345.678, "-12,34,5.678");
- CHECK2(-123456.789, "-123,45,6.789");
- CHECK2(-1234567.891, "-1,234,56,7.891");
- CHECK2(-123456789.123, "-123,456,78,9.123");
- //CHECK2(-100000000000000000000000000000.0, "-100000000000000000000000,000,00,0.000");
- CHECK2(-numeric_limits<double>::infinity(), "-inf");
-}
-
-#endif