From fed9cb5d2d3833c02b27abb4a4e19fed85a6c27e Mon Sep 17 00:00:00 2001 From: Daniel Bertalan Date: Sat, 30 Oct 2021 10:43:21 +0200 Subject: [PATCH] AK+Tests: Fix formatting of infinity and NaN values When I added this code in 1472f6d, I forgot to add tests for it. That's why I didn't realize that the values were appended to the wrong FormatBuilder object, so an empty string was returned instead of the expected "nan"/"inf". This made debugging some FPU issues with the ScummVM port significantly more difficult. --- AK/Format.cpp | 8 ++++---- Tests/AK/TestFormat.cpp | 5 +++++ 2 files changed, 9 insertions(+), 4 deletions(-) diff --git a/AK/Format.cpp b/AK/Format.cpp index 05ee228cdc..fb95978873 100644 --- a/AK/Format.cpp +++ b/AK/Format.cpp @@ -365,14 +365,14 @@ void FormatBuilder::put_f64( string_builder.append('-'); else if (sign_mode == SignMode::Always) string_builder.append('+'); - else + else if (sign_mode == SignMode::Reserved) string_builder.append(' '); if (isnan(value)) string_builder.append(upper_case ? "NAN"sv : "nan"sv); else string_builder.append(upper_case ? "INF"sv : "inf"sv); - format_builder.put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); + put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); return; } @@ -431,14 +431,14 @@ void FormatBuilder::put_f80( string_builder.append('-'); else if (sign_mode == SignMode::Always) string_builder.append('+'); - else + else if (sign_mode == SignMode::Reserved) string_builder.append(' '); if (isnan(value)) string_builder.append(upper_case ? "NAN"sv : "nan"sv); else string_builder.append(upper_case ? "INF"sv : "inf"sv); - format_builder.put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); + put_string(string_builder.string_view(), align, min_width, NumericLimits::max(), fill); return; } diff --git a/Tests/AK/TestFormat.cpp b/Tests/AK/TestFormat.cpp index a4cc1f642f..dcae6d3c07 100644 --- a/Tests/AK/TestFormat.cpp +++ b/Tests/AK/TestFormat.cpp @@ -9,6 +9,7 @@ #include #include #include +#include TEST_CASE(is_integral_works_properly) { @@ -241,6 +242,10 @@ TEST_CASE(floating_point_numbers) EXPECT_EQ(String::formatted("{:.1}", 1.12), "1.1"); EXPECT_EQ(String::formatted("{}", -1.12), "-1.12"); + EXPECT_EQ(String::formatted("{}", NAN), "nan"); + EXPECT_EQ(String::formatted("{}", INFINITY), "inf"); + EXPECT_EQ(String::formatted("{}", -INFINITY), "-inf"); + // FIXME: There is always the question what we mean with the width field. Do we mean significant digits? // Do we mean the whole width? This is what was the simplest to implement: EXPECT_EQ(String::formatted("{:x>5.1}", 1.12), "xx1.1");