vla.cpp 7.0 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2023
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. #if defined(__clang__)
  7. #pragma clang diagnostic ignored "-Wvla-extension"
  8. #define CONFLICTS_WITH_BUILTIN_OPERATOR
  9. #elif defined(__GNUC__)
  10. #pragma GCC diagnostic ignored "-Wvla"
  11. #else
  12. #define VLA_NOT_SUPPORTED
  13. #endif
  14. #ifndef VLA_NOT_SUPPORTED
  15. TEST_CASE("Variable Length Array") {
  16. SECTION("ParseArray") {
  17. int i = 8;
  18. char vla[i];
  19. strcpy(vla, "[42]");
  20. StaticJsonBuffer<JSON_ARRAY_SIZE(1)> jsonBuffer;
  21. JsonArray& arr = jsonBuffer.parseArray(vla);
  22. REQUIRE(true == arr.success());
  23. }
  24. SECTION("ParseObject") {
  25. int i = 16;
  26. char vla[i];
  27. strcpy(vla, "{\"a\":42}");
  28. StaticJsonBuffer<JSON_OBJECT_SIZE(1)> jsonBuffer;
  29. JsonObject& obj = jsonBuffer.parseObject(vla);
  30. REQUIRE(true == obj.success());
  31. }
  32. SECTION("Parse") {
  33. int i = 16;
  34. char vla[i];
  35. strcpy(vla, "42");
  36. StaticJsonBuffer<1> jsonBuffer;
  37. JsonVariant variant = jsonBuffer.parse(vla);
  38. REQUIRE(42 == variant.as<int>());
  39. }
  40. SECTION("JsonVariant_Constructor") {
  41. int i = 16;
  42. char vla[i];
  43. strcpy(vla, "42");
  44. JsonVariant variant(vla);
  45. REQUIRE(42 == variant.as<int>());
  46. }
  47. SECTION("JsonVariant_Assign") {
  48. int i = 16;
  49. char vla[i];
  50. strcpy(vla, "42");
  51. JsonVariant variant(666);
  52. variant = vla;
  53. REQUIRE(42 == variant.as<int>());
  54. }
  55. #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR
  56. SECTION("JsonVariant_Subscript") {
  57. int i = 16;
  58. char vla[i];
  59. strcpy(vla, "hello");
  60. DynamicJsonBuffer jsonBuffer;
  61. JsonVariant variant = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  62. REQUIRE(std::string("world") == variant[vla]);
  63. }
  64. #endif
  65. #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR
  66. SECTION("JsonVariant_Subscript_Const") {
  67. int i = 16;
  68. char vla[i];
  69. strcpy(vla, "hello");
  70. DynamicJsonBuffer jsonBuffer;
  71. const JsonVariant variant = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  72. REQUIRE(std::string("world") == variant[vla]);
  73. }
  74. #endif
  75. SECTION("JsonVariant_Equals") {
  76. int i = 16;
  77. char vla[i];
  78. strcpy(vla, "hello");
  79. DynamicJsonBuffer jsonBuffer;
  80. const JsonVariant variant = "hello";
  81. REQUIRE((vla == variant));
  82. REQUIRE((variant == vla));
  83. REQUIRE_FALSE((vla != variant));
  84. REQUIRE_FALSE((variant != vla));
  85. }
  86. SECTION("JsonVariant_Differs") {
  87. int i = 16;
  88. char vla[i];
  89. strcpy(vla, "hello");
  90. DynamicJsonBuffer jsonBuffer;
  91. const JsonVariant variant = "world";
  92. REQUIRE((vla != variant));
  93. REQUIRE((variant != vla));
  94. REQUIRE_FALSE((vla == variant));
  95. REQUIRE_FALSE((variant == vla));
  96. }
  97. #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR
  98. SECTION("JsonObject_Subscript") {
  99. int i = 16;
  100. char vla[i];
  101. strcpy(vla, "hello");
  102. DynamicJsonBuffer jsonBuffer;
  103. JsonObject& obj = jsonBuffer.createObject();
  104. obj[vla] = "world";
  105. REQUIRE(std::string("world") == obj["hello"]);
  106. }
  107. #endif
  108. SECTION("JsonObject_Subscript_Assign") { // issue #416
  109. int i = 32;
  110. char vla[i];
  111. strcpy(vla, "world");
  112. DynamicJsonBuffer jsonBuffer;
  113. JsonObject& obj = jsonBuffer.createObject();
  114. obj["hello"] = vla;
  115. REQUIRE(std::string("world") == obj["hello"].as<char*>());
  116. }
  117. SECTION("JsonObject_Subscript_Set") {
  118. int i = 32;
  119. char vla[i];
  120. strcpy(vla, "world");
  121. DynamicJsonBuffer jsonBuffer;
  122. JsonObject& obj = jsonBuffer.createObject();
  123. obj["hello"].set(vla);
  124. REQUIRE(std::string("world") == obj["hello"].as<char*>());
  125. }
  126. #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR
  127. SECTION("JsonObject_Subscript_Const") {
  128. int i = 16;
  129. char vla[i];
  130. strcpy(vla, "hello");
  131. DynamicJsonBuffer jsonBuffer;
  132. const JsonObject& obj = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  133. REQUIRE(std::string("world") == obj[vla]);
  134. }
  135. #endif
  136. SECTION("JsonObject_Get") {
  137. int i = 16;
  138. char vla[i];
  139. strcpy(vla, "hello");
  140. DynamicJsonBuffer jsonBuffer;
  141. JsonObject& obj = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  142. REQUIRE(std::string("world") == obj.get<char*>(vla));
  143. }
  144. SECTION("JsonObject_Set_Key") {
  145. int i = 16;
  146. char vla[i];
  147. strcpy(vla, "hello");
  148. DynamicJsonBuffer jsonBuffer;
  149. JsonObject& obj = jsonBuffer.createObject();
  150. obj.set(vla, "world");
  151. REQUIRE(std::string("world") == obj["hello"]);
  152. }
  153. SECTION("JsonObject_Set_Value") {
  154. int i = 16;
  155. char vla[i];
  156. strcpy(vla, "world");
  157. DynamicJsonBuffer jsonBuffer;
  158. JsonObject& obj = jsonBuffer.createObject();
  159. obj.set("hello", vla);
  160. REQUIRE(std::string("world") == obj["hello"]);
  161. }
  162. SECTION("JsonObject_Set_KeyAndValue") {
  163. int i = 16;
  164. char vla[i];
  165. strcpy(vla, "world");
  166. DynamicJsonBuffer jsonBuffer;
  167. JsonObject& obj = jsonBuffer.createObject();
  168. obj.set(vla, vla);
  169. REQUIRE(std::string("world") == obj["world"]);
  170. }
  171. SECTION("JsonObject_ContainsKey") {
  172. int i = 16;
  173. char vla[i];
  174. strcpy(vla, "hello");
  175. DynamicJsonBuffer jsonBuffer;
  176. const JsonObject& obj = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  177. REQUIRE(true == obj.containsKey(vla));
  178. }
  179. SECTION("JsonObject_Remove") {
  180. int i = 16;
  181. char vla[i];
  182. strcpy(vla, "hello");
  183. DynamicJsonBuffer jsonBuffer;
  184. JsonObject& obj = jsonBuffer.parseObject("{\"hello\":\"world\"}");
  185. obj.remove(vla);
  186. REQUIRE(0 == obj.size());
  187. }
  188. SECTION("JsonObject_Is") {
  189. int i = 16;
  190. char vla[i];
  191. strcpy(vla, "hello");
  192. DynamicJsonBuffer jsonBuffer;
  193. JsonObject& obj = jsonBuffer.parseObject("{\"hello\":42}");
  194. REQUIRE(true == obj.is<int>(vla));
  195. }
  196. SECTION("JsonObject_CreateNestedArray") {
  197. int i = 16;
  198. char vla[i];
  199. strcpy(vla, "hello");
  200. DynamicJsonBuffer jsonBuffer;
  201. JsonObject& obj = jsonBuffer.createObject();
  202. obj.createNestedArray(vla);
  203. }
  204. SECTION("JsonObject_CreateNestedObject") {
  205. int i = 16;
  206. char vla[i];
  207. strcpy(vla, "hello");
  208. DynamicJsonBuffer jsonBuffer;
  209. JsonObject& obj = jsonBuffer.createObject();
  210. obj.createNestedObject(vla);
  211. }
  212. SECTION("JsonArray_Add") {
  213. int i = 16;
  214. char vla[i];
  215. strcpy(vla, "world");
  216. DynamicJsonBuffer jsonBuffer;
  217. JsonArray& arr = jsonBuffer.createArray();
  218. arr.add(vla);
  219. REQUIRE(std::string("world") == arr[0]);
  220. }
  221. SECTION("JsonArray_Set") {
  222. int i = 16;
  223. char vla[i];
  224. strcpy(vla, "world");
  225. DynamicJsonBuffer jsonBuffer;
  226. JsonArray& arr = jsonBuffer.createArray();
  227. arr.add("hello");
  228. arr.set(0, vla);
  229. REQUIRE(std::string("world") == arr[0]);
  230. }
  231. SECTION("JsonArraySubscript_Set") {
  232. int i = 16;
  233. char vla[i];
  234. strcpy(vla, "world");
  235. DynamicJsonBuffer jsonBuffer;
  236. JsonArray& arr = jsonBuffer.createArray();
  237. arr.add("hello");
  238. arr[0].set(vla);
  239. REQUIRE(std::string("world") == arr[0]);
  240. }
  241. SECTION("JsonArraySubscript_Assign") {
  242. int i = 16;
  243. char vla[i];
  244. strcpy(vla, "world");
  245. DynamicJsonBuffer jsonBuffer;
  246. JsonArray& arr = jsonBuffer.createArray();
  247. arr.add("hello");
  248. arr[0] = vla;
  249. REQUIRE(std::string("world") == arr[0]);
  250. }
  251. }
  252. #endif