From e80c604843d9f49fca27e9fea14d3d0c5ceffe86 Mon Sep 17 00:00:00 2001 From: Benoit Blanchon Date: Thu, 10 Mar 2022 19:00:24 +0100 Subject: [PATCH] Test array subscript --- extras/tests/JsonVariant/subscript.cpp | 33 ++++++++++++++++++++++--- src/ArduinoJson/Variant/VariantData.hpp | 12 ++++----- 2 files changed, 36 insertions(+), 9 deletions(-) diff --git a/extras/tests/JsonVariant/subscript.cpp b/extras/tests/JsonVariant/subscript.cpp index 0b83d6aa..a1bba08c 100644 --- a/extras/tests/JsonVariant/subscript.cpp +++ b/extras/tests/JsonVariant/subscript.cpp @@ -131,7 +131,7 @@ TEST_CASE("JsonVariant::operator[]") { #endif SECTION("get value from linked object") { - StaticJsonDocument<1024> doc1, doc2; + StaticJsonDocument<1024> doc2; doc2["hello"] = "world"; var.link(doc2); @@ -139,7 +139,7 @@ TEST_CASE("JsonVariant::operator[]") { } SECTION("set value to linked object") { - StaticJsonDocument<1024> doc1, doc2; + StaticJsonDocument<1024> doc2; doc2["hello"] = "world"; var.link(doc2); @@ -148,6 +148,25 @@ TEST_CASE("JsonVariant::operator[]") { CHECK(doc.as() == "{\"hello\":\"world\"}"); CHECK(doc2.as() == "{\"hello\":\"world\"}"); } + + SECTION("get value from linked array") { + StaticJsonDocument<1024> doc2; + doc2.add(42); + var.link(doc2); + + CHECK(var[0].as() == 42); + } + + SECTION("set value to linked array") { + StaticJsonDocument<1024> doc2; + doc2.add(42); + var.link(doc2); + + var[0] = 666; // no-op + + CHECK(doc.as() == "[42]"); + CHECK(doc2.as() == "[42]"); + } } TEST_CASE("JsonVariantConst::operator[]") { @@ -222,10 +241,18 @@ TEST_CASE("JsonVariantConst::operator[]") { } SECTION("get value from linked object") { - StaticJsonDocument<1024> doc1, doc2; + StaticJsonDocument<1024> doc2; doc2["hello"] = "world"; var.link(doc2); CHECK(cvar["hello"].as() == "world"); } + + SECTION("get value from linked array") { + StaticJsonDocument<1024> doc2; + doc2.add(42); + var.link(doc2); + + CHECK(cvar[0].as() == 42); + } } diff --git a/src/ArduinoJson/Variant/VariantData.hpp b/src/ArduinoJson/Variant/VariantData.hpp index e163e279..4a3f1299 100644 --- a/src/ArduinoJson/Variant/VariantData.hpp +++ b/src/ArduinoJson/Variant/VariantData.hpp @@ -88,13 +88,12 @@ class VariantData { bool asBoolean() const; CollectionData *asArray() { - return isArray() ? &_content.asCollection : 0; + return isArrayStrict() ? &_content.asCollection : 0; } const CollectionData *asArray() const { - // TODO - // if (isPointer()) - // return _content.asPointer->asArray(); + if (isPointer()) + return _content.asPointer->asArray(); return const_cast(this)->asArray(); } @@ -302,13 +301,14 @@ class VariantData { } VariantData *getElement(size_t index) const { - return isArray() ? _content.asCollection.getElement(index) : 0; + const CollectionData *col = asArray(); + return col ? col->getElement(index) : 0; } VariantData *getOrAddElement(size_t index, MemoryPool *pool) { if (isNull()) toArray(); - if (!isArray()) + if (!isArrayStrict()) return 0; return _content.asCollection.getOrAddElement(index, pool); }