diff --git a/extras/tests/JsonVariant/as.cpp b/extras/tests/JsonVariant/as.cpp index f6a735f1..57d0d908 100644 --- a/extras/tests/JsonVariant/as.cpp +++ b/extras/tests/JsonVariant/as.cpp @@ -323,4 +323,12 @@ TEST_CASE("JsonVariant::as()") { CHECK(o.isNull() == true); } } + + SECTION("linked int") { + StaticJsonDocument<128> doc2; + doc2.set(42); + variant.link(doc2); + + CHECK(variant.as() == 42); + } } diff --git a/extras/tests/JsonVariant/is.cpp b/extras/tests/JsonVariant/is.cpp index 8c793737..c1fd4255 100644 --- a/extras/tests/JsonVariant/is.cpp +++ b/extras/tests/JsonVariant/is.cpp @@ -199,6 +199,24 @@ TEST_CASE("JsonVariant::is()") { CHECK(variant.is() == true); CHECK(variant.is() == true); } + + SECTION("linked int") { + StaticJsonDocument<1024> doc2; + doc2.set(42); + variant.link(doc2); + + CHECK(variant.is() == false); + CHECK(variant.is() == true); + CHECK(variant.is() == false); + CHECK(variant.is() == true); + CHECK(variant.is() == false); + CHECK(variant.is() == false); + CHECK(variant.is() == true); + CHECK(variant.is() == false); + CHECK(variant.is() == false); + CHECK(variant.is() == false); + CHECK(variant.is() == true); + } } TEST_CASE("JsonVariantConst::is()") { @@ -390,4 +408,22 @@ TEST_CASE("JsonVariantConst::is()") { CHECK(cvariant.is() == false); CHECK(cvariant.is() == false); } + + SECTION("linked int") { + StaticJsonDocument<1024> doc2; + doc2.set(42); + variant.link(doc2); + + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == true); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == false); + CHECK(cvariant.is() == true); + } } diff --git a/extras/tests/JsonVariant/or.cpp b/extras/tests/JsonVariant/or.cpp index 7d1c190b..41bd2f79 100644 --- a/extras/tests/JsonVariant/or.cpp +++ b/extras/tests/JsonVariant/or.cpp @@ -156,4 +156,12 @@ TEST_CASE("JsonVariant::operator|()") { int result = variant | 42; REQUIRE(result == 42); } + + SECTION("linked int | int") { + StaticJsonDocument<128> doc2; + doc2.set(42); + variant.link(doc2); + int result = variant | 666; + CHECK(result == 42); + } } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index da7bf835..85adabd2 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -134,6 +134,8 @@ class VariantData { template bool isInteger() const { + if (isPointer()) + return _content.asPointer->isInteger(); switch (type()) { case VALUE_IS_UNSIGNED_INTEGER: return canConvertNumber(_content.asUnsignedInteger); diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index dae07c53..57fabe37 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -17,6 +17,8 @@ namespace ARDUINOJSON_NAMESPACE { template inline T VariantData::asIntegral() const { + if (isPointer()) + return _content.asPointer->asIntegral(); switch (type()) { case VALUE_IS_BOOLEAN: return _content.asBoolean;