Update to ArduinoJson 7.0.4

This commit is contained in:
iranl
2024-04-19 14:44:01 +02:00
parent 1378732081
commit 81be0a689a
444 changed files with 10842 additions and 9422 deletions

View File

@@ -1,5 +1,5 @@
# ArduinoJson - https://arduinojson.org
# Copyright © 2014-2023, Benoit BLANCHON
# Copyright © 2014-2024, Benoit BLANCHON
# MIT License
add_executable(JsonArrayTests
@@ -7,11 +7,9 @@ add_executable(JsonArrayTests
clear.cpp
compare.cpp
copyArray.cpp
createNested.cpp
equals.cpp
isNull.cpp
iterator.cpp
memoryUsage.cpp
nesting.cpp
remove.cpp
size.cpp

View File

@@ -1,12 +1,17 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray::add()") {
DynamicJsonDocument doc(4096);
#include "Allocators.hpp"
using ArduinoJson::detail::sizeofArray;
TEST_CASE("JsonArray::add(T)") {
SpyingAllocator spy;
JsonDocument doc(&spy);
JsonArray array = doc.to<JsonArray>();
SECTION("int") {
@@ -51,7 +56,7 @@ TEST_CASE("JsonArray::add()") {
#endif
SECTION("nested array") {
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonArray arr = doc2.to<JsonArray>();
array.add(arr);
@@ -62,7 +67,7 @@ TEST_CASE("JsonArray::add()") {
}
SECTION("nested object") {
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonObject obj = doc2.to<JsonObject>();
array.add(obj);
@@ -74,7 +79,7 @@ TEST_CASE("JsonArray::add()") {
SECTION("array subscript") {
const char* str = "hello";
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonArray arr = doc2.to<JsonArray>();
arr.add(str);
@@ -85,7 +90,7 @@ TEST_CASE("JsonArray::add()") {
SECTION("object subscript") {
const char* str = "hello";
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonObject obj = doc2.to<JsonObject>();
obj["x"] = str;
@@ -96,43 +101,81 @@ TEST_CASE("JsonArray::add()") {
SECTION("should not duplicate const char*") {
array.add("world");
const size_t expectedSize = JSON_ARRAY_SIZE(1);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
});
}
SECTION("should duplicate char*") {
array.add(const_cast<char*>("world"));
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(5);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("world")),
});
}
SECTION("should duplicate std::string") {
array.add(std::string("world"));
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(5);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("world")),
});
}
SECTION("should not duplicate serialized(const char*)") {
SECTION("should duplicate serialized(const char*)") {
array.add(serialized("{}"));
const size_t expectedSize = JSON_ARRAY_SIZE(1);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("{}")),
});
}
SECTION("should duplicate serialized(char*)") {
array.add(serialized(const_cast<char*>("{}")));
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(2);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("{}")),
});
}
SECTION("should duplicate serialized(std::string)") {
array.add(serialized(std::string("{}")));
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(2);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("{}")),
});
}
SECTION("should duplicate serialized(std::string)") {
array.add(serialized(std::string("\0XX", 3)));
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(3);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString(" XX")),
});
}
}
TEST_CASE("JsonArray::add<T>()") {
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
SECTION("add<JsonArray>()") {
JsonArray nestedArray = array.add<JsonArray>();
nestedArray.add(1);
nestedArray.add(2);
REQUIRE(doc.as<std::string>() == "[[1,2]]");
}
SECTION("add<JsonObject>()") {
JsonObject nestedObject = array.add<JsonObject>();
nestedObject["a"] = 1;
nestedObject["b"] = 2;
REQUIRE(doc.as<std::string>() == "[{\"a\":1,\"b\":2}]");
}
SECTION("add<JsonVariant>()") {
JsonVariant nestedVariant = array.add<JsonVariant>();
nestedVariant.set(42);
REQUIRE(doc.as<std::string>() == "[42]");
}
}

View File

@@ -1,10 +1,12 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
#include "Allocators.hpp"
TEST_CASE("JsonArray::clear()") {
SECTION("No-op on null JsonArray") {
JsonArray array;
@@ -14,7 +16,7 @@ TEST_CASE("JsonArray::clear()") {
}
SECTION("Removes all elements") {
StaticJsonDocument<64> doc;
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
array.add(1);
array.add(2);
@@ -22,4 +24,23 @@ TEST_CASE("JsonArray::clear()") {
REQUIRE(array.size() == 0);
REQUIRE(array.isNull() == false);
}
SECTION("Removed elements are recycled") {
SpyingAllocator spy;
JsonDocument doc(&spy);
JsonArray array = doc.to<JsonArray>();
// fill the pool entirely
for (int i = 0; i < ARDUINOJSON_POOL_CAPACITY; i++)
array.add(i);
// clear and fill again
array.clear();
for (int i = 0; i < ARDUINOJSON_POOL_CAPACITY; i++)
array.add(i);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
});
}
}

View File

@@ -1,12 +1,12 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("Compare JsonArray with JsonArray") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with unbound") {
JsonArray array = doc.to<JsonArray>();
@@ -43,15 +43,15 @@ TEST_CASE("Compare JsonArray with JsonArray") {
}
SECTION("Compare with identical array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello");
array2.createNestedObject();
array2.add<JsonObject>();
CHECK(array1 == array2);
CHECK(array1 <= array2);
@@ -62,15 +62,15 @@ TEST_CASE("Compare JsonArray with JsonArray") {
}
SECTION("Compare with different array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello1");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello2");
array2.createNestedObject();
array2.add<JsonObject>();
CHECK(array1 != array2);
CHECK_FALSE(array1 == array2);
@@ -82,7 +82,7 @@ TEST_CASE("Compare JsonArray with JsonArray") {
}
TEST_CASE("Compare JsonArray with JsonVariant") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with self") {
JsonArray array = doc.to<JsonArray>();
@@ -107,15 +107,15 @@ TEST_CASE("Compare JsonArray with JsonVariant") {
}
SECTION("Compare with identical array") {
JsonArray array = doc.createNestedArray();
JsonArray array = doc.add<JsonArray>();
array.add(1);
array.add("hello");
array.createNestedObject();
array.add<JsonObject>();
JsonVariant variant = doc.createNestedArray();
JsonVariant variant = doc.add<JsonArray>();
variant.add(1);
variant.add("hello");
variant.createNestedObject();
variant.add<JsonObject>();
CHECK(array == variant);
CHECK(array <= variant);
@@ -133,15 +133,15 @@ TEST_CASE("Compare JsonArray with JsonVariant") {
}
SECTION("Compare with different array") {
JsonArray array = doc.createNestedArray();
JsonArray array = doc.add<JsonArray>();
array.add(1);
array.add("hello1");
array.createNestedObject();
array.add<JsonObject>();
JsonVariant variant = doc.createNestedArray();
JsonVariant variant = doc.add<JsonArray>();
variant.add(1);
variant.add("hello2");
variant.createNestedObject();
variant.add<JsonObject>();
CHECK(array != variant);
CHECK_FALSE(array == variant);
@@ -153,7 +153,7 @@ TEST_CASE("Compare JsonArray with JsonVariant") {
}
TEST_CASE("Compare JsonArray with JsonVariantConst") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with unbound") {
JsonArray array = doc.to<JsonArray>();
@@ -199,15 +199,15 @@ TEST_CASE("Compare JsonArray with JsonVariantConst") {
}
SECTION("Compare with identical array") {
JsonArray array = doc.createNestedArray();
JsonArray array = doc.add<JsonArray>();
array.add(1);
array.add("hello");
array.createNestedObject();
array.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello");
array2.createNestedObject();
array2.add<JsonObject>();
JsonVariantConst variant = array2;
CHECK(array == variant);
@@ -226,15 +226,15 @@ TEST_CASE("Compare JsonArray with JsonVariantConst") {
}
SECTION("Compare with different array") {
JsonArray array = doc.createNestedArray();
JsonArray array = doc.add<JsonArray>();
array.add(1);
array.add("hello1");
array.createNestedObject();
array.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello2");
array2.createNestedObject();
array2.add<JsonObject>();
JsonVariantConst variant = array2;
CHECK(array != variant);
@@ -247,7 +247,7 @@ TEST_CASE("Compare JsonArray with JsonVariantConst") {
}
TEST_CASE("Compare JsonArray with JsonArrayConst") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with unbound") {
JsonArray array = doc.to<JsonArray>();
@@ -292,15 +292,15 @@ TEST_CASE("Compare JsonArray with JsonArrayConst") {
}
SECTION("Compare with identical array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello");
array2.createNestedObject();
array2.add<JsonObject>();
JsonArrayConst carray2 = array2;
CHECK(array1 == carray2);
@@ -319,15 +319,15 @@ TEST_CASE("Compare JsonArray with JsonArrayConst") {
}
SECTION("Compare with different array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello1");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello2");
array2.createNestedObject();
array2.add<JsonObject>();
JsonArrayConst carray2 = array2;
CHECK(array1 != carray2);
@@ -347,7 +347,7 @@ TEST_CASE("Compare JsonArray with JsonArrayConst") {
}
TEST_CASE("Compare JsonArrayConst with JsonArrayConst") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with unbound") {
JsonArray array = doc.to<JsonArray>();
@@ -387,16 +387,16 @@ TEST_CASE("Compare JsonArrayConst with JsonArrayConst") {
}
SECTION("Compare with identical array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArrayConst carray1 = array1;
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello");
array2.createNestedObject();
array2.add<JsonObject>();
JsonArrayConst carray2 = array2;
CHECK(carray1 == carray2);
@@ -408,16 +408,16 @@ TEST_CASE("Compare JsonArrayConst with JsonArrayConst") {
}
SECTION("Compare with different array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello1");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArrayConst carray1 = array1;
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello2");
array2.createNestedObject();
array2.add<JsonObject>();
JsonArrayConst carray2 = array2;
CHECK(carray1 != carray2);
@@ -430,7 +430,7 @@ TEST_CASE("Compare JsonArrayConst with JsonArrayConst") {
}
TEST_CASE("Compare JsonArrayConst with JsonVariant") {
StaticJsonDocument<256> doc;
JsonDocument doc;
SECTION("Compare with self") {
JsonArray array = doc.to<JsonArray>();
@@ -455,16 +455,16 @@ TEST_CASE("Compare JsonArrayConst with JsonVariant") {
}
SECTION("Compare with identical array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArrayConst carray1 = array1;
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello");
array2.createNestedObject();
array2.add<JsonObject>();
JsonVariant variant2 = array2;
CHECK(carray1 == variant2);
@@ -483,16 +483,16 @@ TEST_CASE("Compare JsonArrayConst with JsonVariant") {
}
SECTION("Compare with different array") {
JsonArray array1 = doc.createNestedArray();
JsonArray array1 = doc.add<JsonArray>();
array1.add(1);
array1.add("hello1");
array1.createNestedObject();
array1.add<JsonObject>();
JsonArrayConst carray1 = array1;
JsonArray array2 = doc.createNestedArray();
JsonArray array2 = doc.add<JsonArray>();
array2.add(1);
array2.add("hello2");
array2.createNestedObject();
array2.add<JsonObject>();
JsonVariant variant2 = array2;
CHECK(carray1 != variant2);

View File

@@ -1,13 +1,15 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
#include "Allocators.hpp"
TEST_CASE("copyArray()") {
SECTION("int[] -> JsonArray") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
char json[32];
int source[] = {1, 2, 3};
@@ -20,7 +22,7 @@ TEST_CASE("copyArray()") {
}
SECTION("std::string[] -> JsonArray") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
char json[32];
std::string source[] = {"a", "b", "c"};
@@ -33,7 +35,7 @@ TEST_CASE("copyArray()") {
}
SECTION("const char*[] -> JsonArray") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
char json[32];
const char* source[] = {"a", "b", "c"};
@@ -46,7 +48,7 @@ TEST_CASE("copyArray()") {
}
SECTION("const char[][] -> JsonArray") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
char json[32];
char source[][2] = {"a", "b", "c"};
@@ -59,7 +61,7 @@ TEST_CASE("copyArray()") {
}
SECTION("const char[][] -> JsonDocument") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
char source[][2] = {"a", "b", "c"};
@@ -71,7 +73,7 @@ TEST_CASE("copyArray()") {
}
SECTION("const char[][] -> MemberProxy") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
char source[][2] = {"a", "b", "c"};
@@ -83,7 +85,7 @@ TEST_CASE("copyArray()") {
}
SECTION("int[] -> JsonDocument") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
int source[] = {1, 2, 3};
@@ -95,7 +97,7 @@ TEST_CASE("copyArray()") {
}
SECTION("int[] -> MemberProxy") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
int source[] = {1, 2, 3};
@@ -107,21 +109,16 @@ TEST_CASE("copyArray()") {
}
SECTION("int[] -> JsonArray, but not enough memory") {
const size_t SIZE = JSON_ARRAY_SIZE(2);
StaticJsonDocument<SIZE> doc;
JsonDocument doc(FailingAllocator::instance());
JsonArray array = doc.to<JsonArray>();
char json[32];
int source[] = {1, 2, 3};
bool ok = copyArray(source, array);
REQUIRE_FALSE(ok);
serializeJson(array, json);
CHECK(std::string("[1,2]") == json);
}
SECTION("int[][] -> JsonArray") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
char json[32];
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
@@ -134,7 +131,7 @@ TEST_CASE("copyArray()") {
}
SECTION("int[][] -> MemberProxy") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
@@ -146,7 +143,7 @@ TEST_CASE("copyArray()") {
}
SECTION("int[][] -> JsonDocument") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[32];
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
@@ -158,25 +155,16 @@ TEST_CASE("copyArray()") {
}
SECTION("int[][] -> JsonArray, but not enough memory") {
const size_t SIZE =
JSON_ARRAY_SIZE(2) + JSON_ARRAY_SIZE(3) + JSON_ARRAY_SIZE(2);
StaticJsonDocument<SIZE> doc;
JsonDocument doc(FailingAllocator::instance());
JsonArray array = doc.to<JsonArray>();
char json[32] = "";
int source[][3] = {{1, 2, 3}, {4, 5, 6}};
CAPTURE(SIZE);
bool ok = copyArray(source, array);
CAPTURE(doc.memoryUsage());
CHECK_FALSE(ok);
serializeJson(array, json);
CHECK(std::string("[[1,2,3],[4,5]]") == json);
REQUIRE(ok == false);
}
SECTION("JsonArray -> int[], with more space than needed") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[1,2,3]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -193,7 +181,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonArray -> int[], without enough space") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[1,2,3]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -208,7 +196,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonArray -> std::string[]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[\"a\",\"b\",\"c\"]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -225,7 +213,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonArray -> char[N][]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[\"a12345\",\"b123456\",\"c1234567\"]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -242,7 +230,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonDocument -> int[]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[1,2,3]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -258,7 +246,7 @@ TEST_CASE("copyArray()") {
}
SECTION("MemberProxy -> int[]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "{\"data\":[1,2,3]}";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -274,7 +262,7 @@ TEST_CASE("copyArray()") {
}
SECTION("ElementProxy -> int[]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[[1,2,3]]";
DeserializationError err = deserializeJson(doc, json);
CHECK(err == DeserializationError::Ok);
@@ -290,7 +278,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonArray -> int[][]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[[1,2],[3],[4]]";
DeserializationError err = deserializeJson(doc, json);
@@ -309,7 +297,7 @@ TEST_CASE("copyArray()") {
}
SECTION("JsonDocument -> int[][]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "[[1,2],[3],[4]]";
DeserializationError err = deserializeJson(doc, json);
@@ -327,7 +315,7 @@ TEST_CASE("copyArray()") {
}
SECTION("MemberProxy -> int[][]") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
char json[] = "{\"data\":[[1,2],[3],[4]]}";
DeserializationError err = deserializeJson(doc, json);

View File

@@ -1,21 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray basics") {
DynamicJsonDocument doc(4096);
JsonArray array = doc.to<JsonArray>();
SECTION("CreateNestedArray") {
JsonArray arr = array.createNestedArray();
REQUIRE(arr == array[0].as<JsonArray>());
}
SECTION("CreateNestedObject") {
JsonObject obj = array.createNestedObject();
REQUIRE(obj == array[0].as<JsonObject>());
}
}

View File

@@ -1,25 +1,22 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray::operator==()") {
DynamicJsonDocument doc1(4096);
JsonDocument doc1;
JsonArray array1 = doc1.to<JsonArray>();
JsonArrayConst array1c = array1;
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonArray array2 = doc2.to<JsonArray>();
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") {

View File

@@ -1,5 +1,5 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
@@ -12,25 +12,12 @@ TEST_CASE("JsonArray::isNull()") {
}
SECTION("returns false") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray arr = doc.to<JsonArray>();
REQUIRE(arr.isNull() == false);
}
}
TEST_CASE("JsonArrayConst::isNull()") {
SECTION("returns true") {
JsonArrayConst arr;
REQUIRE(arr.isNull() == true);
}
SECTION("returns false") {
DynamicJsonDocument doc(4096);
JsonArrayConst arr = doc.to<JsonArray>();
REQUIRE(arr.isNull() == false);
}
}
TEST_CASE("JsonArray::operator bool()") {
SECTION("returns false") {
JsonArray arr;
@@ -38,21 +25,8 @@ TEST_CASE("JsonArray::operator bool()") {
}
SECTION("returns true") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray arr = doc.to<JsonArray>();
REQUIRE(static_cast<bool>(arr) == true);
}
}
TEST_CASE("JsonArrayConst::operator bool()") {
SECTION("returns false") {
JsonArrayConst arr;
REQUIRE(static_cast<bool>(arr) == false);
}
SECTION("returns true") {
DynamicJsonDocument doc(4096);
JsonArrayConst arr = doc.to<JsonArray>();
REQUIRE(static_cast<bool>(arr) == true);
}
}

View File

@@ -1,35 +1,29 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
template <typename TArray>
static void run_iterator_test() {
StaticJsonDocument<JSON_ARRAY_SIZE(2)> doc;
JsonArray tmp = doc.to<JsonArray>();
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<int>());
REQUIRE(12 == static_cast<int>(*it));
++it;
REQUIRE(end != it);
REQUIRE(34 == it->template as<int>());
REQUIRE(34 == static_cast<int>(*it));
++it;
REQUIRE(end == it);
}
TEST_CASE("JsonArray::begin()/end()") {
SECTION("Non null JsonArray") {
run_iterator_test<JsonArray>();
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
array.add(12);
array.add(34);
auto it = array.begin();
auto end = array.end();
REQUIRE(end != it);
REQUIRE(12 == it->as<int>());
REQUIRE(12 == static_cast<int>(*it));
++it;
REQUIRE(end != it);
REQUIRE(34 == it->as<int>());
REQUIRE(34 == static_cast<int>(*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<JsonArrayConst>();
}
SECTION("Null JsonArrayConst") {
JsonArrayConst array;
REQUIRE(array.begin() == array.end());
}
}

View File

@@ -1,42 +0,0 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray::memoryUsage()") {
DynamicJsonDocument doc(4096);
JsonArray arr = doc.to<JsonArray>();
SECTION("return 0 if uninitialized") {
JsonArray unitialized;
REQUIRE(unitialized.memoryUsage() == 0);
}
SECTION("JSON_ARRAY_SIZE(0) if empty") {
REQUIRE(arr.memoryUsage() == JSON_ARRAY_SIZE(0));
}
SECTION("JSON_ARRAY_SIZE(1) after add") {
arr.add("hello");
REQUIRE(arr.memoryUsage() == JSON_ARRAY_SIZE(1));
}
SECTION("includes the size of the string") {
arr.add(std::string("hello"));
REQUIRE(arr.memoryUsage() == JSON_ARRAY_SIZE(1) + 6);
}
SECTION("includes the size of the nested array") {
JsonArray nested = arr.createNestedArray();
nested.add(42);
REQUIRE(arr.memoryUsage() == 2 * JSON_ARRAY_SIZE(1));
}
SECTION("includes the size of the nested arrect") {
JsonObject nested = arr.createNestedObject();
nested["hello"] = "world";
REQUIRE(arr.memoryUsage() == JSON_OBJECT_SIZE(1) + JSON_ARRAY_SIZE(1));
}
}

View File

@@ -1,12 +1,12 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray::nesting()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray arr = doc.to<JsonArray>();
SECTION("return 0 if uninitialized") {
@@ -24,12 +24,12 @@ TEST_CASE("JsonArray::nesting()") {
}
SECTION("returns 2 with nested array") {
arr.createNestedArray();
arr.add<JsonArray>();
REQUIRE(arr.nesting() == 2);
}
SECTION("returns 2 with nested object") {
arr.createNestedObject();
arr.add<JsonObject>();
REQUIRE(arr.nesting() == 2);
}
}

View File

@@ -1,12 +1,14 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
#include "Allocators.hpp"
TEST_CASE("JsonArray::remove()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
array.add(1);
array.add(2);
@@ -87,3 +89,23 @@ TEST_CASE("JsonArray::remove()") {
unboundArray.remove(unboundArray.begin());
}
}
TEST_CASE("Removed elements are recycled") {
SpyingAllocator spy;
JsonDocument doc(&spy);
JsonArray array = doc.to<JsonArray>();
// fill the pool entirely
for (int i = 0; i < ARDUINOJSON_POOL_CAPACITY; i++)
array.add(i);
// free one slot in the pool
array.remove(0);
// add one element; it should use the free slot
array.add(42);
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()), // only one pool
});
}

View File

@@ -1,12 +1,12 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonArray::size()") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
SECTION("returns 0 is empty") {

View File

@@ -1,5 +1,5 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
@@ -12,7 +12,7 @@ static void eraseString(std::string& str) {
}
TEST_CASE("std::string") {
DynamicJsonDocument doc(4096);
JsonDocument doc;
JsonArray array = doc.to<JsonArray>();
SECTION("add()") {

View File

@@ -1,13 +1,16 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
#include <stdint.h>
#include <catch.hpp>
#include "Allocators.hpp"
TEST_CASE("JsonArray::operator[]") {
DynamicJsonDocument doc(4096);
SpyingAllocator spy;
JsonDocument doc(&spy);
JsonArray array = doc.to<JsonArray>();
SECTION("Pad with null") {
@@ -65,7 +68,7 @@ TEST_CASE("JsonArray::operator[]") {
}
SECTION("nested array") {
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonArray arr2 = doc2.to<JsonArray>();
array[0] = arr2;
@@ -76,7 +79,7 @@ TEST_CASE("JsonArray::operator[]") {
}
SECTION("nested object") {
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonObject obj = doc2.to<JsonObject>();
array[0] = obj;
@@ -87,7 +90,7 @@ TEST_CASE("JsonArray::operator[]") {
}
SECTION("array subscript") {
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonArray arr2 = doc2.to<JsonArray>();
const char* str = "hello";
@@ -100,7 +103,7 @@ TEST_CASE("JsonArray::operator[]") {
SECTION("object subscript") {
const char* str = "hello";
DynamicJsonDocument doc2(4096);
JsonDocument doc2;
JsonObject obj = doc2.to<JsonObject>();
obj["x"] = str;
@@ -112,20 +115,25 @@ TEST_CASE("JsonArray::operator[]") {
SECTION("should not duplicate const char*") {
array[0] = "world";
const size_t expectedSize = JSON_ARRAY_SIZE(1);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
});
}
SECTION("should duplicate char*") {
array[0] = const_cast<char*>("world");
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(5);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("world")),
});
}
SECTION("should duplicate std::string") {
array[0] = std::string("world");
const size_t expectedSize = JSON_ARRAY_SIZE(1) + JSON_STRING_SIZE(5);
REQUIRE(expectedSize == doc.memoryUsage());
REQUIRE(spy.log() == AllocatorLog{
Allocate(sizeofPool()),
Allocate(sizeofString("world")),
});
}
SECTION("array[0].to<JsonObject>()") {
@@ -157,18 +165,3 @@ TEST_CASE("JsonArray::operator[]") {
}
#endif
}
TEST_CASE("JsonArrayConst::operator[]") {
DynamicJsonDocument doc(4096);
JsonArray array = doc.to<JsonArray>();
array.add(0);
SECTION("int") {
array[0] = 123;
JsonArrayConst carr = array;
REQUIRE(123 == carr[0].as<int>());
REQUIRE(true == carr[0].is<int>());
REQUIRE(false == carr[0].is<bool>());
}
}

View File

@@ -1,5 +1,5 @@
// ArduinoJson - https://arduinojson.org
// Copyright © 2014-2023, Benoit BLANCHON
// Copyright © 2014-2024, Benoit BLANCHON
// MIT License
#include <ArduinoJson.h>
@@ -19,14 +19,6 @@ TEST_CASE("Unbound JsonArray") {
REQUIRE(0 == array.size());
}
SECTION("CreateNestedArrayFails") {
REQUIRE(array.createNestedArray().isNull());
}
SECTION("CreateNestedObjectFails") {
REQUIRE(array.createNestedObject().isNull());
}
SECTION("PrintToWritesBrackets") {
char buffer[32];
serializeJson(array, buffer, sizeof(buffer));