Update to ArduinoJson 7.0.4

This commit is contained in:
iranl
2024-04-19 14:44:01 +02:00
parent 1378732081
commit 81be0a689a
444 changed files with 10842 additions and 9422 deletions

View File

@@ -1,15 +1,23 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
#define ARDUINOJSON_ENABLE_PROGMEM 1
#include <ArduinoJson.h>
#include <catch.hpp>
#include "Allocators.hpp"
using ArduinoJson::detail::sizeofArray;
using ArduinoJson::detail::sizeofObject;
typedef ArduinoJson::detail::MemberProxy<JsonDocument&, const char*>
MemberProxy;
TEST_CASE("MemberProxy::add()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("add(int)") {
@@ -26,7 +34,7 @@ TEST_CASE("MemberProxy::add()") {
}
TEST_CASE("MemberProxy::clear()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("size goes back to zero") {
@@ -45,7 +53,7 @@ TEST_CASE("MemberProxy::clear()") {
}
TEST_CASE("MemberProxy::operator==()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
SECTION("1 vs 1") {
doc["a"] = 1;
@@ -85,7 +93,7 @@ TEST_CASE("MemberProxy::operator==()") {
}
TEST_CASE("MemberProxy::containsKey()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("containsKey(const char*)") {
@@ -104,7 +112,7 @@ TEST_CASE("MemberProxy::containsKey()") {
}
TEST_CASE("MemberProxy::operator|()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
SECTION("const char*") {
doc["a"] = "hello";
@@ -127,7 +135,7 @@ TEST_CASE("MemberProxy::operator|()") {
JsonObject object = doc.to<JsonObject>();
object["hello"] = "world";
StaticJsonDocument<0> emptyDoc;
JsonDocument emptyDoc;
JsonObject anotherObject = object["hello"] | emptyDoc.to<JsonObject>();
REQUIRE(anotherObject.isNull() == false);
@@ -136,7 +144,7 @@ TEST_CASE("MemberProxy::operator|()") {
}
TEST_CASE("MemberProxy::remove()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("remove(int)") {
@@ -183,7 +191,7 @@ TEST_CASE("MemberProxy::remove()") {
}
TEST_CASE("MemberProxy::set()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("set(int)") {
@@ -208,7 +216,7 @@ TEST_CASE("MemberProxy::set()") {
}
TEST_CASE("MemberProxy::size()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("returns 0") {
@@ -230,22 +238,8 @@ TEST_CASE("MemberProxy::size()") {
}
}
TEST_CASE("MemberProxy::memoryUsage()") {
DynamicJsonDocument doc(4096);
MemberProxy mp = doc["hello"];
SECTION("returns 0 when null") {
REQUIRE(mp.memoryUsage() == 0);
}
SECTION("return the size for a string") {
mp.set(std::string("hello"));
REQUIRE(mp.memoryUsage() == 6);
}
}
TEST_CASE("MemberProxy::operator[]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
MemberProxy mp = doc["hello"];
SECTION("set member") {
@@ -262,7 +256,7 @@ TEST_CASE("MemberProxy::operator[]") {
}
TEST_CASE("MemberProxy cast to JsonVariantConst") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
doc["hello"] = "world";
const MemberProxy mp = doc["hello"];
@@ -273,7 +267,7 @@ TEST_CASE("MemberProxy cast to JsonVariantConst") {
}
TEST_CASE("MemberProxy cast to JsonVariant") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
doc["hello"] = "world";
MemberProxy mp = doc["hello"];
@@ -287,42 +281,83 @@ TEST_CASE("MemberProxy cast to JsonVariant") {
CHECK(doc.as<std::string>() == "{\"hello\":\"toto\"}");
}
TEST_CASE("MemberProxy::createNestedArray()") {
StaticJsonDocument<1024> doc;
JsonArray arr = doc["items"].createNestedArray();
arr.add(42);
TEST_CASE("Deduplicate keys") {
SpyingAllocator spy;
JsonDocument doc(&spy);
CHECK(doc["items"][0][0] == 42);
SECTION("std::string") {
doc[0][std::string("example")] = 1;
doc[1][std::string("example")] = 2;
const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
CHECK(key1 == key2);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("example")),
});
}
SECTION("char*") {
char key[] = "example";
doc[0][key] = 1;
doc[1][key] = 2;
const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
CHECK(key1 == key2);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("example")),
});
}
SECTION("Arduino String") {
doc[0][String("example")] = 1;
doc[1][String("example")] = 2;
const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
CHECK(key1 == key2);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("example")),
});
}
SECTION("Flash string") {
doc[0][F("example")] = 1;
doc[1][F("example")] = 2;
const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
CHECK(key1 == key2);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("example")),
});
}
}
TEST_CASE("MemberProxy::createNestedArray(key)") {
StaticJsonDocument<1024> doc;
JsonArray arr = doc["weather"].createNestedArray("temp");
arr.add(42);
TEST_CASE("MemberProxy under memory constraints") {
KillswitchAllocator killswitch;
SpyingAllocator spy(&killswitch);
JsonDocument doc(&spy);
CHECK(doc["weather"]["temp"][0] == 42);
}
TEST_CASE("MemberProxy::createNestedObject()") {
StaticJsonDocument<1024> doc;
JsonObject obj = doc["items"].createNestedObject();
obj["value"] = 42;
CHECK(doc["items"][0]["value"] == 42);
}
TEST_CASE("MemberProxy::createNestedObject(key)") {
StaticJsonDocument<1024> doc;
JsonObject obj = doc["status"].createNestedObject("weather");
obj["temp"] = 42;
CHECK(doc["status"]["weather"]["temp"] == 42);
}
TEST_CASE("MemberProxy::shallowCopy()") {
StaticJsonDocument<1024> doc1, doc2;
doc2["hello"] = "world";
doc1["obj"].shallowCopy(doc2);
CHECK(doc1.as<std::string>() == "{\"obj\":{\"hello\":\"world\"}}");
SECTION("key allocation fails") {
killswitch.on();
doc[std::string("hello")] = "world";
REQUIRE(doc.is<JsonObject>());
REQUIRE(doc.size() == 0);
REQUIRE(doc.overflowed() == true);
REQUIRE(spy.log() == AllocatorLog{
AllocateFail(sizeofString("hello")),
});
}
}