copyArray.cpp 8.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2024, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #include "Allocators.hpp"
  7. TEST_CASE("copyArray()") {
  8. SECTION("int[] -> JsonArray") {
  9. JsonDocument doc;
  10. JsonArray array = doc.to<JsonArray>();
  11. char json[32];
  12. int source[] = {1, 2, 3};
  13. bool ok = copyArray(source, array);
  14. CHECK(ok);
  15. serializeJson(array, json);
  16. CHECK(std::string("[1,2,3]") == json);
  17. }
  18. SECTION("std::string[] -> JsonArray") {
  19. JsonDocument doc;
  20. JsonArray array = doc.to<JsonArray>();
  21. char json[32];
  22. std::string source[] = {"a", "b", "c"};
  23. bool ok = copyArray(source, array);
  24. CHECK(ok);
  25. serializeJson(array, json);
  26. CHECK(std::string("[\"a\",\"b\",\"c\"]") == json);
  27. }
  28. SECTION("const char*[] -> JsonArray") {
  29. JsonDocument doc;
  30. JsonArray array = doc.to<JsonArray>();
  31. char json[32];
  32. const char* source[] = {"a", "b", "c"};
  33. bool ok = copyArray(source, array);
  34. CHECK(ok);
  35. serializeJson(array, json);
  36. CHECK(std::string("[\"a\",\"b\",\"c\"]") == json);
  37. }
  38. SECTION("const char[][] -> JsonArray") {
  39. JsonDocument doc;
  40. JsonArray array = doc.to<JsonArray>();
  41. char json[32];
  42. char source[][2] = {"a", "b", "c"};
  43. bool ok = copyArray(source, array);
  44. CHECK(ok);
  45. serializeJson(array, json);
  46. CHECK(std::string("[\"a\",\"b\",\"c\"]") == json);
  47. }
  48. SECTION("const char[][] -> JsonDocument") {
  49. JsonDocument doc;
  50. char json[32];
  51. char source[][2] = {"a", "b", "c"};
  52. bool ok = copyArray(source, doc);
  53. CHECK(ok);
  54. serializeJson(doc, json);
  55. CHECK(std::string("[\"a\",\"b\",\"c\"]") == json);
  56. }
  57. SECTION("const char[][] -> MemberProxy") {
  58. JsonDocument doc;
  59. char json[32];
  60. char source[][2] = {"a", "b", "c"};
  61. bool ok = copyArray(source, doc["data"]);
  62. CHECK(ok);
  63. serializeJson(doc, json);
  64. CHECK(std::string("{\"data\":[\"a\",\"b\",\"c\"]}") == json);
  65. }
  66. SECTION("int[] -> JsonDocument") {
  67. JsonDocument doc;
  68. char json[32];
  69. int source[] = {1, 2, 3};
  70. bool ok = copyArray(source, doc);
  71. CHECK(ok);
  72. serializeJson(doc, json);
  73. CHECK(std::string("[1,2,3]") == json);
  74. }
  75. SECTION("int[] -> MemberProxy") {
  76. JsonDocument doc;
  77. char json[32];
  78. int source[] = {1, 2, 3};
  79. bool ok = copyArray(source, doc["data"]);
  80. CHECK(ok);
  81. serializeJson(doc, json);
  82. CHECK(std::string("{\"data\":[1,2,3]}") == json);
  83. }
  84. SECTION("int[] -> JsonArray, but not enough memory") {
  85. JsonDocument doc(FailingAllocator::instance());
  86. JsonArray array = doc.to<JsonArray>();
  87. int source[] = {1, 2, 3};
  88. bool ok = copyArray(source, array);
  89. REQUIRE_FALSE(ok);
  90. }
  91. SECTION("int[][] -> JsonArray") {
  92. JsonDocument doc;
  93. JsonArray array = doc.to<JsonArray>();
  94. char json[32];
  95. int source[][3] = {{1, 2, 3}, {4, 5, 6}};
  96. bool ok = copyArray(source, array);
  97. CHECK(ok);
  98. serializeJson(array, json);
  99. CHECK(std::string("[[1,2,3],[4,5,6]]") == json);
  100. }
  101. SECTION("int[][] -> MemberProxy") {
  102. JsonDocument doc;
  103. char json[32];
  104. int source[][3] = {{1, 2, 3}, {4, 5, 6}};
  105. bool ok = copyArray(source, doc["data"]);
  106. CHECK(ok);
  107. serializeJson(doc, json);
  108. CHECK(std::string("{\"data\":[[1,2,3],[4,5,6]]}") == json);
  109. }
  110. SECTION("int[][] -> JsonDocument") {
  111. JsonDocument doc;
  112. char json[32];
  113. int source[][3] = {{1, 2, 3}, {4, 5, 6}};
  114. bool ok = copyArray(source, doc);
  115. CHECK(ok);
  116. serializeJson(doc, json);
  117. CHECK(std::string("[[1,2,3],[4,5,6]]") == json);
  118. }
  119. SECTION("int[][] -> JsonArray, but not enough memory") {
  120. JsonDocument doc(FailingAllocator::instance());
  121. JsonArray array = doc.to<JsonArray>();
  122. int source[][3] = {{1, 2, 3}, {4, 5, 6}};
  123. bool ok = copyArray(source, array);
  124. REQUIRE(ok == false);
  125. }
  126. SECTION("JsonArray -> int[], with more space than needed") {
  127. JsonDocument doc;
  128. char json[] = "[1,2,3]";
  129. DeserializationError err = deserializeJson(doc, json);
  130. CHECK(err == DeserializationError::Ok);
  131. JsonArray array = doc.as<JsonArray>();
  132. int destination[4] = {0};
  133. size_t result = copyArray(array, destination);
  134. CHECK(3 == result);
  135. CHECK(1 == destination[0]);
  136. CHECK(2 == destination[1]);
  137. CHECK(3 == destination[2]);
  138. CHECK(0 == destination[3]);
  139. }
  140. SECTION("JsonArray -> int[], without enough space") {
  141. JsonDocument doc;
  142. char json[] = "[1,2,3]";
  143. DeserializationError err = deserializeJson(doc, json);
  144. CHECK(err == DeserializationError::Ok);
  145. JsonArray array = doc.as<JsonArray>();
  146. int destination[2] = {0};
  147. size_t result = copyArray(array, destination);
  148. CHECK(2 == result);
  149. CHECK(1 == destination[0]);
  150. CHECK(2 == destination[1]);
  151. }
  152. SECTION("JsonArray -> std::string[]") {
  153. JsonDocument doc;
  154. char json[] = "[\"a\",\"b\",\"c\"]";
  155. DeserializationError err = deserializeJson(doc, json);
  156. CHECK(err == DeserializationError::Ok);
  157. JsonArray array = doc.as<JsonArray>();
  158. std::string destination[4];
  159. size_t result = copyArray(array, destination);
  160. CHECK(3 == result);
  161. CHECK("a" == destination[0]);
  162. CHECK("b" == destination[1]);
  163. CHECK("c" == destination[2]);
  164. CHECK("" == destination[3]);
  165. }
  166. SECTION("JsonArray -> char[N][]") {
  167. JsonDocument doc;
  168. char json[] = "[\"a12345\",\"b123456\",\"c1234567\"]";
  169. DeserializationError err = deserializeJson(doc, json);
  170. CHECK(err == DeserializationError::Ok);
  171. JsonArray array = doc.as<JsonArray>();
  172. char destination[4][8] = {{0}};
  173. size_t result = copyArray(array, destination);
  174. CHECK(3 == result);
  175. CHECK(std::string("a12345") == destination[0]);
  176. CHECK(std::string("b123456") == destination[1]);
  177. CHECK(std::string("c123456") == destination[2]); // truncated
  178. CHECK(std::string("") == destination[3]);
  179. }
  180. SECTION("JsonDocument -> int[]") {
  181. JsonDocument doc;
  182. char json[] = "[1,2,3]";
  183. DeserializationError err = deserializeJson(doc, json);
  184. CHECK(err == DeserializationError::Ok);
  185. int destination[4] = {0};
  186. size_t result = copyArray(doc, destination);
  187. CHECK(3 == result);
  188. CHECK(1 == destination[0]);
  189. CHECK(2 == destination[1]);
  190. CHECK(3 == destination[2]);
  191. CHECK(0 == destination[3]);
  192. }
  193. SECTION("MemberProxy -> int[]") {
  194. JsonDocument doc;
  195. char json[] = "{\"data\":[1,2,3]}";
  196. DeserializationError err = deserializeJson(doc, json);
  197. CHECK(err == DeserializationError::Ok);
  198. int destination[4] = {0};
  199. size_t result = copyArray(doc["data"], destination);
  200. CHECK(3 == result);
  201. CHECK(1 == destination[0]);
  202. CHECK(2 == destination[1]);
  203. CHECK(3 == destination[2]);
  204. CHECK(0 == destination[3]);
  205. }
  206. SECTION("ElementProxy -> int[]") {
  207. JsonDocument doc;
  208. char json[] = "[[1,2,3]]";
  209. DeserializationError err = deserializeJson(doc, json);
  210. CHECK(err == DeserializationError::Ok);
  211. int destination[4] = {0};
  212. size_t result = copyArray(doc[0], destination);
  213. CHECK(3 == result);
  214. CHECK(1 == destination[0]);
  215. CHECK(2 == destination[1]);
  216. CHECK(3 == destination[2]);
  217. CHECK(0 == destination[3]);
  218. }
  219. SECTION("JsonArray -> int[][]") {
  220. JsonDocument doc;
  221. char json[] = "[[1,2],[3],[4]]";
  222. DeserializationError err = deserializeJson(doc, json);
  223. CHECK(err == DeserializationError::Ok);
  224. JsonArray array = doc.as<JsonArray>();
  225. int destination[3][2] = {{0}};
  226. copyArray(array, destination);
  227. CHECK(1 == destination[0][0]);
  228. CHECK(2 == destination[0][1]);
  229. CHECK(3 == destination[1][0]);
  230. CHECK(0 == destination[1][1]);
  231. CHECK(4 == destination[2][0]);
  232. CHECK(0 == destination[2][1]);
  233. }
  234. SECTION("JsonDocument -> int[][]") {
  235. JsonDocument doc;
  236. char json[] = "[[1,2],[3],[4]]";
  237. DeserializationError err = deserializeJson(doc, json);
  238. CHECK(err == DeserializationError::Ok);
  239. int destination[3][2] = {{0}};
  240. copyArray(doc, destination);
  241. CHECK(1 == destination[0][0]);
  242. CHECK(2 == destination[0][1]);
  243. CHECK(3 == destination[1][0]);
  244. CHECK(0 == destination[1][1]);
  245. CHECK(4 == destination[2][0]);
  246. CHECK(0 == destination[2][1]);
  247. }
  248. SECTION("MemberProxy -> int[][]") {
  249. JsonDocument doc;
  250. char json[] = "{\"data\":[[1,2],[3],[4]]}";
  251. DeserializationError err = deserializeJson(doc, json);
  252. CHECK(err == DeserializationError::Ok);
  253. int destination[3][2] = {{0}};
  254. copyArray(doc["data"], destination);
  255. CHECK(1 == destination[0][0]);
  256. CHECK(2 == destination[0][1]);
  257. CHECK(3 == destination[1][0]);
  258. CHECK(0 == destination[1][1]);
  259. CHECK(4 == destination[2][0]);
  260. CHECK(0 == destination[2][1]);
  261. }
  262. }