From 01e8b07452eb691469c0a302fff64ecd5dadd3e3 Mon Sep 17 00:00:00 2001 From: Matthew Sloyan Date: Wed, 23 Sep 2020 09:51:04 +0100 Subject: IVGCVSW-5306 Add floating point type checks to NumericCast.hpp * Added Unit Tests to capture all combinations. Signed-off-by: Matthew Sloyan Change-Id: I04db920a5f5f485dc00b2f16582cf7e0bbef3ef2 --- src/armnn/test/UtilityTests.cpp | 80 ++++++++++++++++++++++++++++++++++++++++- 1 file changed, 79 insertions(+), 1 deletion(-) (limited to 'src/armnn/test/UtilityTests.cpp') diff --git a/src/armnn/test/UtilityTests.cpp b/src/armnn/test/UtilityTests.cpp index 8d933eb435..bad6c2250b 100644 --- a/src/armnn/test/UtilityTests.cpp +++ b/src/armnn/test/UtilityTests.cpp @@ -14,6 +14,8 @@ #include +#include + // Tests of include/Utility files BOOST_AUTO_TEST_SUITE(UtilityTests) @@ -160,6 +162,9 @@ BOOST_AUTO_TEST_CASE(NumericCast) BOOST_CHECK_NO_THROW(numeric_cast(1L << 7)); BOOST_CHECK_NO_THROW(numeric_cast((1L << 15)*-1)); + BOOST_CHECK_NO_THROW(numeric_cast(1U << 8)); + BOOST_CHECK_NO_THROW(numeric_cast(1U << 14)); + // To 32 bit BOOST_CHECK_NO_THROW(numeric_cast(1)); BOOST_CHECK_NO_THROW(numeric_cast(1 << 8)); @@ -170,6 +175,79 @@ BOOST_AUTO_TEST_CASE(NumericCast) BOOST_CHECK_NO_THROW(numeric_cast((1L << 8)*-1)); BOOST_CHECK_NO_THROW(numeric_cast((1L << 16)*-1)); BOOST_CHECK_NO_THROW(numeric_cast((1LL << 31)*-1)); -} + + BOOST_CHECK_NO_THROW(numeric_cast(1U)); + BOOST_CHECK_NO_THROW(numeric_cast(1U << 8)); + BOOST_CHECK_NO_THROW(numeric_cast(1U << 16)); + BOOST_CHECK_NO_THROW(numeric_cast(1U << 30)); + + float float_max = std::numeric_limits::max(); + float float_min = std::numeric_limits::lowest(); + auto int8_max = std::numeric_limits::max(); + auto int16_max = std::numeric_limits::max(); + auto int32_max = std::numeric_limits::max(); + auto int8_min = std::numeric_limits::lowest(); + auto int16_min = std::numeric_limits::lowest(); + auto int32_min = std::numeric_limits::lowest(); + auto uint8_max = std::numeric_limits::max(); + auto uint16_max = std::numeric_limits::max(); + auto uint32_max = std::numeric_limits::max(); + auto double_max = std::numeric_limits::max(); + + // Float to signed integer + BOOST_CHECK_NO_THROW(numeric_cast(1.324f)); + BOOST_CHECK(1 == numeric_cast(1.324f)); + BOOST_CHECK_NO_THROW(numeric_cast(-1.0f)); + BOOST_CHECK(-1 == numeric_cast(-1.0f)); + + BOOST_CHECK_NO_THROW(numeric_cast(static_cast(int8_max))); + BOOST_CHECK_NO_THROW(numeric_cast(static_cast(int16_max))); + BOOST_CHECK_NO_THROW(numeric_cast(static_cast(int32_max))); + + BOOST_CHECK_THROW(numeric_cast(float_max), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(float_max), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(float_max), std::bad_cast); + + BOOST_CHECK_THROW(numeric_cast(float_min), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(float_min), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(float_min), std::bad_cast); + + // Signed integer to float + BOOST_CHECK_NO_THROW(numeric_cast(1)); + BOOST_CHECK(1.0 == numeric_cast(1)); + BOOST_CHECK_NO_THROW(numeric_cast(-1)); + BOOST_CHECK(-1.0 == numeric_cast(-1)); + + BOOST_CHECK_NO_THROW(numeric_cast(int8_max)); + BOOST_CHECK_NO_THROW(numeric_cast(int16_max)); + BOOST_CHECK_NO_THROW(numeric_cast(int32_max)); + + BOOST_CHECK_NO_THROW(numeric_cast(int8_min)); + BOOST_CHECK_NO_THROW(numeric_cast(int16_min)); + BOOST_CHECK_NO_THROW(numeric_cast(int32_min)); + + // Unsigned integer to float + BOOST_CHECK_NO_THROW(numeric_cast(1U)); + BOOST_CHECK(1.0 == numeric_cast(1U)); + + BOOST_CHECK_NO_THROW(numeric_cast(uint8_max)); + BOOST_CHECK_NO_THROW(numeric_cast(uint16_max)); + BOOST_CHECK_NO_THROW(numeric_cast(uint32_max)); + + // Float to unsigned integer + BOOST_CHECK_NO_THROW(numeric_cast(1.43243f)); + BOOST_CHECK(1 == numeric_cast(1.43243f)); + + BOOST_CHECK_THROW(numeric_cast(-1.1f), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(float_max), std::bad_cast); + + // Double checks + BOOST_CHECK_THROW(numeric_cast(double_max), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(double_max), std::bad_cast); + BOOST_CHECK_THROW(numeric_cast(double_max), std::bad_cast); + BOOST_CHECK_NO_THROW(numeric_cast(int32_max)); + BOOST_CHECK_NO_THROW(numeric_cast(int32_max)); + + } BOOST_AUTO_TEST_SUITE_END() -- cgit v1.2.1