From b02d979ceb3ad26a39d03f989981a8e910aa0abb Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Mon, 14 Mar 2022 19:40:05 +0100 Subject: [PATCH] Test null --- extras/tests/JsonVariant/link.cpp | 24 ++++++++++++++++++++++++ src/ArduinoJson/Variant/VariantData.hpp | 5 +++-- src/ArduinoJson/Variant/VariantImpl.hpp | 10 +++++++--- 3 files changed, 34 insertions(+), 5 deletions(-) diff --git a/extras/tests/JsonVariant/link.cpp b/extras/tests/JsonVariant/link.cpp index 6c6ebdb3..28ef2ecd 100644 --- a/extras/tests/JsonVariant/link.cpp +++ b/extras/tests/JsonVariant/link.cpp @@ -50,4 +50,28 @@ TEST_CASE("JsonVariant::link()") { CHECK(variant.as() == "{\"hello\":\"WORLD!\"}"); } + + SECTION("target is unbound") { + JsonVariant unbound; + variant["hello"] = "world"; + + variant.link(unbound); + + CHECK(variant.isUnbound() == false); + CHECK(variant.isNull() == true); + CHECK(variant.memoryUsage() == 0); + CHECK(variant.size() == 0); + } + + SECTION("variant is unbound") { + JsonVariant unbound; + doc2["hello"] = "world"; + + unbound.link(doc2); + + CHECK(unbound.isUnbound() == true); + CHECK(unbound.isNull() == true); + CHECK(unbound.memoryUsage() == 0); + CHECK(unbound.size() == 0); + } } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index 7bbe746f..25652f0a 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -244,9 +244,10 @@ class VariantData { setType(VALUE_IS_NULL); } - void setPointer(const VariantData *value) { + void setPointer(const VariantData *p) { + ARDUINOJSON_ASSERT(p); setType(VALUE_IS_POINTER); - _content.asPointer = value; + _content.asPointer = p; } void setString(String s) { diff --git a/src/ArduinoJson/Variant/VariantImpl.hpp b/src/ArduinoJson/Variant/VariantImpl.hpp index 918f07a5..6b4a3492 100644 --- a/src/ArduinoJson/Variant/VariantImpl.hpp +++ b/src/ArduinoJson/Variant/VariantImpl.hpp @@ -189,9 +189,13 @@ bool CopyStringStoragePolicy::store(TAdaptedString str, MemoryPool *pool, return copy != 0; } -inline void VariantRef::link(VariantConstRef var) { - if (_data) - _data->setPointer(var._data); +inline void VariantRef::link(VariantConstRef target) { + if (!_data) + return; + if (target._data) + _data->setPointer(target._data); + else + _data->setNull(); } } // namespace ARDUINOJSON_NAMESPACE