// Copyright 2023 Peter Dimov // Distributed under the Boost Software License, Version 1.0. // https://www.boost.org/LICENSE_1_0.txt #include #include #include #include static boost::detail::splitmix64 rng; template void zero_extend_test() { int const N = 2048; int const M = 16; for( int i = 0; i < M; ++i ) { char buffer[ static_cast(N + 128) ]; { unsigned long long v = static_cast( rng() ); std::snprintf( buffer, sizeof( buffer ), "%llu", v ); T ref; auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), ref ); if( !BOOST_TEST_EQ( static_cast(r1.ec), 0 ) ) { std::fprintf( stderr, "Test failure for '%s': got error at position %ld\n", buffer, static_cast( r1.ptr - buffer ) ); // LCOV_EXCL_LINE } else { for( int j = 1; j <= N; ++j ) { std::snprintf( buffer, sizeof( buffer ), "%llu%se-%d", v, std::string( static_cast(j), '0' ).c_str(), j ); T w; auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w ); if( !BOOST_TEST_EQ( static_cast(r2.ec), 0 ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast( r1.ptr - buffer ) ); // LCOV_EXCL_LINE } else if( !BOOST_TEST_EQ( w, ref ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE } } for( int j = 1; j <= N; ++j ) { std::snprintf( buffer, sizeof( buffer ), "%llu0e-%s1", v, std::string( static_cast(j), '0' ).c_str() ); T w; auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w ); if( !BOOST_TEST_EQ( static_cast(r2.ec), 0 ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast( r1.ptr - buffer ) ); // LCOV_EXCL_LINE } else if( !BOOST_TEST_EQ( w, ref ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE } } } } { unsigned long long v = static_cast( rng() ); std::snprintf( buffer, sizeof( buffer ), "0.%llu", v ); T ref; auto r1 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), ref ); if( !BOOST_TEST_EQ( static_cast(r1.ec), 0 ) ) { std::fprintf( stderr, "Test failure for '%s': got error at position %ld\n", buffer, static_cast( r1.ptr - buffer ) ); // LCOV_EXCL_LINE } else { for( int j = 1; j <= N; ++j ) { std::snprintf( buffer, sizeof( buffer ), "0.%s%llue%d", std::string( static_cast(j), '0' ).c_str(), v, j ); T w; auto r2 = boost::charconv::from_chars( buffer, buffer + std::strlen( buffer ), w ); if( !BOOST_TEST_EQ( static_cast(r2.ec), 0 ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got error at position %ld\n", buffer, ref, static_cast( r1.ptr - buffer ) ); // LCOV_EXCL_LINE } else if( !BOOST_TEST_EQ( w, ref ) ) { std::fprintf( stderr, "Test failure for '%s': expected '%.15g', got '%.15g'\n", buffer, ref, w ); // LCOV_EXCL_LINE } } } } } } int main() { zero_extend_test(); zero_extend_test(); return boost::report_errors(); }