diff options
| author | Stefan Boberg <[email protected]> | 2021-10-05 21:07:18 +0200 |
|---|---|---|
| committer | Stefan Boberg <[email protected]> | 2021-10-05 21:07:18 +0200 |
| commit | 6c19c4fe68253bed7392ffc4eeb6b8308d389c5a (patch) | |
| tree | 7a54757a04e510f1359bffdac47a8f8ab6f005fa | |
| parent | Added Ref<> constructor which allows casting from derived types to parent types (diff) | |
| parent | Serialize JSON NaN numbers to null. (diff) | |
| download | zen-6c19c4fe68253bed7392ffc4eeb6b8308d389c5a.tar.xz zen-6c19c4fe68253bed7392ffc4eeb6b8308d389c5a.zip | |
Merge branch 'main' of https://github.com/EpicGames/zen into main
| -rw-r--r-- | zencore/compactbinary.cpp | 51 |
1 files changed, 48 insertions, 3 deletions
diff --git a/zencore/compactbinary.cpp b/zencore/compactbinary.cpp index 4072ab5cf..c4694733c 100644 --- a/zencore/compactbinary.cpp +++ b/zencore/compactbinary.cpp @@ -1474,10 +1474,30 @@ public: Builder << Accessor.AsIntegerNegative(); break; case CbFieldType::Float32: - Builder.Append("{:.9g}"_format(Accessor.AsFloat32())); + { + const float Value = Accessor.AsFloat32(); + if (std::isfinite(Value)) + { + Builder.Append("{:.9g}"_format(Value)); + } + else + { + Builder << "null"sv; + } + } break; case CbFieldType::Float64: - Builder.Append("{:.17g}"_format(Accessor.AsFloat64())); + { + const double Value = Accessor.AsFloat64(); + if (std::isfinite(Value)) + { + Builder.Append("{:.17g}"_format(Value)); + } + else + { + Builder << "null"sv; + } + } break; case CbFieldType::BoolFalse: Builder << "false"sv; @@ -1834,7 +1854,7 @@ TEST_CASE("uson.json") SUBCASE("number") { - const double ExpectedFloatValue = 21.21f; + const float ExpectedFloatValue = 21.21f; const double ExpectedDoubleValue = 42.42; CbObjectWriter Writer; @@ -1856,6 +1876,31 @@ TEST_CASE("uson.json") CHECK(FloatValue == doctest::Approx(ExpectedFloatValue)); CHECK(DoubleValue == doctest::Approx(ExpectedDoubleValue)); } + + SUBCASE("number.nan") + { + const float FloatNan = std::numeric_limits<float>::quiet_NaN(); + const double DoubleNan = std::numeric_limits<double>::quiet_NaN(); + + CbObjectWriter Writer; + Writer << "FloatNan" << FloatNan; + Writer << "DoubleNan" << DoubleNan; + + CbObject Obj = Writer.Save(); + + StringBuilder<128> Sb; + const std::string_view JsonText = Obj.ToJson(Sb).ToView(); + + std::string JsonError; + json11::Json Json = json11::Json::parse(JsonText.data(), JsonError); + + const double FloatValue = Json["FloatNan"].number_value(); + const double DoubleValue = Json["DoubleNan"].number_value(); + + CHECK(JsonError.empty()); + CHECK(FloatValue == 0); + CHECK(DoubleValue == 0); + } } #endif |