remove.cpp 2.8 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128
  1. // ArduinoJson - https://arduinojson.org
  2. // Copyright © 2014-2025, Benoit BLANCHON
  3. // MIT License
  4. #include <ArduinoJson.h>
  5. #include <stdint.h>
  6. #include <catch.hpp>
  7. #include "Allocators.hpp"
  8. #include "Literals.hpp"
  9. using ArduinoJson::detail::sizeofArray;
  10. TEST_CASE("JsonVariant::remove(int)") {
  11. SpyingAllocator spy;
  12. JsonDocument doc(&spy);
  13. SECTION("release top level strings") {
  14. doc.add("hello"_s);
  15. doc.add("hello"_s);
  16. doc.add("world"_s);
  17. JsonVariant var = doc.as<JsonVariant>();
  18. REQUIRE(var.as<std::string>() == "[\"hello\",\"hello\",\"world\"]");
  19. spy.clearLog();
  20. var.remove(1);
  21. REQUIRE(var.as<std::string>() == "[\"hello\",\"world\"]");
  22. REQUIRE(spy.log() == AllocatorLog{});
  23. spy.clearLog();
  24. var.remove(1);
  25. REQUIRE(var.as<std::string>() == "[\"hello\"]");
  26. REQUIRE(spy.log() == AllocatorLog{
  27. Deallocate(sizeofString("world")),
  28. });
  29. spy.clearLog();
  30. var.remove(0);
  31. REQUIRE(var.as<std::string>() == "[]");
  32. REQUIRE(spy.log() == AllocatorLog{
  33. Deallocate(sizeofString("hello")),
  34. });
  35. }
  36. SECTION("release strings in nested array") {
  37. doc[0][0] = "hello"_s;
  38. JsonVariant var = doc.as<JsonVariant>();
  39. REQUIRE(var.as<std::string>() == "[[\"hello\"]]");
  40. spy.clearLog();
  41. var.remove(0);
  42. REQUIRE(var.as<std::string>() == "[]");
  43. REQUIRE(spy.log() == AllocatorLog{
  44. Deallocate(sizeofString("hello")),
  45. });
  46. }
  47. }
  48. TEST_CASE("JsonVariant::remove(const char *)") {
  49. JsonDocument doc;
  50. JsonVariant var = doc.to<JsonVariant>();
  51. var["a"] = 1;
  52. var["b"] = 2;
  53. var.remove("a");
  54. REQUIRE(var.as<std::string>() == "{\"b\":2}");
  55. }
  56. TEST_CASE("JsonVariant::remove(std::string)") {
  57. JsonDocument doc;
  58. JsonVariant var = doc.to<JsonVariant>();
  59. var["a"] = 1;
  60. var["b"] = 2;
  61. var.remove("b"_s);
  62. REQUIRE(var.as<std::string>() == "{\"a\":1}");
  63. }
  64. #ifdef HAS_VARIABLE_LENGTH_ARRAY
  65. TEST_CASE("JsonVariant::remove(VLA)") {
  66. JsonDocument doc;
  67. JsonVariant var = doc.to<JsonVariant>();
  68. var["a"] = 1;
  69. var["b"] = 2;
  70. size_t i = 16;
  71. char vla[i];
  72. strcpy(vla, "b");
  73. var.remove("b"_s);
  74. REQUIRE(var.as<std::string>() == "{\"a\":1}");
  75. }
  76. #endif
  77. TEST_CASE("JsonVariant::remove(JsonVariant) from object") {
  78. JsonDocument doc;
  79. JsonVariant var = doc.to<JsonVariant>();
  80. var["a"] = "a";
  81. var["b"] = 2;
  82. var["c"] = "b";
  83. var.remove(var["c"]);
  84. REQUIRE(var.as<std::string>() == "{\"a\":\"a\",\"c\":\"b\"}");
  85. }
  86. TEST_CASE("JsonVariant::remove(JsonVariant) from array") {
  87. JsonDocument doc;
  88. JsonVariant var = doc.to<JsonVariant>();
  89. var[0] = 3;
  90. var[1] = 2;
  91. var[2] = 1;
  92. var.remove(var[2]);
  93. var.remove(var[3]); // noop
  94. REQUIRE(var.as<std::string>() == "[3,1]");
  95. }