JsonParser_Array_Tests.cpp 7.5 KB

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