summaryrefslogtreecommitdiff
path: root/qpid/cpp/src/tests
diff options
context:
space:
mode:
authorAlan Conway <aconway@apache.org>2015-04-16 19:04:23 +0000
committerAlan Conway <aconway@apache.org>2015-04-16 19:04:23 +0000
commitea16e50919f21fbab181e20e25b03d1a314634c8 (patch)
tree59fc8ce516b7ad1e6b46b2f640b418cd9092f10c /qpid/cpp/src/tests
parente7998631f9c479dd659f409f8e38c910e0028858 (diff)
downloadqpid-python-ea16e50919f21fbab181e20e25b03d1a314634c8.tar.gz
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
Diffstat (limited to 'qpid/cpp/src/tests')
-rw-r--r--qpid/cpp/src/tests/FieldTable.cpp8
-rw-r--r--qpid/cpp/src/tests/FieldValue.cpp35
2 files changed, 22 insertions, 21 deletions
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<std::string>() == false);
- BOOST_CHECK(i.convertsTo<float>() == false);
+ BOOST_CHECK(i.convertsTo<float>() == true);
BOOST_CHECK(i.convertsTo<int>() == true);
BOOST_CHECK_THROW(i.get<std::string>(), InvalidConversionException);
-
- //FIXME aconway 2015-04-03: fails
- //BOOST_CHECK_THROW(i.get<float>(), InvalidConversionException);
+ BOOST_CHECK_EQUAL(i.get<float>(), 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<float>() == true);
+ BOOST_CHECK(f.convertsTo<float>() == true);
BOOST_CHECK_EQUAL(FloatValue(42.42), f);
BOOST_CHECK_CLOSE(f.get<float>(), 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<float>(), 42.42, 0.001);
// Float to double conversion
- // BOOST_CHECK(f.convertsTo<double>() == true);
- // BOOST_CHECK_CLOSE(f.get<double>(), 42.42, 0.001);
+ BOOST_CHECK(f.convertsTo<double>() == true);
+ BOOST_CHECK_CLOSE(f.get<double>(), 42.42, 0.001);
// Double value
+ BOOST_CHECK(f.convertsTo<float>() == true);
+ BOOST_CHECK(f.convertsTo<double>() == true);
+ BOOST_CHECK_CLOSE(df.get<float>(), 123.123, 0.001);
BOOST_CHECK_CLOSE(df.get<double>(), 123.123, 0.001);
- // BOOST_CHECK(f.convertsTo<float>() == true);
- // BOOST_CHECK(f.convertsTo<double>() == true);
- // BOOST_CHECK_CLOSE(df.get<float>(), 123.123, 0.001);
// Invalid conversions should fail.
BOOST_CHECK(!f.convertsTo<std::string>());
- // BOOST_CHECK(!f.convertsTo<int>());
+ BOOST_CHECK(!f.convertsTo<int>());
BOOST_CHECK_THROW(f.get<std::string>(), InvalidConversionException);
- // BOOST_CHECK_THROW(f.get<int>(), InvalidConversionException);
+ BOOST_CHECK_THROW(f.get<int>(), InvalidConversionException);
+
+ // getFloatingPointValue: check twice, regression test for QPID-6470
+ BOOST_CHECK_CLOSE((f.getFloatingPointValue<float,sizeof(float)>()), 42.42, 0.001);
+ BOOST_CHECK_CLOSE((f.getFloatingPointValue<float,sizeof(float)>()), 42.42, 0.001);
+ BOOST_CHECK_CLOSE((df.getFloatingPointValue<double,sizeof(double)>()), 123.123, 0.001);
+ // getFloatingPointValue should *not* convert float/double, require exact type.
+ BOOST_CHECK_THROW((f.getFloatingPointValue<double,sizeof(double)>()), InvalidConversionException);
+ BOOST_CHECK_THROW((df.getFloatingPointValue<float,sizeof(float)>()), InvalidConversionException);
}
QPID_AUTO_TEST_SUITE_END()