mirror of
				https://github.com/bblanchon/ArduinoJson.git
				synced 2025-11-04 00:21:36 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			134 lines
		
	
	
		
			3.7 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// ArduinoJson - https://arduinojson.org
 | 
						|
// Copyright © 2014-2023, Benoit BLANCHON
 | 
						|
// MIT License
 | 
						|
 | 
						|
#define ARDUINOJSON_USE_LONG_LONG 0
 | 
						|
#define ARDUINOJSON_ENABLE_NAN 1
 | 
						|
#define ARDUINOJSON_ENABLE_INFINITY 1
 | 
						|
 | 
						|
#include <ArduinoJson.h>
 | 
						|
#include <limits.h>
 | 
						|
#include <catch.hpp>
 | 
						|
 | 
						|
namespace my {
 | 
						|
using ArduinoJson::detail::isinf;
 | 
						|
using ArduinoJson::detail::isnan;
 | 
						|
}  // namespace my
 | 
						|
 | 
						|
TEST_CASE("deserialize an integer") {
 | 
						|
  JsonDocument doc(4096);
 | 
						|
 | 
						|
  SECTION("Integer") {
 | 
						|
    SECTION("0") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "0");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<int>() == true);
 | 
						|
      REQUIRE(doc.as<int>() == 0);
 | 
						|
      REQUIRE(doc.as<std::string>() == "0");  // issue #808
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("Negative") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "-42");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<int>());
 | 
						|
      REQUIRE_FALSE(doc.is<bool>());
 | 
						|
      REQUIRE(doc.as<int>() == -42);
 | 
						|
    }
 | 
						|
 | 
						|
#if LONG_MAX == 2147483647
 | 
						|
    SECTION("LONG_MAX") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "2147483647");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<long>() == true);
 | 
						|
      REQUIRE(doc.as<long>() == LONG_MAX);
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("LONG_MAX + 1") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "2147483648");
 | 
						|
 | 
						|
      CAPTURE(LONG_MIN);
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<long>() == false);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
#if LONG_MIN == -2147483648
 | 
						|
    SECTION("LONG_MIN") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "-2147483648");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<long>() == true);
 | 
						|
      REQUIRE(doc.as<long>() == LONG_MIN);
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("LONG_MIN - 1") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "-2147483649");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<long>() == false);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
#if ULONG_MAX == 4294967295
 | 
						|
    SECTION("ULONG_MAX") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "4294967295");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<unsigned long>() == true);
 | 
						|
      REQUIRE(doc.as<unsigned long>() == ULONG_MAX);
 | 
						|
      REQUIRE(doc.is<long>() == false);
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("ULONG_MAX + 1") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "4294967296");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<unsigned long>() == false);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
    }
 | 
						|
#endif
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("Floats") {
 | 
						|
    SECTION("Double") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "-1.23e+4");
 | 
						|
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE_FALSE(doc.is<int>());
 | 
						|
      REQUIRE(doc.is<double>());
 | 
						|
      REQUIRE(doc.as<double>() == Approx(-1.23e+4));
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("NaN") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "NaN");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
      REQUIRE(my::isnan(doc.as<float>()));
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("Infinity") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "Infinity");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
      REQUIRE(my::isinf(doc.as<float>()));
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("+Infinity") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "+Infinity");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
      REQUIRE(my::isinf(doc.as<float>()));
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("-Infinity") {
 | 
						|
      DeserializationError err = deserializeJson(doc, "-Infinity");
 | 
						|
      REQUIRE(err == DeserializationError::Ok);
 | 
						|
      REQUIRE(doc.is<float>() == true);
 | 
						|
      REQUIRE(my::isinf(doc.as<float>()));
 | 
						|
    }
 | 
						|
  }
 | 
						|
}
 |