diff --git a/include/etl/private/to_string_helper.h b/include/etl/private/to_string_helper.h index 1950154f..496d56d0 100644 --- a/include/etl/private/to_string_helper.h +++ b/include/etl/private/to_string_helper.h @@ -88,7 +88,7 @@ namespace etl void add_boolean(const bool value, TIString& str, const etl::basic_format_spec& format, - bool append) + const bool append) { typedef typename TIString::value_type type; typedef typename TIString::iterator iterator; @@ -240,8 +240,31 @@ namespace etl /// Helper function for floating point integral and fractional. //*************************************************************************** template - void add_integral_fractional(const workspace_t integral, - const workspace_t fractional, + void add_integral_and_fractional(const uint32_t integral, + const uint32_t fractional, + TIString& str, + const etl::basic_format_spec& integral_format, + const etl::basic_format_spec& fractional_format, + const bool negative) + { + typedef typename TIString::value_type type; + + etl::private_to_string::add_integral(integral, str, integral_format, true, negative); + + if (fractional_format.get_precision() > 0) + { + str.push_back(type('.')); + etl::private_to_string::add_integral(fractional, str, fractional_format, true, false); + } + } + +#if ETL_USING_64BIT_TYPES + //*************************************************************************** + /// Helper function for floating point integral and fractional. + //*************************************************************************** + template + void add_integral_and_fractional(const uint64_t integral, + const uint64_t fractional, TIString& str, const etl::basic_format_spec& integral_format, const etl::basic_format_spec& fractional_format, @@ -257,15 +280,16 @@ namespace etl etl::private_to_string::add_integral(fractional, str, fractional_format, true, false); } } +#endif //*************************************************************************** /// Helper function for floating point. //*************************************************************************** template - void add_floating_point(T value, + void add_floating_point(const T value, TIString& str, const etl::basic_format_spec& format, - bool append) + const bool append) { typedef typename TIString::iterator iterator; typedef typename TIString::value_type type; @@ -292,7 +316,7 @@ namespace etl etl::basic_format_spec fractional_format = integral_format; fractional_format.width(integral_format.get_precision()).fill(type('0')).right(); - workspace_t multiplier = 1; + uint32_t multiplier = 1U; for (uint32_t i = 0U; i < fractional_format.get_precision(); ++i) { @@ -300,25 +324,103 @@ namespace etl } // Find the integral part of the floating point - T f_integral = (value < T(0.0) ? ceil(value) : floor(value)); - workspace_t integral = static_cast(f_integral); + T f_integral = floor(etl::absolute(value)); + uint32_t integral = static_cast(f_integral); // Find the fractional part of the floating point. - workspace_t fractional = etl::absolute(static_cast(round((value - f_integral) * multiplier))); + uint32_t fractional = static_cast(round((etl::absolute(value) - f_integral) * multiplier)); // Check for a rounding carry to the integral. if (fractional == multiplier) { ++integral; - fractional = 0; + fractional = 0U; } - etl::private_to_string::add_integral_fractional(integral, fractional, str, integral_format, fractional_format, etl::is_negative(value)); + etl::private_to_string::add_integral_and_fractional(integral, fractional, str, integral_format, fractional_format, etl::is_negative(value)); } etl::private_to_string::add_alignment(str, start, format); } + //*************************************************************************** + /// Helper function for denominated integers. + //*************************************************************************** + template + void add_integral_denominated(const T value, + const uint32_t denominator_exponent, + TIString& str, + const etl::basic_format_spec& format, + const bool append = false) + { + typedef typename TIString::iterator iterator; + typedef typename TIString::value_type type; + typedef typename etl::make_unsigned::type working_t; + + if (!append) + { + str.clear(); + } + + iterator start = str.end(); + + // Caculate the denominator. + working_t denominator = 1U; + + for (uint32_t i = 0U; i < denominator_exponent; ++i) + { + denominator *= 10U; + } + + working_t abs_value = etl::absolute(value); + + // Figure out how many decimal digits we have in the value. + const uint32_t& original_decimal_digits = denominator_exponent; + + // How many decimal digits are we displaying. + const uint32_t displayed_decimal_digits = (format.get_precision() > original_decimal_digits) ? original_decimal_digits : format.get_precision(); + + // Format for the integral part. + etl::basic_format_spec integral_format = format; + integral_format.decimal().width(0U); + + // Format for the fractional part. + etl::basic_format_spec fractional_format = integral_format; + fractional_format.precision(displayed_decimal_digits).width(displayed_decimal_digits).fill(type('0')).right(); + + // Do we need to check for rounding? + if (original_decimal_digits > displayed_decimal_digits) + { + // Which digit to adjust? + uint32_t count = original_decimal_digits - fractional_format.get_width(); + + // The 'round-away-from-zero' value. + uint32_t rounding = 5U; + + while (count-- > 1U) + { + rounding *= 10U; + } + + abs_value += rounding; + } + + // Split the value into integral and fractional. + working_t integral = abs_value / denominator; + working_t fractional = abs_value % denominator; + + // Move the fractional part to the right place. + uint32_t count = original_decimal_digits - fractional_format.get_width(); + while (count-- > 0U) + { + fractional /= 10U; + } + + // Create the string. + etl::private_to_string::add_integral_and_fractional(integral, fractional, str, integral_format, fractional_format, etl::is_negative(value)); + etl::private_to_string::add_alignment(str, start, format); + } + //*************************************************************************** /// Helper function for pointers. //*************************************************************************** @@ -326,7 +428,7 @@ namespace etl void add_pointer(const volatile void* value, TIString& str, const etl::basic_format_spec& format, - bool append) + const bool append) { uintptr_t p = reinterpret_cast(value); @@ -340,7 +442,7 @@ namespace etl void add_string(const TIString& value, TIString& str, const etl::basic_format_spec& format, - bool append) + const bool append) { if (!append) { @@ -361,7 +463,7 @@ namespace etl void add_string_view(const TSringView& value, TIString& str, const etl::basic_format_spec& format, - bool append) + const bool append) { if (!append) { @@ -378,28 +480,13 @@ namespace etl //********************************************************************************************************* //*************************************************************************** - /// For booleans. Default format spec. - //*************************************************************************** - template - const TIString& to_string(const bool value, - TIString& str, - bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_boolean(value, str, format, append); - - return str; - } - - //*************************************************************************** - /// For booleans. Supplied format spec. + /// For booleans. //*************************************************************************** template const TIString& to_string(const bool value, TIString& str, const etl::basic_format_spec& format, - bool append = false) + const bool append = false) { etl::private_to_string::add_boolean(value, str, format, append); @@ -407,244 +494,115 @@ namespace etl } //*************************************************************************** - /// For pointers. Default format spec. - //*************************************************************************** - template - const TIString& to_string(const volatile void* value, - TIString& str, - bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_pointer(value, str, format, append); - - return str; - } - - //*************************************************************************** - /// For pointers. Supplied format spec. + /// For pointers. //*************************************************************************** template const TIString& to_string(const volatile void* value, TIString& str, const etl::basic_format_spec& format, - bool append = false) + const bool append = false) { etl::private_to_string::add_pointer(value, str, format, append); return str; } -#if ETL_NOT_USING_64BIT_TYPES +#if ETL_USING_64BIT_TYPES //*************************************************************************** - /// For signed integrals less than 64 bits. Default format spec. + /// For integrals less than 64 bits. //*************************************************************************** template typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value>::value, const TIString& > ::type - to_string(const T value, TIString& str, bool append = false) + !etl::is_same::value && + !etl::is_one_of::value, const TIString&>::type + to_string(const T value, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::basic_format_spec format; + typedef typename etl::conditional::value, int32_t, uint32_t>::type type; - etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); + etl::private_to_string::add_integral(type(value), str, format, append, etl::is_negative(value)); return str; } //*************************************************************************** - /// For signed integrals less than 64 bits. Supplied format spec. + /// For 64 bit integrals. //*************************************************************************** template typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value>::value, const TIString& > ::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) + !etl::is_same::value && + etl::is_one_of::value, const TIString&>::type + to_string(const T value, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); + etl::private_to_string::add_integral(value, str, format, append, etl::is_negative(value)); return str; } //*************************************************************************** - /// For unsigned integrals less than 64 bits. Default format spec. + /// For denominated integrals less than 64 bits. //*************************************************************************** template typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value>::value, const TIString& > ::type - to_string(const T value, TIString& str, bool append = false) + !etl::is_same::value && + !etl::is_one_of::value, const TIString&>::type + to_string(const T value, uint32_t denominator_exponant, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::basic_format_spec format; + typedef typename etl::conditional::value, int32_t, uint32_t>::type type; - etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); + etl::private_to_string::add_integral_denominated(type(value), denominator_exponant, str, format, append); return str; } //*************************************************************************** - /// For unsigned integrals less than 64 bits. Supplied format spec. + /// For denominated 64 bit integrals. //*************************************************************************** template - typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value>::value, const TIString& > ::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) + typename etl::enable_if::value&& + !etl::is_same::value&& + etl::is_one_of::value, const TIString&>::type + to_string(const T value, uint32_t denominator_exponant, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); + etl::private_to_string::add_integral_denominated(value, denominator_exponant, str, format, append); return str; } #else //*************************************************************************** - /// For signed integrals less than 64 bits. Default format spec. + /// For integrals less than 64 bits. //*************************************************************************** template typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value && - !etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, bool append = false) + !etl::is_same::value>::value, const TIString& > ::type + to_string(const T value, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::basic_format_spec format; + typedef typename etl::conditional::value, int32_t, uint32_t>::type type; - etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); + etl::private_to_string::add_integral(type(value), str, format, append, false); return str; } //*************************************************************************** - /// For signed integrals less than 64 bits. Supplied format spec. + /// For denominated integrals less than 64 bits. //*************************************************************************** template typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value && - !etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) + !etl::is_same::value>::value, const TIString& > ::type + to_string(const T value, uint32_t denominator_exponant, TIString& str, const etl::basic_format_spec& format, const bool append = false) { - etl::private_to_string::add_integral(int32_t(value), str, format, append, etl::is_negative(value)); - - return str; - } - - //*************************************************************************** - /// For unsigned integrals less than 64 bits. Default format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value && - !etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); - - return str; - } - - //*************************************************************************** - /// For unsigned integrals less than 64 bits. Supplied format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value && - !etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) - { - etl::private_to_string::add_integral(uint32_t(value), str, format, append, false); - - return str; - } - - //*************************************************************************** - /// For signed 64 bit integrals. Default format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value && - etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_integral(int64_t(value), str, format, append, etl::is_negative(value)); - - return str; - } - - //*************************************************************************** - /// For signed 64 bit integrals. Supplied format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_signed::value && - !etl::is_same::value && - etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) - { - etl::private_to_string::add_integral(int64_t(value), str, format, append, etl::is_negative(value)); - - return str; - } - - //*************************************************************************** - /// For unsigned 64 bit integrals. Default format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value && - etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_integral(uint64_t(value), str, format, append, false); - - return str; - } - - //*************************************************************************** - /// For unsigned 64 bit integrals. Supplied format spec. - //*************************************************************************** - template - typename etl::enable_if::value && - etl::is_unsigned::value && - !etl::is_same::value && - etl::is_same::value, const TIString&>::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) - { - etl::private_to_string::add_integral(uint64_t(value), str, format, append, false); + etl::private_to_string::add_integral_denominated(type(value), denominator_exponant, str, format, append, false); return str; } #endif //*************************************************************************** - /// For floating point. Default format spec. + /// For floating point. //*************************************************************************** template typename etl::enable_if::value, const TIString&>::type - to_string(const T value, TIString& str, bool append = false) - { - etl::basic_format_spec format; - - etl::private_to_string::add_floating_point(value, str, format, append); - - return str; - } - - //*************************************************************************** - /// For floating point. Supplied format spec. - //*************************************************************************** - template - typename etl::enable_if::value, const TIString&>::type - to_string(const T value, TIString& str, const etl::basic_format_spec& format, bool append = false) + to_string(const T value, TIString& str, const etl::basic_format_spec& format, const bool append = false) { etl::private_to_string::add_floating_point(value, str, format, append); diff --git a/include/etl/to_string.h b/include/etl/to_string.h index 4535d2c9..274f26ea 100644 --- a/include/etl/to_string.h +++ b/include/etl/to_string.h @@ -65,6 +65,30 @@ namespace etl return private_to_string::to_string(value, str, format, append); } + //*************************************************************************** + /// Default format spec. + /// !etl::istring && !etl::string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::istring&>::type + to_string(const T value, uint32_t denominator_exponent, etl::istring& str, bool append = false) + { + etl::format_spec format; + + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + + //*************************************************************************** + /// Supplied format spec. + /// !etl::istring && !etl::string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::istring&>::type + to_string(const T value, uint32_t denominator_exponent, etl::istring& str, const etl::format_spec& format, bool append = false) + { + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + //*************************************************************************** /// Default format spec. /// etl::istring diff --git a/include/etl/to_u16string.h b/include/etl/to_u16string.h index cfb6ffe8..0765f7b8 100644 --- a/include/etl/to_u16string.h +++ b/include/etl/to_u16string.h @@ -65,6 +65,31 @@ namespace etl return private_to_string::to_string(value, str, format, append); } + //*************************************************************************** + /// Default format spec. + /// !etl::iu16string && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iu16string&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iu16string& str, bool append = false) + { + etl::u16format_spec format; + + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + + //*************************************************************************** + /// Supplied format spec. + /// !etl::u16string_view && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iu16string&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iu16string& str, const etl::u16format_spec& format, bool append = false) + { + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + + //*************************************************************************** /// Default format spec. /// etl::iu16string diff --git a/include/etl/to_u32string.h b/include/etl/to_u32string.h index f07451cd..08c6cc06 100644 --- a/include/etl/to_u32string.h +++ b/include/etl/to_u32string.h @@ -65,6 +65,30 @@ namespace etl return private_to_string::to_string(value, str, format, append); } + //*************************************************************************** + /// Default format spec. + /// !etl::iu32string && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iu32string&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iu32string& str, bool append = false) + { + etl::u32format_spec format; + + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + + //*************************************************************************** + /// Supplied format spec. + /// !etl::u16string_view && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iu32string&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iu32string& str, const etl::u32format_spec& format, bool append = false) + { + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + //*************************************************************************** /// Default format spec. /// etl::iu32string diff --git a/include/etl/to_wstring.h b/include/etl/to_wstring.h index 1612d02e..a6bf4b64 100644 --- a/include/etl/to_wstring.h +++ b/include/etl/to_wstring.h @@ -65,6 +65,30 @@ namespace etl return private_to_string::to_string(value, str, format, append); } + //*************************************************************************** + /// Default format spec. + /// !etl::iu32string && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iwstring&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iwstring& str, bool append = false) + { + etl::wformat_spec format; + + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + + //*************************************************************************** + /// Supplied format spec. + /// !etl::u16string_view && !etl::u16string_view + //*************************************************************************** + template + typename etl::enable_if::value && !etl::is_same::value, const etl::iwstring&>::type + to_string(const T value, uint32_t denominator_exponent, etl::iwstring& str, const etl::wformat_spec& format, bool append = false) + { + return private_to_string::to_string(value, denominator_exponent, str, format, append); + } + //*************************************************************************** /// Default format spec. /// etl::iwstring diff --git a/include/etl/variant.h b/include/etl/variant.h index c8664590..cfd27e9f 100644 --- a/include/etl/variant.h +++ b/include/etl/variant.h @@ -31,6 +31,8 @@ SOFTWARE. #ifndef ETL_VARIANT_INCLUDED #define ETL_VARIANT_INCLUDED +#include "platform.h" + #if !ETL_CPP11_SUPPORTED || ETL_USE_LEGACY_VARIANT #include "private/variant_legacy.h" #else diff --git a/include/etl/version.h b/include/etl/version.h index d694487e..4fbd4ed3 100644 --- a/include/etl/version.h +++ b/include/etl/version.h @@ -39,7 +39,7 @@ SOFTWARE. #define ETL_VERSION_MAJOR 20 #define ETL_VERSION_MINOR 16 -#define ETL_VERSION_PATCH 1 +#define ETL_VERSION_PATCH 2 #define ETL_VERSION ETL_STRINGIFY(ETL_VERSION_MAJOR) "." ETL_STRINGIFY(ETL_VERSION_MINOR) "." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_W ETL_STRINGIFY(ETL_VERSION_MAJOR) L"." ETL_STRINGIFY(ETL_VERSION_MINOR) L"." ETL_STRINGIFY(ETL_VERSION_PATCH) #define ETL_VERSION_U16 ETL_STRINGIFY(ETL_VERSION_MAJOR) u"." ETL_STRINGIFY(ETL_VERSION_MINOR) u"." ETL_STRINGIFY(ETL_VERSION_PATCH) diff --git a/library.json b/library.json index 2375b99b..c067cc0a 100644 --- a/library.json +++ b/library.json @@ -1,6 +1,6 @@ { "name": "ETL Embedded Template Library", - "version": "20.16.1", + "version": "20.16.2", "author s": { "name": "John Wellbelove", "email": "john.wellbelove@etlcpp.com" diff --git a/library.properties b/library.properties index 7e10a585..473dcc72 100644 --- a/library.properties +++ b/library.properties @@ -1,5 +1,5 @@ name=Embedded Template Library ETL -version=20.16.1 +version=20.16.2 author= John Wellbelove maintainer=John Wellbelove license=MIT diff --git a/meson.build b/meson.build index 89b9af6a..b0554ef6 100644 --- a/meson.build +++ b/meson.build @@ -8,7 +8,7 @@ project('PROJECT_NAME', 'cpp_std=c++17', 'build.cpp_std=c++17', ], meson_version: '>=0.54.0', - version: '20.16.1' + version: '20.16.2' ) ###################### diff --git a/support/Release notes.txt b/support/Release notes.txt index 6898696e..c37cee44 100644 --- a/support/Release notes.txt +++ b/support/Release notes.txt @@ -1,3 +1,6 @@ +=============================================================================== +20.16.2 Fixed incomplete template specialisations in type_traits.h for C++11 + =============================================================================== 20.16.1 Fix for etl::mutex::try_lock() for GCC diff --git a/test/test_to_string.cpp b/test/test_to_string.cpp index 5221884f..6f72985e 100644 --- a/test/test_to_string.cpp +++ b/test/test_to_string.cpp @@ -69,15 +69,15 @@ namespace CHECK(etl::string<20>(STR("2147483648")) == etl::to_string(uint32_t(2147483648ul), str)); CHECK(etl::string<20>(STR("9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str)); - CHECK(etl::string<20>(STR("127")) == etl::to_string(int8_t(127), str)); - CHECK(etl::string<20>(STR("32767")) == etl::to_string(int16_t(32767), str)); - CHECK(etl::string<20>(STR("2147483647")) == etl::to_string(int32_t(2147483647ll), str)); - CHECK(etl::string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str)); + CHECK(etl::string<20>(STR("127")) == etl::to_string(int8_t(INT8_MAX), str)); + CHECK(etl::string<20>(STR("32767")) == etl::to_string(int16_t(INT16_MAX), str)); + CHECK(etl::string<20>(STR("2147483647")) == etl::to_string(int32_t(INT32_MAX), str)); + CHECK(etl::string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str)); - CHECK(etl::string<20>(STR("-128")) == etl::to_string(int8_t(-128), str)); - CHECK(etl::string<20>(STR("-32768")) == etl::to_string(int16_t(-32768), str)); - CHECK(etl::string<20>(STR("-2147483648")) == etl::to_string(int32_t(-2147483648ll), str)); - CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str)); + CHECK(etl::string<20>(STR("-128")) == etl::to_string(int8_t(INT8_MIN), str)); + CHECK(etl::string<20>(STR("-32768")) == etl::to_string(int16_t(INT16_MIN), str)); + CHECK(etl::string<20>(STR("-2147483648")) == etl::to_string(int32_t(INT32_MIN), str)); + CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str)); } //************************************************************************* @@ -85,7 +85,7 @@ namespace { etl::string<120> str; - CHECK(etl::string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); + CHECK(etl::string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); CHECK(etl::string<120>(STR("00")) == etl::to_string(uint16_t(0), str, true)); CHECK(etl::string<120>(STR("000")) == etl::to_string(uint32_t(0), str, true)); CHECK(etl::string<120>(STR("0000")) == etl::to_string(uint64_t(0), str, true)); @@ -95,15 +95,15 @@ namespace CHECK(etl::string<120>(STR("0000128327682147483648")) == etl::to_string(uint32_t(2147483648ul), str, true)); CHECK(etl::string<120>(STR("00001283276821474836489223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, true)); - CHECK(etl::string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(127), str, true)); - CHECK(etl::string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(32767), str, true)); - CHECK(etl::string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(2147483647ll), str, true)); - CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, true)); + CHECK(etl::string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(INT8_MAX), str, true)); + CHECK(etl::string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(INT16_MAX), str, true)); + CHECK(etl::string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(INT32_MAX), str, true)); + CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, true)); - CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(-128), str, true)); - CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(-32768), str, true)); - CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, true)); - CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, true)); + CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(INT8_MIN), str, true)); + CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(INT16_MIN), str, true)); + CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, true)); + CHECK(etl::string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, true)); } //************************************************************************* @@ -115,7 +115,7 @@ namespace etl::to_string(uint8_t(0), str, format); - CHECK(etl::string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::string<20>(STR("###################0")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::string<20>(STR("###################0")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::string<20>(STR("###################0")) == etl::to_string(uint64_t(0), str, format)); @@ -125,15 +125,15 @@ namespace CHECK(etl::string<20>(STR("##########2147483648")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::string<20>(STR("#9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::string<20>(STR("#################127")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::string<20>(STR("###############32767")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::string<20>(STR("##########2147483647")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::string<20>(STR("#################127")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::string<20>(STR("###############32767")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::string<20>(STR("##########2147483647")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::string<20>(STR("################-128")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::string<20>(STR("##############-32768")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::string<20>(STR("################-128")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::string<20>(STR("##############-32768")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -143,7 +143,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')).left(); - CHECK(etl::string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::string<20>(STR("0###################")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::string<20>(STR("0###################")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::string<20>(STR("0###################")) == etl::to_string(uint64_t(0), str, format)); @@ -153,15 +153,15 @@ namespace CHECK(etl::string<20>(STR("2147483648##########")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::string<20>(STR("9223372036854775808#")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::string<20>(STR("127#################")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::string<20>(STR("32767###############")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::string<20>(STR("2147483647##########")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::string<20>(STR("127#################")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::string<20>(STR("32767###############")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::string<20>(STR("2147483647##########")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::string<20>(STR("-128################")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::string<20>(STR("-32768##############")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::string<20>(STR("-128################")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::string<20>(STR("-32768##############")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -169,7 +169,7 @@ namespace { etl::string<64> str; - CHECK(etl::string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); CHECK(etl::string<64>(STR("0000000000000000")) == etl::to_string(uint16_t(0), str, Format().base(2).width(16).fill(STR('0')))); CHECK(etl::string<64>(STR("00000000000000000000000000000000")) == etl::to_string(uint32_t(0), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::string<64>(STR("0000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(2).width(64).fill(STR('0')))); @@ -179,15 +179,15 @@ namespace CHECK(etl::string<64>(STR("10000000000000000000000000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::string<64>(STR("01111111")) == etl::to_string(int8_t(127), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::string<64>(STR("0111111111111111")) == etl::to_string(int16_t(32767), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(2147483647ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::string<64>(STR("01111111")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::string<64>(STR("0111111111111111")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::string<64>(STR("10000000")) == etl::to_string(int8_t(-128), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::string<64>(STR("1000000000000000")) == etl::to_string(int16_t(-32768), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::string<64>(STR("10000000")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::string<64>(STR("1000000000000000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(2).width(64).fill(STR('0')))); } //************************************************************************* @@ -195,7 +195,7 @@ namespace { etl::string<22> str; - CHECK(etl::string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); CHECK(etl::string<22>(STR("000000")) == etl::to_string(uint16_t(0), str, Format().base(8).width(6).fill(STR('0')))); CHECK(etl::string<22>(STR("00000000000")) == etl::to_string(uint32_t(0), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::string<22>(STR("0000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(8).width(22).fill(STR('0')))); @@ -205,15 +205,15 @@ namespace CHECK(etl::string<22>(STR("20000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::string<22>(STR("1000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::string<22>(STR("177")) == etl::to_string(int8_t(127), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::string<22>(STR("077777")) == etl::to_string(int16_t(32767), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::string<22>(STR("17777777777")) == etl::to_string(int32_t(2147483647ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::string<22>(STR("177")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::string<22>(STR("077777")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::string<22>(STR("17777777777")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::string<22>(STR("200")) == etl::to_string(int8_t(-128), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::string<22>(STR("100000")) == etl::to_string(int16_t(-32768), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::string<22>(STR("20000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::string<22>(STR("200")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::string<22>(STR("100000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::string<22>(STR("20000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(8).width(22).fill(STR('0')))); } //************************************************************************* @@ -221,7 +221,7 @@ namespace { etl::string<16> str; - CHECK(etl::string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); CHECK(etl::string<16>(STR("0000")) == etl::to_string(uint16_t(0), str, Format().base(16).width(4).fill(STR('0')))); CHECK(etl::string<16>(STR("00000000")) == etl::to_string(uint32_t(0), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::string<16>(STR("0000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(16).width(16).fill(STR('0')))); @@ -231,15 +231,15 @@ namespace CHECK(etl::string<16>(STR("80000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::string<16>(STR("8000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::string<16>(STR("7f")) == etl::to_string(int8_t(127), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::string<16>(STR("7fff")) == etl::to_string(int16_t(32767), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::string<16>(STR("7fffffff")) == etl::to_string(int32_t(2147483647ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::string<16>(STR("7f")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::string<16>(STR("7fff")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::string<16>(STR("7fffffff")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::string<16>(STR("80")) == etl::to_string(int8_t(-128), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::string<16>(STR("8000")) == etl::to_string(int16_t(-32768), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::string<16>(STR("80000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::string<16>(STR("8000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::string<16>(STR("80")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::string<16>(STR("8000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::string<16>(STR("80000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::string<16>(STR("8000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(16).width(16).fill(STR('0')))); } //************************************************************************* @@ -278,6 +278,14 @@ namespace CHECK(etl::string<20>(STR(" -0.123456")) == etl::to_string(-0.123456, str, Format().precision(6).width(10).right())); CHECK(etl::string<20>(STR("-0.123456 ")) == etl::to_string(-0.123456, str, Format().precision(6).width(10).left())); + + // Positive rollover + CHECK(etl::string<20>(STR(" 2.000000")) == etl::to_string(1.9999996, str, Format().precision(6).width(10).right())); + CHECK(etl::string<20>(STR("2.000000 ")) == etl::to_string(1.9999996, str, Format().precision(6).width(10).left())); + + // Negative rollover + CHECK(etl::string<20>(STR(" -2.000000")) == etl::to_string(-1.9999996, str, Format().precision(6).width(10).right())); + CHECK(etl::string<20>(STR("-2.000000 ")) == etl::to_string(-1.9999996, str, Format().precision(6).width(10).left())); } //************************************************************************* @@ -425,6 +433,223 @@ namespace to_string(&cvi, str, Format().hex().width(10).left().fill(STR('0')), true); CHECK(compare == str); } + + //************************************************************************* + TEST(test_integer_denominator_default_format) + { + etl::string<20> result; + int value = -1234567; + + etl::to_string(value, 6U, result); + + CHECK_EQUAL(etl::string<20>(STR("-1")).c_str(), result.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision) + { + etl::string<20> result; + int value = -1234560; + + Format format = Format().precision(100); + + etl::to_string(value, 6U, result, format); + + CHECK_EQUAL(etl::string<20>(STR("-1.234560")).c_str(), result.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision_64bit) + { + etl::string<20> result; + int64_t value = INT64_MIN; + + Format format = Format().precision(100); + + etl::to_string(value, 12U, result, format); + + CHECK_EQUAL(etl::string<20>(STR("-9223372.036854775808")).c_str(), result.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_fractional) + { + etl::string<20> result_i; + int value_i = -1000000; + + etl::string<20> result_d; + double value_d = -1.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-1.0000")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_value) + { + etl::string<20> result_i; + int value_i = 0; + + etl::string<20> result_d; + double value_d = -0.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("0.0000")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_integral_small_fractional) + { + etl::string<20> result_i; + int value_i = -400; + + etl::string<20> result_d; + double value_d = -0.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-0.0004")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_small_fractional) + { + etl::string<20> result_i; + int value_i = -123000400; + + etl::string<20> result_d; + double value_d = -123.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-123.0004")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional) + { + etl::string<20> result_i; + int value_i = -123000004; + + etl::string<20> result_d; + double value_d = -123.000004; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-123.0000")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional_rounded_up) + { + etl::string<20> result_i; + int value_i = -123000050; + + etl::string<20> result_d; + double value_d = -123.000050; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-123.0001")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_shorter_width) + { + etl::string<20> result_i; + int value_i = -123456780; + + etl::string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(6).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-123.4568")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_larger_width) + { + etl::string<20> result_i; + int value_i = -123456780; + + etl::string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(15).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR(" -123.4568")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_positive_rollover) + { + etl::string<20> result_i; + int value_i = 123999990; + + etl::string<20> result_d; + double value_d = 123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("124.0000")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } + + //************************************************************************* + TEST(test_integer_denominator_negative_rollover) + { + etl::string<20> result_i; + int value_i = -123999990; + + etl::string<20> result_d; + double value_d = -123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK_EQUAL(etl::string<20>(STR("-124.0000")).c_str(), result_i.c_str()); + CHECK_EQUAL(result_d.c_str(), result_i.c_str()); + } }; } diff --git a/test/test_to_u16string.cpp b/test/test_to_u16string.cpp index fff948be..af9761b6 100644 --- a/test/test_to_u16string.cpp +++ b/test/test_to_u16string.cpp @@ -56,15 +56,15 @@ namespace CHECK(etl::u16string<20>(STR("2147483648")) == etl::to_string(uint32_t(2147483648ul), str)); CHECK(etl::u16string<20>(STR("9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str)); - CHECK(etl::u16string<20>(STR("127")) == etl::to_string(int8_t(127), str)); - CHECK(etl::u16string<20>(STR("32767")) == etl::to_string(int16_t(32767), str)); - CHECK(etl::u16string<20>(STR("2147483647")) == etl::to_string(int32_t(2147483647ll), str)); - CHECK(etl::u16string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str)); + CHECK(etl::u16string<20>(STR("127")) == etl::to_string(int8_t(INT8_MAX), str)); + CHECK(etl::u16string<20>(STR("32767")) == etl::to_string(int16_t(INT16_MAX), str)); + CHECK(etl::u16string<20>(STR("2147483647")) == etl::to_string(int32_t(INT32_MAX), str)); + CHECK(etl::u16string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str)); - CHECK(etl::u16string<20>(STR("-128")) == etl::to_string(int8_t(-128), str)); - CHECK(etl::u16string<20>(STR("-32768")) == etl::to_string(int16_t(-32768), str)); - CHECK(etl::u16string<20>(STR("-2147483648")) == etl::to_string(int32_t(-2147483648ll), str)); - CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str)); + CHECK(etl::u16string<20>(STR("-128")) == etl::to_string(int8_t(INT8_MIN), str)); + CHECK(etl::u16string<20>(STR("-32768")) == etl::to_string(int16_t(INT16_MIN), str)); + CHECK(etl::u16string<20>(STR("-2147483648")) == etl::to_string(int32_t(INT32_MIN), str)); + CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str)); } //************************************************************************* @@ -72,7 +72,7 @@ namespace { etl::u16string<120> str; - CHECK(etl::u16string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); + CHECK(etl::u16string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); CHECK(etl::u16string<120>(STR("00")) == etl::to_string(uint16_t(0), str, true)); CHECK(etl::u16string<120>(STR("000")) == etl::to_string(uint32_t(0), str, true)); CHECK(etl::u16string<120>(STR("0000")) == etl::to_string(uint64_t(0), str, true)); @@ -82,15 +82,15 @@ namespace CHECK(etl::u16string<120>(STR("0000128327682147483648")) == etl::to_string(uint32_t(2147483648ul), str, true)); CHECK(etl::u16string<120>(STR("00001283276821474836489223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, true)); - CHECK(etl::u16string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(127), str, true)); - CHECK(etl::u16string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(32767), str, true)); - CHECK(etl::u16string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(2147483647ll), str, true)); - CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, true)); + CHECK(etl::u16string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(INT8_MAX), str, true)); + CHECK(etl::u16string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(INT16_MAX), str, true)); + CHECK(etl::u16string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(INT32_MAX), str, true)); + CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, true)); - CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(-128), str, true)); - CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(-32768), str, true)); - CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, true)); - CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, true)); + CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(INT8_MIN), str, true)); + CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(INT16_MIN), str, true)); + CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, true)); + CHECK(etl::u16string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, true)); } //************************************************************************* @@ -100,7 +100,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')); - CHECK(etl::u16string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::u16string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::u16string<20>(STR("###################0")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::u16string<20>(STR("###################0")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::u16string<20>(STR("###################0")) == etl::to_string(uint64_t(0), str, format)); @@ -110,15 +110,15 @@ namespace CHECK(etl::u16string<20>(STR("##########2147483648")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::u16string<20>(STR("#9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::u16string<20>(STR("#################127")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::u16string<20>(STR("###############32767")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::u16string<20>(STR("##########2147483647")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::u16string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::u16string<20>(STR("#################127")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::u16string<20>(STR("###############32767")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::u16string<20>(STR("##########2147483647")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::u16string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::u16string<20>(STR("################-128")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::u16string<20>(STR("##############-32768")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::u16string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::u16string<20>(STR("################-128")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::u16string<20>(STR("##############-32768")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::u16string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -128,7 +128,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')).left(); - CHECK(etl::u16string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::u16string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::u16string<20>(STR("0###################")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::u16string<20>(STR("0###################")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::u16string<20>(STR("0###################")) == etl::to_string(uint64_t(0), str, format)); @@ -138,15 +138,15 @@ namespace CHECK(etl::u16string<20>(STR("2147483648##########")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::u16string<20>(STR("9223372036854775808#")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::u16string<20>(STR("127#################")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::u16string<20>(STR("32767###############")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::u16string<20>(STR("2147483647##########")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::u16string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::u16string<20>(STR("127#################")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::u16string<20>(STR("32767###############")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::u16string<20>(STR("2147483647##########")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::u16string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::u16string<20>(STR("-128################")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::u16string<20>(STR("-32768##############")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::u16string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::u16string<20>(STR("-128################")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::u16string<20>(STR("-32768##############")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::u16string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::u16string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -154,7 +154,7 @@ namespace { etl::u16string<64> str; - CHECK(etl::u16string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); CHECK(etl::u16string<64>(STR("0000000000000000")) == etl::to_string(uint16_t(0), str, Format().base(2).width(16).fill(STR('0')))); CHECK(etl::u16string<64>(STR("00000000000000000000000000000000")) == etl::to_string(uint32_t(0), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::u16string<64>(STR("0000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(2).width(64).fill(STR('0')))); @@ -164,15 +164,15 @@ namespace CHECK(etl::u16string<64>(STR("10000000000000000000000000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::u16string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("01111111")) == etl::to_string(int8_t(127), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("0111111111111111")) == etl::to_string(int16_t(32767), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(2147483647ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("01111111")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("0111111111111111")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("10000000")) == etl::to_string(int8_t(-128), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("1000000000000000")) == etl::to_string(int16_t(-32768), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::u16string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("10000000")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("1000000000000000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::u16string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(2).width(64).fill(STR('0')))); } //************************************************************************* @@ -180,7 +180,7 @@ namespace { etl::u16string<22> str; - CHECK(etl::u16string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); CHECK(etl::u16string<22>(STR("000000")) == etl::to_string(uint16_t(0), str, Format().base(8).width(6).fill(STR('0')))); CHECK(etl::u16string<22>(STR("00000000000")) == etl::to_string(uint32_t(0), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::u16string<22>(STR("0000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(8).width(22).fill(STR('0')))); @@ -190,15 +190,15 @@ namespace CHECK(etl::u16string<22>(STR("20000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::u16string<22>(STR("1000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("177")) == etl::to_string(int8_t(127), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("077777")) == etl::to_string(int16_t(32767), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("17777777777")) == etl::to_string(int32_t(2147483647ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("177")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("077777")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("17777777777")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("200")) == etl::to_string(int8_t(-128), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("100000")) == etl::to_string(int16_t(-32768), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("20000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::u16string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("200")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("100000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("20000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::u16string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(8).width(22).fill(STR('0')))); } //************************************************************************* @@ -206,7 +206,7 @@ namespace { etl::u16string<16> str; - CHECK(etl::u16string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); CHECK(etl::u16string<16>(STR("0000")) == etl::to_string(uint16_t(0), str, Format().base(16).width(4).fill(STR('0')))); CHECK(etl::u16string<16>(STR("00000000")) == etl::to_string(uint32_t(0), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::u16string<16>(STR("0000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(16).width(16).fill(STR('0')))); @@ -216,15 +216,15 @@ namespace CHECK(etl::u16string<16>(STR("80000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::u16string<16>(STR("8000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("7f")) == etl::to_string(int8_t(127), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("7fff")) == etl::to_string(int16_t(32767), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("7fffffff")) == etl::to_string(int32_t(2147483647ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("7f")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("7fff")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("7fffffff")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("80")) == etl::to_string(int8_t(-128), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("8000")) == etl::to_string(int16_t(-32768), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("80000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::u16string<16>(STR("8000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("80")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("8000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("80000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::u16string<16>(STR("8000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(16).width(16).fill(STR('0')))); } //************************************************************************* @@ -348,6 +348,223 @@ namespace str.assign(STR("Result ")); CHECK(etl::u16string<20>(STR("Result true ")) == to_string(true, str, Format().precision(6).width(10).left().boolalpha(true), true)); } + + //************************************************************************* + TEST(test_integer_denominator_default_format) + { + etl::u16string<20> result; + int value = -1234567; + + etl::to_string(value, 6U, result); + + CHECK(etl::u16string<20>(STR("-1")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision) + { + etl::u16string<20> result; + int value = -1234560; + + Format format = Format().precision(100); + + etl::to_string(value, 6U, result, format); + + CHECK(etl::u16string<20>(STR("-1.234560")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision_64bit) + { + etl::u16string<20> result; + int64_t value = INT64_MIN; + + Format format = Format().precision(100); + + etl::to_string(value, 12U, result, format); + + CHECK(etl::u16string<20>(STR("-9223372.036854775808")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_fractional) + { + etl::u16string<20> result_i; + int value_i = -1000000; + + etl::u16string<20> result_d; + double value_d = -1.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-1.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_value) + { + etl::u16string<20> result_i; + int value_i = 0; + + etl::u16string<20> result_d; + double value_d = -0.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("0.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_integral_small_fractional) + { + etl::u16string<20> result_i; + int value_i = -400; + + etl::u16string<20> result_d; + double value_d = -0.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-0.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_small_fractional) + { + etl::u16string<20> result_i; + int value_i = -123000400; + + etl::u16string<20> result_d; + double value_d = -123.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-123.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional) + { + etl::u16string<20> result_i; + int value_i = -123000004; + + etl::u16string<20> result_d; + double value_d = -123.000004; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-123.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional_rounded_up) + { + etl::u16string<20> result_i; + int value_i = -123000050; + + etl::u16string<20> result_d; + double value_d = -123.000050; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-123.0001")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_shorter_width) + { + etl::u16string<20> result_i; + int value_i = -123456780; + + etl::u16string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(6).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_larger_width) + { + etl::u16string<20> result_i; + int value_i = -123456780; + + etl::u16string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(15).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR(" -123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_positive_rollover) + { + etl::u16string<20> result_i; + int value_i = 123999990; + + etl::u16string<20> result_d; + double value_d = 123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("124.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_negative_rollover) + { + etl::u16string<20> result_i; + int value_i = -123999990; + + etl::u16string<20> result_d; + double value_d = -123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u16string<20>(STR("-124.0000")) == result_i); + CHECK(result_d == result_i); + } }; } diff --git a/test/test_to_u32string.cpp b/test/test_to_u32string.cpp index e5928416..6d479857 100644 --- a/test/test_to_u32string.cpp +++ b/test/test_to_u32string.cpp @@ -58,15 +58,15 @@ namespace CHECK(etl::u32string<20>(STR("2147483648")) == etl::to_string(uint32_t(2147483648ul), str)); CHECK(etl::u32string<20>(STR("9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str)); - CHECK(etl::u32string<20>(STR("127")) == etl::to_string(int8_t(127), str)); - CHECK(etl::u32string<20>(STR("32767")) == etl::to_string(int16_t(32767), str)); - CHECK(etl::u32string<20>(STR("2147483647")) == etl::to_string(int32_t(2147483647ll), str)); - CHECK(etl::u32string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str)); + CHECK(etl::u32string<20>(STR("127")) == etl::to_string(int8_t(INT8_MAX), str)); + CHECK(etl::u32string<20>(STR("32767")) == etl::to_string(int16_t(INT16_MAX), str)); + CHECK(etl::u32string<20>(STR("2147483647")) == etl::to_string(int32_t(INT32_MAX), str)); + CHECK(etl::u32string<20>(STR("9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str)); - CHECK(etl::u32string<20>(STR("-128")) == etl::to_string(int8_t(-128), str)); - CHECK(etl::u32string<20>(STR("-32768")) == etl::to_string(int16_t(-32768), str)); - CHECK(etl::u32string<20>(STR("-2147483648")) == etl::to_string(int32_t(-2147483648ll), str)); - CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str)); + CHECK(etl::u32string<20>(STR("-128")) == etl::to_string(int8_t(INT8_MIN), str)); + CHECK(etl::u32string<20>(STR("-32768")) == etl::to_string(int16_t(INT16_MIN), str)); + CHECK(etl::u32string<20>(STR("-2147483648")) == etl::to_string(int32_t(INT32_MIN), str)); + CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str)); } //************************************************************************* @@ -74,7 +74,7 @@ namespace { etl::u32string<120> str; - CHECK(etl::u32string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); + CHECK(etl::u32string<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); CHECK(etl::u32string<120>(STR("00")) == etl::to_string(uint16_t(0), str, true)); CHECK(etl::u32string<120>(STR("000")) == etl::to_string(uint32_t(0), str, true)); CHECK(etl::u32string<120>(STR("0000")) == etl::to_string(uint64_t(0), str, true)); @@ -84,15 +84,15 @@ namespace CHECK(etl::u32string<120>(STR("0000128327682147483648")) == etl::to_string(uint32_t(2147483648ul), str, true)); CHECK(etl::u32string<120>(STR("00001283276821474836489223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, true)); - CHECK(etl::u32string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(127), str, true)); - CHECK(etl::u32string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(32767), str, true)); - CHECK(etl::u32string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(2147483647ll), str, true)); - CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, true)); + CHECK(etl::u32string<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(INT8_MAX), str, true)); + CHECK(etl::u32string<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(INT16_MAX), str, true)); + CHECK(etl::u32string<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(INT32_MAX), str, true)); + CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, true)); - CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(-128), str, true)); - CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(-32768), str, true)); - CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, true)); - CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, true)); + CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(INT8_MIN), str, true)); + CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(INT16_MIN), str, true)); + CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, true)); + CHECK(etl::u32string<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, true)); } //************************************************************************* @@ -102,7 +102,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')); - CHECK(etl::u32string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::u32string<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::u32string<20>(STR("###################0")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::u32string<20>(STR("###################0")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::u32string<20>(STR("###################0")) == etl::to_string(uint64_t(0), str, format)); @@ -112,15 +112,15 @@ namespace CHECK(etl::u32string<20>(STR("##########2147483648")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::u32string<20>(STR("#9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::u32string<20>(STR("#################127")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::u32string<20>(STR("###############32767")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::u32string<20>(STR("##########2147483647")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::u32string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::u32string<20>(STR("#################127")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::u32string<20>(STR("###############32767")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::u32string<20>(STR("##########2147483647")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::u32string<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::u32string<20>(STR("################-128")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::u32string<20>(STR("##############-32768")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::u32string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::u32string<20>(STR("################-128")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::u32string<20>(STR("##############-32768")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::u32string<20>(STR("#########-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -130,7 +130,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')).left(); - CHECK(etl::u32string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::u32string<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::u32string<20>(STR("0###################")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::u32string<20>(STR("0###################")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::u32string<20>(STR("0###################")) == etl::to_string(uint64_t(0), str, format)); @@ -140,15 +140,15 @@ namespace CHECK(etl::u32string<20>(STR("2147483648##########")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::u32string<20>(STR("9223372036854775808#")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::u32string<20>(STR("127#################")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::u32string<20>(STR("32767###############")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::u32string<20>(STR("2147483647##########")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::u32string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::u32string<20>(STR("127#################")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::u32string<20>(STR("32767###############")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::u32string<20>(STR("2147483647##########")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::u32string<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::u32string<20>(STR("-128################")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::u32string<20>(STR("-32768##############")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::u32string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::u32string<20>(STR("-128################")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::u32string<20>(STR("-32768##############")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::u32string<20>(STR("-2147483648#########")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::u32string<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -156,7 +156,7 @@ namespace { etl::u32string<64> str; - CHECK(etl::u32string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); CHECK(etl::u32string<64>(STR("0000000000000000")) == etl::to_string(uint16_t(0), str, Format().base(2).width(16).fill(STR('0')))); CHECK(etl::u32string<64>(STR("00000000000000000000000000000000")) == etl::to_string(uint32_t(0), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::u32string<64>(STR("0000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(2).width(64).fill(STR('0')))); @@ -166,15 +166,15 @@ namespace CHECK(etl::u32string<64>(STR("10000000000000000000000000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::u32string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("01111111")) == etl::to_string(int8_t(127), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("0111111111111111")) == etl::to_string(int16_t(32767), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(2147483647ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("01111111")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("0111111111111111")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("10000000")) == etl::to_string(int8_t(-128), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("1000000000000000")) == etl::to_string(int16_t(-32768), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::u32string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("10000000")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("1000000000000000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::u32string<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(2).width(64).fill(STR('0')))); } //************************************************************************* @@ -182,7 +182,7 @@ namespace { etl::u32string<22> str; - CHECK(etl::u32string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); CHECK(etl::u32string<22>(STR("000000")) == etl::to_string(uint16_t(0), str, Format().base(8).width(6).fill(STR('0')))); CHECK(etl::u32string<22>(STR("00000000000")) == etl::to_string(uint32_t(0), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::u32string<22>(STR("0000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(8).width(22).fill(STR('0')))); @@ -192,15 +192,15 @@ namespace CHECK(etl::u32string<22>(STR("20000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::u32string<22>(STR("1000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("177")) == etl::to_string(int8_t(127), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("077777")) == etl::to_string(int16_t(32767), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("17777777777")) == etl::to_string(int32_t(2147483647ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("177")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("077777")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("17777777777")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("200")) == etl::to_string(int8_t(-128), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("100000")) == etl::to_string(int16_t(-32768), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("20000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::u32string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("200")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("100000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("20000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::u32string<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(8).width(22).fill(STR('0')))); } //************************************************************************* @@ -208,7 +208,7 @@ namespace { etl::u32string<16> str; - CHECK(etl::u32string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); CHECK(etl::u32string<16>(STR("0000")) == etl::to_string(uint16_t(0), str, Format().base(16).width(4).fill(STR('0')))); CHECK(etl::u32string<16>(STR("00000000")) == etl::to_string(uint32_t(0), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::u32string<16>(STR("0000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(16).width(16).fill(STR('0')))); @@ -218,15 +218,15 @@ namespace CHECK(etl::u32string<16>(STR("80000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::u32string<16>(STR("8000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("7f")) == etl::to_string(int8_t(127), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("7fff")) == etl::to_string(int16_t(32767), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("7fffffff")) == etl::to_string(int32_t(2147483647ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("7f")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("7fff")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("7fffffff")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("80")) == etl::to_string(int8_t(-128), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("8000")) == etl::to_string(int16_t(-32768), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("80000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::u32string<16>(STR("8000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("80")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("8000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("80000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::u32string<16>(STR("8000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(16).width(16).fill(STR('0')))); } @@ -353,6 +353,223 @@ namespace str.assign(STR("Result ")); CHECK(etl::u32string<20>(STR("Result true ")) == to_string(true, str, Format().precision(6).width(10).left().boolalpha(true), true)); } + + //************************************************************************* + TEST(test_integer_denominator_default_format) + { + etl::u32string<20> result; + int value = -1234567; + + etl::to_string(value, 6U, result); + + CHECK(etl::u32string<20>(STR("-1")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision) + { + etl::u32string<20> result; + int value = -1234560; + + Format format = Format().precision(100); + + etl::to_string(value, 6U, result, format); + + CHECK(etl::u32string<20>(STR("-1.234560")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision_64bit) + { + etl::u32string<20> result; + int64_t value = INT64_MIN; + + Format format = Format().precision(100); + + etl::to_string(value, 12U, result, format); + + CHECK(etl::u32string<20>(STR("-9223372.036854775808")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_fractional) + { + etl::u32string<20> result_i; + int value_i = -1000000; + + etl::u32string<20> result_d; + double value_d = -1.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-1.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_value) + { + etl::u32string<20> result_i; + int value_i = 0; + + etl::u32string<20> result_d; + double value_d = -0.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("0.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_integral_small_fractional) + { + etl::u32string<20> result_i; + int value_i = -400; + + etl::u32string<20> result_d; + double value_d = -0.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-0.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_small_fractional) + { + etl::u32string<20> result_i; + int value_i = -123000400; + + etl::u32string<20> result_d; + double value_d = -123.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-123.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional) + { + etl::u32string<20> result_i; + int value_i = -123000004; + + etl::u32string<20> result_d; + double value_d = -123.000004; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-123.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional_rounded_up) + { + etl::u32string<20> result_i; + int value_i = -123000050; + + etl::u32string<20> result_d; + double value_d = -123.000050; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-123.0001")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_shorter_width) + { + etl::u32string<20> result_i; + int value_i = -123456780; + + etl::u32string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(6).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_larger_width) + { + etl::u32string<20> result_i; + int value_i = -123456780; + + etl::u32string<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(15).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR(" -123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_positive_rollover) + { + etl::u32string<20> result_i; + int value_i = 123999990; + + etl::u32string<20> result_d; + double value_d = 123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("124.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_negative_rollover) + { + etl::u32string<20> result_i; + int value_i = -123999990; + + etl::u32string<20> result_d; + double value_d = -123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::u32string<20>(STR("-124.0000")) == result_i); + CHECK(result_d == result_i); + } }; } diff --git a/test/test_to_wstring.cpp b/test/test_to_wstring.cpp index d213ab80..88c2dd46 100644 --- a/test/test_to_wstring.cpp +++ b/test/test_to_wstring.cpp @@ -60,15 +60,15 @@ namespace CHECK(etl::wstring<20>(STR("2147483648")) == etl::to_string(uint32_t(2147483648ul), str)); CHECK(etl::wstring<20>(STR("9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str)); - CHECK(etl::wstring<20>(STR("127")) == etl::to_string(int8_t(127), str)); - CHECK(etl::wstring<20>(STR("32767")) == etl::to_string(int16_t(32767), str)); - CHECK(etl::wstring<20>(STR("2147483647")) == etl::to_string(int32_t(2147483647ll), str)); - CHECK(etl::wstring<20>(STR("9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str)); + CHECK(etl::wstring<20>(STR("127")) == etl::to_string(int8_t(INT8_MAX), str)); + CHECK(etl::wstring<20>(STR("32767")) == etl::to_string(int16_t(INT16_MAX), str)); + CHECK(etl::wstring<20>(STR("2147483647")) == etl::to_string(int32_t(INT32_MAX), str)); + CHECK(etl::wstring<20>(STR("9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str)); - CHECK(etl::wstring<20>(STR("-128")) == etl::to_string(int8_t(-128), str)); - CHECK(etl::wstring<20>(STR("-32768")) == etl::to_string(int16_t(-32768), str)); - CHECK(etl::wstring<20>(STR("-2147483648")) == etl::to_string(int32_t(-2147483648ll), str)); - CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str)); + CHECK(etl::wstring<20>(STR("-128")) == etl::to_string(int8_t(INT8_MIN), str)); + CHECK(etl::wstring<20>(STR("-32768")) == etl::to_string(int16_t(INT16_MIN), str)); + CHECK(etl::wstring<20>(STR("-2147483648")) == etl::to_string(int32_t(INT32_MIN), str)); + CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str)); } //************************************************************************* @@ -76,7 +76,7 @@ namespace { etl::wstring<120> str; - CHECK(etl::wstring<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); + CHECK(etl::wstring<120>(STR("0")) == etl::to_string(uint8_t(0), str, true)); CHECK(etl::wstring<120>(STR("00")) == etl::to_string(uint16_t(0), str, true)); CHECK(etl::wstring<120>(STR("000")) == etl::to_string(uint32_t(0), str, true)); CHECK(etl::wstring<120>(STR("0000")) == etl::to_string(uint64_t(0), str, true)); @@ -86,15 +86,15 @@ namespace CHECK(etl::wstring<120>(STR("0000128327682147483648")) == etl::to_string(uint32_t(2147483648ul), str, true)); CHECK(etl::wstring<120>(STR("00001283276821474836489223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, true)); - CHECK(etl::wstring<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(127), str, true)); - CHECK(etl::wstring<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(32767), str, true)); - CHECK(etl::wstring<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(2147483647ll), str, true)); - CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, true)); + CHECK(etl::wstring<120>(STR("00001283276821474836489223372036854775808127")) == etl::to_string(int8_t(INT8_MAX), str, true)); + CHECK(etl::wstring<120>(STR("0000128327682147483648922337203685477580812732767")) == etl::to_string(int16_t(INT16_MAX), str, true)); + CHECK(etl::wstring<120>(STR("00001283276821474836489223372036854775808127327672147483647")) == etl::to_string(int32_t(INT32_MAX), str, true)); + CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, true)); - CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(-128), str, true)); - CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(-32768), str, true)); - CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, true)); - CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, true)); + CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128")) == etl::to_string(int8_t(INT8_MIN), str, true)); + CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768")) == etl::to_string(int16_t(INT16_MIN), str, true)); + CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, true)); + CHECK(etl::wstring<120>(STR("000012832768214748364892233720368547758081273276721474836479223372036854775807-128-32768-2147483648-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, true)); } //************************************************************************* @@ -104,7 +104,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')); - CHECK(etl::wstring<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::wstring<20>(STR("###################0")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::wstring<20>(STR("###################0")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::wstring<20>(STR("###################0")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::wstring<20>(STR("###################0")) == etl::to_string(uint64_t(0), str, format)); @@ -114,15 +114,15 @@ namespace CHECK(etl::wstring<20>(STR("##########2147483648")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::wstring<20>(STR("#9223372036854775808")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::wstring<20>(STR("#################127")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::wstring<20>(STR("###############32767")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::wstring<20>(STR("##########2147483647")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::wstring<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::wstring<20>(STR("#################127")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::wstring<20>(STR("###############32767")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::wstring<20>(STR("##########2147483647")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::wstring<20>(STR("#9223372036854775807")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::wstring<20>(STR("################-128")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::wstring<20>(STR("##############-32768")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::wstring<20>(STR("#########-2147483648")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::wstring<20>(STR("################-128")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::wstring<20>(STR("##############-32768")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::wstring<20>(STR("#########-2147483648")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -132,7 +132,7 @@ namespace Format format = Format().base(10).width(20).fill(STR('#')).left(); - CHECK(etl::wstring<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); + CHECK(etl::wstring<20>(STR("0###################")) == etl::to_string(uint8_t(0), str, format)); CHECK(etl::wstring<20>(STR("0###################")) == etl::to_string(uint16_t(0), str, format)); CHECK(etl::wstring<20>(STR("0###################")) == etl::to_string(uint32_t(0), str, format)); CHECK(etl::wstring<20>(STR("0###################")) == etl::to_string(uint64_t(0), str, format)); @@ -142,15 +142,15 @@ namespace CHECK(etl::wstring<20>(STR("2147483648##########")) == etl::to_string(uint32_t(2147483648ul), str, format)); CHECK(etl::wstring<20>(STR("9223372036854775808#")) == etl::to_string(uint64_t(9223372036854775808ull), str, format)); - CHECK(etl::wstring<20>(STR("127#################")) == etl::to_string(int8_t(127), str, format)); - CHECK(etl::wstring<20>(STR("32767###############")) == etl::to_string(int16_t(32767), str, format)); - CHECK(etl::wstring<20>(STR("2147483647##########")) == etl::to_string(int32_t(2147483647ll), str, format)); - CHECK(etl::wstring<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(9223372036854775807ll), str, format)); + CHECK(etl::wstring<20>(STR("127#################")) == etl::to_string(int8_t(INT8_MAX), str, format)); + CHECK(etl::wstring<20>(STR("32767###############")) == etl::to_string(int16_t(INT16_MAX), str, format)); + CHECK(etl::wstring<20>(STR("2147483647##########")) == etl::to_string(int32_t(INT32_MAX), str, format)); + CHECK(etl::wstring<20>(STR("9223372036854775807#")) == etl::to_string(int64_t(INT64_MAX), str, format)); - CHECK(etl::wstring<20>(STR("-128################")) == etl::to_string(int8_t(-128), str, format)); - CHECK(etl::wstring<20>(STR("-32768##############")) == etl::to_string(int16_t(-32768), str, format)); - CHECK(etl::wstring<20>(STR("-2147483648#########")) == etl::to_string(int32_t(-2147483648ll), str, format)); - CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, format)); + CHECK(etl::wstring<20>(STR("-128################")) == etl::to_string(int8_t(INT8_MIN), str, format)); + CHECK(etl::wstring<20>(STR("-32768##############")) == etl::to_string(int16_t(INT16_MIN), str, format)); + CHECK(etl::wstring<20>(STR("-2147483648#########")) == etl::to_string(int32_t(INT32_MIN), str, format)); + CHECK(etl::wstring<20>(STR("-9223372036854775808")) == etl::to_string(int64_t(INT64_MIN), str, format)); } //************************************************************************* @@ -158,7 +158,7 @@ namespace { etl::wstring<64> str; - CHECK(etl::wstring<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("00000000")) == etl::to_string(uint8_t(0), str, Format().base(2).width(8).fill(STR('0')))); CHECK(etl::wstring<64>(STR("0000000000000000")) == etl::to_string(uint16_t(0), str, Format().base(2).width(16).fill(STR('0')))); CHECK(etl::wstring<64>(STR("00000000000000000000000000000000")) == etl::to_string(uint32_t(0), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::wstring<64>(STR("0000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(2).width(64).fill(STR('0')))); @@ -168,15 +168,15 @@ namespace CHECK(etl::wstring<64>(STR("10000000000000000000000000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(2).width(32).fill(STR('0')))); CHECK(etl::wstring<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("01111111")) == etl::to_string(int8_t(127), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("0111111111111111")) == etl::to_string(int16_t(32767), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(2147483647ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("01111111")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("0111111111111111")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("01111111111111111111111111111111")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("0111111111111111111111111111111111111111111111111111111111111111")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(2).width(64).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("10000000")) == etl::to_string(int8_t(-128), str, Format().base(2).width(8).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("1000000000000000")) == etl::to_string(int16_t(-32768), str, Format().base(2).width(16).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(2).width(32).fill(STR('0')))); - CHECK(etl::wstring<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(2).width(64).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("10000000")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(2).width(8).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("1000000000000000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(2).width(16).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("10000000000000000000000000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(2).width(32).fill(STR('0')))); + CHECK(etl::wstring<64>(STR("1000000000000000000000000000000000000000000000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(2).width(64).fill(STR('0')))); } //************************************************************************* @@ -184,7 +184,7 @@ namespace { etl::wstring<22> str; - CHECK(etl::wstring<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("000")) == etl::to_string(uint8_t(0), str, Format().base(8).width(3).fill(STR('0')))); CHECK(etl::wstring<22>(STR("000000")) == etl::to_string(uint16_t(0), str, Format().base(8).width(6).fill(STR('0')))); CHECK(etl::wstring<22>(STR("00000000000")) == etl::to_string(uint32_t(0), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::wstring<22>(STR("0000000000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(8).width(22).fill(STR('0')))); @@ -194,15 +194,15 @@ namespace CHECK(etl::wstring<22>(STR("20000000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(8).width(11).fill(STR('0')))); CHECK(etl::wstring<22>(STR("1000000000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("177")) == etl::to_string(int8_t(127), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("077777")) == etl::to_string(int16_t(32767), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("17777777777")) == etl::to_string(int32_t(2147483647ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("177")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("077777")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("17777777777")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("0777777777777777777777")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(8).width(22).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("200")) == etl::to_string(int8_t(-128), str, Format().base(8).width(3).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("100000")) == etl::to_string(int16_t(-32768), str, Format().base(8).width(6).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("20000000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(8).width(11).fill(STR('0')))); - CHECK(etl::wstring<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(8).width(22).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("200")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(8).width(3).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("100000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(8).width(6).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("20000000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(8).width(11).fill(STR('0')))); + CHECK(etl::wstring<22>(STR("1000000000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(8).width(22).fill(STR('0')))); } //************************************************************************* @@ -210,7 +210,7 @@ namespace { etl::wstring<16> str; - CHECK(etl::wstring<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("00")) == etl::to_string(uint8_t(0), str, Format().base(16).width(2).fill(STR('0')))); CHECK(etl::wstring<16>(STR("0000")) == etl::to_string(uint16_t(0), str, Format().base(16).width(4).fill(STR('0')))); CHECK(etl::wstring<16>(STR("00000000")) == etl::to_string(uint32_t(0), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::wstring<16>(STR("0000000000000000")) == etl::to_string(uint64_t(0), str, Format().base(16).width(16).fill(STR('0')))); @@ -220,15 +220,15 @@ namespace CHECK(etl::wstring<16>(STR("80000000")) == etl::to_string(uint32_t(2147483648ul), str, Format().base(16).width(8).fill(STR('0')))); CHECK(etl::wstring<16>(STR("8000000000000000")) == etl::to_string(uint64_t(9223372036854775808ull), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("7f")) == etl::to_string(int8_t(127), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("7fff")) == etl::to_string(int16_t(32767), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("7fffffff")) == etl::to_string(int32_t(2147483647ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(9223372036854775807ll), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("7f")) == etl::to_string(int8_t(INT8_MAX), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("7fff")) == etl::to_string(int16_t(INT16_MAX), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("7fffffff")) == etl::to_string(int32_t(INT32_MAX), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("7fffffffffffffff")) == etl::to_string(int64_t(INT64_MAX), str, Format().base(16).width(16).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("80")) == etl::to_string(int8_t(-128), str, Format().base(16).width(2).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("8000")) == etl::to_string(int16_t(-32768), str, Format().base(16).width(4).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("80000000")) == etl::to_string(int32_t(-2147483648ll), str, Format().base(16).width(8).fill(STR('0')))); - CHECK(etl::wstring<16>(STR("8000000000000000")) == etl::to_string(int64_t(-9223372036854775807ll - 1), str, Format().base(16).width(16).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("80")) == etl::to_string(int8_t(INT8_MIN), str, Format().base(16).width(2).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("8000")) == etl::to_string(int16_t(INT16_MIN), str, Format().base(16).width(4).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("80000000")) == etl::to_string(int32_t(INT32_MIN), str, Format().base(16).width(8).fill(STR('0')))); + CHECK(etl::wstring<16>(STR("8000000000000000")) == etl::to_string(int64_t(INT64_MIN), str, Format().base(16).width(16).fill(STR('0')))); } //************************************************************************* @@ -415,6 +415,223 @@ namespace to_string(&cvi, str, Format().hex().width(10).left().fill(STR('0')), true); CHECK(compare == str); } + + //************************************************************************* + TEST(test_integer_denominator_default_format) + { + etl::wstring<20> result; + int value = -1234567; + + etl::to_string(value, 6U, result); + + CHECK(etl::wstring<20>(STR("-1")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision) + { + etl::wstring<20> result; + int value = -1234560; + + Format format = Format().precision(100); + + etl::to_string(value, 6U, result, format); + + CHECK(etl::wstring<20>(STR("-1.234560")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_huge_precision_64bit) + { + etl::wstring<20> result; + int64_t value = INT64_MIN; + + Format format = Format().precision(100); + + etl::to_string(value, 12U, result, format); + + CHECK(etl::wstring<20>(STR("-9223372.036854775808")) == result); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_fractional) + { + etl::wstring<20> result_i; + int value_i = -1000000; + + etl::wstring<20> result_d; + double value_d = -1.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-1.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_value) + { + etl::wstring<20> result_i; + int value_i = 0; + + etl::wstring<20> result_d; + double value_d = -0.000000; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("0.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_zero_integral_small_fractional) + { + etl::wstring<20> result_i; + int value_i = -400; + + etl::wstring<20> result_d; + double value_d = -0.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-0.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_small_fractional) + { + etl::wstring<20> result_i; + int value_i = -123000400; + + etl::wstring<20> result_d; + double value_d = -123.000400; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-123.0004")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional) + { + etl::wstring<20> result_i; + int value_i = -123000004; + + etl::wstring<20> result_d; + double value_d = -123.000004; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-123.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_very_small_fractional_rounded_up) + { + etl::wstring<20> result_i; + int value_i = -123000050; + + etl::wstring<20> result_d; + double value_d = -123.000050; + + Format format = Format().precision(4); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-123.0001")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_shorter_width) + { + etl::wstring<20> result_i; + int value_i = -123456780; + + etl::wstring<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(6).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_larger_width) + { + etl::wstring<20> result_i; + int value_i = -123456780; + + etl::wstring<20> result_d; + double value_d = -123.456780; + + Format format = Format().precision(4).width(15).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR(" -123.4568")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_positive_rollover) + { + etl::wstring<20> result_i; + int value_i = 123999990; + + etl::wstring<20> result_d; + double value_d = 123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("124.0000")) == result_i); + CHECK(result_d == result_i); + } + + //************************************************************************* + TEST(test_integer_denominator_negative_rollover) + { + etl::wstring<20> result_i; + int value_i = -123999990; + + etl::wstring<20> result_d; + double value_d = -123.999990; + + Format format = Format().precision(4).right(); + + etl::to_string(value_i, 6U, result_i, format); + etl::to_string(value_d, result_d, format); + + CHECK(etl::wstring<20>(STR("-124.0000")) == result_i); + CHECK(result_d == result_i); + } }; } diff --git a/test/vs2019/etl.vcxproj.filters b/test/vs2019/etl.vcxproj.filters index 3861d5c3..572a72df 100644 --- a/test/vs2019/etl.vcxproj.filters +++ b/test/vs2019/etl.vcxproj.filters @@ -2990,12 +2990,12 @@ Source Files\Sanity Checks - - Source Files - Source Files + + Source Files\Sanity Checks + @@ -3140,4 +3140,4 @@ Resource Files - + \ No newline at end of file