forked from bblanchon/ArduinoJson
Fix VLA support in JsonDocument::set()
This commit is contained in:
@ -5,6 +5,7 @@ HEAD
|
|||||||
----
|
----
|
||||||
|
|
||||||
* Forbid `deserializeJson(JsonArray|JsonObject, ...)` (issue #2135)
|
* Forbid `deserializeJson(JsonArray|JsonObject, ...)` (issue #2135)
|
||||||
|
* Fix VLA support in `JsonDocument::set()`
|
||||||
|
|
||||||
v7.2.0 (2024-09-18)
|
v7.2.0 (2024-09-18)
|
||||||
------
|
------
|
||||||
|
@ -16,6 +16,7 @@ add_executable(JsonDocumentTests
|
|||||||
nesting.cpp
|
nesting.cpp
|
||||||
overflowed.cpp
|
overflowed.cpp
|
||||||
remove.cpp
|
remove.cpp
|
||||||
|
set.cpp
|
||||||
shrinkToFit.cpp
|
shrinkToFit.cpp
|
||||||
size.cpp
|
size.cpp
|
||||||
subscript.cpp
|
subscript.cpp
|
||||||
|
79
extras/tests/JsonDocument/set.cpp
Normal file
79
extras/tests/JsonDocument/set.cpp
Normal file
@ -0,0 +1,79 @@
|
|||||||
|
#define ARDUINOJSON_ENABLE_ARDUINO_STRING 1
|
||||||
|
#define ARDUINOJSON_ENABLE_PROGMEM 1
|
||||||
|
#include <ArduinoJson.h>
|
||||||
|
|
||||||
|
#include <catch.hpp>
|
||||||
|
|
||||||
|
#include "Allocators.hpp"
|
||||||
|
#include "Literals.hpp"
|
||||||
|
|
||||||
|
TEST_CASE("JsonDocument::set()") {
|
||||||
|
SpyingAllocator spy;
|
||||||
|
JsonDocument doc(&spy);
|
||||||
|
|
||||||
|
SECTION("integer") {
|
||||||
|
doc.set(42);
|
||||||
|
|
||||||
|
REQUIRE(doc.as<std::string>() == "42");
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{});
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("const char*") {
|
||||||
|
doc.set("example");
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{});
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("std::string") {
|
||||||
|
doc.set("example"_s);
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{
|
||||||
|
Allocate(sizeofString("example")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("char*") {
|
||||||
|
char value[] = "example";
|
||||||
|
doc.set(value);
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{
|
||||||
|
Allocate(sizeofString("example")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("Arduino String") {
|
||||||
|
doc.set(String("example"));
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{
|
||||||
|
Allocate(sizeofString("example")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
SECTION("Flash string") {
|
||||||
|
doc.set(F("example"));
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{
|
||||||
|
Allocate(sizeofString("example")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
|
||||||
|
#ifdef HAS_VARIABLE_LENGTH_ARRAY
|
||||||
|
SECTION("VLA") {
|
||||||
|
size_t i = 16;
|
||||||
|
char vla[i];
|
||||||
|
strcpy(vla, "example");
|
||||||
|
|
||||||
|
doc.set(vla);
|
||||||
|
|
||||||
|
REQUIRE(doc.as<const char*>() == "example"_s);
|
||||||
|
REQUIRE(spy.log() == AllocatorLog{
|
||||||
|
Allocate(sizeofString("example")),
|
||||||
|
});
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
}
|
@ -142,6 +142,13 @@ class JsonDocument : public detail::VariantOperators<const JsonDocument&> {
|
|||||||
return to<JsonVariant>().set(src);
|
return to<JsonVariant>().set(src);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Replaces the root with the specified value.
|
||||||
|
// https://arduinojson.org/v7/api/jsondocument/set/
|
||||||
|
template <typename TChar>
|
||||||
|
bool set(TChar* src) {
|
||||||
|
return to<JsonVariant>().set(src);
|
||||||
|
}
|
||||||
|
|
||||||
// Clears the document and converts it to the specified type.
|
// Clears the document and converts it to the specified type.
|
||||||
// https://arduinojson.org/v7/api/jsondocument/to/
|
// https://arduinojson.org/v7/api/jsondocument/to/
|
||||||
template <typename T>
|
template <typename T>
|
||||||
|
Reference in New Issue
Block a user