// ArduinoJson - https://arduinojson.org // Copyright © 2014-2024, Benoit BLANCHON // MIT License #include #include #include #include "Allocators.hpp" #include "Literals.hpp" using ArduinoJson::detail::sizeofArray; TEST_CASE("JsonVariant::remove(int)") { SpyingAllocator spy; JsonDocument doc(&spy); SECTION("release top level strings") { doc.add("hello"_s); doc.add("hello"_s); doc.add("world"_s); JsonVariant var = doc.as(); REQUIRE(var.as() == "[\"hello\",\"hello\",\"world\"]"); spy.clearLog(); var.remove(1); REQUIRE(var.as() == "[\"hello\",\"world\"]"); REQUIRE(spy.log() == AllocatorLog{}); spy.clearLog(); var.remove(1); REQUIRE(var.as() == "[\"hello\"]"); REQUIRE(spy.log() == AllocatorLog{ Deallocate(sizeofString("world")), }); spy.clearLog(); var.remove(0); REQUIRE(var.as() == "[]"); REQUIRE(spy.log() == AllocatorLog{ Deallocate(sizeofString("hello")), }); } SECTION("release strings in nested array") { doc[0][0] = "hello"_s; JsonVariant var = doc.as(); REQUIRE(var.as() == "[[\"hello\"]]"); spy.clearLog(); var.remove(0); REQUIRE(var.as() == "[]"); REQUIRE(spy.log() == AllocatorLog{ Deallocate(sizeofString("hello")), }); } } TEST_CASE("JsonVariant::remove(const char *)") { JsonDocument doc; JsonVariant var = doc.to(); var["a"] = 1; var["b"] = 2; var.remove("a"); REQUIRE(var.as() == "{\"b\":2}"); } TEST_CASE("JsonVariant::remove(std::string)") { JsonDocument doc; JsonVariant var = doc.to(); var["a"] = 1; var["b"] = 2; var.remove("b"_s); REQUIRE(var.as() == "{\"a\":1}"); } TEST_CASE("JsonVariant::remove(JsonVariant) from object") { JsonDocument doc; JsonVariant var = doc.to(); var["a"] = "a"; var["b"] = 2; var["c"] = "b"; var.remove(var["c"]); REQUIRE(var.as() == "{\"a\":\"a\",\"c\":\"b\"}"); } TEST_CASE("JsonVariant::remove(JsonVariant) from array") { JsonDocument doc; JsonVariant var = doc.to(); var[0] = 3; var[1] = 2; var[2] = 1; var.remove(var[2]); var.remove(var[3]); // noop REQUIRE(var.as() == "[3,1]"); }