std_string.cpp 6.7 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259
  1. // ArduinoJson - arduinojson.org
  2. // Copyright Benoit Blanchon 2014-2018
  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. SECTION("deserializeJson duplicates content") {
  12. std::string json("[\"hello\"]");
  13. DynamicJsonDocument doc;
  14. JsonError err = deserializeJson(doc, json);
  15. eraseString(json);
  16. JsonArray &array = doc.as<JsonArray>();
  17. REQUIRE(err == JsonError::Ok);
  18. REQUIRE(std::string("hello") == array[0]);
  19. }
  20. SECTION("JsonArray") {
  21. DynamicJsonDocument doc;
  22. JsonArray &array = doc.to<JsonArray>();
  23. SECTION("add()") {
  24. std::string value("hello");
  25. array.add(value);
  26. eraseString(value);
  27. REQUIRE(std::string("hello") == array[0]);
  28. }
  29. SECTION("set()") {
  30. std::string value("world");
  31. array.add("hello");
  32. array.set(0, value);
  33. eraseString(value);
  34. REQUIRE(std::string("world") == array[0]);
  35. }
  36. SECTION("operator[]") {
  37. std::string value("world");
  38. array.add("hello");
  39. array[0] = value;
  40. eraseString(value);
  41. REQUIRE(std::string("world") == array[0]);
  42. }
  43. SECTION("serializeJson()") {
  44. array.add(4);
  45. array.add(2);
  46. std::string json;
  47. serializeJson(array, json);
  48. REQUIRE(std::string("[4,2]") == json);
  49. }
  50. SECTION("serializeJsonPretty()") {
  51. array.add(4);
  52. array.add(2);
  53. std::string json;
  54. serializeJsonPretty(array, json);
  55. REQUIRE(std::string("[\r\n 4,\r\n 2\r\n]") == json);
  56. }
  57. }
  58. SECTION("JsonObject") {
  59. DynamicJsonDocument doc;
  60. SECTION("deserializeJson()") {
  61. std::string json("{\"hello\":\"world\"}");
  62. JsonError err = deserializeJson(doc, json);
  63. JsonObject &obj = doc.as<JsonObject>();
  64. eraseString(json);
  65. REQUIRE(err == JsonError::Ok);
  66. REQUIRE(std::string("world") == obj["hello"]);
  67. }
  68. SECTION("operator[]") {
  69. char json[] = "{\"key\":\"value\"}";
  70. deserializeJson(doc, json);
  71. JsonObject &obj = doc.as<JsonObject>();
  72. REQUIRE(std::string("value") == obj[std::string("key")]);
  73. }
  74. SECTION("operator[] const") {
  75. char json[] = "{\"key\":\"value\"}";
  76. deserializeJson(doc, json);
  77. JsonObject &obj = doc.as<JsonObject>();
  78. REQUIRE(std::string("value") == obj[std::string("key")]);
  79. }
  80. SECTION("set(key)") {
  81. JsonObject &obj = doc.to<JsonObject>();
  82. std::string key("hello");
  83. obj.set(key, "world");
  84. eraseString(key);
  85. REQUIRE(std::string("world") == obj["hello"]);
  86. }
  87. SECTION("set(value)") {
  88. JsonObject &obj = doc.to<JsonObject>();
  89. std::string value("world");
  90. obj.set("hello", value);
  91. eraseString(value);
  92. REQUIRE(std::string("world") == obj["hello"]);
  93. }
  94. SECTION("set(key,value)") {
  95. JsonObject &obj = doc.to<JsonObject>();
  96. std::string key("hello");
  97. std::string value("world");
  98. obj.set(key, value);
  99. eraseString(key);
  100. eraseString(value);
  101. REQUIRE(std::string("world") == obj["hello"]);
  102. }
  103. SECTION("set(JsonArraySubscript)") {
  104. JsonObject &obj = doc.to<JsonObject>();
  105. DynamicJsonDocument doc2;
  106. JsonArray &arr = doc2.to<JsonArray>();
  107. arr.add("world");
  108. obj.set(std::string("hello"), arr[0]);
  109. REQUIRE(std::string("world") == obj["hello"]);
  110. }
  111. SECTION("set(JsonObjectSubscript)") {
  112. JsonObject &obj = doc.to<JsonObject>();
  113. DynamicJsonDocument doc2;
  114. JsonObject &obj2 = doc2.to<JsonObject>();
  115. obj2.set("x", "world");
  116. obj.set(std::string("hello"), obj2["x"]);
  117. REQUIRE(std::string("world") == obj["hello"]);
  118. }
  119. SECTION("get<T>()") {
  120. char json[] = "{\"key\":\"value\"}";
  121. deserializeJson(doc, json);
  122. JsonObject &obj = doc.as<JsonObject>();
  123. REQUIRE(std::string("value") ==
  124. obj.get<const char *>(std::string("key")));
  125. }
  126. SECTION("is<T>()") {
  127. char json[] = "{\"key\":\"value\"}";
  128. deserializeJson(doc, json);
  129. JsonObject &obj = doc.as<JsonObject>();
  130. REQUIRE(true == obj.is<const char *>(std::string("key")));
  131. }
  132. SECTION("createNestedObject()") {
  133. JsonObject &obj = doc.to<JsonObject>();
  134. std::string key = "key";
  135. char json[64];
  136. obj.createNestedObject(key);
  137. eraseString(key);
  138. serializeJson(doc, json, sizeof(json));
  139. REQUIRE(std::string("{\"key\":{}}") == json);
  140. }
  141. SECTION("createNestedArray()") {
  142. JsonObject &obj = doc.to<JsonObject>();
  143. std::string key = "key";
  144. char json[64];
  145. obj.createNestedArray(key);
  146. eraseString(key);
  147. serializeJson(doc, json, sizeof(json));
  148. REQUIRE(std::string("{\"key\":[]}") == json);
  149. }
  150. SECTION("containsKey()") {
  151. char json[] = "{\"key\":\"value\"}";
  152. deserializeJson(doc, json);
  153. JsonObject &obj = doc.as<JsonObject>();
  154. REQUIRE(true == obj.containsKey(std::string("key")));
  155. }
  156. SECTION("remove()") {
  157. JsonObject &obj = doc.to<JsonObject>();
  158. obj["key"] = "value";
  159. obj.remove(std::string("key"));
  160. REQUIRE(0 == obj.size());
  161. }
  162. SECTION("operator[], set key") {
  163. std::string key("hello");
  164. JsonObject &obj = doc.to<JsonObject>();
  165. obj[key] = "world";
  166. eraseString(key);
  167. REQUIRE(std::string("world") == obj["hello"]);
  168. }
  169. SECTION("operator[], set value") {
  170. std::string value("world");
  171. JsonObject &obj = doc.to<JsonObject>();
  172. obj["hello"] = value;
  173. eraseString(value);
  174. REQUIRE(std::string("world") == obj["hello"]);
  175. }
  176. SECTION("serializeJson()") {
  177. JsonObject &obj = doc.to<JsonObject>();
  178. obj["key"] = "value";
  179. std::string json;
  180. serializeJson(doc, json);
  181. REQUIRE(std::string("{\"key\":\"value\"}") == json);
  182. }
  183. SECTION("serializeJsonPretty()") {
  184. JsonObject &obj = doc.to<JsonObject>();
  185. obj["key"] = "value";
  186. std::string json;
  187. serializeJsonPretty(doc, json);
  188. REQUIRE(std::string("{\r\n \"key\": \"value\"\r\n}") == json);
  189. }
  190. SECTION("memoryUsage() increases when adding a new key") {
  191. std::string key1("hello"), key2("world");
  192. JsonObject &obj = doc.to<JsonObject>();
  193. obj[key1] = 1;
  194. size_t sizeBefore = doc.memoryUsage();
  195. obj[key2] = 2;
  196. size_t sizeAfter = doc.memoryUsage();
  197. REQUIRE(sizeAfter - sizeBefore >= key2.size());
  198. }
  199. SECTION("memoryUsage() remains when adding the same key") {
  200. std::string key("hello");
  201. JsonObject &obj = doc.to<JsonObject>();
  202. obj[key] = 1;
  203. size_t sizeBefore = doc.memoryUsage();
  204. obj[key] = 2;
  205. size_t sizeAfter = doc.memoryUsage();
  206. REQUIRE(sizeBefore == sizeAfter);
  207. }
  208. }
  209. }