diff --git a/extras/tests/MixedConfiguration/use_double_0.cpp b/extras/tests/MixedConfiguration/use_double_0.cpp index 8752890d..6958bc06 100644 --- a/extras/tests/MixedConfiguration/use_double_0.cpp +++ b/extras/tests/MixedConfiguration/use_double_0.cpp @@ -3,15 +3,65 @@ #include -TEST_CASE("ARDUINOJSON_USE_DOUBLE == 0") { - JsonDocument doc; - JsonObject root = doc.to(); +namespace my { +using ArduinoJson::detail::isinf; +} // namespace my - root["pi"] = 3.14; - root["e"] = 2.72; - - std::string json; - serializeJson(doc, json); - - REQUIRE(json == "{\"pi\":3.14,\"e\":2.72}"); +void checkFloat(const char* input, float expected) { + using ArduinoJson::detail::NumberType; + using ArduinoJson::detail::parseNumber; + CAPTURE(input); + auto result = parseNumber(input); + REQUIRE(result.type() == NumberType::Float); + REQUIRE(result.asFloat() == Approx(expected)); +} + +TEST_CASE("ARDUINOJSON_USE_DOUBLE == 0") { + SECTION("serializeJson()") { + JsonDocument doc; + JsonObject root = doc.to(); + + root["pi"] = 3.14; + root["e"] = 2.72; + + std::string json; + serializeJson(doc, json); + + REQUIRE(json == "{\"pi\":3.14,\"e\":2.72}"); + } + + SECTION("parseNumber()") { + using ArduinoJson::detail::NumberType; + using ArduinoJson::detail::parseNumber; + + SECTION("Large positive number") { + auto result = parseNumber("1e300"); + REQUIRE(result.type() == NumberType::Float); + REQUIRE(result.asFloat() > 0); + REQUIRE(my::isinf(result.asFloat())); + } + + SECTION("Large negative number") { + auto result = parseNumber("-1e300"); + REQUIRE(result.type() == NumberType::Float); + REQUIRE(result.asFloat() < 0); + REQUIRE(my::isinf(result.asFloat())); + } + + SECTION("Too small to be represented") { + auto result = parseNumber("1e-300"); + REQUIRE(result.type() == NumberType::Float); + REQUIRE(result.asFloat() == 0); + } + + SECTION("MantissaTooLongToFit") { + checkFloat("0.340282346638528861111111111111", 0.34028234663852886f); + checkFloat("34028234663852886.11111111111111", 34028234663852886.0f); + checkFloat("34028234.66385288611111111111111", 34028234.663852886f); + + checkFloat("-0.340282346638528861111111111111", -0.34028234663852886f); + checkFloat("-34028234663852886.11111111111111", -34028234663852886.0f); + checkFloat("-34028234.66385288611111111111111", -34028234.663852886f); + } + } } diff --git a/extras/tests/Numbers/parseFloat.cpp b/extras/tests/Numbers/parseFloat.cpp index 4a42f442..928e0767 100644 --- a/extras/tests/Numbers/parseFloat.cpp +++ b/extras/tests/Numbers/parseFloat.cpp @@ -2,7 +2,6 @@ // Copyright © 2014-2024, Benoit BLANCHON // MIT License -#define ARDUINOJSON_USE_DOUBLE 0 #define ARDUINOJSON_ENABLE_NAN 1 #define ARDUINOJSON_ENABLE_INFINITY 1 @@ -13,7 +12,9 @@ using namespace ArduinoJson::detail; void checkFloat(const char* input, float expected) { CAPTURE(input); - REQUIRE(parseNumber(input) == Approx(expected)); + auto result = parseNumber(input); + REQUIRE(result.type() == NumberType::Float); + REQUIRE(result.asFloat() == Approx(expected)); } void checkFloatNaN(const char* input) { @@ -65,23 +66,6 @@ TEST_CASE("parseNumber()") { 1e+32f); } - SECTION("MantissaTooLongToFit") { - checkFloat("0.340282346638528861111111111111", 0.34028234663852886f); - checkFloat("34028234663852886.11111111111111", 34028234663852886.0f); - checkFloat("34028234.66385288611111111111111", 34028234.663852886f); - - checkFloat("-0.340282346638528861111111111111", -0.34028234663852886f); - checkFloat("-34028234663852886.11111111111111", -34028234663852886.0f); - checkFloat("-34028234.66385288611111111111111", -34028234.663852886f); - } - - SECTION("ExponentTooBig") { - checkFloatInf("1e39", false); - checkFloatInf("-1e39", true); - checkFloatInf("1e255", false); - checkFloat("1e-255", 0.0f); - } - SECTION("NaN") { checkFloatNaN("NaN"); checkFloatNaN("nan"); @@ -94,8 +78,5 @@ TEST_CASE("parseNumber()") { checkFloatInf("inf", false); checkFloatInf("+inf", false); checkFloatInf("-inf", true); - - checkFloatInf("1e300", false); - checkFloatInf("-1e300", true); } }