copyArray.cpp 8.4 KB

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