Skip to content

Commit

Permalink
Add JsonVariant::link() (resolves #1343)
Browse files Browse the repository at this point in the history
  • Loading branch information
bblanchon committed Apr 27, 2022
1 parent 5577d18 commit 3d6c328
Show file tree
Hide file tree
Showing 35 changed files with 649 additions and 51 deletions.
1 change: 1 addition & 0 deletions CHANGELOG.md
Expand Up @@ -4,6 +4,7 @@ ArduinoJson: change log
HEAD
----

* Add `JsonVariant::link()` (issue #1343)
* Fix `9.22337e+18 is outside the range of representable values of type 'long'`

v6.19.4 (2022-04-05)
Expand Down
8 changes: 8 additions & 0 deletions extras/tests/Cpp11/nullptr.cpp
Expand Up @@ -43,5 +43,13 @@ TEST_CASE("nullptr") {

variant.clear();
REQUIRE(variant.is<std::nullptr_t>() == true);

StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
variant.link(doc2);
REQUIRE(variant.is<std::nullptr_t>() == false);

doc2.clear();
REQUIRE(variant.is<std::nullptr_t>() == true);
}
}
8 changes: 8 additions & 0 deletions extras/tests/JsonDocument/ElementProxy.cpp
Expand Up @@ -245,3 +245,11 @@ TEST_CASE("ElementProxy cast to JsonVariant") {

CHECK(doc.as<std::string>() == "[\"toto\"]");
}

TEST_CASE("ElementProxy::link()") {
StaticJsonDocument<1024> doc1, doc2;
doc1[0].link(doc2);
doc2["hello"] = "world";

CHECK(doc1.as<std::string>() == "[{\"hello\":\"world\"}]");
}
7 changes: 7 additions & 0 deletions extras/tests/JsonDocument/MemberProxy.cpp
Expand Up @@ -318,3 +318,10 @@ TEST_CASE("MemberProxy::createNestedObject(key)") {
CHECK(doc["status"]["weather"]["temp"] == 42);
}

TEST_CASE("MemberProxy::link()") {
StaticJsonDocument<1024> doc1, doc2;
doc1["obj"].link(doc2);
doc2["hello"] = "world";

CHECK(doc1.as<std::string>() == "{\"obj\":{\"hello\":\"world\"}}");
}
17 changes: 17 additions & 0 deletions extras/tests/JsonDocument/size.cpp
Expand Up @@ -25,4 +25,21 @@ TEST_CASE("JsonDocument::size()") {

REQUIRE(doc.size() == 2);
}

SECTION("linked array") {
StaticJsonDocument<128> doc2;
doc2.add(1);
doc2.add(2);
doc.as<JsonVariant>().link(doc2);

REQUIRE(doc.size() == 2);
}

SECTION("linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
doc.as<JsonVariant>().link(doc2);

REQUIRE(doc.size() == 1);
}
}
1 change: 1 addition & 0 deletions extras/tests/JsonVariant/CMakeLists.txt
Expand Up @@ -13,6 +13,7 @@ add_executable(JsonVariantTests
createNested.cpp
is.cpp
isnull.cpp
link.cpp
memoryUsage.cpp
misc.cpp
nesting.cpp
Expand Down
10 changes: 10 additions & 0 deletions extras/tests/JsonVariant/add.cpp
Expand Up @@ -43,4 +43,14 @@ TEST_CASE("JsonVariant::add()") {

REQUIRE(var.as<std::string>() == "{\"val\":123}");
}

SECTION("add to linked array") {
StaticJsonDocument<1024> doc2;
doc2.add(42);
var.link(doc2);

var.add(666); // no-op

CHECK(var.as<std::string>() == "[42]");
}
}
93 changes: 93 additions & 0 deletions extras/tests/JsonVariant/as.cpp
Expand Up @@ -267,4 +267,97 @@ TEST_CASE("JsonVariant::as()") {

REQUIRE(variant.as<MY_ENUM>() == ONE);
}

SECTION("linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
variant.link(doc2);

SECTION("as<std::string>()") {
CHECK(variant.as<std::string>() == "{\"hello\":\"world\"}");
}

SECTION("as<JsonArray>()") {
JsonArray a = variant.as<JsonArray>();
CHECK(a.isNull() == true);
}

SECTION("as<JsonObject>()") {
JsonObject o = variant.as<JsonObject>();
CHECK(o.isNull() == true);
}

SECTION("as<JsonObjectConst>()") {
JsonObjectConst o = variant.as<JsonObjectConst>();
CHECK(o.isNull() == false);
CHECK(o.size() == 1);
CHECK(o["hello"] == "world");
}
}

SECTION("linked array") {
StaticJsonDocument<128> doc2;
doc2.add("hello");
doc2.add("world");
variant.link(doc2);

SECTION("as<std::string>()") {
CHECK(variant.as<std::string>() == "[\"hello\",\"world\"]");
}

SECTION("as<JsonArray>()") {
JsonArray a = variant.as<JsonArray>();
CHECK(a.isNull() == true);
}

SECTION("as<JsonArrayConst>()") {
JsonArrayConst a = variant.as<JsonArrayConst>();
CHECK(a.isNull() == false);
CHECK(a.size() == 2);
CHECK(a[0] == "hello");
CHECK(a[1] == "world");
}

SECTION("as<JsonObject>()") {
JsonObject o = variant.as<JsonObject>();
CHECK(o.isNull() == true);
}
}

SECTION("linked int") {
StaticJsonDocument<128> doc2;
doc2.set(42);
variant.link(doc2);

CHECK(variant.as<int>() == 42);
CHECK(variant.as<double>() == 42.0);
}

SECTION("linked double") {
StaticJsonDocument<128> doc2;
doc2.set(42.0);
variant.link(doc2);

CHECK(variant.as<int>() == 42);
CHECK(variant.as<double>() == 42.0);
}

SECTION("linked string") {
StaticJsonDocument<128> doc2;
doc2.set("hello");
variant.link(doc2);

CHECK(variant.as<std::string>() == "hello");
}

SECTION("linked bool") {
StaticJsonDocument<128> doc2;
variant.link(doc2);

doc2.set(true);
CHECK(variant.as<bool>() == true);

doc2.set(false);
CHECK(variant.as<bool>() == false);
}
}
11 changes: 11 additions & 0 deletions extras/tests/JsonVariant/clear.cpp
Expand Up @@ -23,4 +23,15 @@ TEST_CASE("JsonVariant::clear()") {

REQUIRE(var.isNull() == true);
}

SECTION("doesn't alter linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
var.link(doc2);

var.clear();

CHECK(var.isNull() == true);
CHECK(doc2.as<std::string>() == "{\"hello\":\"world\"}");
}
}
29 changes: 29 additions & 0 deletions extras/tests/JsonVariant/compare.cpp
Expand Up @@ -34,6 +34,20 @@ TEST_CASE("Compare JsonVariant with value") {
CHECK_FALSE(a < b);
CHECK_FALSE(a > b);
}

SECTION("linked 42 vs 42") {
StaticJsonDocument<128> doc2;
doc2.set(42);
a.link(doc2);
int b = 42;

CHECK(a == b);
CHECK(a <= b);
CHECK(a >= b);
CHECK_FALSE(a != b);
CHECK_FALSE(a < b);
CHECK_FALSE(a > b);
}
}

TEST_CASE("Compare JsonVariant with JsonVariant") {
Expand Down Expand Up @@ -313,4 +327,19 @@ TEST_CASE("Compare JsonVariant with JsonVariant") {
CHECK_FALSE(a > b);
CHECK_FALSE(a >= b);
}

SECTION("linked 42 vs link 42") {
StaticJsonDocument<128> doc2, doc3;
doc2.set(42);
doc3.set(42);
a.link(doc2);
b.link(doc3);

CHECK(a == b);
CHECK(a <= b);
CHECK(a >= b);
CHECK_FALSE(a != b);
CHECK_FALSE(a < b);
CHECK_FALSE(a > b);
}
}
13 changes: 11 additions & 2 deletions extras/tests/JsonVariant/containsKey.cpp
Expand Up @@ -12,19 +12,28 @@ TEST_CASE("JsonVariant::containsKey()") {
DynamicJsonDocument doc(4096);
JsonVariant var = doc.to<JsonVariant>();

SECTION("containsKey(const char*) returns true") {
SECTION("containsKey(const char*)") {
var["hello"] = "world";

REQUIRE(var.containsKey("hello") == true);
REQUIRE(var.containsKey("world") == false);
}

SECTION("containsKey(std::string) returns true") {
SECTION("containsKey(std::string)") {
var["hello"] = "world";

REQUIRE(var.containsKey(std::string("hello")) == true);
REQUIRE(var.containsKey(std::string("world")) == false);
}

SECTION("linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
var.link(doc2);

CHECK(var.containsKey("hello") == true);
CHECK(var.containsKey("world") == false);
}
}

TEST_CASE("JsonVariantConst::containsKey()") {
Expand Down
10 changes: 10 additions & 0 deletions extras/tests/JsonVariant/copy.cpp
Expand Up @@ -84,6 +84,16 @@ TEST_CASE("JsonVariant::set(JsonVariant)") {
REQUIRE(doc2.memoryUsage() == JSON_STRING_SIZE(7));
}

SECTION("stores linked object by pointer") {
StaticJsonDocument<128> doc3;
doc3["hello"] = "world";
var1.link(doc3);
var2.set(var1);

REQUIRE(doc1.memoryUsage() == 0);
REQUIRE(doc2.memoryUsage() == 0);
}

SECTION("destination is unbound") {
JsonVariant unboundVariant;

Expand Down
44 changes: 44 additions & 0 deletions extras/tests/JsonVariant/createNested.cpp
Expand Up @@ -18,6 +18,17 @@ TEST_CASE("JsonVariant::createNestedObject()") {
REQUIRE(variant[0]["value"] == 42);
REQUIRE(obj.isNull() == false);
}

SECTION("does nothing on linked array") {
StaticJsonDocument<128> doc2;
doc2[0] = 42;
variant.link(doc2);

variant.createNestedObject();

CHECK(variant.size() == 1);
CHECK(variant[0] == 42);
}
}

TEST_CASE("JsonVariant::createNestedArray()") {
Expand All @@ -30,6 +41,17 @@ TEST_CASE("JsonVariant::createNestedArray()") {
REQUIRE(variant.is<JsonArray>() == true);
REQUIRE(arr.isNull() == false);
}

SECTION("does nothing on linked array") {
StaticJsonDocument<128> doc2;
doc2[0] = 42;
variant.link(doc2);

variant.createNestedArray();

CHECK(variant.size() == 1);
CHECK(variant[0] == 42);
}
}

TEST_CASE("JsonVariant::createNestedObject(key)") {
Expand All @@ -43,6 +65,17 @@ TEST_CASE("JsonVariant::createNestedObject(key)") {
REQUIRE(variant.is<JsonObject>() == true);
REQUIRE(variant["weather"]["temp"] == 42);
}

SECTION("does nothing on linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
variant.link(doc2);

variant.createNestedObject("weather");

CHECK(variant.size() == 1);
CHECK(variant["hello"] == "world");
}
}

TEST_CASE("JsonVariant::createNestedArray(key)") {
Expand All @@ -55,4 +88,15 @@ TEST_CASE("JsonVariant::createNestedArray(key)") {
REQUIRE(variant.is<JsonObject>() == true);
REQUIRE(arr.isNull() == false);
}

SECTION("does nothing on linked object") {
StaticJsonDocument<128> doc2;
doc2["hello"] = "world";
variant.link(doc2);

variant.createNestedArray("items");

CHECK(variant.size() == 1);
CHECK(variant["hello"] == "world");
}
}

0 comments on commit 3d6c328

Please sign in to comment.