Skip to content

Commit

Permalink
iox-eclipse-iceoryx#2055 Implement LongDouble::Eq
Browse files Browse the repository at this point in the history
Signed-off-by: Dennis Liu <[email protected]>
  • Loading branch information
Dennis40816 committed Jan 14, 2024
1 parent 910a48c commit 6679b5a
Showing 1 changed file with 32 additions and 7 deletions.
39 changes: 32 additions & 7 deletions iceoryx_hoofs/test/moduletests/test_utility_convert.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -30,6 +30,32 @@ using namespace ::testing;

using NumberType = iox::convert::NumberType;

class LongDouble
{
public:
static bool Eq(long double a, long double b)
{
IOX_LOG(DEBUG, "a: " << a << ", b: " << b);

long double min_val = std::min(std::fabs(a), std::fabs(b));
long double epsilon = std::fabs(min_val - std::nextafter(min_val, static_cast<long double>(0)));

IOX_LOG(DEBUG, "epsilon from min_val: " << epsilon);
IOX_LOG(DEBUG, "abs min_val: " << min_val);

if (epsilon <= 0 || epsilon < std::numeric_limits<long double>::min())
{
epsilon = std::numeric_limits<long double>::min();
}
IOX_LOG(DEBUG, "epsilon: " << epsilon);

long double abs_diff = std::fabs(a - b);
IOX_LOG(DEBUG, "fabs: " << abs_diff);

return abs_diff <= epsilon;
}
};

class convert_test : public Test
{
public:
Expand Down Expand Up @@ -199,10 +225,10 @@ TEST_F(convert_test, fromString_LongDouble_Success)
{
::testing::Test::RecordProperty("TEST_ID", "2864fbae-ef1c-48ab-97f2-745baadc4dc5");
std::string source = "121.01";
constexpr long double VERIFY = 121.01;
constexpr long double VERIFY = 121.01L;
auto result = iox::convert::from_string<long double>(source.c_str());
ASSERT_THAT(result.has_value(), Eq(true));
EXPECT_THAT(static_cast<double>(result.value()), DoubleEq(static_cast<double>(VERIFY)));
EXPECT_THAT(LongDouble::Eq(VERIFY, result.value()), Eq(true));
}

TEST_F(convert_test, fromString_LongDouble_Fail)
Expand Down Expand Up @@ -732,18 +758,17 @@ TEST_F(convert_test, fromString_LongDouble_EdgeCase_InRange_Success)
std::string source = fp_to_string(std::numeric_limits<long double>::min());
auto long_double_min = iox::convert::from_string<long double>(source.c_str());
ASSERT_THAT(long_double_min.has_value(), Eq(true));
// There's no LongDoubleEq
EXPECT_THAT(long_double_min.value(), Eq(std::numeric_limits<long double>::min()));
EXPECT_THAT(LongDouble::Eq(long_double_min.value(), std::numeric_limits<long double>::min()), Eq(true));

source = fp_to_string(std::numeric_limits<long double>::lowest());
auto long_double_lowest = iox::convert::from_string<long double>(source.c_str());
ASSERT_THAT(long_double_lowest.has_value(), Eq(true));
EXPECT_THAT(long_double_lowest.value(), Eq(std::numeric_limits<long double>::lowest()));
EXPECT_THAT(LongDouble::Eq(long_double_lowest.value(), std::numeric_limits<long double>::lowest()), Eq(true));

source = fp_to_string(std::numeric_limits<long double>::max());
auto long_double_max = iox::convert::from_string<long double>(source.c_str());
ASSERT_THAT(long_double_max.has_value(), Eq(true));
EXPECT_THAT(long_double_max.value(), Eq(std::numeric_limits<long double>::max()));
EXPECT_THAT(LongDouble::Eq(long_double_lowest.value(), std::numeric_limits<long double>::max()), Eq(true));
}

TEST_F(convert_test, fromString_LongDouble_EdgeCase_SubNormalLongDouble_ShouldFail)
Expand Down Expand Up @@ -888,7 +913,7 @@ TEST_F(convert_test, fromString_LongDouble_EdgeCase_ZeroDecimalNotation_Success)
{
auto decimal_ret = iox::convert::from_string<long double>(v.c_str());
ASSERT_THAT(decimal_ret.has_value(), Eq(true));
ASSERT_THAT(decimal_ret.value(), Eq(0.0L));
ASSERT_THAT(LongDouble::Eq(decimal_ret.value(), 0.0L), Eq(true));
}
}

Expand Down

0 comments on commit 6679b5a

Please sign in to comment.