enable_string_deduplication_1.cpp 3.6 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2023, Benoit BLANCHON
  3. // MIT License
  4. #include "progmem_emulation.hpp"
  5. #define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
  6. #define ARDUINOJSON_ENABLE_PROGMEM 1
  7. #define ARDUINOJSON_ENABLE_STRING_DEDUPLICATION 1
  8. #include <ArduinoJson.h>
  9. #include <catch.hpp>
  10. using ArduinoJson::detail::sizeofArray;
  11. using ArduinoJson::detail::sizeofObject;
  12. TEST_CASE("ARDUINOJSON_ENABLE_STRING_DEDUPLICATION = 1") {
  13. JsonDocument doc(1024);
  14. SECTION("deserializeJson()") {
  15. SECTION("Deduplicate values") {
  16. deserializeJson(doc, "[\"example\",\"example\"]");
  17. CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
  18. CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
  19. }
  20. SECTION("Deduplicate keys") {
  21. deserializeJson(doc, "[{\"example\":1},{\"example\":2}]");
  22. CHECK(doc.memoryUsage() == 2 * sizeofObject(1) + sizeofArray(2) + 8);
  23. const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
  24. const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
  25. CHECK(key1 == key2);
  26. }
  27. }
  28. SECTION("JsonDocument") {
  29. SECTION("values") {
  30. SECTION("std::string") {
  31. doc.add(std::string("example"));
  32. doc.add(std::string("example"));
  33. CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
  34. CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
  35. }
  36. SECTION("char*") {
  37. char value[] = "example";
  38. doc.add(value);
  39. doc.add(value);
  40. CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
  41. CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
  42. }
  43. SECTION("Arduino String") {
  44. doc.add(String("example"));
  45. doc.add(String("example"));
  46. CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
  47. CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
  48. }
  49. SECTION("Flash string") {
  50. doc.add(F("example"));
  51. doc.add(F("example"));
  52. CHECK(doc.memoryUsage() == sizeofArray(2) + 8);
  53. CHECK(doc[0].as<const char*>() == doc[1].as<const char*>());
  54. }
  55. }
  56. SECTION("keys") {
  57. SECTION("std::string") {
  58. doc[0][std::string("example")] = 1;
  59. doc[1][std::string("example")] = 2;
  60. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
  61. const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
  62. const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
  63. CHECK(key1 == key2);
  64. }
  65. SECTION("char*") {
  66. char key[] = "example";
  67. doc[0][key] = 1;
  68. doc[1][key] = 2;
  69. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
  70. const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
  71. const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
  72. CHECK(key1 == key2);
  73. }
  74. SECTION("Arduino String") {
  75. doc[0][String("example")] = 1;
  76. doc[1][String("example")] = 2;
  77. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
  78. const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
  79. const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
  80. CHECK(key1 == key2);
  81. }
  82. SECTION("Flash string") {
  83. doc[0][F("example")] = 1;
  84. doc[1][F("example")] = 2;
  85. CHECK(doc.memoryUsage() == sizeofArray(2) + 2 * sizeofObject(1) + 8);
  86. const char* key1 = doc[0].as<JsonObject>().begin()->key().c_str();
  87. const char* key2 = doc[1].as<JsonObject>().begin()->key().c_str();
  88. CHECK(key1 == key2);
  89. }
  90. }
  91. }
  92. }