DynamicJsonArray.cpp 9.2 KB

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