Disabled drum menus when drums not enabled. Replaced all strcpy(),strncpy(),strcat(),strncat() against strlcpy()/strlcat.dev
parent
70f5c12484
commit
a0d3fee52f
Before Width: | Height: | Size: 32 KiB |
@ -0,0 +1,72 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h> |
||||||
|
#include <stdint.h> |
||||||
|
#include <catch.hpp> |
||||||
|
|
||||||
|
#include <string> |
||||||
|
#include <vector> |
||||||
|
|
||||||
|
namespace ARDUINOJSON_NAMESPACE { |
||||||
|
template <typename T> |
||||||
|
struct Converter<std::vector<T> > { |
||||||
|
static void toJson(const std::vector<T>& src, JsonVariant dst) { |
||||||
|
JsonArray array = dst.to<JsonArray>(); |
||||||
|
for (T item : src) |
||||||
|
array.add(item); |
||||||
|
} |
||||||
|
|
||||||
|
static std::vector<T> fromJson(JsonVariantConst src) { |
||||||
|
std::vector<T> dst; |
||||||
|
for (T item : src.as<JsonArrayConst>()) |
||||||
|
dst.push_back(item); |
||||||
|
return dst; |
||||||
|
} |
||||||
|
|
||||||
|
static bool checkJson(JsonVariantConst src) { |
||||||
|
JsonArrayConst array = src; |
||||||
|
bool result = array; |
||||||
|
for (JsonVariantConst item : array) { |
||||||
|
if (!result) |
||||||
|
break; |
||||||
|
result = item.is<T>(); |
||||||
|
} |
||||||
|
return result; |
||||||
|
} |
||||||
|
}; |
||||||
|
} // namespace ARDUINOJSON_NAMESPACE
|
||||||
|
|
||||||
|
TEST_CASE("vector<int>") { |
||||||
|
SECTION("toJson") { |
||||||
|
std::vector<int> v = {1, 2}; |
||||||
|
|
||||||
|
StaticJsonDocument<128> doc; |
||||||
|
doc.set(v); |
||||||
|
REQUIRE(doc.as<std::string>() == "[1,2]"); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("fromJson") { |
||||||
|
StaticJsonDocument<128> doc; |
||||||
|
doc.add(1); |
||||||
|
doc.add(2); |
||||||
|
|
||||||
|
auto v = doc.as<std::vector<int> >(); |
||||||
|
REQUIRE(v.size() == 2); |
||||||
|
CHECK(v[0] == 1); |
||||||
|
CHECK(v[1] == 2); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("checkJson") { |
||||||
|
StaticJsonDocument<128> doc; |
||||||
|
CHECK(doc.is<std::vector<int> >() == false); |
||||||
|
|
||||||
|
doc.add(1); |
||||||
|
doc.add(2); |
||||||
|
CHECK(doc.is<std::vector<int> >() == true); |
||||||
|
|
||||||
|
doc.add("foo"); |
||||||
|
CHECK(doc.is<std::vector<int> >() == false); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,512 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h> |
||||||
|
#include <catch.hpp> |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArray with JsonArray") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonArray unbound; |
||||||
|
|
||||||
|
CHECK(array != unbound); |
||||||
|
CHECK_FALSE(array == unbound); |
||||||
|
CHECK_FALSE(array <= unbound); |
||||||
|
CHECK_FALSE(array >= unbound); |
||||||
|
CHECK_FALSE(array > unbound); |
||||||
|
CHECK_FALSE(array < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != array); |
||||||
|
CHECK_FALSE(unbound == array); |
||||||
|
CHECK_FALSE(unbound <= array); |
||||||
|
CHECK_FALSE(unbound >= array); |
||||||
|
CHECK_FALSE(unbound > array); |
||||||
|
CHECK_FALSE(unbound < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
|
||||||
|
CHECK(array == array); |
||||||
|
CHECK(array <= array); |
||||||
|
CHECK(array >= array); |
||||||
|
CHECK_FALSE(array != array); |
||||||
|
CHECK_FALSE(array > array); |
||||||
|
CHECK_FALSE(array < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello"); |
||||||
|
array1.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello"); |
||||||
|
array2.createNestedObject(); |
||||||
|
|
||||||
|
CHECK(array1 == array2); |
||||||
|
CHECK(array1 <= array2); |
||||||
|
CHECK(array1 >= array2); |
||||||
|
CHECK_FALSE(array1 != array2); |
||||||
|
CHECK_FALSE(array1 > array2); |
||||||
|
CHECK_FALSE(array1 < array2); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello1"); |
||||||
|
array1.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello2"); |
||||||
|
array2.createNestedObject(); |
||||||
|
|
||||||
|
CHECK(array1 != array2); |
||||||
|
CHECK_FALSE(array1 == array2); |
||||||
|
CHECK_FALSE(array1 > array2); |
||||||
|
CHECK_FALSE(array1 < array2); |
||||||
|
CHECK_FALSE(array1 <= array2); |
||||||
|
CHECK_FALSE(array1 >= array2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArray with JsonVariant") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
|
||||||
|
JsonVariant variant = array; |
||||||
|
|
||||||
|
CHECK(array == variant); |
||||||
|
CHECK(array <= variant); |
||||||
|
CHECK(array >= variant); |
||||||
|
CHECK_FALSE(array != variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
|
||||||
|
CHECK(variant == array); |
||||||
|
CHECK(variant <= array); |
||||||
|
CHECK(variant >= array); |
||||||
|
CHECK_FALSE(variant != array); |
||||||
|
CHECK_FALSE(variant > array); |
||||||
|
CHECK_FALSE(variant < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array = doc.createNestedArray(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
array.createNestedObject(); |
||||||
|
|
||||||
|
JsonVariant variant = doc.createNestedArray(); |
||||||
|
variant.add(1); |
||||||
|
variant.add("hello"); |
||||||
|
variant.createNestedObject(); |
||||||
|
|
||||||
|
CHECK(array == variant); |
||||||
|
CHECK(array <= variant); |
||||||
|
CHECK(array >= variant); |
||||||
|
CHECK_FALSE(array != variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
|
||||||
|
CHECK(variant == array); |
||||||
|
CHECK(variant <= array); |
||||||
|
CHECK(variant >= array); |
||||||
|
CHECK_FALSE(variant != array); |
||||||
|
CHECK_FALSE(variant > array); |
||||||
|
CHECK_FALSE(variant < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array = doc.createNestedArray(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello1"); |
||||||
|
array.createNestedObject(); |
||||||
|
|
||||||
|
JsonVariant variant = doc.createNestedArray(); |
||||||
|
variant.add(1); |
||||||
|
variant.add("hello2"); |
||||||
|
variant.createNestedObject(); |
||||||
|
|
||||||
|
CHECK(array != variant); |
||||||
|
CHECK_FALSE(array == variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
CHECK_FALSE(array <= variant); |
||||||
|
CHECK_FALSE(array >= variant); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArray with JsonVariantConst") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonVariantConst unbound; |
||||||
|
|
||||||
|
CHECK(array != unbound); |
||||||
|
CHECK_FALSE(array == unbound); |
||||||
|
CHECK_FALSE(array <= unbound); |
||||||
|
CHECK_FALSE(array >= unbound); |
||||||
|
CHECK_FALSE(array > unbound); |
||||||
|
CHECK_FALSE(array < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != array); |
||||||
|
CHECK_FALSE(unbound == array); |
||||||
|
CHECK_FALSE(unbound <= array); |
||||||
|
CHECK_FALSE(unbound >= array); |
||||||
|
CHECK_FALSE(unbound > array); |
||||||
|
CHECK_FALSE(unbound < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
|
||||||
|
JsonVariantConst variant = array; |
||||||
|
|
||||||
|
CHECK(array == variant); |
||||||
|
CHECK(array <= variant); |
||||||
|
CHECK(array >= variant); |
||||||
|
CHECK_FALSE(array != variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
|
||||||
|
CHECK(variant == array); |
||||||
|
CHECK(variant <= array); |
||||||
|
CHECK(variant >= array); |
||||||
|
CHECK_FALSE(variant != array); |
||||||
|
CHECK_FALSE(variant > array); |
||||||
|
CHECK_FALSE(variant < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array = doc.createNestedArray(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
array.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonVariantConst variant = array2; |
||||||
|
|
||||||
|
CHECK(array == variant); |
||||||
|
CHECK(array <= variant); |
||||||
|
CHECK(array >= variant); |
||||||
|
CHECK_FALSE(array != variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
|
||||||
|
CHECK(variant == array); |
||||||
|
CHECK(variant <= array); |
||||||
|
CHECK(variant >= array); |
||||||
|
CHECK_FALSE(variant != array); |
||||||
|
CHECK_FALSE(variant > array); |
||||||
|
CHECK_FALSE(variant < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array = doc.createNestedArray(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello1"); |
||||||
|
array.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello2"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonVariantConst variant = array2; |
||||||
|
|
||||||
|
CHECK(array != variant); |
||||||
|
CHECK_FALSE(array == variant); |
||||||
|
CHECK_FALSE(array > variant); |
||||||
|
CHECK_FALSE(array < variant); |
||||||
|
CHECK_FALSE(array <= variant); |
||||||
|
CHECK_FALSE(array >= variant); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArray with JsonArrayConst") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonArrayConst unbound; |
||||||
|
|
||||||
|
CHECK(array != unbound); |
||||||
|
CHECK_FALSE(array == unbound); |
||||||
|
CHECK_FALSE(array <= unbound); |
||||||
|
CHECK_FALSE(array >= unbound); |
||||||
|
CHECK_FALSE(array > unbound); |
||||||
|
CHECK_FALSE(array < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != array); |
||||||
|
CHECK_FALSE(unbound == array); |
||||||
|
CHECK_FALSE(unbound <= array); |
||||||
|
CHECK_FALSE(unbound >= array); |
||||||
|
CHECK_FALSE(unbound > array); |
||||||
|
CHECK_FALSE(unbound < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonArrayConst carray = array; |
||||||
|
|
||||||
|
CHECK(array == carray); |
||||||
|
CHECK(array <= carray); |
||||||
|
CHECK(array >= carray); |
||||||
|
CHECK_FALSE(array != carray); |
||||||
|
CHECK_FALSE(array > carray); |
||||||
|
CHECK_FALSE(array < carray); |
||||||
|
|
||||||
|
CHECK(carray == array); |
||||||
|
CHECK(carray <= array); |
||||||
|
CHECK(carray >= array); |
||||||
|
CHECK_FALSE(carray != array); |
||||||
|
CHECK_FALSE(carray > array); |
||||||
|
CHECK_FALSE(carray < array); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello"); |
||||||
|
array1.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonArrayConst carray2 = array2; |
||||||
|
|
||||||
|
CHECK(array1 == carray2); |
||||||
|
CHECK(array1 <= carray2); |
||||||
|
CHECK(array1 >= carray2); |
||||||
|
CHECK_FALSE(array1 != carray2); |
||||||
|
CHECK_FALSE(array1 > carray2); |
||||||
|
CHECK_FALSE(array1 < carray2); |
||||||
|
|
||||||
|
CHECK(carray2 == array1); |
||||||
|
CHECK(carray2 <= array1); |
||||||
|
CHECK(carray2 >= array1); |
||||||
|
CHECK_FALSE(carray2 != array1); |
||||||
|
CHECK_FALSE(carray2 > array1); |
||||||
|
CHECK_FALSE(carray2 < array1); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello1"); |
||||||
|
array1.createNestedObject(); |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello2"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonArrayConst carray2 = array2; |
||||||
|
|
||||||
|
CHECK(array1 != carray2); |
||||||
|
CHECK_FALSE(array1 == carray2); |
||||||
|
CHECK_FALSE(array1 > carray2); |
||||||
|
CHECK_FALSE(array1 < carray2); |
||||||
|
CHECK_FALSE(array1 <= carray2); |
||||||
|
CHECK_FALSE(array1 >= carray2); |
||||||
|
|
||||||
|
CHECK(carray2 != array1); |
||||||
|
CHECK_FALSE(carray2 == array1); |
||||||
|
CHECK_FALSE(carray2 > array1); |
||||||
|
CHECK_FALSE(carray2 < array1); |
||||||
|
CHECK_FALSE(carray2 <= array1); |
||||||
|
CHECK_FALSE(carray2 >= array1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArrayConst with JsonArrayConst") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
|
||||||
|
JsonArrayConst carray = array; |
||||||
|
JsonArrayConst unbound; |
||||||
|
|
||||||
|
CHECK(carray != unbound); |
||||||
|
CHECK_FALSE(carray == unbound); |
||||||
|
CHECK_FALSE(carray <= unbound); |
||||||
|
CHECK_FALSE(carray >= unbound); |
||||||
|
CHECK_FALSE(carray > unbound); |
||||||
|
CHECK_FALSE(carray < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != carray); |
||||||
|
CHECK_FALSE(unbound == carray); |
||||||
|
CHECK_FALSE(unbound <= carray); |
||||||
|
CHECK_FALSE(unbound >= carray); |
||||||
|
CHECK_FALSE(unbound > carray); |
||||||
|
CHECK_FALSE(unbound < carray); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonArrayConst carray = array; |
||||||
|
|
||||||
|
CHECK(carray == carray); |
||||||
|
CHECK(carray <= carray); |
||||||
|
CHECK(carray >= carray); |
||||||
|
CHECK_FALSE(carray != carray); |
||||||
|
CHECK_FALSE(carray > carray); |
||||||
|
CHECK_FALSE(carray < carray); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello"); |
||||||
|
array1.createNestedObject(); |
||||||
|
JsonArrayConst carray1 = array1; |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonArrayConst carray2 = array2; |
||||||
|
|
||||||
|
CHECK(carray1 == carray2); |
||||||
|
CHECK(carray1 <= carray2); |
||||||
|
CHECK(carray1 >= carray2); |
||||||
|
CHECK_FALSE(carray1 != carray2); |
||||||
|
CHECK_FALSE(carray1 > carray2); |
||||||
|
CHECK_FALSE(carray1 < carray2); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello1"); |
||||||
|
array1.createNestedObject(); |
||||||
|
JsonArrayConst carray1 = array1; |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello2"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonArrayConst carray2 = array2; |
||||||
|
|
||||||
|
CHECK(carray1 != carray2); |
||||||
|
CHECK_FALSE(carray1 == carray2); |
||||||
|
CHECK_FALSE(carray1 > carray2); |
||||||
|
CHECK_FALSE(carray1 < carray2); |
||||||
|
CHECK_FALSE(carray1 <= carray2); |
||||||
|
CHECK_FALSE(carray1 >= carray2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonArrayConst with JsonVariant") { |
||||||
|
StaticJsonDocument<256> doc; |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonArray array = doc.to<JsonArray>(); |
||||||
|
array.add(1); |
||||||
|
array.add("hello"); |
||||||
|
JsonArrayConst carray = array; |
||||||
|
JsonVariant variant = array; |
||||||
|
|
||||||
|
CHECK(carray == variant); |
||||||
|
CHECK(carray <= variant); |
||||||
|
CHECK(carray >= variant); |
||||||
|
CHECK_FALSE(carray != variant); |
||||||
|
CHECK_FALSE(carray > variant); |
||||||
|
CHECK_FALSE(carray < variant); |
||||||
|
|
||||||
|
CHECK(variant == carray); |
||||||
|
CHECK(variant <= carray); |
||||||
|
CHECK(variant >= carray); |
||||||
|
CHECK_FALSE(variant != carray); |
||||||
|
CHECK_FALSE(variant > carray); |
||||||
|
CHECK_FALSE(variant < carray); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello"); |
||||||
|
array1.createNestedObject(); |
||||||
|
JsonArrayConst carray1 = array1; |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonVariant variant2 = array2; |
||||||
|
|
||||||
|
CHECK(carray1 == variant2); |
||||||
|
CHECK(carray1 <= variant2); |
||||||
|
CHECK(carray1 >= variant2); |
||||||
|
CHECK_FALSE(carray1 != variant2); |
||||||
|
CHECK_FALSE(carray1 > variant2); |
||||||
|
CHECK_FALSE(carray1 < variant2); |
||||||
|
|
||||||
|
CHECK(variant2 == carray1); |
||||||
|
CHECK(variant2 <= carray1); |
||||||
|
CHECK(variant2 >= carray1); |
||||||
|
CHECK_FALSE(variant2 != carray1); |
||||||
|
CHECK_FALSE(variant2 > carray1); |
||||||
|
CHECK_FALSE(variant2 < carray1); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different array") { |
||||||
|
JsonArray array1 = doc.createNestedArray(); |
||||||
|
array1.add(1); |
||||||
|
array1.add("hello1"); |
||||||
|
array1.createNestedObject(); |
||||||
|
JsonArrayConst carray1 = array1; |
||||||
|
|
||||||
|
JsonArray array2 = doc.createNestedArray(); |
||||||
|
array2.add(1); |
||||||
|
array2.add("hello2"); |
||||||
|
array2.createNestedObject(); |
||||||
|
JsonVariant variant2 = array2; |
||||||
|
|
||||||
|
CHECK(carray1 != variant2); |
||||||
|
CHECK_FALSE(carray1 == variant2); |
||||||
|
CHECK_FALSE(carray1 > variant2); |
||||||
|
CHECK_FALSE(carray1 < variant2); |
||||||
|
CHECK_FALSE(carray1 <= variant2); |
||||||
|
CHECK_FALSE(carray1 >= variant2); |
||||||
|
|
||||||
|
CHECK(variant2 != carray1); |
||||||
|
CHECK_FALSE(variant2 == carray1); |
||||||
|
CHECK_FALSE(variant2 > carray1); |
||||||
|
CHECK_FALSE(variant2 < carray1); |
||||||
|
CHECK_FALSE(variant2 <= carray1); |
||||||
|
CHECK_FALSE(variant2 >= carray1); |
||||||
|
} |
||||||
|
} |
@ -1,16 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#include <ArduinoJson.h> |
|
||||||
#include <catch.hpp> |
|
||||||
|
|
||||||
TEST_CASE("JsonArray::get()") { |
|
||||||
DynamicJsonDocument doc(4096); |
|
||||||
deserializeJson(doc, "[1,2,3]"); |
|
||||||
JsonArray array = doc.as<JsonArray>(); |
|
||||||
|
|
||||||
SECTION("Overflow") { |
|
||||||
REQUIRE(array.getElement(3).isNull()); |
|
||||||
} |
|
||||||
} |
|
@ -0,0 +1,512 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h> |
||||||
|
#include <catch.hpp> |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObject with JsonObject") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonObject unbound; |
||||||
|
|
||||||
|
CHECK(object != unbound); |
||||||
|
CHECK_FALSE(object == unbound); |
||||||
|
CHECK_FALSE(object <= unbound); |
||||||
|
CHECK_FALSE(object >= unbound); |
||||||
|
CHECK_FALSE(object > unbound); |
||||||
|
CHECK_FALSE(object < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != object); |
||||||
|
CHECK_FALSE(unbound == object); |
||||||
|
CHECK_FALSE(unbound <= object); |
||||||
|
CHECK_FALSE(unbound >= object); |
||||||
|
CHECK_FALSE(unbound > object); |
||||||
|
CHECK_FALSE(unbound < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
|
||||||
|
CHECK(object == object); |
||||||
|
CHECK(object <= object); |
||||||
|
CHECK(object >= object); |
||||||
|
CHECK_FALSE(object != object); |
||||||
|
CHECK_FALSE(object > object); |
||||||
|
CHECK_FALSE(object < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello"; |
||||||
|
object1["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello"; |
||||||
|
object2["c"][0] = false; |
||||||
|
|
||||||
|
CHECK(object1 == object2); |
||||||
|
CHECK(object1 <= object2); |
||||||
|
CHECK(object1 >= object2); |
||||||
|
CHECK_FALSE(object1 != object2); |
||||||
|
CHECK_FALSE(object1 > object2); |
||||||
|
CHECK_FALSE(object1 < object2); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello1"; |
||||||
|
object1["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello2"; |
||||||
|
object2["c"][0] = false; |
||||||
|
|
||||||
|
CHECK(object1 != object2); |
||||||
|
CHECK_FALSE(object1 == object2); |
||||||
|
CHECK_FALSE(object1 > object2); |
||||||
|
CHECK_FALSE(object1 < object2); |
||||||
|
CHECK_FALSE(object1 <= object2); |
||||||
|
CHECK_FALSE(object1 >= object2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObject with JsonVariant") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
|
||||||
|
JsonVariant variant = object; |
||||||
|
|
||||||
|
CHECK(object == variant); |
||||||
|
CHECK(object <= variant); |
||||||
|
CHECK(object >= variant); |
||||||
|
CHECK_FALSE(object != variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
|
||||||
|
CHECK(variant == object); |
||||||
|
CHECK(variant <= object); |
||||||
|
CHECK(variant >= object); |
||||||
|
CHECK_FALSE(variant != object); |
||||||
|
CHECK_FALSE(variant > object); |
||||||
|
CHECK_FALSE(variant < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object = doc.createNestedObject(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
object["c"][0] = false; |
||||||
|
|
||||||
|
JsonVariant variant = doc.createNestedObject(); |
||||||
|
variant["a"] = 1; |
||||||
|
variant["b"] = "hello"; |
||||||
|
variant["c"][0] = false; |
||||||
|
|
||||||
|
CHECK(object == variant); |
||||||
|
CHECK(object <= variant); |
||||||
|
CHECK(object >= variant); |
||||||
|
CHECK_FALSE(object != variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
|
||||||
|
CHECK(variant == object); |
||||||
|
CHECK(variant <= object); |
||||||
|
CHECK(variant >= object); |
||||||
|
CHECK_FALSE(variant != object); |
||||||
|
CHECK_FALSE(variant > object); |
||||||
|
CHECK_FALSE(variant < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object = doc.createNestedObject(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello1"; |
||||||
|
object["c"][0] = false; |
||||||
|
|
||||||
|
JsonVariant variant = doc.createNestedObject(); |
||||||
|
variant["a"] = 1; |
||||||
|
variant["b"] = "hello2"; |
||||||
|
variant["c"][0] = false; |
||||||
|
|
||||||
|
CHECK(object != variant); |
||||||
|
CHECK_FALSE(object == variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
CHECK_FALSE(object <= variant); |
||||||
|
CHECK_FALSE(object >= variant); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObject with JsonVariantConst") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonVariantConst unbound; |
||||||
|
|
||||||
|
CHECK(object != unbound); |
||||||
|
CHECK_FALSE(object == unbound); |
||||||
|
CHECK_FALSE(object <= unbound); |
||||||
|
CHECK_FALSE(object >= unbound); |
||||||
|
CHECK_FALSE(object > unbound); |
||||||
|
CHECK_FALSE(object < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != object); |
||||||
|
CHECK_FALSE(unbound == object); |
||||||
|
CHECK_FALSE(unbound <= object); |
||||||
|
CHECK_FALSE(unbound >= object); |
||||||
|
CHECK_FALSE(unbound > object); |
||||||
|
CHECK_FALSE(unbound < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
|
||||||
|
JsonVariantConst variant = object; |
||||||
|
|
||||||
|
CHECK(object == variant); |
||||||
|
CHECK(object <= variant); |
||||||
|
CHECK(object >= variant); |
||||||
|
CHECK_FALSE(object != variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
|
||||||
|
CHECK(variant == object); |
||||||
|
CHECK(variant <= object); |
||||||
|
CHECK(variant >= object); |
||||||
|
CHECK_FALSE(variant != object); |
||||||
|
CHECK_FALSE(variant > object); |
||||||
|
CHECK_FALSE(variant < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object = doc.createNestedObject(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
object["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonVariantConst variant = object2; |
||||||
|
|
||||||
|
CHECK(object == variant); |
||||||
|
CHECK(object <= variant); |
||||||
|
CHECK(object >= variant); |
||||||
|
CHECK_FALSE(object != variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
|
||||||
|
CHECK(variant == object); |
||||||
|
CHECK(variant <= object); |
||||||
|
CHECK(variant >= object); |
||||||
|
CHECK_FALSE(variant != object); |
||||||
|
CHECK_FALSE(variant > object); |
||||||
|
CHECK_FALSE(variant < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object = doc.createNestedObject(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello1"; |
||||||
|
object["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello2"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonVariantConst variant = object2; |
||||||
|
|
||||||
|
CHECK(object != variant); |
||||||
|
CHECK_FALSE(object == variant); |
||||||
|
CHECK_FALSE(object > variant); |
||||||
|
CHECK_FALSE(object < variant); |
||||||
|
CHECK_FALSE(object <= variant); |
||||||
|
CHECK_FALSE(object >= variant); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObject with JsonObjectConst") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonObjectConst unbound; |
||||||
|
|
||||||
|
CHECK(object != unbound); |
||||||
|
CHECK_FALSE(object == unbound); |
||||||
|
CHECK_FALSE(object <= unbound); |
||||||
|
CHECK_FALSE(object >= unbound); |
||||||
|
CHECK_FALSE(object > unbound); |
||||||
|
CHECK_FALSE(object < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != object); |
||||||
|
CHECK_FALSE(unbound == object); |
||||||
|
CHECK_FALSE(unbound <= object); |
||||||
|
CHECK_FALSE(unbound >= object); |
||||||
|
CHECK_FALSE(unbound > object); |
||||||
|
CHECK_FALSE(unbound < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonObjectConst cobject = object; |
||||||
|
|
||||||
|
CHECK(object == cobject); |
||||||
|
CHECK(object <= cobject); |
||||||
|
CHECK(object >= cobject); |
||||||
|
CHECK_FALSE(object != cobject); |
||||||
|
CHECK_FALSE(object > cobject); |
||||||
|
CHECK_FALSE(object < cobject); |
||||||
|
|
||||||
|
CHECK(cobject == object); |
||||||
|
CHECK(cobject <= object); |
||||||
|
CHECK(cobject >= object); |
||||||
|
CHECK_FALSE(cobject != object); |
||||||
|
CHECK_FALSE(cobject > object); |
||||||
|
CHECK_FALSE(cobject < object); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello"; |
||||||
|
object1["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonObjectConst carray2 = object2; |
||||||
|
|
||||||
|
CHECK(object1 == carray2); |
||||||
|
CHECK(object1 <= carray2); |
||||||
|
CHECK(object1 >= carray2); |
||||||
|
CHECK_FALSE(object1 != carray2); |
||||||
|
CHECK_FALSE(object1 > carray2); |
||||||
|
CHECK_FALSE(object1 < carray2); |
||||||
|
|
||||||
|
CHECK(carray2 == object1); |
||||||
|
CHECK(carray2 <= object1); |
||||||
|
CHECK(carray2 >= object1); |
||||||
|
CHECK_FALSE(carray2 != object1); |
||||||
|
CHECK_FALSE(carray2 > object1); |
||||||
|
CHECK_FALSE(carray2 < object1); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello1"; |
||||||
|
object1["c"][0] = false; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello2"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonObjectConst carray2 = object2; |
||||||
|
|
||||||
|
CHECK(object1 != carray2); |
||||||
|
CHECK_FALSE(object1 == carray2); |
||||||
|
CHECK_FALSE(object1 > carray2); |
||||||
|
CHECK_FALSE(object1 < carray2); |
||||||
|
CHECK_FALSE(object1 <= carray2); |
||||||
|
CHECK_FALSE(object1 >= carray2); |
||||||
|
|
||||||
|
CHECK(carray2 != object1); |
||||||
|
CHECK_FALSE(carray2 == object1); |
||||||
|
CHECK_FALSE(carray2 > object1); |
||||||
|
CHECK_FALSE(carray2 < object1); |
||||||
|
CHECK_FALSE(carray2 <= object1); |
||||||
|
CHECK_FALSE(carray2 >= object1); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObjectConst with JsonObjectConst") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with unbound") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
|
||||||
|
JsonObjectConst cobject = object; |
||||||
|
JsonObjectConst unbound; |
||||||
|
|
||||||
|
CHECK(cobject != unbound); |
||||||
|
CHECK_FALSE(cobject == unbound); |
||||||
|
CHECK_FALSE(cobject <= unbound); |
||||||
|
CHECK_FALSE(cobject >= unbound); |
||||||
|
CHECK_FALSE(cobject > unbound); |
||||||
|
CHECK_FALSE(cobject < unbound); |
||||||
|
|
||||||
|
CHECK(unbound != cobject); |
||||||
|
CHECK_FALSE(unbound == cobject); |
||||||
|
CHECK_FALSE(unbound <= cobject); |
||||||
|
CHECK_FALSE(unbound >= cobject); |
||||||
|
CHECK_FALSE(unbound > cobject); |
||||||
|
CHECK_FALSE(unbound < cobject); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonObjectConst cobject = object; |
||||||
|
|
||||||
|
CHECK(cobject == cobject); |
||||||
|
CHECK(cobject <= cobject); |
||||||
|
CHECK(cobject >= cobject); |
||||||
|
CHECK_FALSE(cobject != cobject); |
||||||
|
CHECK_FALSE(cobject > cobject); |
||||||
|
CHECK_FALSE(cobject < cobject); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello"; |
||||||
|
object1["c"][0] = false; |
||||||
|
JsonObjectConst carray1 = object1; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonObjectConst carray2 = object2; |
||||||
|
|
||||||
|
CHECK(carray1 == carray2); |
||||||
|
CHECK(carray1 <= carray2); |
||||||
|
CHECK(carray1 >= carray2); |
||||||
|
CHECK_FALSE(carray1 != carray2); |
||||||
|
CHECK_FALSE(carray1 > carray2); |
||||||
|
CHECK_FALSE(carray1 < carray2); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello1"; |
||||||
|
object1["c"][0] = false; |
||||||
|
JsonObjectConst carray1 = object1; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello2"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonObjectConst carray2 = object2; |
||||||
|
|
||||||
|
CHECK(carray1 != carray2); |
||||||
|
CHECK_FALSE(carray1 == carray2); |
||||||
|
CHECK_FALSE(carray1 > carray2); |
||||||
|
CHECK_FALSE(carray1 < carray2); |
||||||
|
CHECK_FALSE(carray1 <= carray2); |
||||||
|
CHECK_FALSE(carray1 >= carray2); |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
TEST_CASE("Compare JsonObjectConst with JsonVariant") { |
||||||
|
StaticJsonDocument<512> doc; |
||||||
|
|
||||||
|
SECTION("Compare with self") { |
||||||
|
JsonObject object = doc.to<JsonObject>(); |
||||||
|
object["a"] = 1; |
||||||
|
object["b"] = "hello"; |
||||||
|
JsonObjectConst cobject = object; |
||||||
|
JsonVariant variant = object; |
||||||
|
|
||||||
|
CHECK(cobject == variant); |
||||||
|
CHECK(cobject <= variant); |
||||||
|
CHECK(cobject >= variant); |
||||||
|
CHECK_FALSE(cobject != variant); |
||||||
|
CHECK_FALSE(cobject > variant); |
||||||
|
CHECK_FALSE(cobject < variant); |
||||||
|
|
||||||
|
CHECK(variant == cobject); |
||||||
|
CHECK(variant <= cobject); |
||||||
|
CHECK(variant >= cobject); |
||||||
|
CHECK_FALSE(variant != cobject); |
||||||
|
CHECK_FALSE(variant > cobject); |
||||||
|
CHECK_FALSE(variant < cobject); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with identical object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello"; |
||||||
|
object1["c"][0] = false; |
||||||
|
JsonObjectConst carray1 = object1; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonVariant variant2 = object2; |
||||||
|
|
||||||
|
CHECK(carray1 == variant2); |
||||||
|
CHECK(carray1 <= variant2); |
||||||
|
CHECK(carray1 >= variant2); |
||||||
|
CHECK_FALSE(carray1 != variant2); |
||||||
|
CHECK_FALSE(carray1 > variant2); |
||||||
|
CHECK_FALSE(carray1 < variant2); |
||||||
|
|
||||||
|
CHECK(variant2 == carray1); |
||||||
|
CHECK(variant2 <= carray1); |
||||||
|
CHECK(variant2 >= carray1); |
||||||
|
CHECK_FALSE(variant2 != carray1); |
||||||
|
CHECK_FALSE(variant2 > carray1); |
||||||
|
CHECK_FALSE(variant2 < carray1); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("Compare with different object") { |
||||||
|
JsonObject object1 = doc.createNestedObject(); |
||||||
|
object1["a"] = 1; |
||||||
|
object1["b"] = "hello1"; |
||||||
|
object1["c"][0] = false; |
||||||
|
JsonObjectConst carray1 = object1; |
||||||
|
|
||||||
|
JsonObject object2 = doc.createNestedObject(); |
||||||
|
object2["a"] = 1; |
||||||
|
object2["b"] = "hello2"; |
||||||
|
object2["c"][0] = false; |
||||||
|
JsonVariant variant2 = object2; |
||||||
|
|
||||||
|
CHECK(carray1 != variant2); |
||||||
|
CHECK_FALSE(carray1 == variant2); |
||||||
|
CHECK_FALSE(carray1 > variant2); |
||||||
|
CHECK_FALSE(carray1 < variant2); |
||||||
|
CHECK_FALSE(carray1 <= variant2); |
||||||
|
CHECK_FALSE(carray1 >= variant2); |
||||||
|
|
||||||
|
CHECK(variant2 != carray1); |
||||||
|
CHECK_FALSE(variant2 == carray1); |
||||||
|
CHECK_FALSE(variant2 > carray1); |
||||||
|
CHECK_FALSE(variant2 < carray1); |
||||||
|
CHECK_FALSE(variant2 <= carray1); |
||||||
|
CHECK_FALSE(variant2 >= carray1); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,87 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h> |
||||||
|
#include <catch.hpp> |
||||||
|
|
||||||
|
TEST_CASE("JsonVariant::shallowCopy()") { |
||||||
|
StaticJsonDocument<1024> doc1, doc2; |
||||||
|
JsonVariant variant = doc1.to<JsonVariant>(); |
||||||
|
|
||||||
|
SECTION("JsonVariant::shallowCopy(JsonDocument&)") { |
||||||
|
doc2["hello"] = "world"; |
||||||
|
|
||||||
|
variant.shallowCopy(doc2); |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"world\"}"); |
||||||
|
|
||||||
|
// altering the linked document should change the result
|
||||||
|
doc2["hello"] = "WORLD!"; |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"WORLD!\"}"); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("JsonVariant::shallowCopy(MemberProxy)") { |
||||||
|
doc2["obj"]["hello"] = "world"; |
||||||
|
|
||||||
|
variant.shallowCopy(doc2["obj"]); |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"world\"}"); |
||||||
|
|
||||||
|
// altering the linked document should change the result
|
||||||
|
doc2["obj"]["hello"] = "WORLD!"; |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"WORLD!\"}"); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("JsonVariant::shallowCopy(ElementProxy)") { |
||||||
|
doc2[0]["hello"] = "world"; |
||||||
|
|
||||||
|
variant.shallowCopy(doc2[0]); |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"world\"}"); |
||||||
|
|
||||||
|
// altering the linked document should change the result
|
||||||
|
doc2[0]["hello"] = "WORLD!"; |
||||||
|
|
||||||
|
CHECK(variant.as<std::string>() == "{\"hello\":\"WORLD!\"}"); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("target is unbound") { |
||||||
|
JsonVariant unbound; |
||||||
|
variant["hello"] = "world"; |
||||||
|
|
||||||
|
variant.shallowCopy(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.shallowCopy(doc2); |
||||||
|
|
||||||
|
CHECK(unbound.isUnbound() == true); |
||||||
|
CHECK(unbound.isNull() == true); |
||||||
|
CHECK(unbound.memoryUsage() == 0); |
||||||
|
CHECK(unbound.size() == 0); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("preserves owned key bit") { |
||||||
|
doc2.set(42); |
||||||
|
|
||||||
|
doc1["a"].shallowCopy(doc2); |
||||||
|
doc1[std::string("b")].shallowCopy(doc2); |
||||||
|
|
||||||
|
JsonObject::iterator it = doc1.as<JsonObject>().begin(); |
||||||
|
|
||||||
|
CHECK(it->key().isLinked() == true); |
||||||
|
++it; |
||||||
|
CHECK(it->key().isLinked() == false); |
||||||
|
} |
||||||
|
} |
@ -0,0 +1,36 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#include <ArduinoJson.h> |
||||||
|
#include <catch.hpp> |
||||||
|
|
||||||
|
TEST_CASE("JsonVariant::size()") { |
||||||
|
DynamicJsonDocument doc(4096); |
||||||
|
JsonVariant variant = doc.to<JsonVariant>(); |
||||||
|
|
||||||
|
SECTION("unbound reference") { |
||||||
|
JsonVariant unbound; |
||||||
|
|
||||||
|
CHECK(unbound.size() == 0); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("int") { |
||||||
|
variant.set(42); |
||||||
|
|
||||||
|
CHECK(variant.size() == 0); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("string") { |
||||||
|
variant.set("hello"); |
||||||
|
|
||||||
|
CHECK(variant.size() == 0); |
||||||
|
} |
||||||
|
|
||||||
|
SECTION("object") { |
||||||
|
variant["a"] = 1; |
||||||
|
variant["b"] = 2; |
||||||
|
|
||||||
|
CHECK(variant.size() == 2); |
||||||
|
} |
||||||
|
} |
@ -1,115 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#define ARDUINOJSON_DEPRECATED(msg) // nothing
|
|
||||||
|
|
||||||
#include <ArduinoJson.h> |
|
||||||
#include <catch.hpp> |
|
||||||
|
|
||||||
TEST_CASE("Deprecated features") { |
|
||||||
StaticJsonDocument<256> doc; |
|
||||||
const char* s = "hello"; |
|
||||||
doc["s"] = s; |
|
||||||
doc["c"] = 42; |
|
||||||
doc["a"].add(s); |
|
||||||
doc["a"].add(42); |
|
||||||
|
|
||||||
SECTION("JsonVariant::add(char)") { |
|
||||||
JsonVariant v = doc.to<JsonVariant>(); |
|
||||||
v.add('*'); |
|
||||||
REQUIRE(v[0] == 42); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariant::as<char*>()") { |
|
||||||
JsonVariant v = doc["s"]; |
|
||||||
REQUIRE(v.as<char*>() == s); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariant::as<char>()") { |
|
||||||
JsonVariant v = doc["c"]; |
|
||||||
REQUIRE(v.as<char>() == '*'); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariant::is<char*>()") { |
|
||||||
JsonVariant v = doc["s"]; |
|
||||||
REQUIRE(v.is<char*>() == true); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariant::is<char>()") { |
|
||||||
JsonVariant v = doc["c"]; |
|
||||||
REQUIRE(v.is<char>() == true); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariant::set(char)") { |
|
||||||
JsonVariant v = doc.to<JsonVariant>(); |
|
||||||
v.set('*'); |
|
||||||
REQUIRE(v.as<unsigned char>() == 42); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariantConst::as<char*>()") { |
|
||||||
JsonVariantConst v = doc["s"]; |
|
||||||
REQUIRE(v.as<char*>() == s); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariantConst::as<char>()") { |
|
||||||
JsonVariantConst v = doc["c"]; |
|
||||||
REQUIRE(v.as<char>() == '*'); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariantConst::is<char*>()") { |
|
||||||
JsonVariantConst v = doc["s"]; |
|
||||||
REQUIRE(v.is<char*>() == true); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("JsonVariantConst::is<char>()") { |
|
||||||
JsonVariantConst v = doc["c"]; |
|
||||||
REQUIRE(v.is<char>() == true); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("MemberProxy::as<char*>()") { |
|
||||||
REQUIRE(doc["s"].as<char*>() == s); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("MemberProxy::as<char>()") { |
|
||||||
REQUIRE(doc["c"].as<char>() == '*'); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("MemberProxy::as<char>()") { |
|
||||||
doc["x"].set('*'); |
|
||||||
REQUIRE(doc["x"] == 42); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("MemberProxy::is<char*>()") { |
|
||||||
REQUIRE(doc["s"].is<char*>() == true); |
|
||||||
REQUIRE(doc["c"].is<char*>() == false); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("MemberProxy::is<char>()") { |
|
||||||
REQUIRE(doc["c"].is<char>() == true); |
|
||||||
REQUIRE(doc["s"].is<char>() == false); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("ElementProxy::as<char*>()") { |
|
||||||
REQUIRE(doc["a"][0].as<char*>() == s); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("ElementProxy::as<char>()") { |
|
||||||
REQUIRE(doc["a"][1].as<char>() == '*'); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("ElementProxy::as<char>()") { |
|
||||||
doc["a"][0].set('*'); |
|
||||||
REQUIRE(doc["a"][0] == 42); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("ElementProxy::is<char*>()") { |
|
||||||
REQUIRE(doc["a"][0].is<char*>() == true); |
|
||||||
REQUIRE(doc["a"][1].is<char*>() == false); |
|
||||||
} |
|
||||||
|
|
||||||
SECTION("ElementProxy::is<char>()") { |
|
||||||
REQUIRE(doc["a"][1].is<char>() == true); |
|
||||||
REQUIRE(doc["a"][0].is<char>() == false); |
|
||||||
} |
|
||||||
} |
|
After Width: | Height: | Size: 17 KiB |
@ -1,31 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <ArduinoJson/Collection/CollectionData.hpp> |
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE { |
|
||||||
|
|
||||||
inline VariantData *arrayAdd(CollectionData *arr, MemoryPool *pool) { |
|
||||||
return arr ? arr->addElement(pool) : 0; |
|
||||||
} |
|
||||||
|
|
||||||
template <typename TVisitor> |
|
||||||
inline typename TVisitor::result_type arrayAccept(const CollectionData *arr, |
|
||||||
TVisitor &visitor) { |
|
||||||
if (arr) |
|
||||||
return visitor.visitArray(*arr); |
|
||||||
else |
|
||||||
return visitor.visitNull(); |
|
||||||
} |
|
||||||
|
|
||||||
inline bool arrayEquals(const CollectionData *lhs, const CollectionData *rhs) { |
|
||||||
if (lhs == rhs) |
|
||||||
return true; |
|
||||||
if (!lhs || !rhs) |
|
||||||
return false; |
|
||||||
return lhs->equalsArray(*rhs); |
|
||||||
} |
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
|
@ -1,28 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <ArduinoJson/Array/ArrayRef.hpp> |
|
||||||
#include <ArduinoJson/Object/ObjectRef.hpp> |
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE { |
|
||||||
|
|
||||||
template <typename TArray> |
|
||||||
inline ArrayRef ArrayShortcuts<TArray>::createNestedArray() const { |
|
||||||
return impl()->addElement().template to<ArrayRef>(); |
|
||||||
} |
|
||||||
|
|
||||||
template <typename TArray> |
|
||||||
inline ObjectRef ArrayShortcuts<TArray>::createNestedObject() const { |
|
||||||
return impl()->addElement().template to<ObjectRef>(); |
|
||||||
} |
|
||||||
|
|
||||||
template <typename TArray> |
|
||||||
inline ElementProxy<TArray> ArrayShortcuts<TArray>::operator[]( |
|
||||||
size_t index) const { |
|
||||||
return ElementProxy<TArray>(*impl(), index); |
|
||||||
} |
|
||||||
|
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
|
@ -1,121 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <ArduinoJson/Variant/SlotFunctions.hpp> |
|
||||||
#include <ArduinoJson/Variant/VariantRef.hpp> |
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE { |
|
||||||
|
|
||||||
class VariantPtr { |
|
||||||
public: |
|
||||||
VariantPtr(MemoryPool *pool, VariantData *data) : _variant(pool, data) {} |
|
||||||
|
|
||||||
VariantRef *operator->() { |
|
||||||
return &_variant; |
|
||||||
} |
|
||||||
|
|
||||||
VariantRef &operator*() { |
|
||||||
return _variant; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
VariantRef _variant; |
|
||||||
}; |
|
||||||
|
|
||||||
class ArrayIterator { |
|
||||||
public: |
|
||||||
ArrayIterator() : _slot(0) {} |
|
||||||
explicit ArrayIterator(MemoryPool *pool, VariantSlot *slot) |
|
||||||
: _pool(pool), _slot(slot) {} |
|
||||||
|
|
||||||
VariantRef operator*() const { |
|
||||||
return VariantRef(_pool, _slot->data()); |
|
||||||
} |
|
||||||
VariantPtr operator->() { |
|
||||||
return VariantPtr(_pool, _slot->data()); |
|
||||||
} |
|
||||||
|
|
||||||
bool operator==(const ArrayIterator &other) const { |
|
||||||
return _slot == other._slot; |
|
||||||
} |
|
||||||
|
|
||||||
bool operator!=(const ArrayIterator &other) const { |
|
||||||
return _slot != other._slot; |
|
||||||
} |
|
||||||
|
|
||||||
ArrayIterator &operator++() { |
|
||||||
_slot = _slot->next(); |
|
||||||
return *this; |
|
||||||
} |
|
||||||
|
|
||||||
ArrayIterator &operator+=(size_t distance) { |
|
||||||
_slot = _slot->next(distance); |
|
||||||
return *this; |
|
||||||
} |
|
||||||
|
|
||||||
VariantSlot *internal() { |
|
||||||
return _slot; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
MemoryPool *_pool; |
|
||||||
VariantSlot *_slot; |
|
||||||
}; |
|
||||||
|
|
||||||
class VariantConstPtr { |
|
||||||
public: |
|
||||||
VariantConstPtr(const VariantData *data) : _variant(data) {} |
|
||||||
|
|
||||||
VariantConstRef *operator->() { |
|
||||||
return &_variant; |
|
||||||
} |
|
||||||
|
|
||||||
VariantConstRef &operator*() { |
|
||||||
return _variant; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
VariantConstRef _variant; |
|
||||||
}; |
|
||||||
|
|
||||||
class ArrayConstRefIterator { |
|
||||||
public: |
|
||||||
ArrayConstRefIterator() : _slot(0) {} |
|
||||||
explicit ArrayConstRefIterator(const VariantSlot *slot) : _slot(slot) {} |
|
||||||
|
|
||||||
VariantConstRef operator*() const { |
|
||||||
return VariantConstRef(_slot->data()); |
|
||||||
} |
|
||||||
VariantConstPtr operator->() { |
|
||||||
return VariantConstPtr(_slot->data()); |
|
||||||
} |
|
||||||
|
|
||||||
bool operator==(const ArrayConstRefIterator &other) const { |
|
||||||
return _slot == other._slot; |
|
||||||
} |
|
||||||
|
|
||||||
bool operator!=(const ArrayConstRefIterator &other) const { |
|
||||||
return _slot != other._slot; |
|
||||||
} |
|
||||||
|
|
||||||
ArrayConstRefIterator &operator++() { |
|
||||||
_slot = _slot->next(); |
|
||||||
return *this; |
|
||||||
} |
|
||||||
|
|
||||||
ArrayConstRefIterator &operator+=(size_t distance) { |
|
||||||
_slot = _slot->next(distance); |
|
||||||
return *this; |
|
||||||
} |
|
||||||
|
|
||||||
const VariantSlot *internal() { |
|
||||||
return _slot; |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
const VariantSlot *_slot; |
|
||||||
}; |
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
|
@ -1,213 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <ArduinoJson/Array/ArrayFunctions.hpp> |
|
||||||
#include <ArduinoJson/Array/ArrayIterator.hpp> |
|
||||||
#include <ArduinoJson/Variant/VariantData.hpp> |
|
||||||
|
|
||||||
// Returns the size (in bytes) of an array with n elements.
|
|
||||||
// Can be very handy to determine the size of a StaticMemoryPool.
|
|
||||||
#define JSON_ARRAY_SIZE(NUMBER_OF_ELEMENTS) \ |
|
||||||
((NUMBER_OF_ELEMENTS) * sizeof(ARDUINOJSON_NAMESPACE::VariantSlot)) |
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE { |
|
||||||
|
|
||||||
class ObjectRef; |
|
||||||
template <typename> |
|
||||||
class ElementProxy; |
|
||||||
|
|
||||||
template <typename TData> |
|
||||||
class ArrayRefBase { |
|
||||||
public: |
|
||||||
operator VariantConstRef() const { |
|
||||||
const void* data = _data; // prevent warning cast-align
|
|
||||||
return VariantConstRef(reinterpret_cast<const VariantData*>(data)); |
|
||||||
} |
|
||||||
|
|
||||||
template <typename TVisitor> |
|
||||||
FORCE_INLINE typename TVisitor::result_type accept(TVisitor& visitor) const { |
|
||||||
return arrayAccept(_data, visitor); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE bool isNull() const { |
|
||||||
return _data == 0; |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE operator bool() const { |
|
||||||
return _data != 0; |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE size_t memoryUsage() const { |
|
||||||
return _data ? _data->memoryUsage() : 0; |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE size_t nesting() const { |
|
||||||
return _data ? _data->nesting() : 0; |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE size_t size() const { |
|
||||||
return _data ? _data->size() : 0; |
|
||||||
} |
|
||||||
|
|
||||||
protected: |
|
||||||
ArrayRefBase(TData* data) : _data(data) {} |
|
||||||
TData* _data; |
|
||||||
}; |
|
||||||
|
|
||||||
class ArrayConstRef : public ArrayRefBase<const CollectionData>, |
|
||||||
public Visitable { |
|
||||||
friend class ArrayRef; |
|
||||||
typedef ArrayRefBase<const CollectionData> base_type; |
|
||||||
|
|
||||||
public: |
|
||||||
typedef ArrayConstRefIterator iterator; |
|
||||||
|
|
||||||
FORCE_INLINE iterator begin() const { |
|
||||||
if (!_data) |
|
||||||
return iterator(); |
|
||||||
return iterator(_data->head()); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE iterator end() const { |
|
||||||
return iterator(); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE ArrayConstRef() : base_type(0) {} |
|
||||||
FORCE_INLINE ArrayConstRef(const CollectionData* data) : base_type(data) {} |
|
||||||
|
|
||||||
FORCE_INLINE bool operator==(ArrayConstRef rhs) const { |
|
||||||
return arrayEquals(_data, rhs._data); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE VariantConstRef operator[](size_t index) const { |
|
||||||
return getElement(index); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE VariantConstRef getElement(size_t index) const { |
|
||||||
return VariantConstRef(_data ? _data->getElement(index) : 0); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
class ArrayRef : public ArrayRefBase<CollectionData>, |
|
||||||
public ArrayShortcuts<ArrayRef>, |
|
||||||
public Visitable { |
|
||||||
typedef ArrayRefBase<CollectionData> base_type; |
|
||||||
|
|
||||||
public: |
|
||||||
typedef ArrayIterator iterator; |
|
||||||
|
|
||||||
FORCE_INLINE ArrayRef() : base_type(0), _pool(0) {} |
|
||||||
FORCE_INLINE ArrayRef(MemoryPool* pool, CollectionData* data) |
|
||||||
: base_type(data), _pool(pool) {} |
|
||||||
|
|
||||||
operator VariantRef() { |
|
||||||
void* data = _data; // prevent warning cast-align
|
|
||||||
return VariantRef(_pool, reinterpret_cast<VariantData*>(data)); |
|
||||||
} |
|
||||||
|
|
||||||
operator ArrayConstRef() const { |
|
||||||
return ArrayConstRef(_data); |
|
||||||
} |
|
||||||
|
|
||||||
VariantRef addElement() const { |
|
||||||
return VariantRef(_pool, arrayAdd(_data, _pool)); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE iterator begin() const { |
|
||||||
if (!_data) |
|
||||||
return iterator(); |
|
||||||
return iterator(_pool, _data->head()); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE iterator end() const { |
|
||||||
return iterator(); |
|
||||||
} |
|
||||||
|
|
||||||
// Copy a ArrayRef
|
|
||||||
FORCE_INLINE bool set(ArrayConstRef src) const { |
|
||||||
if (!_data || !src._data) |
|
||||||
return false; |
|
||||||
return _data->copyFrom(*src._data, _pool); |
|
||||||
} |
|
||||||
|
|
||||||
FORCE_INLINE bool operator==(ArrayRef rhs) const { |
|
||||||
return arrayEquals(_data, rhs._data); |
|
||||||
} |
|
||||||
|
|
||||||
// Internal use
|
|
||||||
FORCE_INLINE VariantRef getOrAddElement(size_t index) const { |
|
||||||
return VariantRef(_pool, _data ? _data->getOrAddElement(index, _pool) : 0); |
|
||||||
} |
|
||||||
|
|
||||||
// Gets the value at the specified index.
|
|
||||||
FORCE_INLINE VariantRef getElement(size_t index) const { |
|
||||||
return VariantRef(_pool, _data ? _data->getElement(index) : 0); |
|
||||||
} |
|
||||||
|
|
||||||
// Removes element at specified position.
|
|
||||||
FORCE_INLINE void remove(iterator it) const { |
|
||||||
if (!_data) |
|
||||||
return; |
|
||||||
_data->removeSlot(it.internal()); |
|
||||||
} |
|
||||||
|
|
||||||
// Removes element at specified index.
|
|
||||||
FORCE_INLINE void remove(size_t index) const { |
|
||||||
if (!_data) |
|
||||||
return; |
|
||||||
_data->removeElement(index); |
|
||||||
} |
|
||||||
|
|
||||||
void clear() const { |
|
||||||
if (!_data) |
|
||||||
return; |
|
||||||
_data->clear(); |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
MemoryPool* _pool; |
|
||||||
}; |
|
||||||
|
|
||||||
template <> |
|
||||||
struct Converter<ArrayConstRef> { |
|
||||||
static void toJson(VariantConstRef src, VariantRef dst) { |
|
||||||
variantCopyFrom(getData(dst), getData(src), getPool(dst)); |
|
||||||
} |
|
||||||
|
|
||||||
static ArrayConstRef fromJson(VariantConstRef src) { |
|
||||||
return ArrayConstRef(variantAsArray(getData(src))); |
|
||||||
} |
|
||||||
|
|
||||||
static bool checkJson(VariantConstRef src) { |
|
||||||
const VariantData* data = getData(src); |
|
||||||
return data && data->isArray(); |
|
||||||
} |
|
||||||
}; |
|
||||||
|
|
||||||
template <> |
|
||||||
struct Converter<ArrayRef> { |
|
||||||
static void toJson(VariantConstRef src, VariantRef dst) { |
|
||||||
variantCopyFrom(getData(dst), getData(src), getPool(dst)); |
|
||||||
} |
|
||||||
|
|
||||||
static ArrayRef fromJson(VariantRef src) { |
|
||||||
VariantData* data = getData(src); |
|
||||||
MemoryPool* pool = getPool(src); |
|
||||||
return ArrayRef(pool, data != 0 ? data->asArray() : 0); |
|
||||||
} |
|
||||||
|
|
||||||
static InvalidConversion<VariantConstRef, ArrayRef> fromJson(VariantConstRef); |
|
||||||
|
|
||||||
static bool checkJson(VariantConstRef) { |
|
||||||
return false; |
|
||||||
} |
|
||||||
|
|
||||||
static bool checkJson(VariantRef src) { |
|
||||||
VariantData* data = getData(src); |
|
||||||
return data && data->isArray(); |
|
||||||
} |
|
||||||
}; |
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
|
@ -1,49 +0,0 @@ |
|||||||
// ArduinoJson - https://arduinojson.org
|
|
||||||
// Copyright © 2014-2022, Benoit BLANCHON
|
|
||||||
// MIT License
|
|
||||||
|
|
||||||
#pragma once |
|
||||||
|
|
||||||
#include <ArduinoJson/Polyfills/attributes.hpp> |
|
||||||
#include <ArduinoJson/Polyfills/type_traits.hpp> |
|
||||||
|
|
||||||
namespace ARDUINOJSON_NAMESPACE { |
|
||||||
// Forward declarations.
|
|
||||||
class ArrayRef; |
|
||||||
class ObjectRef; |
|
||||||
template <typename> |
|
||||||
class ElementProxy; |
|
||||||
|
|
||||||
template <typename TArray> |
|
||||||
class ArrayShortcuts { |
|
||||||
public: |
|
||||||
// Returns the element at specified index if the variant is an array.
|
|
||||||
FORCE_INLINE ElementProxy<TArray> operator[](size_t index) const; |
|
||||||
|
|
||||||
FORCE_INLINE ObjectRef createNestedObject() const; |
|
||||||
|
|
||||||
FORCE_INLINE ArrayRef createNestedArray() const; |
|
||||||
|
|
||||||
// Adds the specified value at the end of the array.
|
|
||||||
//
|
|
||||||
// bool add(TValue);
|
|
||||||
// TValue = bool, long, int, short, float, double, serialized, VariantRef,
|
|
||||||
// std::string, String, ObjectRef
|
|
||||||
template <typename T> |
|
||||||
FORCE_INLINE bool add(const T &value) const { |
|
||||||
return impl()->addElement().set(value); |
|
||||||
} |
|
||||||
//
|
|
||||||
// bool add(TValue);
|
|
||||||
// TValue = char*, const char*, const __FlashStringHelper*
|
|
||||||
template <typename T> |
|
||||||
FORCE_INLINE bool add(T *value) const { |
|
||||||
return impl()->addElement().set(value); |
|
||||||
} |
|
||||||
|
|
||||||
private: |
|
||||||
const TArray *impl() const { |
|
||||||
return static_cast<const TArray *>(this); |
|
||||||
} |
|
||||||
}; |
|
||||||
} // namespace ARDUINOJSON_NAMESPACE
|
|
@ -0,0 +1,134 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <ArduinoJson/Array/JsonArrayIterator.hpp> |
||||||
|
#include <ArduinoJson/Variant/VariantAttorney.hpp> |
||||||
|
#include <ArduinoJson/Variant/VariantData.hpp> |
||||||
|
|
||||||
|
namespace ARDUINOJSON_NAMESPACE { |
||||||
|
|
||||||
|
class JsonObject; |
||||||
|
|
||||||
|
// A read-only reference to an array in a JsonDocument
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/
|
||||||
|
class JsonArrayConst : public VariantOperators<JsonArrayConst> { |
||||||
|
friend class JsonArray; |
||||||
|
friend class VariantAttorney; |
||||||
|
|
||||||
|
public: |
||||||
|
typedef JsonArrayConstIterator iterator; |
||||||
|
|
||||||
|
// Returns an iterator to the first element of the array.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/begin/
|
||||||
|
FORCE_INLINE iterator begin() const { |
||||||
|
if (!_data) |
||||||
|
return iterator(); |
||||||
|
return iterator(_data->head()); |
||||||
|
} |
||||||
|
|
||||||
|
// Returns an iterator to the element following the last element of the array.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/end/
|
||||||
|
FORCE_INLINE iterator end() const { |
||||||
|
return iterator(); |
||||||
|
} |
||||||
|
|
||||||
|
// Creates an unbound reference.
|
||||||
|
FORCE_INLINE JsonArrayConst() : _data(0) {} |
||||||
|
|
||||||
|
// INTERNAL USE ONLY
|
||||||
|
FORCE_INLINE JsonArrayConst(const CollectionData* data) : _data(data) {} |
||||||
|
|
||||||
|
// Compares the content of two arrays.
|
||||||
|
// Returns true if the two arrays are equal.
|
||||||
|
FORCE_INLINE bool operator==(JsonArrayConst rhs) const { |
||||||
|
if (_data == rhs._data) |
||||||
|
return true; |
||||||
|
if (!_data || !rhs._data) |
||||||
|
return false; |
||||||
|
|
||||||
|
iterator it1 = begin(); |
||||||
|
iterator it2 = rhs.begin(); |
||||||
|
|
||||||
|
for (;;) { |
||||||
|
bool end1 = it1 == end(); |
||||||
|
bool end2 = it2 == rhs.end(); |
||||||
|
if (end1 && end2) |
||||||
|
return true; |
||||||
|
if (end1 || end2) |
||||||
|
return false; |
||||||
|
if (*it1 != *it2) |
||||||
|
return false; |
||||||
|
++it1; |
||||||
|
++it2; |
||||||
|
} |
||||||
|
} |
||||||
|
|
||||||
|
// Returns the element at the specified index.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/subscript/
|
||||||
|
FORCE_INLINE JsonVariantConst operator[](size_t index) const { |
||||||
|
return JsonVariantConst(_data ? _data->getElement(index) : 0); |
||||||
|
} |
||||||
|
|
||||||
|
operator JsonVariantConst() const { |
||||||
|
return JsonVariantConst(collectionToVariant(_data)); |
||||||
|
} |
||||||
|
|
||||||
|
// Returns true if the reference is unbound.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/isnull/
|
||||||
|
FORCE_INLINE bool isNull() const { |
||||||
|
return _data == 0; |
||||||
|
} |
||||||
|
|
||||||
|
// Returns true if the reference is bound.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/isnull/
|
||||||
|
FORCE_INLINE operator bool() const { |
||||||
|
return _data != 0; |
||||||
|
} |
||||||
|
|
||||||
|
// Returns the number of bytes occupied by the array.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/memoryusage/
|
||||||
|
FORCE_INLINE size_t memoryUsage() const { |
||||||
|
return _data ? _data->memoryUsage() : 0; |
||||||
|
} |
||||||
|
|
||||||
|
// Returns the depth (nesting level) of the array.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/nesting/
|
||||||
|
FORCE_INLINE size_t nesting() const { |
||||||
|
return variantNesting(collectionToVariant(_data)); |
||||||
|
} |
||||||
|
|
||||||
|
// Returns the number of elements in the array.
|
||||||
|
// https://arduinojson.org/v6/api/jsonarrayconst/size/
|
||||||
|
FORCE_INLINE size_t size() const { |
||||||
|
return _data ? _data->size() : 0; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
const VariantData* getData() const { |
||||||
|
return collectionToVariant(_data); |
||||||
|
} |
||||||
|
|
||||||
|
const CollectionData* _data; |
||||||
|
}; |
||||||
|
|
||||||
|
template <> |
||||||
|
struct Converter<JsonArrayConst> : private VariantAttorney { |
||||||
|
static void toJson(JsonVariantConst src, JsonVariant dst) { |
||||||
|
variantCopyFrom(getData(dst), getData(src), getPool(dst)); |
||||||
|
} |
||||||
|
|
||||||
|
static JsonArrayConst fromJson(JsonVariantConst src) { |
||||||
|
const VariantData* data = getData(src); |
||||||
|
return data ? data->asArray() : 0; |
||||||
|
} |
||||||
|
|
||||||
|
static bool checkJson(JsonVariantConst src) { |
||||||
|
const VariantData* data = getData(src); |
||||||
|
return data && data->isArray(); |
||||||
|
} |
||||||
|
}; |
||||||
|
|
||||||
|
} // namespace ARDUINOJSON_NAMESPACE
|
@ -0,0 +1,32 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <ArduinoJson/Array/JsonArray.hpp> |
||||||
|
#include <ArduinoJson/Object/JsonObject.hpp> |
||||||
|
|
||||||
|
namespace ARDUINOJSON_NAMESPACE { |
||||||
|
|
||||||
|
inline JsonObject JsonArray::createNestedObject() const { |
||||||
|
return add().to<JsonObject>(); |
||||||
|
} |
||||||
|
|
||||||
|
template <typename TDerived> |
||||||
|
inline JsonArray VariantRefBase<TDerived>::createNestedArray() const { |
||||||
|
return add().template to<JsonArray>(); |
||||||
|
} |
||||||
|
|
||||||
|
template <typename TDerived> |
||||||
|
inline JsonObject VariantRefBase<TDerived>::createNestedObject() const { |
||||||
|
return add().template to<JsonObject>(); |
||||||
|
} |
||||||
|
|
||||||
|
template <typename TDerived> |
||||||
|
inline ElementProxy<TDerived> VariantRefBase<TDerived>::operator[]( |
||||||
|
size_t index) const { |
||||||
|
return ElementProxy<TDerived>(derived(), index); |
||||||
|
} |
||||||
|
|
||||||
|
} // namespace ARDUINOJSON_NAMESPACE
|
@ -0,0 +1,117 @@ |
|||||||
|
// ArduinoJson - https://arduinojson.org
|
||||||
|
// Copyright © 2014-2022, Benoit BLANCHON
|
||||||
|
// MIT License
|
||||||
|
|
||||||
|
#pragma once |
||||||
|
|
||||||
|
#include <ArduinoJson/Variant/JsonVariant.hpp> |
||||||
|
#include <ArduinoJson/Variant/SlotFunctions.hpp> |
||||||
|
|
||||||
|
namespace ARDUINOJSON_NAMESPACE { |
||||||
|
|
||||||
|
class VariantPtr { |
||||||
|
public: |
||||||
|
VariantPtr(MemoryPool* pool, VariantData* data) : _variant(pool, data) {} |
||||||
|
|
||||||
|
JsonVariant* operator->() { |
||||||
|
return &_variant; |
||||||
|
} |
||||||
|
|
||||||
|
JsonVariant& operator*() { |
||||||
|
return _variant; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
JsonVariant _variant; |
||||||
|
}; |
||||||
|
|
||||||
|
class JsonArrayIterator { |
||||||
|
friend class JsonArray; |
||||||
|
|
||||||
|
public: |
||||||
|
JsonArrayIterator() : _slot(0) {} |
||||||
|
explicit JsonArrayIterator(MemoryPool* pool, VariantSlot* slot) |
||||||
|
: _pool(pool), _slot(slot) {} |
||||||
|
|
||||||
|
JsonVariant operator*() const { |
||||||
|
return JsonVariant(_pool, _slot->data()); |
||||||
|
} |
||||||
|
VariantPtr operator->() { |
||||||
|
return VariantPtr(_pool, _slot->data()); |
||||||
|
} |
||||||
|
|
||||||
|
bool operator==(const JsonArrayIterator& other) const { |
||||||
|
return _slot == other._slot; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator!=(const JsonArrayIterator& other) const { |
||||||
|
return _slot != other._slot; |
||||||
|
} |
||||||
|
|
||||||
|
JsonArrayIterator& operator++() { |
||||||
|
_slot = _slot->next(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
JsonArrayIterator& operator+=(size_t distance) { |
||||||
|
_slot = _slot->next(distance); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
MemoryPool* _pool; |
||||||
|
VariantSlot* _slot; |
||||||
|
}; |
||||||
|
|
||||||
|
class VariantConstPtr { |
||||||
|
public: |
||||||
|
VariantConstPtr(const VariantData* data) : _variant(data) {} |
||||||
|
|
||||||
|
JsonVariantConst* operator->() { |
||||||
|
return &_variant; |
||||||
|
} |
||||||
|
|
||||||
|
JsonVariantConst& operator*() { |
||||||
|
return _variant; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
JsonVariantConst _variant; |
||||||
|
}; |
||||||
|
|
||||||
|
class JsonArrayConstIterator { |
||||||
|
friend class JsonArray; |
||||||
|
|
||||||
|
public: |
||||||
|
JsonArrayConstIterator() : _slot(0) {} |
||||||
|
explicit JsonArrayConstIterator(const VariantSlot* slot) : _slot(slot) {} |
||||||
|
|
||||||
|
JsonVariantConst operator*() const { |
||||||
|
return JsonVariantConst(_slot->data()); |
||||||
|
} |
||||||
|
VariantConstPtr operator->() { |
||||||
|
return VariantConstPtr(_slot->data()); |
||||||
|
} |
||||||
|
|
||||||
|
bool operator==(const JsonArrayConstIterator& other) const { |
||||||
|
return _slot == other._slot; |
||||||
|
} |
||||||
|
|
||||||
|
bool operator!=(const JsonArrayConstIterator& other) const { |
||||||
|
return _slot != other._slot; |
||||||
|
} |
||||||
|
|
||||||
|
JsonArrayConstIterator& operator++() { |
||||||
|
_slot = _slot->next(); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
JsonArrayConstIterator& operator+=(size_t distance) { |
||||||
|
_slot = _slot->next(distance); |
||||||
|
return *this; |
||||||
|
} |
||||||
|
|
||||||
|
private: |
||||||
|
const VariantSlot* _slot; |
||||||
|
}; |
||||||
|
} // namespace ARDUINOJSON_NAMESPACE
|
Some files were not shown because too many files have changed in this diff Show More
Loading…
Reference in new issue