PropWare  3.0.0.229
C++ objects and CMake build system for Parallax Propeller
copyArray.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 TEST_CASE("copyArray()") {
9  SECTION("int[] -> JsonArray") {
10  DynamicJsonDocument doc(4096);
11  JsonArray array = doc.to<JsonArray>();
12  char json[32];
13  int source[] = {1, 2, 3};
14 
15  bool ok = copyArray(source, array);
16  CHECK(ok);
17 
18  serializeJson(array, json);
19  CHECK(std::string("[1,2,3]") == json);
20  }
21 
22  SECTION("std::string[] -> JsonArray") {
23  DynamicJsonDocument doc(4096);
24  JsonArray array = doc.to<JsonArray>();
25  char json[32];
26  std::string source[] = {"a", "b", "c"};
27 
28  bool ok = copyArray(source, array);
29  CHECK(ok);
30 
31  serializeJson(array, json);
32  CHECK(std::string("[\"a\",\"b\",\"c\"]") == json);
33  }
34 
35  SECTION("int[] -> JsonDocument") {
36  DynamicJsonDocument doc(4096);
37  char json[32];
38  int source[] = {1, 2, 3};
39 
40  bool ok = copyArray(source, doc);
41  CHECK(ok);
42 
43  serializeJson(doc, json);
44  CHECK(std::string("[1,2,3]") == json);
45  }
46 
47  SECTION("int[] -> MemberProxy") {
48  DynamicJsonDocument doc(4096);
49  char json[32];
50  int source[] = {1, 2, 3};
51 
52  bool ok = copyArray(source, doc["data"]);
53  CHECK(ok);
54 
55  serializeJson(doc, json);
56  CHECK(std::string("{\"data\":[1,2,3]}") == json);
57  }
58 
59  SECTION("int[] -> JsonArray, but not enough memory") {
60  const size_t SIZE = JSON_ARRAY_SIZE(2);
61  StaticJsonDocument<SIZE> doc;
62  JsonArray array = doc.to<JsonArray>();
63  char json[32];
64  int source[] = {1, 2, 3};
65 
66  bool ok = copyArray(source, array);
67  REQUIRE_FALSE(ok);
68 
69  serializeJson(array, json);
70  CHECK(std::string("[1,2]") == json);
71  }
72 
73  SECTION("int[][] -> JsonArray") {
74  DynamicJsonDocument doc(4096);
75  JsonArray array = doc.to<JsonArray>();
76  char json[32];
77  int source[][3] = {{1, 2, 3}, {4, 5, 6}};
78 
79  bool ok = copyArray(source, array);
80  CHECK(ok);
81 
82  serializeJson(array, json);
83  CHECK(std::string("[[1,2,3],[4,5,6]]") == json);
84  }
85 
86  SECTION("int[][] -> MemberProxy") {
87  DynamicJsonDocument doc(4096);
88  char json[32];
89  int source[][3] = {{1, 2, 3}, {4, 5, 6}};
90 
91  bool ok = copyArray(source, doc["data"]);
92  CHECK(ok);
93 
94  serializeJson(doc, json);
95  CHECK(std::string("{\"data\":[[1,2,3],[4,5,6]]}") == json);
96  }
97 
98  SECTION("int[][] -> JsonDocument") {
99  DynamicJsonDocument doc(4096);
100  char json[32];
101  int source[][3] = {{1, 2, 3}, {4, 5, 6}};
102 
103  bool ok = copyArray(source, doc);
104  CHECK(ok);
105 
106  serializeJson(doc, json);
107  CHECK(std::string("[[1,2,3],[4,5,6]]") == json);
108  }
109 
110  SECTION("int[][] -> JsonArray, but not enough memory") {
111  const size_t SIZE =
112  JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
113  StaticJsonDocument<SIZE> doc;
114  JsonArray array = doc.to<JsonArray>();
115  char json[32] = "";
116  int source[][3] = {{1, 2, 3}, {4, 5, 6}};
117 
118  CAPTURE(SIZE)
119 
120  bool ok = copyArray(source, array);
121  CAPTURE(doc.memoryUsage());
122  CHECK_FALSE(ok);
123 
124  serializeJson(array, json);
125  CHECK(std::string("[[1,2,3],[4,5]]") == json);
126  }
127 
128  SECTION("JsonArray -> int[], with more space than needed") {
129  DynamicJsonDocument doc(4096);
130  char json[] = "[1,2,3]";
131  DeserializationError err = deserializeJson(doc, json);
132  CHECK(err == DeserializationError::Ok);
133  JsonArray array = doc.as<JsonArray>();
134 
135  int destination[4] = {0};
136  size_t result = copyArray(array, destination);
137 
138  CHECK(3 == result);
139  CHECK(1 == destination[0]);
140  CHECK(2 == destination[1]);
141  CHECK(3 == destination[2]);
142  CHECK(0 == destination[3]);
143  }
144 
145  SECTION("JsonArray -> int[], without enough space") {
146  DynamicJsonDocument doc(4096);
147  char json[] = "[1,2,3]";
148  DeserializationError err = deserializeJson(doc, json);
149  CHECK(err == DeserializationError::Ok);
150  JsonArray array = doc.as<JsonArray>();
151 
152  int destination[2] = {0};
153  size_t result = copyArray(array, destination);
154 
155  CHECK(2 == result);
156  CHECK(1 == destination[0]);
157  CHECK(2 == destination[1]);
158  }
159 
160  SECTION("JsonArray -> std::string[]") {
161  DynamicJsonDocument doc(4096);
162  char json[] = "[\"a\",\"b\",\"c\"]";
163  DeserializationError err = deserializeJson(doc, json);
164  CHECK(err == DeserializationError::Ok);
165  JsonArray array = doc.as<JsonArray>();
166 
167  std::string destination[4];
168  size_t result = copyArray(array, destination);
169 
170  CHECK(3 == result);
171  CHECK("a" == destination[0]);
172  CHECK("b" == destination[1]);
173  CHECK("c" == destination[2]);
174  CHECK("" == destination[3]);
175  }
176 
177  SECTION("JsonDocument -> int[]") {
178  DynamicJsonDocument doc(4096);
179  char json[] = "[1,2,3]";
180  DeserializationError err = deserializeJson(doc, json);
181  CHECK(err == DeserializationError::Ok);
182 
183  int destination[4] = {0};
184  size_t result = copyArray(doc, destination);
185 
186  CHECK(3 == result);
187  CHECK(1 == destination[0]);
188  CHECK(2 == destination[1]);
189  CHECK(3 == destination[2]);
190  CHECK(0 == destination[3]);
191  }
192 
193  SECTION("MemberProxy -> int[]") {
194  DynamicJsonDocument doc(4096);
195  char json[] = "{\"data\":[1,2,3]}";
196  DeserializationError err = deserializeJson(doc, json);
197  CHECK(err == DeserializationError::Ok);
198 
199  int destination[4] = {0};
200  size_t result = copyArray(doc["data"], destination);
201 
202  CHECK(3 == result);
203  CHECK(1 == destination[0]);
204  CHECK(2 == destination[1]);
205  CHECK(3 == destination[2]);
206  CHECK(0 == destination[3]);
207  }
208 
209  SECTION("ElementProxy -> int[]") {
210  DynamicJsonDocument doc(4096);
211  char json[] = "[[1,2,3]]";
212  DeserializationError err = deserializeJson(doc, json);
213  CHECK(err == DeserializationError::Ok);
214 
215  int destination[4] = {0};
216  size_t result = copyArray(doc[0], destination);
217 
218  CHECK(3 == result);
219  CHECK(1 == destination[0]);
220  CHECK(2 == destination[1]);
221  CHECK(3 == destination[2]);
222  CHECK(0 == destination[3]);
223  }
224 
225  SECTION("JsonArray -> int[][]") {
226  DynamicJsonDocument doc(4096);
227  char json[] = "[[1,2],[3],[4]]";
228 
229  DeserializationError err = deserializeJson(doc, json);
230  CHECK(err == DeserializationError::Ok);
231  JsonArray array = doc.as<JsonArray>();
232 
233  int destination[3][2] = {{0}};
234  copyArray(array, destination);
235 
236  CHECK(1 == destination[0][0]);
237  CHECK(2 == destination[0][1]);
238  CHECK(3 == destination[1][0]);
239  CHECK(0 == destination[1][1]);
240  CHECK(4 == destination[2][0]);
241  CHECK(0 == destination[2][1]);
242  }
243 
244  SECTION("JsonDocument -> int[][]") {
245  DynamicJsonDocument doc(4096);
246  char json[] = "[[1,2],[3],[4]]";
247 
248  DeserializationError err = deserializeJson(doc, json);
249  CHECK(err == DeserializationError::Ok);
250 
251  int destination[3][2] = {{0}};
252  copyArray(doc, destination);
253 
254  CHECK(1 == destination[0][0]);
255  CHECK(2 == destination[0][1]);
256  CHECK(3 == destination[1][0]);
257  CHECK(0 == destination[1][1]);
258  CHECK(4 == destination[2][0]);
259  CHECK(0 == destination[2][1]);
260  }
261 
262  SECTION("MemberProxy -> int[][]") {
263  DynamicJsonDocument doc(4096);
264  char json[] = "{\"data\":[[1,2],[3],[4]]}";
265 
266  DeserializationError err = deserializeJson(doc, json);
267  CHECK(err == DeserializationError::Ok);
268 
269  int destination[3][2] = {{0}};
270  copyArray(doc["data"], destination);
271 
272  CHECK(1 == destination[0][0]);
273  CHECK(2 == destination[0][1]);
274  CHECK(3 == destination[1][0]);
275  CHECK(0 == destination[1][1]);
276  CHECK(4 == destination[2][0]);
277  CHECK(0 == destination[2][1]);
278  }
279 }
CHECK
#define CHECK
Command token used to check a Wi-Fi module setting or I/O pin state.
Definition: wifi.h:168
string
void string(char *str)
Display a character string on the oLED display.
Definition: oled_string.c:7