diff --git a/extras/tests/CMakeLists.txt b/extras/tests/CMakeLists.txt index b4d86ac1..03485640 100644 --- a/extras/tests/CMakeLists.txt +++ b/extras/tests/CMakeLists.txt @@ -16,6 +16,7 @@ add_subdirectory(Deprecated) add_subdirectory(FailingBuilds) add_subdirectory(IntegrationTests) add_subdirectory(JsonArray) +add_subdirectory(JsonArrayConst) add_subdirectory(JsonDeserializer) add_subdirectory(JsonDocument) add_subdirectory(JsonObject) diff --git a/extras/tests/JsonArray/equals.cpp b/extras/tests/JsonArray/equals.cpp index 7bbaa13f..4f5af465 100644 --- a/extras/tests/JsonArray/equals.cpp +++ b/extras/tests/JsonArray/equals.cpp @@ -8,18 +8,15 @@ TEST_CASE("JsonArray::operator==()") { JsonDocument doc1; JsonArray array1 = doc1.to(); - JsonArrayConst array1c = array1; JsonDocument doc2; JsonArray array2 = doc2.to(); - JsonArrayConst array2c = array2; SECTION("should return false when arrays differ") { array1.add("coucou"); array2.add(1); REQUIRE_FALSE(array1 == array2); - REQUIRE_FALSE(array1c == array2c); } SECTION("should return false when LHS has more elements") { @@ -28,7 +25,6 @@ TEST_CASE("JsonArray::operator==()") { array2.add(1); REQUIRE_FALSE(array1 == array2); - REQUIRE_FALSE(array1c == array2c); } SECTION("should return false when RHS has more elements") { @@ -37,7 +33,6 @@ TEST_CASE("JsonArray::operator==()") { array2.add(2); REQUIRE_FALSE(array1 == array2); - REQUIRE_FALSE(array1c == array2c); } SECTION("should return true when arrays equal") { @@ -45,7 +40,6 @@ TEST_CASE("JsonArray::operator==()") { array2.add("coucou"); REQUIRE(array1 == array2); - REQUIRE(array1c == array2c); } SECTION("should return false when RHS is null") { diff --git a/extras/tests/JsonArray/isNull.cpp b/extras/tests/JsonArray/isNull.cpp index 5df073d4..dc22f4ba 100644 --- a/extras/tests/JsonArray/isNull.cpp +++ b/extras/tests/JsonArray/isNull.cpp @@ -18,19 +18,6 @@ TEST_CASE("JsonArray::isNull()") { } } -TEST_CASE("JsonArrayConst::isNull()") { - SECTION("returns true") { - JsonArrayConst arr; - REQUIRE(arr.isNull() == true); - } - - SECTION("returns false") { - JsonDocument doc; - JsonArrayConst arr = doc.to(); - REQUIRE(arr.isNull() == false); - } -} - TEST_CASE("JsonArray::operator bool()") { SECTION("returns false") { JsonArray arr; @@ -43,16 +30,3 @@ TEST_CASE("JsonArray::operator bool()") { REQUIRE(static_cast(arr) == true); } } - -TEST_CASE("JsonArrayConst::operator bool()") { - SECTION("returns false") { - JsonArrayConst arr; - REQUIRE(static_cast(arr) == false); - } - - SECTION("returns true") { - JsonDocument doc; - JsonArrayConst arr = doc.to(); - REQUIRE(static_cast(arr) == true); - } -} diff --git a/extras/tests/JsonArray/iterator.cpp b/extras/tests/JsonArray/iterator.cpp index 5300a23b..81589752 100644 --- a/extras/tests/JsonArray/iterator.cpp +++ b/extras/tests/JsonArray/iterator.cpp @@ -5,31 +5,25 @@ #include #include -template -static void run_iterator_test() { - JsonDocument doc; - JsonArray tmp = doc.to(); - tmp.add(12); - tmp.add(34); - - TArray array = tmp; - typename TArray::iterator it = array.begin(); - typename TArray::iterator end = array.end(); - - REQUIRE(end != it); - REQUIRE(12 == it->template as()); - REQUIRE(12 == static_cast(*it)); - ++it; - REQUIRE(end != it); - REQUIRE(34 == it->template as()); - REQUIRE(34 == static_cast(*it)); - ++it; - REQUIRE(end == it); -} - TEST_CASE("JsonArray::begin()/end()") { SECTION("Non null JsonArray") { - run_iterator_test(); + JsonDocument doc; + JsonArray array = doc.to(); + array.add(12); + array.add(34); + + auto it = array.begin(); + auto end = array.end(); + + REQUIRE(end != it); + REQUIRE(12 == it->as()); + REQUIRE(12 == static_cast(*it)); + ++it; + REQUIRE(end != it); + REQUIRE(34 == it->as()); + REQUIRE(34 == static_cast(*it)); + ++it; + REQUIRE(end == it); } SECTION("Null JsonArray") { @@ -38,15 +32,3 @@ TEST_CASE("JsonArray::begin()/end()") { REQUIRE(array.begin() == array.end()); } } - -TEST_CASE("JsonArrayConst::begin()/end()") { - SECTION("Non null JsonArrayConst") { - run_iterator_test(); - } - - SECTION("Null JsonArrayConst") { - JsonArrayConst array; - - REQUIRE(array.begin() == array.end()); - } -} diff --git a/extras/tests/JsonArray/subscript.cpp b/extras/tests/JsonArray/subscript.cpp index 91ab0da7..fde76177 100644 --- a/extras/tests/JsonArray/subscript.cpp +++ b/extras/tests/JsonArray/subscript.cpp @@ -8,8 +8,6 @@ #include "Allocators.hpp" -using ArduinoJson::detail::sizeofArray; - TEST_CASE("JsonArray::operator[]") { SpyingAllocator spy; JsonDocument doc(&spy); @@ -167,18 +165,3 @@ TEST_CASE("JsonArray::operator[]") { } #endif } - -TEST_CASE("JsonArrayConst::operator[]") { - JsonDocument doc; - JsonArray array = doc.to(); - array.add(0); - - SECTION("int") { - array[0] = 123; - JsonArrayConst carr = array; - - REQUIRE(123 == carr[0].as()); - REQUIRE(true == carr[0].is()); - REQUIRE(false == carr[0].is()); - } -} diff --git a/extras/tests/JsonArrayConst/CMakeLists.txt b/extras/tests/JsonArrayConst/CMakeLists.txt new file mode 100644 index 00000000..8608a895 --- /dev/null +++ b/extras/tests/JsonArrayConst/CMakeLists.txt @@ -0,0 +1,19 @@ +# ArduinoJson - https://arduinojson.org +# Copyright © 2014-2024, Benoit BLANCHON +# MIT License + +add_executable(JsonArrayConstTests + equals.cpp + isNull.cpp + iterator.cpp + nesting.cpp + size.cpp + subscript.cpp +) + +add_test(JsonArrayConst JsonArrayConstTests) + +set_tests_properties(JsonArrayConst + PROPERTIES + LABELS "Catch" +) diff --git a/extras/tests/JsonArrayConst/equals.cpp b/extras/tests/JsonArrayConst/equals.cpp new file mode 100644 index 00000000..ba60d385 --- /dev/null +++ b/extras/tests/JsonArrayConst/equals.cpp @@ -0,0 +1,63 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonArrayConst::operator==()") { + JsonDocument doc1; + JsonArrayConst array1 = doc1.to(); + + JsonDocument doc2; + JsonArrayConst array2 = doc2.to(); + + SECTION("should return false when arrays differ") { + doc1.add("coucou"); + doc2.add(1); + + REQUIRE_FALSE(array1 == array2); + } + + SECTION("should return false when LHS has more elements") { + doc1.add(1); + doc1.add(2); + doc2.add(1); + + REQUIRE_FALSE(array1 == array2); + } + + SECTION("should return false when RHS has more elements") { + doc1.add(1); + doc2.add(1); + doc2.add(2); + + REQUIRE_FALSE(array1 == array2); + } + + SECTION("should return true when arrays equal") { + doc1.add("coucou"); + doc2.add("coucou"); + + REQUIRE(array1 == array2); + } + + SECTION("should return false when RHS is null") { + JsonArrayConst null; + + REQUIRE_FALSE(array1 == null); + } + + SECTION("should return false when LHS is null") { + JsonArrayConst null; + + REQUIRE_FALSE(null == array1); + } + + SECTION("should return true when both are null") { + JsonArrayConst null1; + JsonArrayConst null2; + + REQUIRE(null1 == null2); + } +} diff --git a/extras/tests/JsonArrayConst/isNull.cpp b/extras/tests/JsonArrayConst/isNull.cpp new file mode 100644 index 00000000..26b64ae5 --- /dev/null +++ b/extras/tests/JsonArrayConst/isNull.cpp @@ -0,0 +1,32 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonArrayConst::isNull()") { + SECTION("returns true") { + JsonArrayConst arr; + REQUIRE(arr.isNull() == true); + } + + SECTION("returns false") { + JsonDocument doc; + JsonArrayConst arr = doc.to(); + REQUIRE(arr.isNull() == false); + } +} + +TEST_CASE("JsonArrayConst::operator bool()") { + SECTION("returns false") { + JsonArrayConst arr; + REQUIRE(static_cast(arr) == false); + } + + SECTION("returns true") { + JsonDocument doc; + JsonArrayConst arr = doc.to(); + REQUIRE(static_cast(arr) == true); + } +} diff --git a/extras/tests/JsonArrayConst/iterator.cpp b/extras/tests/JsonArrayConst/iterator.cpp new file mode 100644 index 00000000..5eeb56aa --- /dev/null +++ b/extras/tests/JsonArrayConst/iterator.cpp @@ -0,0 +1,34 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonArrayConst::begin()/end()") { + SECTION("Non null JsonArrayConst") { + JsonDocument doc; + JsonArrayConst array = doc.to(); + doc.add(12); + doc.add(34); + + auto it = array.begin(); + auto end = array.end(); + + REQUIRE(end != it); + REQUIRE(12 == it->as()); + REQUIRE(12 == static_cast(*it)); + ++it; + REQUIRE(end != it); + REQUIRE(34 == it->as()); + REQUIRE(34 == static_cast(*it)); + ++it; + REQUIRE(end == it); + } + + SECTION("Null JsonArrayConst") { + JsonArrayConst array; + + REQUIRE(array.begin() == array.end()); + } +} diff --git a/extras/tests/JsonArrayConst/nesting.cpp b/extras/tests/JsonArrayConst/nesting.cpp new file mode 100644 index 00000000..860754ac --- /dev/null +++ b/extras/tests/JsonArrayConst/nesting.cpp @@ -0,0 +1,35 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonArrayConst::nesting()") { + JsonDocument doc; + JsonArrayConst arr = doc.to(); + + SECTION("return 0 if unbound") { + JsonArrayConst unbound; + REQUIRE(unbound.nesting() == 0); + } + + SECTION("returns 1 for empty array") { + REQUIRE(arr.nesting() == 1); + } + + SECTION("returns 1 for flat array") { + doc.add("hello"); + REQUIRE(arr.nesting() == 1); + } + + SECTION("returns 2 with nested array") { + doc.add(); + REQUIRE(arr.nesting() == 2); + } + + SECTION("returns 2 with nested object") { + doc.add(); + REQUIRE(arr.nesting() == 2); + } +} diff --git a/extras/tests/JsonArrayConst/size.cpp b/extras/tests/JsonArrayConst/size.cpp new file mode 100644 index 00000000..a59551ae --- /dev/null +++ b/extras/tests/JsonArrayConst/size.cpp @@ -0,0 +1,27 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include + +TEST_CASE("JsonArrayConst::size()") { + JsonDocument doc; + JsonArrayConst array = doc.to(); + + SECTION("returns 0 if unbound") { + JsonArrayConst unbound; + REQUIRE(0U == unbound.size()); + } + + SECTION("returns 0 is empty") { + REQUIRE(0U == array.size()); + } + + SECTION("return number of elements") { + doc.add("hello"); + doc.add("world"); + + REQUIRE(2U == array.size()); + } +} diff --git a/extras/tests/JsonArrayConst/subscript.cpp b/extras/tests/JsonArrayConst/subscript.cpp new file mode 100644 index 00000000..4525287d --- /dev/null +++ b/extras/tests/JsonArrayConst/subscript.cpp @@ -0,0 +1,20 @@ +// ArduinoJson - https://arduinojson.org +// Copyright © 2014-2024, Benoit BLANCHON +// MIT License + +#include +#include +#include + +TEST_CASE("JsonArrayConst::operator[]") { + JsonDocument doc; + JsonArrayConst arr = doc.to(); + doc.add(1); + doc.add(2); + doc.add(3); + + REQUIRE(1 == arr[0].as()); + REQUIRE(2 == arr[1].as()); + REQUIRE(3 == arr[2].as()); + REQUIRE(0 == arr[3].as()); +} diff --git a/src/ArduinoJson/Array/JsonArrayConst.hpp b/src/ArduinoJson/Array/JsonArrayConst.hpp index e988e862..526975a2 100644 --- a/src/ArduinoJson/Array/JsonArrayConst.hpp +++ b/src/ArduinoJson/Array/JsonArrayConst.hpp @@ -51,7 +51,7 @@ class JsonArrayConst : public detail::VariantOperators { } operator JsonVariantConst() const { - return JsonVariantConst(collectionToVariant(data_), resources_); + return JsonVariantConst(getData(), resources_); } // Returns true if the reference is unbound. @@ -69,7 +69,7 @@ class JsonArrayConst : public detail::VariantOperators { // Returns the depth (nesting level) of the array. // https://arduinojson.org/v7/api/jsonarrayconst/nesting/ FORCE_INLINE size_t nesting() const { - return detail::VariantData::nesting(collectionToVariant(data_), resources_); + return detail::VariantData::nesting(getData(), resources_); } // Returns the number of elements in the array.