PropWare  3.0.0.229
C++ objects and CMake build system for Parallax Propeller
DynamicJsonDocument.cpp
1 // ArduinoJson - arduinojson.org
2 // Copyright Benoit Blanchon 2014-2020
3 // MIT License
4 
5 #include <ArduinoJson.h>
6 #include <catch.hpp>
7 
8 using ARDUINOJSON_NAMESPACE::addPadding;
9 
10 static void REQUIRE_JSON(JsonDocument& doc, const std::string& expected) {
11  std::string json;
12  serializeJson(doc, json);
13  REQUIRE(json == expected);
14 }
15 
16 TEST_CASE("DynamicJsonDocument") {
17  DynamicJsonDocument doc(4096);
18 
19  SECTION("serializeJson()") {
20  JsonObject obj = doc.to<JsonObject>();
21  obj["hello"] = "world";
22 
23  std::string json;
24  serializeJson(doc, json);
25 
26  REQUIRE(json == "{\"hello\":\"world\"}");
27  }
28 
29  SECTION("memoryUsage()") {
30  SECTION("starts at zero") {
31  REQUIRE(doc.memoryUsage() == 0);
32  }
33 
34  SECTION("JSON_ARRAY_SIZE(0)") {
35  doc.to<JsonArray>();
36  REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
37  }
38 
39  SECTION("JSON_ARRAY_SIZE(1)") {
40  doc.to<JsonArray>().add(42);
41  REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
42  }
43 
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));
47  }
48  }
49 
50  SECTION("capacity()") {
51  SECTION("matches constructor argument") {
52  DynamicJsonDocument doc2(256);
53  REQUIRE(doc2.capacity() == 256);
54  }
55 
56  SECTION("rounds up constructor argument") {
57  DynamicJsonDocument doc2(253);
58  REQUIRE(doc2.capacity() == 256);
59  }
60  }
61 
62  SECTION("memoryUsage()") {
63  SECTION("Increases after adding value to array") {
64  JsonArray arr = doc.to<JsonArray>();
65 
66  REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
67  arr.add(42);
68  REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(1));
69  arr.add(43);
70  REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(2));
71  }
72 
73  SECTION("Increases after adding value to object") {
74  JsonObject obj = doc.to<JsonObject>();
75 
76  REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(0));
77  obj["a"] = 1;
78  REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(1));
79  obj["b"] = 2;
80  REQUIRE(doc.memoryUsage() == JSON_OBJECT_SIZE(2));
81  }
82  }
83 }
84 
85 TEST_CASE("DynamicJsonDocument constructor") {
86  SECTION("Copy constructor") {
87  DynamicJsonDocument doc1(1234);
88  deserializeJson(doc1, "{\"hello\":\"world\"}");
89 
90  DynamicJsonDocument doc2 = doc1;
91 
92  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
93 
94  REQUIRE(doc2.capacity() == doc1.capacity());
95  }
96 
97  SECTION("Construct from StaticJsonDocument") {
98  StaticJsonDocument<200> doc1;
99  deserializeJson(doc1, "{\"hello\":\"world\"}");
100 
101  DynamicJsonDocument doc2 = doc1;
102 
103  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
104  REQUIRE(doc2.capacity() == doc1.capacity());
105  }
106 
107  SECTION("Construct from JsonObject") {
108  StaticJsonDocument<200> doc1;
109  JsonObject obj = doc1.to<JsonObject>();
110  obj["hello"] = "world";
111 
112  DynamicJsonDocument doc2 = obj;
113 
114  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
115  REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
116  }
117 
118  SECTION("Construct from JsonArray") {
119  StaticJsonDocument<200> doc1;
120  JsonArray arr = doc1.to<JsonArray>();
121  arr.add("hello");
122 
123  DynamicJsonDocument doc2 = arr;
124 
125  REQUIRE_JSON(doc2, "[\"hello\"]");
126  REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
127  }
128 
129  SECTION("Construct from JsonVariant") {
130  StaticJsonDocument<200> doc1;
131  deserializeJson(doc1, "42");
132 
133  DynamicJsonDocument doc2 = doc1.as<JsonVariant>();
134 
135  REQUIRE_JSON(doc2, "42");
136  REQUIRE(doc2.capacity() == addPadding(doc1.memoryUsage()));
137  }
138 }
139 
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\"}");
144 
145  DynamicJsonDocument doc2(doc1.capacity());
146  doc2 = doc1;
147 
148  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
149  REQUIRE(doc2.capacity() == doc1.capacity());
150  }
151 
152  SECTION("Copy assignment realloc the buffer when capacity is insufficient") {
153  DynamicJsonDocument doc1(1234);
154  deserializeJson(doc1, "{\"hello\":\"world\"}");
155  DynamicJsonDocument doc2(8);
156 
157  REQUIRE(doc2.capacity() < doc1.memoryUsage());
158  doc2 = doc1;
159  REQUIRE(doc2.capacity() >= doc1.memoryUsage());
160 
161  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
162  }
163 
164  SECTION("Assign from StaticJsonDocument") {
165  StaticJsonDocument<200> doc1;
166  deserializeJson(doc1, "{\"hello\":\"world\"}");
167  DynamicJsonDocument doc2(4096);
168  doc2.to<JsonVariant>().set(666);
169 
170  doc2 = doc1;
171 
172  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
173  }
174 
175  SECTION("Assign from JsonObject") {
176  StaticJsonDocument<200> doc1;
177  JsonObject obj = doc1.to<JsonObject>();
178  obj["hello"] = "world";
179 
180  DynamicJsonDocument doc2(4096);
181  doc2 = obj;
182 
183  REQUIRE_JSON(doc2, "{\"hello\":\"world\"}");
184  REQUIRE(doc2.capacity() == 4096);
185  }
186 
187  SECTION("Assign from JsonArray") {
188  StaticJsonDocument<200> doc1;
189  JsonArray arr = doc1.to<JsonArray>();
190  arr.add("hello");
191 
192  DynamicJsonDocument doc2(4096);
193  doc2 = arr;
194 
195  REQUIRE_JSON(doc2, "[\"hello\"]");
196  REQUIRE(doc2.capacity() == 4096);
197  }
198 
199  SECTION("Assign from JsonVariant") {
200  StaticJsonDocument<200> doc1;
201  deserializeJson(doc1, "42");
202 
203  DynamicJsonDocument doc2(4096);
204  doc2 = doc1.as<JsonVariant>();
205 
206  REQUIRE_JSON(doc2, "42");
207  REQUIRE(doc2.capacity() == 4096);
208  }
209 }
string
void string(char *str)
Display a character string on the oLED display.
Definition: oled_string.c:7