From 67968d9b33576ebd6deaadb7a213db8ee9e01fc5 Mon Sep 17 00:00:00 2001 From: Alexander Nasonov Date: Sat, 28 Oct 2006 19:33:32 +0000 Subject: [PATCH] Separate test for round-tripping of floating point types. [SVN r35771] --- lexical_cast_test.cpp | 54 ---------------- test/Jamfile | 3 +- test/Jamfile.v2 | 3 +- test/lexical_cast_loopback_test.cpp | 98 +++++++++++++++++++++++++++++ 4 files changed, 102 insertions(+), 56 deletions(-) create mode 100644 test/lexical_cast_loopback_test.cpp diff --git a/lexical_cast_test.cpp b/lexical_cast_test.cpp index 052a49c..6ba26a3 100644 --- a/lexical_cast_test.cpp +++ b/lexical_cast_test.cpp @@ -67,9 +67,6 @@ void test_conversion_from_ulong(); void test_conversion_from_longlong(); void test_conversion_from_ulonglong(); #endif -void test_round_conversion_float(); -void test_round_conversion_double(); -void test_round_conversion_long_double(); unit_test::test_suite *init_unit_test_suite(int, char *[]) { @@ -100,9 +97,6 @@ unit_test::test_suite *init_unit_test_suite(int, char *[]) suite->add(BOOST_TEST_CASE(&test_conversion_from_longlong)); suite->add(BOOST_TEST_CASE(&test_conversion_from_ulonglong)); #endif - suite->add(BOOST_TEST_CASE(&test_round_conversion_float)); - suite->add(BOOST_TEST_CASE(&test_round_conversion_double)); - suite->add(BOOST_TEST_CASE(&test_round_conversion_long_double)); return suite; } @@ -612,51 +606,3 @@ void test_conversion_from_ulonglong() #endif -template -void test_round_conversion(bool use_min_max_values = true) -{ - T v1 = std::numeric_limits::epsilon(); - std::string s1 = boost::lexical_cast(v1); - BOOST_CHECK(v1 == lexical_cast(s1)); - - if(use_min_max_values) - { - T v2 = (std::numeric_limits::max)(); - std::string s2 = boost::lexical_cast(v2); - BOOST_CHECK(v2 == lexical_cast(s2)); - - T v3 = (std::numeric_limits::min)(); - std::string s3 = boost::lexical_cast(v3); - BOOST_CHECK(v3 == lexical_cast(s3)); - - T v4 = v2 / 137; - std::string s4 = boost::lexical_cast(v4); - BOOST_CHECK(v4 == lexical_cast(s4)); - } - - T v5 = v1 * 137; - std::string s5 = boost::lexical_cast(v5); - BOOST_CHECK(v5 == lexical_cast(s5)); -} - -void test_round_conversion_float() -{ - test_round_conversion(); -} - -void test_round_conversion_double() -{ - test_round_conversion(); -} - -void test_round_conversion_long_double() -{ -#if defined(BOOST_NO_STDLIB_CONFIG) - test_round_conversion(); -#elif defined(__i386__) && defined(__OpenBSD__) - test_round_conversion(false); -#elif !defined(__i386__) || !defined(__FreeBSD__) - test_round_conversion(); -#endif -} - diff --git a/test/Jamfile b/test/Jamfile index 8af8d65..20d8265 100644 --- a/test/Jamfile +++ b/test/Jamfile @@ -27,8 +27,9 @@ DEPENDS all : test ; : [ run implicit_cast.cpp ] [ compile-fail implicit_cast_fail.cpp ] [ run ../cast_test.cpp ] - [ run ../numeric_cast_test.cpp ] + [ run ../numeric_cast_test.cpp ] [ run ../lexical_cast_test.cpp ../../test/build/boost_unit_test_framework ] + [ run lexical_cast_loopback_test.cpp ../../test/build/boost_unit_test_framework ] ; } diff --git a/test/Jamfile.v2 b/test/Jamfile.v2 index 58ae133..1b89444 100644 --- a/test/Jamfile.v2 +++ b/test/Jamfile.v2 @@ -21,6 +21,7 @@ test-suite conversion [ run ../cast_test.cpp ] [ run ../numeric_cast_test.cpp ] [ run ../lexical_cast_test.cpp ../../test/build//boost_unit_test_framework ] + [ run lexical_cast_loopback_test.cpp ../../test/build//boost_unit_test_framework ] ; - \ No newline at end of file + diff --git a/test/lexical_cast_loopback_test.cpp b/test/lexical_cast_loopback_test.cpp new file mode 100644 index 0000000..cd058fe --- /dev/null +++ b/test/lexical_cast_loopback_test.cpp @@ -0,0 +1,98 @@ +// Unit test for boost::lexical_cast. +// +// See http://www.boost.org for most recent version, including documentation. +// +// Copyright Alexander Nasonov, 2006. +// +// Distributed under the Boost +// Software License, Version 1.0. (See accompanying file +// LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt). +// +// Test round-tripping conversion FPT -> string -> FPT, +// where FPT is Floating Point Type. + +#include + +#if defined(__INTEL_COMPILER) +#pragma warning(disable: 193 383 488 981 1418 1419) +#elif defined(BOOST_MSVC) +#pragma warning(disable: 4097 4100 4121 4127 4146 4244 4245 4511 4512 4701 4800) +#endif + +#include +#include + +using namespace boost; + +void test_round_conversion_float(); +void test_round_conversion_double(); +void test_round_conversion_long_double(); + +unit_test::test_suite *init_unit_test_suite(int, char *[]) +{ + unit_test_framework::test_suite *suite = + BOOST_TEST_SUITE("lexical_cast unit test"); + suite->add(BOOST_TEST_CASE(&test_round_conversion_float)); + suite->add(BOOST_TEST_CASE(&test_round_conversion_double)); + suite->add(BOOST_TEST_CASE(&test_round_conversion_long_double)); + + return suite; +} + +template +void test_round_conversion() +{ + T epsilon = std::numeric_limits::epsilon(); + std::string const epsilon_s = boost::lexical_cast(epsilon); + BOOST_CHECK(epsilon == lexical_cast(epsilon_s)); + + T max_ = (std::numeric_limits::max)(); + std::string const max_s = boost::lexical_cast(max_); + BOOST_CHECK(max_ == lexical_cast(max_s)); + + T min_ = (std::numeric_limits::min)(); + std::string const min_s = boost::lexical_cast(min_); + BOOST_CHECK(min_ == lexical_cast(min_s)); + + T max_div137 = max_ / 137; + std::string max_div137_s = boost::lexical_cast(max_div137); + BOOST_CHECK(max_div137 == lexical_cast(max_div137_s)); + + T epsilon_mult137 = epsilon * 137; + std::string epsilon_mult137_s(lexical_cast(epsilon_mult137)); + BOOST_CHECK(epsilon_mult137 == lexical_cast(epsilon_mult137_s)); + +} + +#if defined(BOOST_MSVC) +// See bug http://tinyurl.com/vhpvo +template +void test_msvc_magic_values() +{ + T magic_msvc = 0.00010000433948393407; + std::string magic_msvc_s = boost::lexical_cast(magic_msvc); + BOOST_CHECK(magic_msvc == lexical_cast(magic_msvc_s)); +} +#endif + +void test_round_conversion_float() +{ + test_round_conversion(); +} + +void test_round_conversion_double() +{ + test_round_conversion(); +#if defined(BOOST_MSVC) + test_msvc_magic_values(); +#endif +} + +void test_round_conversion_long_double() +{ + test_round_conversion(); +#if defined(BOOST_MSVC) + test_msvc_magic_values(); +#endif +} +