parseArray.cpp 7.5 KB

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