deserializeJsonArray.cpp 11 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. TEST_CASE("deserialize JSON array") {
  7. DynamicJsonDocument doc;
  8. SECTION("An empty array") {
  9. JsonError err = deserializeJson(doc, "[]");
  10. JsonArray& arr = doc.as<JsonArray>();
  11. REQUIRE(err == JsonError::Ok);
  12. REQUIRE(0 == arr.size());
  13. }
  14. SECTION("Spaces") {
  15. SECTION("Before the opening bracket") {
  16. JsonError err = deserializeJson(doc, " []");
  17. JsonArray& arr = doc.as<JsonArray>();
  18. REQUIRE(err == JsonError::Ok);
  19. REQUIRE(0 == arr.size());
  20. }
  21. SECTION("Before first value") {
  22. JsonError err = deserializeJson(doc, "[ \t\r\n42]");
  23. JsonArray& arr = doc.as<JsonArray>();
  24. REQUIRE(err == JsonError::Ok);
  25. REQUIRE(1 == arr.size());
  26. REQUIRE(arr[0] == 42);
  27. }
  28. SECTION("After first value") {
  29. JsonError err = deserializeJson(doc, "[42 \t\r\n]");
  30. JsonArray& arr = doc.as<JsonArray>();
  31. REQUIRE(err == JsonError::Ok);
  32. REQUIRE(1 == arr.size());
  33. REQUIRE(arr[0] == 42);
  34. }
  35. }
  36. SECTION("Values types") {
  37. SECTION("On integer") {
  38. JsonError err = deserializeJson(doc, "[42]");
  39. JsonArray& arr = doc.as<JsonArray>();
  40. REQUIRE(err == JsonError::Ok);
  41. REQUIRE(1 == arr.size());
  42. REQUIRE(arr[0] == 42);
  43. }
  44. SECTION("Two integers") {
  45. JsonError err = deserializeJson(doc, "[42,84]");
  46. JsonArray& arr = doc.as<JsonArray>();
  47. REQUIRE(err == JsonError::Ok);
  48. REQUIRE(2 == arr.size());
  49. REQUIRE(arr[0] == 42);
  50. REQUIRE(arr[1] == 84);
  51. }
  52. SECTION("Double") {
  53. JsonError err = deserializeJson(doc, "[4.2,1e2]");
  54. JsonArray& arr = doc.as<JsonArray>();
  55. REQUIRE(err == JsonError::Ok);
  56. REQUIRE(2 == arr.size());
  57. REQUIRE(arr[0] == 4.2);
  58. REQUIRE(arr[1] == 1e2);
  59. }
  60. SECTION("Unsigned long") {
  61. JsonError err = deserializeJson(doc, "[4294967295]");
  62. JsonArray& arr = doc.as<JsonArray>();
  63. REQUIRE(err == JsonError::Ok);
  64. REQUIRE(1 == arr.size());
  65. REQUIRE(arr[0] == 4294967295UL);
  66. }
  67. SECTION("Boolean") {
  68. JsonError err = deserializeJson(doc, "[true,false]");
  69. JsonArray& arr = doc.as<JsonArray>();
  70. REQUIRE(err == JsonError::Ok);
  71. REQUIRE(2 == arr.size());
  72. REQUIRE(arr[0] == true);
  73. REQUIRE(arr[1] == false);
  74. }
  75. SECTION("Null") {
  76. JsonError err = deserializeJson(doc, "[null,null]");
  77. JsonArray& arr = doc.as<JsonArray>();
  78. REQUIRE(err == JsonError::Ok);
  79. REQUIRE(2 == arr.size());
  80. REQUIRE(arr[0].as<char*>() == 0);
  81. REQUIRE(arr[1].as<char*>() == 0);
  82. }
  83. }
  84. SECTION("Quotes") {
  85. SECTION("Double quotes") {
  86. JsonError err = deserializeJson(doc, "[ \"hello\" , \"world\" ]");
  87. JsonArray& arr = doc.as<JsonArray>();
  88. REQUIRE(err == JsonError::Ok);
  89. REQUIRE(2 == arr.size());
  90. REQUIRE(arr[0] == "hello");
  91. REQUIRE(arr[1] == "world");
  92. }
  93. SECTION("Single quotes") {
  94. JsonError err = deserializeJson(doc, "[ 'hello' , 'world' ]");
  95. JsonArray& arr = doc.as<JsonArray>();
  96. REQUIRE(err == JsonError::Ok);
  97. REQUIRE(2 == arr.size());
  98. REQUIRE(arr[0] == "hello");
  99. REQUIRE(arr[1] == "world");
  100. }
  101. SECTION("No quotes") {
  102. JsonError err = deserializeJson(doc, "[ hello , world ]");
  103. JsonArray& arr = doc.as<JsonArray>();
  104. REQUIRE(err == JsonError::Ok);
  105. REQUIRE(2 == arr.size());
  106. REQUIRE(arr[0] == "hello");
  107. REQUIRE(arr[1] == "world");
  108. }
  109. SECTION("Double quotes (empty strings)") {
  110. JsonError err = deserializeJson(doc, "[\"\",\"\"]");
  111. JsonArray& arr = doc.as<JsonArray>();
  112. REQUIRE(err == JsonError::Ok);
  113. REQUIRE(2 == arr.size());
  114. REQUIRE(arr[0] == "");
  115. REQUIRE(arr[1] == "");
  116. }
  117. SECTION("Single quotes (empty strings)") {
  118. JsonError err = deserializeJson(doc, "[\'\',\'\']");
  119. JsonArray& arr = doc.as<JsonArray>();
  120. REQUIRE(err == JsonError::Ok);
  121. REQUIRE(2 == arr.size());
  122. REQUIRE(arr[0] == "");
  123. REQUIRE(arr[1] == "");
  124. }
  125. SECTION("No quotes (empty strings)") {
  126. JsonError err = deserializeJson(doc, "[,]");
  127. REQUIRE(err == JsonError::InvalidInput);
  128. }
  129. SECTION("Closing single quotes missing") {
  130. JsonError err = deserializeJson(doc, "[\"]");
  131. REQUIRE(err == JsonError::IncompleteInput);
  132. }
  133. SECTION("Closing double quotes missing") {
  134. JsonError err = deserializeJson(doc, "[\']");
  135. REQUIRE(err == JsonError::IncompleteInput);
  136. }
  137. }
  138. SECTION("Block comments") {
  139. SECTION("Before opening bracket") {
  140. JsonError err = deserializeJson(doc, "/*COMMENT*/ [\"hello\"]");
  141. JsonArray& arr = doc.as<JsonArray>();
  142. REQUIRE(err == JsonError::Ok);
  143. REQUIRE(1 == arr.size());
  144. REQUIRE(arr[0] == "hello");
  145. }
  146. SECTION("After opening bracket") {
  147. JsonError err = deserializeJson(doc, "[/*COMMENT*/ \"hello\"]");
  148. JsonArray& arr = doc.as<JsonArray>();
  149. REQUIRE(err == JsonError::Ok);
  150. REQUIRE(1 == arr.size());
  151. REQUIRE(arr[0] == "hello");
  152. }
  153. SECTION("Before closing bracket") {
  154. JsonError err = deserializeJson(doc, "[\"hello\"/*COMMENT*/]");
  155. JsonArray& arr = doc.as<JsonArray>();
  156. REQUIRE(err == JsonError::Ok);
  157. REQUIRE(1 == arr.size());
  158. REQUIRE(arr[0] == "hello");
  159. }
  160. SECTION("After closing bracket") {
  161. JsonError err = deserializeJson(doc, "[\"hello\"]/*COMMENT*/");
  162. JsonArray& arr = doc.as<JsonArray>();
  163. REQUIRE(err == JsonError::Ok);
  164. REQUIRE(1 == arr.size());
  165. REQUIRE(arr[0] == "hello");
  166. }
  167. SECTION("Before comma") {
  168. JsonError err = deserializeJson(doc, "[\"hello\"/*COMMENT*/,\"world\"]");
  169. JsonArray& arr = doc.as<JsonArray>();
  170. REQUIRE(err == JsonError::Ok);
  171. REQUIRE(2 == arr.size());
  172. REQUIRE(arr[0] == "hello");
  173. REQUIRE(arr[1] == "world");
  174. }
  175. SECTION("After comma") {
  176. JsonError err = deserializeJson(doc, "[\"hello\",/*COMMENT*/ \"world\"]");
  177. JsonArray& arr = doc.as<JsonArray>();
  178. REQUIRE(err == JsonError::Ok);
  179. REQUIRE(2 == arr.size());
  180. REQUIRE(arr[0] == "hello");
  181. REQUIRE(arr[1] == "world");
  182. }
  183. SECTION("/*/") {
  184. JsonError err = deserializeJson(doc, "[/*/\n]");
  185. REQUIRE(err == JsonError::IncompleteInput);
  186. }
  187. SECTION("Unfinished comment") {
  188. JsonError err = deserializeJson(doc, "[/*COMMENT]");
  189. REQUIRE(err == JsonError::IncompleteInput);
  190. }
  191. SECTION("Final slash missing") {
  192. JsonError err = deserializeJson(doc, "[/*COMMENT*]");
  193. REQUIRE(err == JsonError::IncompleteInput);
  194. }
  195. }
  196. SECTION("Trailing comments") {
  197. SECTION("Before opening bracket") {
  198. JsonError err = deserializeJson(doc, "//COMMENT\n\t[\"hello\"]");
  199. JsonArray& arr = doc.as<JsonArray>();
  200. REQUIRE(err == JsonError::Ok);
  201. REQUIRE(1 == arr.size());
  202. REQUIRE(arr[0] == "hello");
  203. }
  204. SECTION("After opening bracket") {
  205. JsonError err = deserializeJson(doc, "[//COMMENT\n\"hello\"]");
  206. JsonArray& arr = doc.as<JsonArray>();
  207. REQUIRE(err == JsonError::Ok);
  208. REQUIRE(1 == arr.size());
  209. REQUIRE(arr[0] == "hello");
  210. }
  211. SECTION("Before closing bracket") {
  212. JsonError err = deserializeJson(doc, "[\"hello\"//COMMENT\r\n]");
  213. JsonArray& arr = doc.as<JsonArray>();
  214. REQUIRE(err == JsonError::Ok);
  215. REQUIRE(1 == arr.size());
  216. REQUIRE(arr[0] == "hello");
  217. }
  218. SECTION("After closing bracket") {
  219. JsonError err = deserializeJson(doc, "[\"hello\"]//COMMENT\n");
  220. JsonArray& arr = doc.as<JsonArray>();
  221. REQUIRE(err == JsonError::Ok);
  222. REQUIRE(1 == arr.size());
  223. REQUIRE(arr[0] == "hello");
  224. }
  225. SECTION("Before comma") {
  226. JsonError err = deserializeJson(doc, "[\"hello\"//COMMENT\n,\"world\"]");
  227. JsonArray& arr = doc.as<JsonArray>();
  228. REQUIRE(err == JsonError::Ok);
  229. REQUIRE(2 == arr.size());
  230. REQUIRE(arr[0] == "hello");
  231. REQUIRE(arr[1] == "world");
  232. }
  233. SECTION("After comma") {
  234. JsonError err = deserializeJson(doc, "[\"hello\",//COMMENT\n\"world\"]");
  235. JsonArray& arr = doc.as<JsonArray>();
  236. REQUIRE(err == JsonError::Ok);
  237. REQUIRE(2 == arr.size());
  238. REQUIRE(arr[0] == "hello");
  239. REQUIRE(arr[1] == "world");
  240. }
  241. SECTION("Invalid comment") {
  242. JsonError err = deserializeJson(doc, "[/COMMENT\n]");
  243. REQUIRE(err == JsonError::InvalidInput);
  244. }
  245. SECTION("End document with comment") {
  246. JsonError err = deserializeJson(doc, "[//COMMENT");
  247. REQUIRE(err == JsonError::IncompleteInput);
  248. }
  249. }
  250. SECTION("Premature null-terminator") {
  251. SECTION("After opening bracket") {
  252. JsonError err = deserializeJson(doc, "[");
  253. REQUIRE(err == JsonError::IncompleteInput);
  254. }
  255. SECTION("After value") {
  256. JsonError err = deserializeJson(doc, "[1");
  257. REQUIRE(err == JsonError::IncompleteInput);
  258. }
  259. SECTION("After comma") {
  260. JsonError err = deserializeJson(doc, "[1,");
  261. REQUIRE(err == JsonError::IncompleteInput);
  262. }
  263. }
  264. SECTION("Premature end of input") {
  265. const char* input = "[1,2]";
  266. SECTION("After opening bracket") {
  267. JsonError err = deserializeJson(doc, input, 1);
  268. REQUIRE(err == JsonError::IncompleteInput);
  269. }
  270. SECTION("After value") {
  271. JsonError err = deserializeJson(doc, input, 2);
  272. REQUIRE(err == JsonError::IncompleteInput);
  273. }
  274. SECTION("After comma") {
  275. JsonError err = deserializeJson(doc, input, 3);
  276. REQUIRE(err == JsonError::IncompleteInput);
  277. }
  278. }
  279. SECTION("Misc") {
  280. SECTION("Nested objects") {
  281. char jsonString[] =
  282. " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] ";
  283. JsonError err = deserializeJson(doc, jsonString);
  284. JsonArray& arr = doc.as<JsonArray>();
  285. JsonObject& object1 = arr[0];
  286. const JsonObject& object2 = arr[1];
  287. JsonObject& object3 = arr[2];
  288. REQUIRE(err == JsonError::Ok);
  289. REQUIRE(true == object1.success());
  290. REQUIRE(true == object2.success());
  291. REQUIRE(false == object3.success());
  292. REQUIRE(2 == object1.size());
  293. REQUIRE(2 == object2.size());
  294. REQUIRE(0 == object3.size());
  295. REQUIRE(1 == object1["a"].as<int>());
  296. REQUIRE(2 == object1["b"].as<int>());
  297. REQUIRE(3 == object2["c"].as<int>());
  298. REQUIRE(4 == object2["d"].as<int>());
  299. REQUIRE(0 == object3["e"].as<int>());
  300. }
  301. }
  302. SECTION("Should clear the JsonArray") {
  303. deserializeJson(doc, "[1,2,3,4]");
  304. deserializeJson(doc, "[]");
  305. JsonArray& arr = doc.as<JsonArray>();
  306. REQUIRE(arr.size() == 0);
  307. REQUIRE(doc.memoryUsage() == JSON_ARRAY_SIZE(0));
  308. }
  309. }