summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorDaniel Bertalan <dani@danielbertalan.dev>2021-10-30 10:43:21 +0200
committerAndreas Kling <kling@serenityos.org>2021-10-31 12:15:34 +0100
commitfed9cb5d2d3833c02b27abb4a4e19fed85a6c27e (patch)
tree8b1d566463331c249a86cec48322b59d71937f68
parent2c93ee50cd7b247bf01c6f6fabd3ae441d742ea8 (diff)
downloadserenity-fed9cb5d2d3833c02b27abb4a4e19fed85a6c27e.zip
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.
-rw-r--r--AK/Format.cpp8
-rw-r--r--Tests/AK/TestFormat.cpp5
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<size_t>::max(), fill);
+ put_string(string_builder.string_view(), align, min_width, NumericLimits<size_t>::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<size_t>::max(), fill);
+ put_string(string_builder.string_view(), align, min_width, NumericLimits<size_t>::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 <AK/String.h>
#include <AK/StringBuilder.h>
#include <AK/Vector.h>
+#include <math.h>
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");