Remove JSON_ARRAY_SIZE(), JSON_OBJECT_SIZE(), and JSON_STRING_SIZE()

This commit is contained in:
Benoit Blanchon
2023-03-29 19:18:06 +02:00
parent 0328f66340
commit 3f43c2b816
36 changed files with 395 additions and 340 deletions

View File

@ -6,6 +6,8 @@
#include <catch.hpp>
using ArduinoJson::detail::addPadding;
using ArduinoJson::detail::sizeofArray;
using ArduinoJson::detail::sizeofObject;
static void REQUIRE_JSON(JsonDocument& doc, const std::string& expected) {
std::string json;
@ -31,19 +33,19 @@ TEST_CASE("JsonDocument") {
REQUIRE(doc.memoryUsage() == 0);
}
SECTION("JSON_ARRAY_SIZE(0)") {
SECTION("sizeofArray(0)") {
doc.to<JsonArray>();
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
REQUIRE(doc.memoryUsage() == sizeofArray(0));
}
SECTION("JSON_ARRAY_SIZE(1)") {
SECTION("sizeofArray(1)") {
doc.to<JsonArray>().add(42);
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
REQUIRE(doc.memoryUsage() == sizeofArray(1));
}
SECTION("JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0)") {
SECTION("sizeofArray(1) + sizeofArray(0)") {
doc.to<JsonArray>().createNestedArray();
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0));
REQUIRE(doc.memoryUsage() == sizeofArray(1) + sizeofArray(0));
}
}
@ -63,21 +65,21 @@ TEST_CASE("JsonDocument") {
SECTION("Increases after adding value to array") {
JsonArray arr = doc.to<JsonArray>();
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
REQUIRE(doc.memoryUsage() == sizeofArray(0));
arr.add(42);
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
REQUIRE(doc.memoryUsage() == sizeofArray(1));
arr.add(43);
REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(2));
REQUIRE(doc.memoryUsage() == sizeofArray(2));
}
SECTION("Increases after adding value to object") {
JsonObject obj = doc.to<JsonObject>();
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0));
REQUIRE(doc.memoryUsage() == sizeofObject(0));
obj["a"] = 1;
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1));
REQUIRE(doc.memoryUsage() == sizeofObject(1));
obj["b"] = 2;
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2));
REQUIRE(doc.memoryUsage() == sizeofObject(2));
}
}
}

View File

@ -8,6 +8,8 @@
#include <sstream>
#include <utility>
using ArduinoJson::detail::sizeofObject;
class SpyingAllocator : public Allocator {
public:
virtual ~SpyingAllocator() {}
@ -165,13 +167,13 @@ TEST_CASE("JsonDocument's allocator") {
SECTION("when allocation succeeds") {
deserializeJson(doc, "{\"blanket\":1,\"dancing\":2}");
REQUIRE(doc.capacity() == 4096);
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2) + 16);
REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
doc.remove("blanket");
bool result = doc.garbageCollect();
REQUIRE(result == true);
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1) + 8);
REQUIRE(doc.memoryUsage() == sizeofObject(1) + 8);
REQUIRE(doc.capacity() == 4096);
REQUIRE(doc.as<std::string>() == "{\"dancing\":2}");
}
@ -179,14 +181,14 @@ TEST_CASE("JsonDocument's allocator") {
SECTION("when allocation fails") {
deserializeJson(doc, "{\"blanket\":1,\"dancing\":2}");
REQUIRE(doc.capacity() == 4096);
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2) + 16);
REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
doc.remove("blanket");
controllableAllocator.disable();
bool result = doc.garbageCollect();
REQUIRE(result == false);
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2) + 16);
REQUIRE(doc.memoryUsage() == sizeofObject(2) + 16);
REQUIRE(doc.capacity() == 4096);
REQUIRE(doc.as<std::string>() == "{\"dancing\":2}");
}

View File

@ -5,6 +5,8 @@
#include <ArduinoJson.h>
#include <catch.hpp>
using ArduinoJson::detail::sizeofArray;
TEST_CASE("JsonDocument::overflowed()") {
SECTION("returns false on a fresh object") {
JsonDocument doc(0);
@ -18,19 +20,19 @@ TEST_CASE("JsonDocument::overflowed()") {
}
SECTION("returns false after successful insertion") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
doc.add(0);
CHECK(doc.overflowed() == false);
}
SECTION("returns true after a failed string copy") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
doc.add(std::string("example"));
CHECK(doc.overflowed() == true);
}
SECTION("returns false after a successful string copy") {
JsonDocument doc(JSON_ARRAY_SIZE(1) + 8);
JsonDocument doc(sizeofArray(1) + 8);
doc.add(std::string("example"));
CHECK(doc.overflowed() == false);
}
@ -42,13 +44,13 @@ TEST_CASE("JsonDocument::overflowed()") {
}
SECTION("returns true after a failed deserialization") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
deserializeJson(doc, "[\"example\"]");
CHECK(doc.overflowed() == true);
}
SECTION("returns false after a successful deserialization") {
JsonDocument doc(JSON_ARRAY_SIZE(1) + 8);
JsonDocument doc(sizeofArray(1) + 8);
deserializeJson(doc, "[\"example\"]");
CHECK(doc.overflowed() == false);
}
@ -61,14 +63,14 @@ TEST_CASE("JsonDocument::overflowed()") {
}
SECTION("remains false after shrinkToFit()") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
doc.add(0);
doc.shrinkToFit();
CHECK(doc.overflowed() == false);
}
SECTION("remains true after shrinkToFit()") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
doc.add(0);
doc.add(0);
doc.shrinkToFit();
@ -76,7 +78,7 @@ TEST_CASE("JsonDocument::overflowed()") {
}
SECTION("return false after garbageCollect()") {
JsonDocument doc(JSON_ARRAY_SIZE(1));
JsonDocument doc(sizeofArray(1));
doc.add(0);
doc.add(0);
doc.garbageCollect();

View File

@ -8,6 +8,9 @@
#include <stdlib.h> // malloc, free
#include <string>
using ArduinoJson::detail::sizeofArray;
using ArduinoJson::detail::sizeofObject;
class ArmoredAllocator : public Allocator {
public:
ArmoredAllocator() : _ptr(0), _size(0) {}
@ -68,12 +71,12 @@ TEST_CASE("JsonDocument::shrinkToFit()") {
SECTION("empty object") {
deserializeJson(doc, "{}");
testShrinkToFit(doc, "{}", JSON_OBJECT_SIZE(0));
testShrinkToFit(doc, "{}", sizeofObject(0));
}
SECTION("empty array") {
deserializeJson(doc, "[]");
testShrinkToFit(doc, "[]", JSON_ARRAY_SIZE(0));
testShrinkToFit(doc, "[]", sizeofArray(0));
}
SECTION("linked string") {
@ -98,43 +101,43 @@ TEST_CASE("JsonDocument::shrinkToFit()") {
SECTION("linked key") {
doc["key"] = 42;
testShrinkToFit(doc, "{\"key\":42}", JSON_OBJECT_SIZE(1));
testShrinkToFit(doc, "{\"key\":42}", sizeofObject(1));
}
SECTION("owned key") {
doc[std::string("abcdefg")] = 42;
testShrinkToFit(doc, "{\"abcdefg\":42}", JSON_OBJECT_SIZE(1) + 8);
testShrinkToFit(doc, "{\"abcdefg\":42}", sizeofObject(1) + 8);
}
SECTION("linked string in array") {
doc.add("hello");
testShrinkToFit(doc, "[\"hello\"]", JSON_ARRAY_SIZE(1));
testShrinkToFit(doc, "[\"hello\"]", sizeofArray(1));
}
SECTION("owned string in array") {
doc.add(std::string("abcdefg"));
testShrinkToFit(doc, "[\"abcdefg\"]", JSON_ARRAY_SIZE(1) + 8);
testShrinkToFit(doc, "[\"abcdefg\"]", sizeofArray(1) + 8);
}
SECTION("linked string in object") {
doc["key"] = "hello";
testShrinkToFit(doc, "{\"key\":\"hello\"}", JSON_OBJECT_SIZE(1));
testShrinkToFit(doc, "{\"key\":\"hello\"}", sizeofObject(1));
}
SECTION("owned string in object") {
doc["key"] = std::string("abcdefg");
testShrinkToFit(doc, "{\"key\":\"abcdefg\"}", JSON_ARRAY_SIZE(1) + 8);
testShrinkToFit(doc, "{\"key\":\"abcdefg\"}", sizeofArray(1) + 8);
}
SECTION("unaligned") {
doc.add(std::string("?")); // two bytes in the string pool
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1) + 2);
REQUIRE(doc.memoryUsage() == sizeofObject(1) + 2);
doc.shrinkToFit();
// the new capacity should be padded to align the pointers
REQUIRE(doc.capacity() == JSON_OBJECT_SIZE(1) + sizeof(void*));
REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1) + 2);
REQUIRE(doc.capacity() == sizeofObject(1) + sizeof(void*));
REQUIRE(doc.memoryUsage() == sizeofObject(1) + 2);
REQUIRE(doc[0] == "?");
}
}