array.cpp 9.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. using ArduinoJson::detail::sizeofArray;
  7. using ArduinoJson::detail::sizeofObject;
  8. using ArduinoJson::detail::sizeofString;
  9. TEST_CASE("deserialize JSON array") {
  10. JsonDocument doc(4096);
  11. SECTION("An empty array") {
  12. DeserializationError err = deserializeJson(doc, "[]");
  13. JsonArray arr = doc.as<JsonArray>();
  14. REQUIRE(err == DeserializationError::Ok);
  15. REQUIRE(0 == arr.size());
  16. }
  17. SECTION("Spaces") {
  18. SECTION("Before the opening bracket") {
  19. DeserializationError err = deserializeJson(doc, " []");
  20. JsonArray arr = doc.as<JsonArray>();
  21. REQUIRE(err == DeserializationError::Ok);
  22. REQUIRE(0 == arr.size());
  23. }
  24. SECTION("Before first value") {
  25. DeserializationError err = deserializeJson(doc, "[ \t\r\n42]");
  26. JsonArray arr = doc.as<JsonArray>();
  27. REQUIRE(err == DeserializationError::Ok);
  28. REQUIRE(1 == arr.size());
  29. REQUIRE(arr[0] == 42);
  30. }
  31. SECTION("After first value") {
  32. DeserializationError err = deserializeJson(doc, "[42 \t\r\n]");
  33. JsonArray arr = doc.as<JsonArray>();
  34. REQUIRE(err == DeserializationError::Ok);
  35. REQUIRE(1 == arr.size());
  36. REQUIRE(arr[0] == 42);
  37. }
  38. }
  39. SECTION("Values types") {
  40. SECTION("On integer") {
  41. DeserializationError err = deserializeJson(doc, "[42]");
  42. JsonArray arr = doc.as<JsonArray>();
  43. REQUIRE(err == DeserializationError::Ok);
  44. REQUIRE(1 == arr.size());
  45. REQUIRE(arr[0] == 42);
  46. }
  47. SECTION("Two integers") {
  48. DeserializationError err = deserializeJson(doc, "[42,84]");
  49. JsonArray arr = doc.as<JsonArray>();
  50. REQUIRE(err == DeserializationError::Ok);
  51. REQUIRE(2 == arr.size());
  52. REQUIRE(arr[0] == 42);
  53. REQUIRE(arr[1] == 84);
  54. }
  55. SECTION("Double") {
  56. DeserializationError err = deserializeJson(doc, "[4.2,1e2]");
  57. JsonArray arr = doc.as<JsonArray>();
  58. REQUIRE(err == DeserializationError::Ok);
  59. REQUIRE(2 == arr.size());
  60. REQUIRE(arr[0] == 4.2);
  61. REQUIRE(arr[1] == 1e2);
  62. }
  63. SECTION("Unsigned long") {
  64. DeserializationError err = deserializeJson(doc, "[4294967295]");
  65. JsonArray arr = doc.as<JsonArray>();
  66. REQUIRE(err == DeserializationError::Ok);
  67. REQUIRE(1 == arr.size());
  68. REQUIRE(arr[0] == 4294967295UL);
  69. }
  70. SECTION("Boolean") {
  71. DeserializationError err = deserializeJson(doc, "[true,false]");
  72. JsonArray arr = doc.as<JsonArray>();
  73. REQUIRE(err == DeserializationError::Ok);
  74. REQUIRE(2 == arr.size());
  75. REQUIRE(arr[0] == true);
  76. REQUIRE(arr[1] == false);
  77. }
  78. SECTION("Null") {
  79. DeserializationError err = deserializeJson(doc, "[null,null]");
  80. JsonArray arr = doc.as<JsonArray>();
  81. REQUIRE(err == DeserializationError::Ok);
  82. REQUIRE(2 == arr.size());
  83. REQUIRE(arr[0].as<const char*>() == 0);
  84. REQUIRE(arr[1].as<const char*>() == 0);
  85. }
  86. }
  87. SECTION("Quotes") {
  88. SECTION("Double quotes") {
  89. DeserializationError err =
  90. deserializeJson(doc, "[ \"hello\" , \"world\" ]");
  91. JsonArray arr = doc.as<JsonArray>();
  92. REQUIRE(err == DeserializationError::Ok);
  93. REQUIRE(2 == arr.size());
  94. REQUIRE(arr[0] == "hello");
  95. REQUIRE(arr[1] == "world");
  96. }
  97. SECTION("Single quotes") {
  98. DeserializationError err = deserializeJson(doc, "[ 'hello' , 'world' ]");
  99. JsonArray arr = doc.as<JsonArray>();
  100. REQUIRE(err == DeserializationError::Ok);
  101. REQUIRE(2 == arr.size());
  102. REQUIRE(arr[0] == "hello");
  103. REQUIRE(arr[1] == "world");
  104. }
  105. SECTION("No quotes") {
  106. DeserializationError err = deserializeJson(doc, "[ hello , world ]");
  107. REQUIRE(err == DeserializationError::InvalidInput);
  108. }
  109. SECTION("Double quotes (empty strings)") {
  110. DeserializationError err = deserializeJson(doc, "[\"\",\"\"]");
  111. JsonArray arr = doc.as<JsonArray>();
  112. REQUIRE(err == DeserializationError::Ok);
  113. REQUIRE(2 == arr.size());
  114. REQUIRE(arr[0] == "");
  115. REQUIRE(arr[1] == "");
  116. }
  117. SECTION("Single quotes (empty strings)") {
  118. DeserializationError err = deserializeJson(doc, "[\'\',\'\']");
  119. JsonArray arr = doc.as<JsonArray>();
  120. REQUIRE(err == DeserializationError::Ok);
  121. REQUIRE(2 == arr.size());
  122. REQUIRE(arr[0] == "");
  123. REQUIRE(arr[1] == "");
  124. }
  125. SECTION("No quotes (empty strings)") {
  126. DeserializationError err = deserializeJson(doc, "[,]");
  127. REQUIRE(err == DeserializationError::InvalidInput);
  128. }
  129. SECTION("Closing single quotes missing") {
  130. DeserializationError err = deserializeJson(doc, "[\"]");
  131. REQUIRE(err == DeserializationError::IncompleteInput);
  132. }
  133. SECTION("Closing double quotes missing") {
  134. DeserializationError err = deserializeJson(doc, "[\']");
  135. REQUIRE(err == DeserializationError::IncompleteInput);
  136. }
  137. }
  138. SECTION("Premature null-terminator") {
  139. SECTION("After opening bracket") {
  140. DeserializationError err = deserializeJson(doc, "[");
  141. REQUIRE(err == DeserializationError::IncompleteInput);
  142. }
  143. SECTION("After value") {
  144. DeserializationError err = deserializeJson(doc, "[1");
  145. REQUIRE(err == DeserializationError::IncompleteInput);
  146. }
  147. SECTION("After comma") {
  148. DeserializationError err = deserializeJson(doc, "[1,");
  149. REQUIRE(err == DeserializationError::IncompleteInput);
  150. }
  151. }
  152. SECTION("Premature end of input") {
  153. const char* input = "[1,2]";
  154. SECTION("After opening bracket") {
  155. DeserializationError err = deserializeJson(doc, input, 1);
  156. REQUIRE(err == DeserializationError::IncompleteInput);
  157. }
  158. SECTION("After value") {
  159. DeserializationError err = deserializeJson(doc, input, 2);
  160. REQUIRE(err == DeserializationError::IncompleteInput);
  161. }
  162. SECTION("After comma") {
  163. DeserializationError err = deserializeJson(doc, input, 3);
  164. REQUIRE(err == DeserializationError::IncompleteInput);
  165. }
  166. }
  167. SECTION("Misc") {
  168. SECTION("Nested objects") {
  169. char jsonString[] =
  170. " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
  171. DeserializationError err = deserializeJson(doc, jsonString);
  172. JsonArray arr = doc.as<JsonArray>();
  173. JsonObject object1 = arr[0];
  174. const JsonObject object2 = arr[1];
  175. JsonObject object3 = arr[2];
  176. REQUIRE(err == DeserializationError::Ok);
  177. REQUIRE(object1.isNull() == false);
  178. REQUIRE(object2.isNull() == false);
  179. REQUIRE(object3.isNull() == true);
  180. REQUIRE(2 == object1.size());
  181. REQUIRE(2 == object2.size());
  182. REQUIRE(0 == object3.size());
  183. REQUIRE(1 == object1["a"].as<int>());
  184. REQUIRE(2 == object1["b"].as<int>());
  185. REQUIRE(3 == object2["c"].as<int>());
  186. REQUIRE(4 == object2["d"].as<int>());
  187. REQUIRE(0 == object3["e"].as<int>());
  188. }
  189. }
  190. SECTION("Should clear the JsonArray") {
  191. deserializeJson(doc, "[1,2,3,4]");
  192. deserializeJson(doc, "[]");
  193. JsonArray arr = doc.as<JsonArray>();
  194. REQUIRE(arr.size() == 0);
  195. REQUIRE(doc.memoryUsage() == sizeofArray(0));
  196. }
  197. }
  198. TEST_CASE("deserialize JSON array under memory constraints") {
  199. SECTION("buffer of the right size for an empty array") {
  200. JsonDocument doc(sizeofArray(0));
  201. char input[] = "[]";
  202. DeserializationError err = deserializeJson(doc, input);
  203. REQUIRE(err == DeserializationError::Ok);
  204. }
  205. SECTION("buffer too small for an array with one element") {
  206. JsonDocument doc(sizeofArray(0));
  207. char input[] = "[1]";
  208. DeserializationError err = deserializeJson(doc, input);
  209. REQUIRE(err == DeserializationError::NoMemory);
  210. }
  211. SECTION("buffer of the right size for an array with one element") {
  212. JsonDocument doc(sizeofArray(1));
  213. char input[] = "[1]";
  214. DeserializationError err = deserializeJson(doc, input);
  215. REQUIRE(err == DeserializationError::Ok);
  216. }
  217. SECTION("buffer too small for an array with a nested object") {
  218. JsonDocument doc(sizeofArray(0) + sizeofObject(0));
  219. char input[] = "[{}]";
  220. DeserializationError err = deserializeJson(doc, input);
  221. REQUIRE(err == DeserializationError::NoMemory);
  222. }
  223. SECTION("buffer of the right size for an array with a nested object") {
  224. JsonDocument doc(sizeofArray(1) + sizeofObject(0));
  225. char input[] = "[{}]";
  226. DeserializationError err = deserializeJson(doc, input);
  227. REQUIRE(err == DeserializationError::Ok);
  228. }
  229. SECTION("don't store space characters") {
  230. JsonDocument doc(100);
  231. deserializeJson(doc, " [ \"1234567\" ] ");
  232. REQUIRE(sizeofArray(1) + sizeofString(7) == doc.memoryUsage());
  233. }
  234. SECTION("Should clear the JsonArray") {
  235. JsonDocument doc(sizeofArray(4));
  236. char input[] = "[1,2,3,4]";
  237. deserializeJson(doc, input);
  238. deserializeJson(doc, "[]");
  239. JsonArray arr = doc.as<JsonArray>();
  240. REQUIRE(arr.size() == 0);
  241. REQUIRE(doc.memoryUsage() == sizeofArray(0));
  242. }
  243. SECTION("buffer of the right size for an array with two element") {
  244. JsonDocument doc(sizeofArray(2));
  245. char input[] = "[1,2]";
  246. DeserializationError err = deserializeJson(doc, input);
  247. JsonArray arr = doc.as<JsonArray>();
  248. REQUIRE(err == DeserializationError::Ok);
  249. REQUIRE(doc.is<JsonArray>());
  250. REQUIRE(doc.memoryUsage() == sizeofArray(2));
  251. REQUIRE(arr[0] == 1);
  252. REQUIRE(arr[1] == 2);
  253. }
  254. }