From ea16e50919f21fbab181e20e25b03d1a314634c8 Mon Sep 17 00:00:00 2001 From: Alan Conway Date: Thu, 16 Apr 2015 19:04:23 +0000 Subject: QPID-6470: Fix float conversion problems. Previous code would incorrectly convert between float and int types producing nonsense values, and would not allow legal conversions between float and double types. Created FixedWidthIntValue and FixedWidthFloatValue template subclasses to correctly handle conversions. Enabled FieldValue unit tests for float conversions. git-svn-id: https://svn.apache.org/repos/asf/qpid/trunk@1674137 13f79535-47bb-0310-9956-ffa450edef68 --- qpid/cpp/src/tests/FieldTable.cpp | 8 ++++---- qpid/cpp/src/tests/FieldValue.cpp | 35 ++++++++++++++++++----------------- 2 files changed, 22 insertions(+), 21 deletions(-) (limited to 'qpid/cpp/src/tests') diff --git a/qpid/cpp/src/tests/FieldTable.cpp b/qpid/cpp/src/tests/FieldTable.cpp index 81372d87c5..c040f1d433 100644 --- a/qpid/cpp/src/tests/FieldTable.cpp +++ b/qpid/cpp/src/tests/FieldTable.cpp @@ -176,19 +176,19 @@ QPID_AUTO_TEST_CASE(testFloatAndDouble) Buffer rbuffer(buff, 100); FieldTable a; rbuffer.get(a); - BOOST_CHECK(string("abc") == a.getAsString("string")); - BOOST_CHECK(5672 == a.getAsInt("int")); + BOOST_CHECK_EQUAL(string("abc"), a.getAsString("string")); + BOOST_CHECK_EQUAL(5672, a.getAsInt("int")); float f2; BOOST_CHECK(!a.getFloat("string", f2)); BOOST_CHECK(!a.getFloat("int", f2)); BOOST_CHECK(a.getFloat("float", f2)); - BOOST_CHECK(f2 == f); + BOOST_CHECK_EQUAL(f2, f); double d2; BOOST_CHECK(!a.getDouble("string", d2)); BOOST_CHECK(!a.getDouble("int", d2)); BOOST_CHECK(a.getDouble("double", d2)); - BOOST_CHECK(d2 == d); + BOOST_CHECK_EQUAL(d2, d); } } diff --git a/qpid/cpp/src/tests/FieldValue.cpp b/qpid/cpp/src/tests/FieldValue.cpp index 3e2a761c38..2182a43e35 100644 --- a/qpid/cpp/src/tests/FieldValue.cpp +++ b/qpid/cpp/src/tests/FieldValue.cpp @@ -53,22 +53,15 @@ QPID_AUTO_TEST_CASE(testIntegerValueEquals) BOOST_CHECK(IntegerValue(5) != i); BOOST_CHECK(i != s); BOOST_CHECK(i.convertsTo() == false); - BOOST_CHECK(i.convertsTo() == false); + BOOST_CHECK(i.convertsTo() == true); BOOST_CHECK(i.convertsTo() == true); BOOST_CHECK_THROW(i.get(), InvalidConversionException); - - //FIXME aconway 2015-04-03: fails - //BOOST_CHECK_THROW(i.get(), InvalidConversionException); + BOOST_CHECK_EQUAL(i.get(), 42.0); } QPID_AUTO_TEST_CASE(testFloatValueEquals) { - // FIXME aconway 2015-04-03: The commented out tests are bug QPID-6470. - // The basic problems are: - // - allows meaningles conversion between int and float types. - // - does not allow expected conversion between float and double types. - - // BOOST_CHECK(f.convertsTo() == true); + BOOST_CHECK(f.convertsTo() == true); BOOST_CHECK_EQUAL(FloatValue(42.42), f); BOOST_CHECK_CLOSE(f.get(), 42.42, 0.001); // Check twice, regression test for QPID-6470 where the value was corrupted during get. @@ -76,20 +69,28 @@ QPID_AUTO_TEST_CASE(testFloatValueEquals) BOOST_CHECK_CLOSE(f.get(), 42.42, 0.001); // Float to double conversion - // BOOST_CHECK(f.convertsTo() == true); - // BOOST_CHECK_CLOSE(f.get(), 42.42, 0.001); + BOOST_CHECK(f.convertsTo() == true); + BOOST_CHECK_CLOSE(f.get(), 42.42, 0.001); // Double value + BOOST_CHECK(f.convertsTo() == true); + BOOST_CHECK(f.convertsTo() == true); + BOOST_CHECK_CLOSE(df.get(), 123.123, 0.001); BOOST_CHECK_CLOSE(df.get(), 123.123, 0.001); - // BOOST_CHECK(f.convertsTo() == true); - // BOOST_CHECK(f.convertsTo() == true); - // BOOST_CHECK_CLOSE(df.get(), 123.123, 0.001); // Invalid conversions should fail. BOOST_CHECK(!f.convertsTo()); - // BOOST_CHECK(!f.convertsTo()); + BOOST_CHECK(!f.convertsTo()); BOOST_CHECK_THROW(f.get(), InvalidConversionException); - // BOOST_CHECK_THROW(f.get(), InvalidConversionException); + BOOST_CHECK_THROW(f.get(), InvalidConversionException); + + // getFloatingPointValue: check twice, regression test for QPID-6470 + BOOST_CHECK_CLOSE((f.getFloatingPointValue()), 42.42, 0.001); + BOOST_CHECK_CLOSE((f.getFloatingPointValue()), 42.42, 0.001); + BOOST_CHECK_CLOSE((df.getFloatingPointValue()), 123.123, 0.001); + // getFloatingPointValue should *not* convert float/double, require exact type. + BOOST_CHECK_THROW((f.getFloatingPointValue()), InvalidConversionException); + BOOST_CHECK_THROW((df.getFloatingPointValue()), InvalidConversionException); } QPID_AUTO_TEST_SUITE_END() -- cgit v1.2.1