Line data Source code
1 : // Copyright (c) 2011-2022 Made to Order Software Corp. All Rights Reserved
2 : //
3 : // https://snapwebsites.org/project/snapdev
4 : // contact@m2osw.com
5 : //
6 : // This program is free software: you can redistribute it and/or modify
7 : // it under the terms of the GNU General Public License as published by
8 : // the Free Software Foundation, either version 3 of the License, or
9 : // (at your option) any later version.
10 : //
11 : // This program is distributed in the hope that it will be useful,
12 : // but WITHOUT ANY WARRANTY; without even the implied warranty of
13 : // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
14 : // GNU General Public License for more details.
15 : //
16 : // You should have received a copy of the GNU General Public License
17 : // along with this program. If not, see <https://www.gnu.org/licenses/>.
18 :
19 : /** \file
20 : * \brief Verify the to_string_literal templates.
21 : *
22 : * This file verifies that the to_string_literal template works as expected.
23 : */
24 :
25 : // snapdev
26 : //
27 : #include <snapdev/to_string_literal.h>
28 :
29 :
30 : // self
31 : //
32 : #include "catch_main.h"
33 :
34 :
35 : // C++
36 : //
37 : #include <iomanip>
38 :
39 :
40 :
41 : namespace
42 : {
43 :
44 : // convert a port number to a string at compile time
45 : //
46 : constexpr int const LOCAL_PORT = 9123;
47 : constexpr std::string_view g_port_decimal = snapdev::integer_to_string_literal<LOCAL_PORT>.data();
48 : constexpr std::string_view g_port_decimal_explicit = snapdev::integer_to_string_literal<LOCAL_PORT, 10>.data();
49 : constexpr std::string_view g_port_hexadecimal = snapdev::integer_to_string_literal<LOCAL_PORT, 16>.data();
50 : constexpr std::string_view g_port_hexadecimal_uppercase = snapdev::integer_to_string_literal<LOCAL_PORT, 16, true>.data();
51 : constexpr std::string_view g_port_octal = snapdev::integer_to_string_literal<LOCAL_PORT, 8>.data();
52 : constexpr std::string_view g_port_binary = snapdev::integer_to_string_literal<LOCAL_PORT, 2>.data();
53 :
54 : // these require C++20, becaue double_wrapper() is not otherwise accepted as a type to pass values as is
55 : //constexpr float const CONSTANT_ROOT_TWO = 1.414213562373095048801688724209698078;
56 : //constexpr double const CONSTANT_PI = 3.141592653589793238462643383279502884;
57 : //constexpr long double const CONSTANT_E = 2.718281828459045235360287471352662497;
58 : //constexpr std::string_view g_root_two = snapdev::floating_point_to_string_literal<snapdev::detail::double_wrapper(CONSTANT_ROOT_TWO)>.data();
59 : //constexpr std::string_view g_pi = snapdev::floating_point_to_string_literal<CONSTANT_PI>.data();
60 : //constexpr std::string_view g_e = snapdev::floating_point_to_string_literal<CONSTANT_E>.data();
61 :
62 : }
63 :
64 :
65 3 : CATCH_TEST_CASE("to_string_literal", "[basic][strings]")
66 : {
67 2 : CATCH_START_SECTION("integer_to_string_literal: verify integral literals")
68 : {
69 2 : std::stringstream ds;
70 1 : ds << std::setbase(10) << LOCAL_PORT;
71 1 : CATCH_REQUIRE(ds.str() == std::string(g_port_decimal));
72 1 : CATCH_REQUIRE(ds.str() == std::string(g_port_decimal_explicit));
73 :
74 2 : std::stringstream hs;
75 1 : hs << std::setbase(16) << LOCAL_PORT;
76 1 : CATCH_REQUIRE(hs.str() == std::string(g_port_hexadecimal));
77 :
78 2 : std::stringstream hsu;
79 1 : hsu << std::uppercase << std::setbase(16) << LOCAL_PORT;
80 1 : CATCH_REQUIRE(hsu.str() == std::string(g_port_hexadecimal_uppercase));
81 :
82 2 : std::stringstream os;
83 1 : os << std::setbase(8) << LOCAL_PORT;
84 1 : CATCH_REQUIRE(os.str() == std::string(g_port_octal));
85 :
86 : // unfortunately, for some really odd reasons, the std::setbase()
87 : // is limited to 8, 10, and 16...
88 : //
89 1 : char binary[64] = {};
90 1 : std::size_t q(std::size(binary) - 1);
91 15 : for(auto p(LOCAL_PORT); p != 0; p /= 2)
92 : {
93 14 : --q;
94 14 : binary[q] = (p & 1) + '0';
95 : }
96 1 : CATCH_REQUIRE(std::string(binary + q) == std::string(g_port_binary));
97 : }
98 : CATCH_END_SECTION()
99 :
100 : // this requires C++20 to compile...
101 : //
102 : // CATCH_START_SECTION("floating_point_to_string_literal: verify float literals")
103 : // {
104 : ////constexpr float const CONSTANT_ROOT_TWO = 1.414213562373095048801688724209698078;
105 : ////constexpr double const CONSTANT_PI = 3.141592653589793238462643383279502884;
106 : ////constexpr long double const CONSTANT_E = 2.718281828459045235360287471352662497;
107 : ////constexpr std::string_view g_root_two = snapdev::floating_point_to_string_literal(CONSTANT_ROOT_TWO);
108 : ////constexpr std::string_view g_pi = snapdev::floating_point_to_string_literal(CONSTANT_PI);
109 : ////constexpr std::string_view g_e = snapdev::floating_point_to_string_literal(CONSTANT_E);
110 : //
111 : // std::stringstream ds;
112 : // ds << std::setprecision(12) << CONSTANT_ROOT_TWO;
113 : // CATCH_REQUIRE(ds.str() == std::string(g_root_two));
114 : // }
115 : // CATCH_END_SECTION()
116 7 : }
117 :
118 :
119 : // vim: ts=4 sw=4 et
|