jaulib v1.3.0
Jau Support Library (C++, Java, ..)
test_intdecstring01.cpp
Go to the documentation of this file.
1/*
2 * Author: Sven Gothel <sgothel@jausoft.com>
3 * Copyright (c) 2020 Gothel Software e.K.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24#include <cassert>
25#include <cinttypes>
26#include <cstring>
27
29
30#include <jau/basic_types.hpp>
31
32using namespace jau;
33
34#define SHOW_DECIMAL_STRING_STATS 0
35
36#if SHOW_DECIMAL_STRING_STATS
37 template<class T>
38 void show_decimal_string_stats(const std::string msg, const T value, const bool use_separator, const int min_width) {
39 const nsize_t max_digits10 = std::numeric_limits<T>::is_signed ?
40 jau::digits10<T>(std::numeric_limits<T>::min()) :
41 jau::digits10<T>(std::numeric_limits<T>::max());
42
43 const nsize_t max_digits10_0 = std::numeric_limits<T>::digits10;
44 const T max_value = std::numeric_limits<T>::max();
45 const T min_value = std::numeric_limits<T>::min();
46 const nsize_t max_digits10_1 = jau::digits10<T>(min_value);
47 const nsize_t max_digits10_2 = jau::digits10<T>(max_value);
48
49 const nsize_t max_commas = use_separator ? ( max_digits10 - 1 ) / 3 : 0;
50 const nsize_t max_chars = max_digits10 + max_commas;
51
52 const nsize_t digit10_count = jau::digits10<T>(value);
53
54 const nsize_t comma_count = use_separator ? ( digit10_count - 1 ) / 3 : 0;
55 const nsize_t net_chars = digit10_count + comma_count;
56 const nsize_t total_chars = std::min<nsize_t>(max_chars, std::max<nsize_t>(min_width, net_chars));
57
58 INFO(msg+": value "+std::to_string(value)+", use_separator "+std::to_string(use_separator)+", min_width "+std::to_string(min_width));
59 INFO(msg+": min "+std::to_string(min_value)+", max "+std::to_string(max_value));
60 INFO(msg+": max_digits10 "+std::to_string(max_digits10)+" [ orig "+std::to_string(max_digits10_0)+", min "+std::to_string(max_digits10_1)+", max "+std::to_string(max_digits10_2)+"]");
61 INFO(msg+": max_commas "+std::to_string(max_commas));
62 INFO(msg+": max_chars "+std::to_string(max_chars));
63 INFO(msg+": value digits10 "+std::to_string(digit10_count));
64 INFO(msg+": value commas "+std::to_string(comma_count));
65 INFO(msg+": value net_chars "+std::to_string(net_chars));
66 INFO(msg+": value total_chars "+std::to_string(total_chars));
67 std::string s = to_decstring<T>(value, use_separator ? ',' : 0, min_width);
68 INFO(msg+": result '"+s+"', len "+std::to_string(s.length()));
69 }
70#endif
71
72static void test_int32_t(const std::string& msg, const int32_t v, const size_t expStrLen, const std::string& expStr) {
73#if SHOW_DECIMAL_STRING_STATS
74 show_decimal_string_stats<int32_t>(msg, v, true /* use_separator */, 0 /* min_width */);
75#endif
76 const std::string str = to_decstring(v);
77 INFO(msg+": has '"+str+"', len "+std::to_string(str.length()));
78 INFO(msg+": exp '"+expStr+"', len "+std::to_string(expStr.length())+", equal: "+std::to_string(str==expStr));
79 REQUIRE(str.length() == expStrLen);
80 REQUIRE_THAT(str, Catch::Matchers::Equals(expStr, Catch::CaseSensitive::Yes));
81}
82
83static void test_uint32_t(const std::string& msg, const uint32_t v, const size_t expStrLen, const std::string& expStr) {
84#if SHOW_DECIMAL_STRING_STATS
85 show_decimal_string_stats<uint32_t>(msg, v, true /* use_separator */, 0 /* min_width */);
86#endif
87
88 const std::string str = to_decstring(v);
89 INFO(msg+": has '"+str+"', len "+std::to_string(str.length()));
90 INFO(msg+": exp '"+expStr+"', len "+std::to_string(expStr.length())+", equal: "+std::to_string(str==expStr));
91 REQUIRE(str.length() == expStrLen);
92 REQUIRE_THAT(str, Catch::Matchers::Equals(expStr, Catch::CaseSensitive::Yes));
93}
94
95static void test_uint64_t(const std::string& msg, const uint64_t v, const size_t expStrLen, const std::string& expStr) {
96#if SHOW_DECIMAL_STRING_STATS
97 show_decimal_string_stats<uint64_t>(msg, v, true /* use_separator */, 0 /* min_width */);
98#endif
99
100 const std::string str = to_decstring(v);
101 INFO(msg+": has '"+str+"', len "+std::to_string(str.length()));
102 INFO(msg+": exp '"+expStr+"', len "+std::to_string(expStr.length())+", equal: "+std::to_string(str==expStr));
103 REQUIRE(str.length() == expStrLen);
104 REQUIRE_THAT(str, Catch::Matchers::Equals(expStr, Catch::CaseSensitive::Yes));
105}
106
107TEST_CASE( "Integer Decimal String Test 01", "[datatype][int_dec_string]" ) {
108 test_int32_t("INT32_MIN", INT32_MIN, 14, "-2,147,483,648");
109 test_int32_t("int32_t -thousand", -1000, 6, "-1,000");
110 test_int32_t("int32_t one", 1, 1, "1");
111 test_int32_t("int32_t thousand", 1000, 5, "1,000");
112 test_int32_t("INT32_MAX", INT32_MAX, 13, "2,147,483,647");
113
114 test_uint32_t("UINT32_MIN", 0, 1, "0");
115 test_uint32_t("uint32_t one", 1, 1, "1");
116 test_uint32_t("uint32_t thousand", 1000, 5, "1,000");
117 test_uint32_t("UINT32_MAX", UINT32_MAX, 13, "4,294,967,295");
118
119 test_uint64_t("UINT64_MIN", 0, 1, "0");
120 test_uint64_t("uint64_t one", 1, 1, "1");
121 test_uint64_t("uint64_t thousand", 1000, 5, "1,000");
122 test_uint64_t("UINT64_MAX", UINT64_MAX, 26, "18,446,744,073,709,551,615");
123}
124
125
std::string to_string(const alphabet &v) noexcept
Definition: base_codec.hpp:97
constexpr nsize_t digits10(const T x, const snsize_t x_sign, const bool sign_is_digit=true) noexcept
Returns the number of decimal digits of the given integral value number using std::log10<T>().
Definition: int_math.hpp:371
constexpr T min(const T x, const T y) noexcept
Returns the minimum of two integrals (w/ branching) in O(1)
Definition: base_math.hpp:177
uint_fast32_t nsize_t
Natural 'size_t' alternative using uint_fast32_t as its natural sized type.
Definition: int_types.hpp:53
constexpr T max(const T x, const T y) noexcept
Returns the maximum of two integrals (w/ branching) in O(1)
Definition: base_math.hpp:191
std::string to_decstring(const value_type &v, const char separator=',', const nsize_t width=0) noexcept
Produce a decimal string representation of an integral integer value.
__pack(...): Produces MSVC, clang and gcc compatible lead-in and -out macros.
Definition: backtrace.hpp:32
TEST_CASE("Integer Decimal String Test 01", "[datatype][int_dec_string]")
static void test_uint64_t(const std::string &msg, const uint64_t v, const size_t expStrLen, const std::string &expStr)
static void test_int32_t(const std::string &msg, const int32_t v, const size_t expStrLen, const std::string &expStr)
static void test_uint32_t(const std::string &msg, const uint32_t v, const size_t expStrLen, const std::string &expStr)