LCOV - code coverage report
Current view: top level - tests - catch_to_string_literal.cpp (source / functions) Hit Total Coverage
Test: coverage.info Lines: 22 22 100.0 %
Date: 2022-07-09 19:51:09 Functions: 3 3 100.0 %
Legend: Lines: hit not hit

          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

Generated by: LCOV version 1.13