Add extra test cases for StringToFloat() and StringToDouble()
Add more test cases for converting strings to floats and doubles to
cover many different edge cases.
Bug: 366309453, 367395351
Change-Id: Iadba7d10d6e36a3428bd94f406f4472d35ec141d
Reviewed-on: https://pdfium-review.googlesource.com/c/pdfium/+/124411
Reviewed-by: Lei Zhang <thestig@chromium.org>
Commit-Queue: Andy Phan <andyphan@chromium.org>
diff --git a/core/fxcrt/fx_string_unittest.cpp b/core/fxcrt/fx_string_unittest.cpp
index d4a7bf8..601deb2 100644
--- a/core/fxcrt/fx_string_unittest.cpp
+++ b/core/fxcrt/fx_string_unittest.cpp
@@ -73,6 +73,23 @@
EXPECT_FLOAT_EQ(1.000000119f, StringToFloat("1.000000119"));
EXPECT_FLOAT_EQ(1.999999881f, StringToFloat("1.999999881"));
+
+ EXPECT_FLOAT_EQ(0.25f, StringToFloat(L"+0.25"));
+
+ // TODO(crbug.com/367395351): Should be 1.2e34f.
+ EXPECT_FLOAT_EQ(1.2034f, StringToFloat("1.2e34"));
+
+ EXPECT_FLOAT_EQ(std::numeric_limits<float>::infinity(),
+ StringToFloat("999999999999999999999999999999999999999"));
+ EXPECT_FLOAT_EQ(-std::numeric_limits<float>::infinity(),
+ StringToFloat("-999999999999999999999999999999999999999"));
+
+ EXPECT_FLOAT_EQ(0.0f, StringToFloat("invalid"));
+
+ // Test the exact float value. Use EXPECT_EQ, which does an exact comparison,
+ // instead of EXPECT_FLOAT_EQ, which allows slight precision error.
+ // TODO(crbug.com/366309453): Should round to 38.89528656005859375f.
+ EXPECT_EQ(38.895282745361328125f, StringToFloat("38.895285"));
}
TEST(fxstring, WideStringToFloat) {
@@ -96,6 +113,23 @@
EXPECT_FLOAT_EQ(1.000000119f, StringToFloat(L"1.000000119"));
EXPECT_FLOAT_EQ(1.999999881f, StringToFloat(L"1.999999881"));
+
+ EXPECT_FLOAT_EQ(0.25f, StringToFloat(L"+0.25"));
+
+ // TODO(crbug.com/367395351): Should be 1.2e34f.
+ EXPECT_FLOAT_EQ(1.2034f, StringToFloat(L"1.2e34"));
+
+ EXPECT_FLOAT_EQ(std::numeric_limits<float>::infinity(),
+ StringToFloat(L"999999999999999999999999999999999999999"));
+ EXPECT_FLOAT_EQ(-std::numeric_limits<float>::infinity(),
+ StringToFloat(L"-999999999999999999999999999999999999999"));
+
+ EXPECT_FLOAT_EQ(0.0f, StringToFloat(L"invalid"));
+
+ // Test the exact float value. Use EXPECT_EQ, which does an exact comparison,
+ // instead of EXPECT_FLOAT_EQ, which allows slight precision error.
+ // TODO(crbug.com/366309453): Should round to 38.89528656005859375f.
+ EXPECT_EQ(38.895282745361328125f, StringToFloat(L"38.895285"));
}
TEST(fxstring, ByteStringToDouble) {
@@ -119,6 +153,35 @@
EXPECT_DOUBLE_EQ(1.000000119, StringToDouble("1.000000119"));
EXPECT_DOUBLE_EQ(1.999999881, StringToDouble("1.999999881"));
+
+ EXPECT_DOUBLE_EQ(0.25, StringToDouble("+0.25"));
+
+ // TODO(crbug.com/367395351): Should be 1.2e34.
+ EXPECT_DOUBLE_EQ(1.2034, StringToDouble("1.2e34"));
+
+ EXPECT_DOUBLE_EQ(
+ std::numeric_limits<double>::infinity(),
+ StringToDouble(
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999"));
+ EXPECT_DOUBLE_EQ(
+ -std::numeric_limits<double>::infinity(),
+ StringToDouble(
+ "-9999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999999999999999999999999999999999"
+ "99999999999999999999999999999999999999"));
+
+ EXPECT_DOUBLE_EQ(0.0, StringToDouble("invalid"));
+
+ // Test the exact double value. Use EXPECT_EQ, which does an exact comparison,
+ // instead of EXPECT_DOUBLE_EQ, which allows slight precision error.
+ // TODO(crbug.com/366309453): Should round to 1.9998779296892903.
+ EXPECT_EQ(1.9998779296800002, StringToDouble("1.99987792968929034"));
}
TEST(fxstring, WideStringToDouble) {
@@ -142,6 +205,35 @@
EXPECT_DOUBLE_EQ(1.000000119, StringToDouble(L"1.000000119"));
EXPECT_DOUBLE_EQ(1.999999881, StringToDouble(L"1.999999881"));
+
+ EXPECT_DOUBLE_EQ(0.25, StringToDouble(L"+0.25"));
+
+ // TODO(crbug.com/367395351): Should be 1.2e34.
+ EXPECT_DOUBLE_EQ(1.2034, StringToDouble(L"1.2e34"));
+
+ EXPECT_DOUBLE_EQ(
+ std::numeric_limits<double>::infinity(),
+ StringToDouble(
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"999999999999999999999999999999999999999999"));
+ EXPECT_DOUBLE_EQ(
+ -std::numeric_limits<double>::infinity(),
+ StringToDouble(
+ L"-999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"9999999999999999999999999999999999999999999999999999999999999999999"
+ L"999999999999999999999999999999999999999999"));
+
+ EXPECT_DOUBLE_EQ(0.0, StringToDouble(L"invalid"));
+
+ // Test the exact double value. Use EXPECT_EQ, which does an exact comparison,
+ // instead of EXPECT_DOUBLE_EQ, which allows slight precision error.
+ // TODO(crbug.com/366309453): Should round to 1.9998779296892903.
+ EXPECT_EQ(1.9998779296800002, StringToDouble(L"1.99987792968929034"));
}
TEST(fxstring, SplitByteString) {