// ArduinoJson - https://arduinojson.org // Copyright © 2014-2022, Benoit BLANCHON // MIT License #include #include using ARDUINOJSON_NAMESPACE::addPadding; static void REQUIRE_JSON(JsonDocument& doc, const std::string& expected) { std::string json; serializeJson(doc, json); REQUIRE(json == expected); } TEST_CASE("DynamicJsonDocument") { DynamicJsonDocument doc(4096); SECTION("serializeJson()") { JsonObject obj = doc.to(); obj["hello"] = "world"; std::string json; serializeJson(doc, json); REQUIRE(json == "{\"hello\":\"world\"}"); } SECTION("memoryUsage()") { SECTION("starts at zero") { REQUIRE(doc.memoryUsage() == 0); } SECTION("JSON_ARRAY_SIZE(0)") { doc.to(); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0)); } SECTION("JSON_ARRAY_SIZE(1)") { doc.to().add(42); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1)); } SECTION("JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0)") { doc.to().createNestedArray(); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0)); } } SECTION("capacity()") { SECTION("matches constructor argument") { DynamicJsonDocument doc2(256); REQUIRE(doc2.capacity() == 256); } SECTION("rounds up constructor argument") { DynamicJsonDocument doc2(253); REQUIRE(doc2.capacity() == 256); } } SECTION("memoryUsage()") { SECTION("Increases after adding value to array") { JsonArray arr = doc.to(); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0)); arr.add(42); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1)); arr.add(43); REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(2)); } SECTION("Increases after adding value to object") { JsonObject obj = doc.to(); REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0)); obj["a"] = 1; REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1)); obj["b"] = 2; REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2)); } } } TEST_CASE("DynamicJsonDocument constructor") { SECTION("Copy constructor") { DynamicJsonDocument doc1(1234); deserializeJson(doc1, "{\"hello\":\"world\"}"); DynamicJsonDocument doc2 = doc1; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == doc1.capacity()); } SECTION("Construct from StaticJsonDocument") { StaticJsonDocument<200> doc1; deserializeJson(doc1, "{\"hello\":\"world\"}"); DynamicJsonDocument doc2 = doc1; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == doc1.capacity()); } SECTION("Construct from JsonObject") { StaticJsonDocument<200> doc1; JsonObject obj = doc1.to(); obj["hello"] = "world"; DynamicJsonDocument doc2 = obj; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage())); } SECTION("Construct from JsonArray") { StaticJsonDocument<200> doc1; JsonArray arr = doc1.to(); arr.add("hello"); DynamicJsonDocument doc2 = arr; REQUIRE_JSON(doc2, "[\"hello\"]"); REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage())); } SECTION("Construct from JsonVariant") { StaticJsonDocument<200> doc1; deserializeJson(doc1, "42"); DynamicJsonDocument doc2 = doc1.as(); REQUIRE_JSON(doc2, "42"); REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage())); } } TEST_CASE("DynamicJsonDocument assignment") { SECTION("Copy assignment reallocates when capacity is smaller") { DynamicJsonDocument doc1(1234); deserializeJson(doc1, "{\"hello\":\"world\"}"); DynamicJsonDocument doc2(8); doc2 = doc1; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == doc1.capacity()); } SECTION("Copy assignment reallocates when capacity is larger") { DynamicJsonDocument doc1(100); deserializeJson(doc1, "{\"hello\":\"world\"}"); DynamicJsonDocument doc2(1234); doc2 = doc1; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == doc1.capacity()); } SECTION("Assign from StaticJsonDocument") { StaticJsonDocument<200> doc1; deserializeJson(doc1, "{\"hello\":\"world\"}"); DynamicJsonDocument doc2(4096); doc2.to().set(666); doc2 = doc1; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); } SECTION("Assign from JsonObject") { StaticJsonDocument<200> doc1; JsonObject obj = doc1.to(); obj["hello"] = "world"; DynamicJsonDocument doc2(4096); doc2 = obj; REQUIRE_JSON(doc2, "{\"hello\":\"world\"}"); REQUIRE(doc2.capacity() == 4096); } SECTION("Assign from JsonArray") { StaticJsonDocument<200> doc1; JsonArray arr = doc1.to(); arr.add("hello"); DynamicJsonDocument doc2(4096); doc2 = arr; REQUIRE_JSON(doc2, "[\"hello\"]"); REQUIRE(doc2.capacity() == 4096); } SECTION("Assign from JsonVariant") { StaticJsonDocument<200> doc1; deserializeJson(doc1, "42"); DynamicJsonDocument doc2(4096); doc2 = doc1.as(); REQUIRE_JSON(doc2, "42"); REQUIRE(doc2.capacity() == 4096); } SECTION("Assign from MemberProxy") { StaticJsonDocument<200> doc1; doc1["value"] = 42; DynamicJsonDocument doc2(4096); doc2 = doc1["value"]; REQUIRE_JSON(doc2, "42"); REQUIRE(doc2.capacity() == 4096); } SECTION("Assign from ElementProxy") { StaticJsonDocument<200> doc1; doc1[0] = 42; DynamicJsonDocument doc2(4096); doc2 = doc1[0]; REQUIRE_JSON(doc2, "42"); REQUIRE(doc2.capacity() == 4096); } }