std_string.cpp 6.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2023
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <catch.hpp>
  6. static void eraseString(std::string &str) {
  7. char *p = const_cast<char *>(str.c_str());
  8. while (*p) *p++ = '*';
  9. }
  10. TEST_CASE("std::string") {
  11. DynamicJsonBuffer jb;
  12. SECTION("JsonBuffer_ParseArray") {
  13. std::string json("[\"hello\"]");
  14. JsonArray &array = jb.parseArray(json);
  15. eraseString(json);
  16. REQUIRE(true == array.success());
  17. REQUIRE(std::string("hello") == array[0]);
  18. }
  19. SECTION("JsonBuffer_ParseObject") {
  20. std::string json("{\"hello\":\"world\"}");
  21. JsonObject &object = jb.parseObject(json);
  22. eraseString(json);
  23. REQUIRE(true == object.success());
  24. REQUIRE(std::string("world") == object["hello"]);
  25. }
  26. SECTION("JsonObject_Subscript") {
  27. char json[] = "{\"key\":\"value\"}";
  28. JsonObject &object = jb.parseObject(json);
  29. REQUIRE(std::string("value") == object[std::string("key")]);
  30. }
  31. SECTION("JsonObject_ConstSubscript") {
  32. char json[] = "{\"key\":\"value\"}";
  33. const JsonObject &object = jb.parseObject(json);
  34. REQUIRE(std::string("value") == object[std::string("key")]);
  35. }
  36. SECTION("JsonObject_SetKey") {
  37. JsonObject &object = jb.createObject();
  38. std::string key("hello");
  39. object.set(key, "world");
  40. eraseString(key);
  41. REQUIRE(std::string("world") == object["hello"]);
  42. }
  43. SECTION("JsonObject_SetValue") {
  44. JsonObject &object = jb.createObject();
  45. std::string value("world");
  46. object.set("hello", value);
  47. eraseString(value);
  48. REQUIRE(std::string("world") == object["hello"]);
  49. }
  50. SECTION("JsonObject_SetKeyValue") {
  51. JsonObject &object = jb.createObject();
  52. std::string key("hello");
  53. std::string value("world");
  54. object.set(key, value);
  55. eraseString(key);
  56. eraseString(value);
  57. REQUIRE(std::string("world") == object["hello"]);
  58. }
  59. SECTION("JsonObject_SetToArraySubscript") {
  60. JsonArray &arr = jb.createArray();
  61. arr.add("world");
  62. JsonObject &object = jb.createObject();
  63. object.set(std::string("hello"), arr[0]);
  64. REQUIRE(std::string("world") == object["hello"]);
  65. }
  66. SECTION("JsonObject_SetToObjectSubscript") {
  67. JsonObject &arr = jb.createObject();
  68. arr.set("x", "world");
  69. JsonObject &object = jb.createObject();
  70. object.set(std::string("hello"), arr["x"]);
  71. REQUIRE(std::string("world") == object["hello"]);
  72. }
  73. SECTION("JsonObject_Get") {
  74. char json[] = "{\"key\":\"value\"}";
  75. const JsonObject &object = jb.parseObject(json);
  76. REQUIRE(std::string("value") ==
  77. object.get<const char *>(std::string("key")));
  78. }
  79. SECTION("JsonObject_GetT") {
  80. char json[] = "{\"key\":\"value\"}";
  81. const JsonObject &object = jb.parseObject(json);
  82. REQUIRE(std::string("value") ==
  83. object.get<const char *>(std::string("key")));
  84. }
  85. SECTION("JsonObject_IsT") {
  86. char json[] = "{\"key\":\"value\"}";
  87. const JsonObject &object = jb.parseObject(json);
  88. REQUIRE(true == object.is<const char *>(std::string("key")));
  89. }
  90. SECTION("JsonObject_CreateNestedObject") {
  91. std::string key = "key";
  92. char json[64];
  93. JsonObject &object = jb.createObject();
  94. object.createNestedObject(key);
  95. eraseString(key);
  96. object.printTo(json, sizeof(json));
  97. REQUIRE(std::string("{\"key\":{}}") == json);
  98. }
  99. SECTION("JsonObject_CreateNestedArray") {
  100. std::string key = "key";
  101. char json[64];
  102. JsonObject &object = jb.createObject();
  103. object.createNestedArray(key);
  104. eraseString(key);
  105. object.printTo(json, sizeof(json));
  106. REQUIRE(std::string("{\"key\":[]}") == json);
  107. }
  108. SECTION("JsonObject_ContainsKey") {
  109. char json[] = "{\"key\":\"value\"}";
  110. const JsonObject &object = jb.parseObject(json);
  111. REQUIRE(true == object.containsKey(std::string("key")));
  112. }
  113. SECTION("JsonObject_Remove") {
  114. char json[] = "{\"key\":\"value\"}";
  115. JsonObject &object = jb.parseObject(json);
  116. REQUIRE(1 == object.size());
  117. object.remove(std::string("key"));
  118. REQUIRE(0 == object.size());
  119. }
  120. SECTION("JsonObjectSubscript_SetKey") {
  121. JsonObject &object = jb.createObject();
  122. std::string key("hello");
  123. object[key] = "world";
  124. eraseString(key);
  125. REQUIRE(std::string("world") == object["hello"]);
  126. }
  127. SECTION("JsonObjectSubscript_SetValue") {
  128. JsonObject &object = jb.createObject();
  129. std::string value("world");
  130. object["hello"] = value;
  131. eraseString(value);
  132. REQUIRE(std::string("world") == object["hello"]);
  133. }
  134. SECTION("JsonArray_Add") {
  135. JsonArray &array = jb.createArray();
  136. std::string value("hello");
  137. array.add(value);
  138. eraseString(value);
  139. REQUIRE(std::string("hello") == array[0]);
  140. }
  141. SECTION("JsonArray_Set") {
  142. JsonArray &array = jb.createArray();
  143. std::string value("world");
  144. array.add("hello");
  145. array.set(0, value);
  146. eraseString(value);
  147. REQUIRE(std::string("world") == array[0]);
  148. }
  149. SECTION("JsonArraySubscript") {
  150. JsonArray &array = jb.createArray();
  151. std::string value("world");
  152. array.add("hello");
  153. array[0] = value;
  154. eraseString(value);
  155. REQUIRE(std::string("world") == array[0]);
  156. }
  157. SECTION("JsonArray_PrintTo") {
  158. JsonArray &array = jb.createArray();
  159. array.add(4);
  160. array.add(2);
  161. std::string json;
  162. array.printTo(json);
  163. REQUIRE(std::string("[4,2]") == json);
  164. }
  165. SECTION("JsonArray_PrettyPrintTo") {
  166. JsonArray &array = jb.createArray();
  167. array.add(4);
  168. array.add(2);
  169. std::string json;
  170. array.prettyPrintTo(json);
  171. REQUIRE(std::string("[\r\n 4,\r\n 2\r\n]") == json);
  172. }
  173. SECTION("JsonObject_PrintTo") {
  174. JsonObject &object = jb.createObject();
  175. object["key"] = "value";
  176. std::string json;
  177. object.printTo(json);
  178. REQUIRE(std::string("{\"key\":\"value\"}") == json);
  179. }
  180. SECTION("JsonObject_PrettyPrintTo") {
  181. JsonObject &object = jb.createObject();
  182. object["key"] = "value";
  183. std::string json;
  184. object.prettyPrintTo(json);
  185. REQUIRE(std::string("{\r\n \"key\": \"value\"\r\n}") == json);
  186. }
  187. SECTION("JsonBuffer_GrowWhenAddingNewKey") {
  188. JsonObject &object = jb.createObject();
  189. std::string key1("hello"), key2("world");
  190. object[key1] = 1;
  191. size_t sizeBefore = jb.size();
  192. object[key2] = 2;
  193. size_t sizeAfter = jb.size();
  194. REQUIRE(sizeAfter - sizeBefore >= key2.size());
  195. }
  196. SECTION("JsonBuffer_DontGrowWhenReusingKey") {
  197. JsonObject &object = jb.createObject();
  198. std::string key("hello");
  199. object[key] = 1;
  200. size_t sizeBefore = jb.size();
  201. object[key] = 2;
  202. size_t sizeAfter = jb.size();
  203. REQUIRE(sizeBefore == sizeAfter);
  204. }
  205. }