1// Copyright 2023 Peter Dimov
2// Distributed under the Boost Software License, Version 1.0.
3// https://www.boost.org/LICENSE_1_0.txt
4
5#include <boost/charconv.hpp>
6#include <boost/core/detail/splitmix64.hpp>
7#include <boost/core/lightweight_test.hpp>
8#include <cstdio>
9
10static boost::detail::splitmix64 rng;
11
12template<class T> void zero_extend_test()
13{
14 int const N = 2048;
15 int const M = 16;
16
17 for( int i = 0; i < M; ++i )
18 {
19 char buffer[ static_cast<std::size_t>(N + 128) ];
20
21 {
22 unsigned long long v = static_cast<unsigned long long>( rng() );
23
24 std::snprintf( s: buffer, maxlen: sizeof( buffer ), format: "%llu", v );
25
26 T ref;
27
28 auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( s: buffer ), ref );
29
30 if( !BOOST_TEST_EQ( static_cast<int>(r1.ec), 0 ) )
31 {
32 std::fprintf( stderr, format: "Test failure for '%s': got error at position %ld\n", buffer, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
33 }
34 else
35 {
36 for( int j = 1; j <= N; ++j )
37 {
38 std::snprintf( s: buffer, maxlen: sizeof( buffer ), format: "%llu%se-%d", v, std::string( static_cast<std::size_t>(j), '0' ).c_str(), j );
39
40 T w;
41 auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( s: buffer ), w );
42
43 if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
44 {
45 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
46 }
47 else if( !BOOST_TEST_EQ( w, ref ) )
48 {
49 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
50 }
51 }
52
53 for( int j = 1; j <= N; ++j )
54 {
55 std::snprintf( s: buffer, maxlen: sizeof( buffer ), format: "%llu0e-%s1", v, std::string( static_cast<std::size_t>(j), '0' ).c_str() );
56
57 T w;
58 auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( s: buffer ), w );
59
60 if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
61 {
62 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
63 }
64 else if( !BOOST_TEST_EQ( w, ref ) )
65 {
66 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
67 }
68 }
69 }
70 }
71
72 {
73 unsigned long long v = static_cast<unsigned long long>( rng() );
74
75 std::snprintf( s: buffer, maxlen: sizeof( buffer ), format: "0.%llu", v );
76
77 T ref;
78
79 auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( s: buffer ), ref );
80
81 if( !BOOST_TEST_EQ( static_cast<int>(r1.ec), 0 ) )
82 {
83 std::fprintf( stderr, format: "Test failure for '%s': got error at position %ld\n", buffer, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
84 }
85 else
86 {
87 for( int j = 1; j <= N; ++j )
88 {
89 std::snprintf( s: buffer, maxlen: sizeof( buffer ), format: "0.%s%llue%d", std::string( static_cast<std::size_t>(j), '0' ).c_str(), v, j );
90
91 T w;
92 auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( s: buffer ), w );
93
94 if( !BOOST_TEST_EQ( static_cast<int>(r2.ec), 0 ) )
95 {
96 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast<long>( r1.ptr - buffer ) ); // LCOV_EXCL_LINE
97 }
98 else if( !BOOST_TEST_EQ( w, ref ) )
99 {
100 std::fprintf( stderr, format: "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE
101 }
102 }
103 }
104 }
105 }
106}
107
108int main()
109{
110 zero_extend_test<float>();
111 zero_extend_test<double>();
112
113 return boost::report_errors();
114}
115

source code of boost/libs/charconv/test/from_chars_float2.cpp