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) {