std_string.cpp 4.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173
  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. DynamicJsonDocument doc;
  12. SECTION("operator[]") {
  13. char json[] = "{\"key\":\"value\"}";
  14. deserializeJson(doc, json);
  15. JsonObject &obj = doc.as<JsonObject>();
  16. REQUIRE(std::string("value") == obj[std::string("key")]);
  17. }
  18. SECTION("operator[] const") {
  19. char json[] = "{\"key\":\"value\"}";
  20. deserializeJson(doc, json);
  21. JsonObject &obj = doc.as<JsonObject>();
  22. REQUIRE(std::string("value") == obj[std::string("key")]);
  23. }
  24. SECTION("set(key)") {
  25. JsonObject &obj = doc.to<JsonObject>();
  26. std::string key("hello");
  27. obj.set(key, "world");
  28. eraseString(key);
  29. REQUIRE(std::string("world") == obj["hello"]);
  30. }
  31. SECTION("set(value)") {
  32. JsonObject &obj = doc.to<JsonObject>();
  33. std::string value("world");
  34. obj.set("hello", value);
  35. eraseString(value);
  36. REQUIRE(std::string("world") == obj["hello"]);
  37. }
  38. SECTION("set(key,value)") {
  39. JsonObject &obj = doc.to<JsonObject>();
  40. std::string key("hello");
  41. std::string value("world");
  42. obj.set(key, value);
  43. eraseString(key);
  44. eraseString(value);
  45. REQUIRE(std::string("world") == obj["hello"]);
  46. }
  47. SECTION("set(JsonArraySubscript)") {
  48. JsonObject &obj = doc.to<JsonObject>();
  49. DynamicJsonDocument doc2;
  50. JsonArray &arr = doc2.to<JsonArray>();
  51. arr.add("world");
  52. obj.set(std::string("hello"), arr[0]);
  53. REQUIRE(std::string("world") == obj["hello"]);
  54. }
  55. SECTION("set(JsonObjectSubscript)") {
  56. JsonObject &obj = doc.to<JsonObject>();
  57. DynamicJsonDocument doc2;
  58. JsonObject &obj2 = doc2.to<JsonObject>();
  59. obj2.set("x", "world");
  60. obj.set(std::string("hello"), obj2["x"]);
  61. REQUIRE(std::string("world") == obj["hello"]);
  62. }
  63. SECTION("get<T>()") {
  64. char json[] = "{\"key\":\"value\"}";
  65. deserializeJson(doc, json);
  66. JsonObject &obj = doc.as<JsonObject>();
  67. REQUIRE(std::string("value") == obj.get<const char *>(std::string("key")));
  68. }
  69. SECTION("is<T>()") {
  70. char json[] = "{\"key\":\"value\"}";
  71. deserializeJson(doc, json);
  72. JsonObject &obj = doc.as<JsonObject>();
  73. REQUIRE(true == obj.is<const char *>(std::string("key")));
  74. }
  75. SECTION("createNestedObject()") {
  76. JsonObject &obj = doc.to<JsonObject>();
  77. std::string key = "key";
  78. char json[64];
  79. obj.createNestedObject(key);
  80. eraseString(key);
  81. serializeJson(doc, json, sizeof(json));
  82. REQUIRE(std::string("{\"key\":{}}") == json);
  83. }
  84. SECTION("createNestedArray()") {
  85. JsonObject &obj = doc.to<JsonObject>();
  86. std::string key = "key";
  87. char json[64];
  88. obj.createNestedArray(key);
  89. eraseString(key);
  90. serializeJson(doc, json, sizeof(json));
  91. REQUIRE(std::string("{\"key\":[]}") == json);
  92. }
  93. SECTION("containsKey()") {
  94. char json[] = "{\"key\":\"value\"}";
  95. deserializeJson(doc, json);
  96. JsonObject &obj = doc.as<JsonObject>();
  97. REQUIRE(true == obj.containsKey(std::string("key")));
  98. }
  99. SECTION("remove()") {
  100. JsonObject &obj = doc.to<JsonObject>();
  101. obj["key"] = "value";
  102. obj.remove(std::string("key"));
  103. REQUIRE(0 == obj.size());
  104. }
  105. SECTION("operator[], set key") {
  106. std::string key("hello");
  107. JsonObject &obj = doc.to<JsonObject>();
  108. obj[key] = "world";
  109. eraseString(key);
  110. REQUIRE(std::string("world") == obj["hello"]);
  111. }
  112. SECTION("operator[], set value") {
  113. std::string value("world");
  114. JsonObject &obj = doc.to<JsonObject>();
  115. obj["hello"] = value;
  116. eraseString(value);
  117. REQUIRE(std::string("world") == obj["hello"]);
  118. }
  119. SECTION("memoryUsage() increases when adding a new key") {
  120. std::string key1("hello"), key2("world");
  121. JsonObject &obj = doc.to<JsonObject>();
  122. obj[key1] = 1;
  123. size_t sizeBefore = doc.memoryUsage();
  124. obj[key2] = 2;
  125. size_t sizeAfter = doc.memoryUsage();
  126. REQUIRE(sizeAfter - sizeBefore >= key2.size());
  127. }
  128. SECTION("memoryUsage() remains when adding the same key") {
  129. std::string key("hello");
  130. JsonObject &obj = doc.to<JsonObject>();
  131. obj[key] = 1;
  132. size_t sizeBefore = doc.memoryUsage();
  133. obj[key] = 2;
  134. size_t sizeAfter = doc.memoryUsage();
  135. REQUIRE(sizeBefore == sizeAfter);
  136. }
  137. }