5 #include <ArduinoJson.h>
8 using ARDUINOJSON_NAMESPACE::addPadding;
10 static void REQUIRE_JSON(JsonDocument& doc,
const std::string& expected) {
12 serializeJson(doc, json);
13 REQUIRE(json == expected);
16 TEST_CASE(
"DynamicJsonDocument") {
17 DynamicJsonDocument doc(4096);
19 SECTION(
"serializeJson()") {
20 JsonObject obj = doc.to<JsonObject>();
21 obj[
"hello"] =
"world";
24 serializeJson(doc, json);
26 REQUIRE(json ==
"{\"hello\":\"world\"}");
29 SECTION(
"memoryUsage()") {
30 SECTION(
"starts at zero") {
31 REQUIRE(doc.memoryUsage() == 0);
34 SECTION(
"JSON_ARRAY_SIZE(0)") {
36 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
39 SECTION(
"JSON_ARRAY_SIZE(1)") {
40 doc.to<JsonArray>().add(42);
41 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
44 SECTION(
"JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0)") {
45 doc.to<JsonArray>().createNestedArray();
46 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1) + JSON_ARRAY_SIZE(0));
50 SECTION(
"capacity()") {
51 SECTION(
"matches constructor argument") {
52 DynamicJsonDocument doc2(256);
53 REQUIRE(doc2.capacity() == 256);
56 SECTION(
"rounds up constructor argument") {
57 DynamicJsonDocument doc2(253);
58 REQUIRE(doc2.capacity() == 256);
62 SECTION(
"memoryUsage()") {
63 SECTION(
"Increases after adding value to array") {
64 JsonArray arr = doc.to<JsonArray>();
66 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
68 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
70 REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(2));
73 SECTION(
"Increases after adding value to object") {
74 JsonObject obj = doc.to<JsonObject>();
76 REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0));
78 REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1));
80 REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2));
85 TEST_CASE(
"DynamicJsonDocument constructor") {
86 SECTION(
"Copy constructor") {
87 DynamicJsonDocument doc1(1234);
88 deserializeJson(doc1,
"{\"hello\":\"world\"}");
90 DynamicJsonDocument doc2 = doc1;
92 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
94 REQUIRE(doc2.capacity() == doc1.capacity());
97 SECTION(
"Construct from StaticJsonDocument") {
98 StaticJsonDocument<200> doc1;
99 deserializeJson(doc1,
"{\"hello\":\"world\"}");
101 DynamicJsonDocument doc2 = doc1;
103 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
104 REQUIRE(doc2.capacity() == doc1.capacity());
107 SECTION(
"Construct from JsonObject") {
108 StaticJsonDocument<200> doc1;
109 JsonObject obj = doc1.to<JsonObject>();
110 obj[
"hello"] =
"world";
112 DynamicJsonDocument doc2 = obj;
114 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
115 REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
118 SECTION(
"Construct from JsonArray") {
119 StaticJsonDocument<200> doc1;
120 JsonArray arr = doc1.to<JsonArray>();
123 DynamicJsonDocument doc2 = arr;
125 REQUIRE_JSON(doc2,
"[\"hello\"]");
126 REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
129 SECTION(
"Construct from JsonVariant") {
130 StaticJsonDocument<200> doc1;
131 deserializeJson(doc1,
"42");
133 DynamicJsonDocument doc2 = doc1.as<JsonVariant>();
135 REQUIRE_JSON(doc2,
"42");
136 REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
140 TEST_CASE(
"DynamicJsonDocument assignment") {
141 SECTION(
"Copy assignment preserves the buffer when capacity is sufficient") {
142 DynamicJsonDocument doc1(1234);
143 deserializeJson(doc1,
"{\"hello\":\"world\"}");
145 DynamicJsonDocument doc2(doc1.capacity());
148 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
149 REQUIRE(doc2.capacity() == doc1.capacity());
152 SECTION(
"Copy assignment realloc the buffer when capacity is insufficient") {
153 DynamicJsonDocument doc1(1234);
154 deserializeJson(doc1,
"{\"hello\":\"world\"}");
155 DynamicJsonDocument doc2(8);
157 REQUIRE(doc2.capacity() < doc1.memoryUsage());
159 REQUIRE(doc2.capacity() >= doc1.memoryUsage());
161 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
164 SECTION(
"Assign from StaticJsonDocument") {
165 StaticJsonDocument<200> doc1;
166 deserializeJson(doc1,
"{\"hello\":\"world\"}");
167 DynamicJsonDocument doc2(4096);
168 doc2.to<JsonVariant>().set(666);
172 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
175 SECTION(
"Assign from JsonObject") {
176 StaticJsonDocument<200> doc1;
177 JsonObject obj = doc1.to<JsonObject>();
178 obj[
"hello"] =
"world";
180 DynamicJsonDocument doc2(4096);
183 REQUIRE_JSON(doc2,
"{\"hello\":\"world\"}");
184 REQUIRE(doc2.capacity() == 4096);
187 SECTION(
"Assign from JsonArray") {
188 StaticJsonDocument<200> doc1;
189 JsonArray arr = doc1.to<JsonArray>();
192 DynamicJsonDocument doc2(4096);
195 REQUIRE_JSON(doc2,
"[\"hello\"]");
196 REQUIRE(doc2.capacity() == 4096);
199 SECTION(
"Assign from JsonVariant") {
200 StaticJsonDocument<200> doc1;
201 deserializeJson(doc1,
"42");
203 DynamicJsonDocument doc2(4096);
204 doc2 = doc1.as<JsonVariant>();
206 REQUIRE_JSON(doc2,
"42");
207 REQUIRE(doc2.capacity() == 4096);