Internal change
PiperOrigin-RevId: 499976437
diff --git a/fuzztest/internal/type_support.cc b/fuzztest/internal/type_support.cc
index 2ae4dd1..4376505 100644
--- a/fuzztest/internal/type_support.cc
+++ b/fuzztest/internal/type_support.cc
@@ -37,7 +37,7 @@
// format specifier is needed to reasonably choose between decimal and
// exponential notation.
std::string num_string =
- absl::StrFormat("%.*g", std::numeric_limits<T>::digits10, v);
+ absl::StrFormat("%.*g", std::numeric_limits<T>::digits10 + 2, v);
bool needs_decimal = std::isfinite(v) &&
!absl::StrContains(num_string, '.') &&
!absl::StrContains(num_string, 'e');
diff --git a/fuzztest/internal/type_support_test.cc b/fuzztest/internal/type_support_test.cc
index eb06981..b68ee51 100644
--- a/fuzztest/internal/type_support_test.cc
+++ b/fuzztest/internal/type_support_test.cc
@@ -25,6 +25,7 @@
#include <optional>
#include <ostream>
#include <set>
+#include <sstream>
#include <string>
#include <string_view>
#include <tuple>
@@ -37,6 +38,7 @@
#include "gtest/gtest.h"
#include "absl/strings/str_cat.h"
#include "absl/strings/str_format.h"
+#include "absl/strings/strip.h"
#include "absl/time/time.h"
#include "./fuzztest/domain.h"
#include "./fuzztest/internal/domain.h"
@@ -125,9 +127,7 @@
class FloatingTest : public testing::Test {};
using FloatingTypes = testing::Types<float, double, long double>;
-
TYPED_TEST_SUITE(FloatingTest, FloatingTypes);
-
TYPED_TEST(FloatingTest, Printer) {
std::string_view suffix = std::is_same_v<float, TypeParam> ? "f"
: std::is_same_v<double, TypeParam> ? ""
@@ -156,6 +156,25 @@
std::is_same_v<float, TypeParam> ? "std::nanf(\"\")"
: std::is_same_v<double, TypeParam> ? "std::nan(\"\")"
: "std::nanl(\"\")"));
+
+ // Check round tripping.
+ for (auto v : {TypeParam{0.0013660046866830892},
+ std::numeric_limits<TypeParam>::epsilon()}) {
+ auto printed_v = TestPrintValue(v);
+ // Using stringstream isn't ideal but neither std::strto* nor
+ // //strings/numbers.h are templated (the latter can't even handle long
+ // double).
+ std::stringstream human_v_str;
+ std::stringstream source_code_v_str;
+ human_v_str << absl::StripSuffix(printed_v[0], suffix);
+ source_code_v_str << absl::StripSuffix(printed_v[1], suffix);
+ TypeParam human_v = TypeParam{0};
+ TypeParam source_code_v = TypeParam{0};
+ EXPECT_TRUE(human_v_str >> human_v);
+ EXPECT_TRUE(source_code_v_str >> source_code_v);
+ EXPECT_EQ(v, human_v);
+ EXPECT_EQ(v, source_code_v);
+ }
}
TEST(StringTest, Printer) {