parseArray.cpp 7.4 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2023
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. TEST_CASE("JsonBuffer::parseArray()") {
  7. DynamicJsonBuffer jb;
  8. SECTION("EmptyArray") {
  9. JsonArray& arr = jb.parseArray("[]");
  10. REQUIRE(arr.success());
  11. REQUIRE(0 == arr.size());
  12. }
  13. SECTION("MissingOpeningBracket") {
  14. JsonArray& arr = jb.parseArray("]");
  15. REQUIRE_FALSE(arr.success());
  16. }
  17. SECTION("ArrayWithNoEnd") {
  18. JsonArray& arr = jb.parseArray("[");
  19. REQUIRE_FALSE(arr.success());
  20. }
  21. SECTION("EmptyArrayWithLeadingSpaces") {
  22. JsonArray& arr = jb.parseArray(" []");
  23. REQUIRE(arr.success());
  24. REQUIRE(0 == arr.size());
  25. }
  26. SECTION("Garbage") {
  27. JsonArray& arr = jb.parseArray("%*$£¤");
  28. REQUIRE_FALSE(arr.success());
  29. }
  30. SECTION("OneInteger") {
  31. JsonArray& arr = jb.parseArray("[42]");
  32. REQUIRE(arr.success());
  33. REQUIRE(1 == arr.size());
  34. REQUIRE(arr[0] == 42);
  35. }
  36. SECTION("OneIntegerWithSpacesBefore") {
  37. JsonArray& arr = jb.parseArray("[ \t\r\n42]");
  38. REQUIRE(arr.success());
  39. REQUIRE(1 == arr.size());
  40. REQUIRE(arr[0] == 42);
  41. }
  42. SECTION("OneIntegerWithSpaceAfter") {
  43. JsonArray& arr = jb.parseArray("[42 \t\r\n]");
  44. REQUIRE(arr.success());
  45. REQUIRE(1 == arr.size());
  46. REQUIRE(arr[0] == 42);
  47. }
  48. SECTION("TwoIntegers") {
  49. JsonArray& arr = jb.parseArray("[42,84]");
  50. REQUIRE(arr.success());
  51. REQUIRE(2 == arr.size());
  52. REQUIRE(arr[0] == 42);
  53. REQUIRE(arr[1] == 84);
  54. }
  55. SECTION("TwoDoubles") {
  56. JsonArray& arr = jb.parseArray("[4.2,1e2]");
  57. REQUIRE(arr.success());
  58. REQUIRE(2 == arr.size());
  59. REQUIRE(arr[0] == 4.2);
  60. REQUIRE(arr[1] == 1e2);
  61. }
  62. SECTION("UnsignedLong") {
  63. JsonArray& arr = jb.parseArray("[4294967295]");
  64. REQUIRE(arr.success());
  65. REQUIRE(1 == arr.size());
  66. REQUIRE(arr[0] == 4294967295UL);
  67. }
  68. SECTION("TwoBooleans") {
  69. JsonArray& arr = jb.parseArray("[true,false]");
  70. REQUIRE(arr.success());
  71. REQUIRE(2 == arr.size());
  72. REQUIRE(arr[0] == true);
  73. REQUIRE(arr[1] == false);
  74. }
  75. SECTION("TwoNulls") {
  76. JsonArray& arr = jb.parseArray("[null,null]");
  77. REQUIRE(arr.success());
  78. REQUIRE(2 == arr.size());
  79. REQUIRE(arr[0].as<char*>() == 0);
  80. REQUIRE(arr[1].as<char*>() == 0);
  81. }
  82. SECTION("TwoStringsDoubleQuotes") {
  83. JsonArray& arr = jb.parseArray("[ \"hello\" , \"world\" ]");
  84. REQUIRE(arr.success());
  85. REQUIRE(2 == arr.size());
  86. REQUIRE(arr[0] == "hello");
  87. REQUIRE(arr[1] == "world");
  88. }
  89. SECTION("TwoStringsSingleQuotes") {
  90. JsonArray& arr = jb.parseArray("[ 'hello' , 'world' ]");
  91. REQUIRE(arr.success());
  92. REQUIRE(2 == arr.size());
  93. REQUIRE(arr[0] == "hello");
  94. REQUIRE(arr[1] == "world");
  95. }
  96. SECTION("TwoStringsNoQuotes") {
  97. JsonArray& arr = jb.parseArray("[ hello , world ]");
  98. REQUIRE(arr.success());
  99. REQUIRE(2 == arr.size());
  100. REQUIRE(arr[0] == "hello");
  101. REQUIRE(arr[1] == "world");
  102. }
  103. SECTION("EmptyStringsDoubleQuotes") {
  104. JsonArray& arr = jb.parseArray("[\"\",\"\"]");
  105. REQUIRE(arr.success());
  106. REQUIRE(2 == arr.size());
  107. REQUIRE(arr[0] == "");
  108. REQUIRE(arr[1] == "");
  109. }
  110. SECTION("EmptyStringSingleQuotes") {
  111. JsonArray& arr = jb.parseArray("[\'\',\'\']");
  112. REQUIRE(arr.success());
  113. REQUIRE(2 == arr.size());
  114. REQUIRE(arr[0] == "");
  115. REQUIRE(arr[1] == "");
  116. }
  117. SECTION("EmptyStringNoQuotes") {
  118. JsonArray& arr = jb.parseArray("[,]");
  119. REQUIRE(arr.success());
  120. REQUIRE(2 == arr.size());
  121. REQUIRE(arr[0] == "");
  122. REQUIRE(arr[1] == "");
  123. }
  124. SECTION("ClosingDoubleQuoteMissing") {
  125. JsonArray& arr = jb.parseArray("[\"]");
  126. REQUIRE_FALSE(arr.success());
  127. }
  128. SECTION("ClosingSignleQuoteMissing") {
  129. JsonArray& arr = jb.parseArray("[\']");
  130. REQUIRE_FALSE(arr.success());
  131. }
  132. SECTION("StringWithEscapedChars") {
  133. JsonArray& arr = jb.parseArray("[\"1\\\"2\\\\3\\/4\\b5\\f6\\n7\\r8\\t9\"]");
  134. REQUIRE(arr.success());
  135. REQUIRE(1 == arr.size());
  136. REQUIRE(arr[0] == "1\"2\\3/4\b5\f6\n7\r8\t9");
  137. }
  138. SECTION("StringWithUnterminatedEscapeSequence") {
  139. JsonArray& arr = jb.parseArray("\"\\\0\"", 4);
  140. REQUIRE_FALSE(arr.success());
  141. }
  142. SECTION("CCommentBeforeOpeningBracket") {
  143. JsonArray& arr = jb.parseArray("/*COMMENT*/ [\"hello\"]");
  144. REQUIRE(arr.success());
  145. REQUIRE(1 == arr.size());
  146. REQUIRE(arr[0] == "hello");
  147. }
  148. SECTION("CCommentAfterOpeningBracket") {
  149. JsonArray& arr = jb.parseArray("[/*COMMENT*/ \"hello\"]");
  150. REQUIRE(arr.success());
  151. REQUIRE(1 == arr.size());
  152. REQUIRE(arr[0] == "hello");
  153. }
  154. SECTION("CCommentBeforeClosingBracket") {
  155. JsonArray& arr = jb.parseArray("[\"hello\"/*COMMENT*/]");
  156. REQUIRE(arr.success());
  157. REQUIRE(1 == arr.size());
  158. REQUIRE(arr[0] == "hello");
  159. }
  160. SECTION("CCommentAfterClosingBracket") {
  161. JsonArray& arr = jb.parseArray("[\"hello\"]/*COMMENT*/");
  162. REQUIRE(arr.success());
  163. REQUIRE(1 == arr.size());
  164. REQUIRE(arr[0] == "hello");
  165. }
  166. SECTION("CCommentBeforeComma") {
  167. JsonArray& arr = jb.parseArray("[\"hello\"/*COMMENT*/,\"world\"]");
  168. REQUIRE(arr.success());
  169. REQUIRE(2 == arr.size());
  170. REQUIRE(arr[0] == "hello");
  171. REQUIRE(arr[1] == "world");
  172. }
  173. SECTION("CCommentAfterComma") {
  174. JsonArray& arr = jb.parseArray("[\"hello\",/*COMMENT*/ \"world\"]");
  175. REQUIRE(arr.success());
  176. REQUIRE(2 == arr.size());
  177. REQUIRE(arr[0] == "hello");
  178. REQUIRE(arr[1] == "world");
  179. }
  180. SECTION("CppCommentBeforeOpeningBracket") {
  181. JsonArray& arr = jb.parseArray("//COMMENT\n\t[\"hello\"]");
  182. REQUIRE(arr.success());
  183. REQUIRE(1 == arr.size());
  184. REQUIRE(arr[0] == "hello");
  185. }
  186. SECTION("CppCommentAfterOpeningBracket") {
  187. JsonArray& arr = jb.parseArray("[//COMMENT\n\"hello\"]");
  188. REQUIRE(arr.success());
  189. REQUIRE(1 == arr.size());
  190. REQUIRE(arr[0] == "hello");
  191. }
  192. SECTION("CppCommentBeforeClosingBracket") {
  193. JsonArray& arr = jb.parseArray("[\"hello\"//COMMENT\r\n]");
  194. REQUIRE(arr.success());
  195. REQUIRE(1 == arr.size());
  196. REQUIRE(arr[0] == "hello");
  197. }
  198. SECTION("CppCommentAfterClosingBracket") {
  199. JsonArray& arr = jb.parseArray("[\"hello\"]//COMMENT\n");
  200. REQUIRE(arr.success());
  201. REQUIRE(1 == arr.size());
  202. REQUIRE(arr[0] == "hello");
  203. }
  204. SECTION("CppCommentBeforeComma") {
  205. JsonArray& arr = jb.parseArray("[\"hello\"//COMMENT\n,\"world\"]");
  206. REQUIRE(arr.success());
  207. REQUIRE(2 == arr.size());
  208. REQUIRE(arr[0] == "hello");
  209. REQUIRE(arr[1] == "world");
  210. }
  211. SECTION("CppCommentAfterComma") {
  212. JsonArray& arr = jb.parseArray("[\"hello\",//COMMENT\n\"world\"]");
  213. REQUIRE(arr.success());
  214. REQUIRE(2 == arr.size());
  215. REQUIRE(arr[0] == "hello");
  216. REQUIRE(arr[1] == "world");
  217. }
  218. SECTION("InvalidCppComment") {
  219. JsonArray& arr = jb.parseArray("[/COMMENT\n]");
  220. REQUIRE_FALSE(arr.success());
  221. }
  222. SECTION("InvalidComment") {
  223. JsonArray& arr = jb.parseArray("[/*/\n]");
  224. REQUIRE_FALSE(arr.success());
  225. }
  226. SECTION("UnfinishedCComment") {
  227. JsonArray& arr = jb.parseArray("[/*COMMENT]");
  228. REQUIRE_FALSE(arr.success());
  229. }
  230. SECTION("EndsInCppComment") {
  231. JsonArray& arr = jb.parseArray("[//COMMENT");
  232. REQUIRE_FALSE(arr.success());
  233. }
  234. SECTION("AfterClosingStar") {
  235. JsonArray& arr = jb.parseArray("[/*COMMENT*");
  236. REQUIRE_FALSE(arr.success());
  237. }
  238. SECTION("DeeplyNested") {
  239. JsonArray& arr =
  240. jb.parseArray("[[[[[[[[[[[[[[[[[[[\"Not too deep\"]]]]]]]]]]]]]]]]]]]");
  241. REQUIRE(arr.success());
  242. }
  243. }