forked from bblanchon/ArduinoJson
Added support for custom reader classes
This commit is contained in:
@ -72,6 +72,7 @@ if(MSVC)
|
||||
)
|
||||
endif()
|
||||
|
||||
include_directories(Helpers)
|
||||
add_subdirectory(ElementProxy)
|
||||
add_subdirectory(IntegrationTests)
|
||||
add_subdirectory(JsonArray)
|
||||
|
26
extras/tests/Helpers/CustomReader.hpp
Normal file
26
extras/tests/Helpers/CustomReader.hpp
Normal file
@ -0,0 +1,26 @@
|
||||
// ArduinoJson - arduinojson.org
|
||||
// Copyright Benoit Blanchon 2014-2019
|
||||
// MIT License
|
||||
|
||||
#pragma once
|
||||
|
||||
#include <sstream>
|
||||
|
||||
class CustomReader {
|
||||
std::stringstream _stream;
|
||||
|
||||
public:
|
||||
CustomReader(const char* input) : _stream(input) {}
|
||||
|
||||
int read() {
|
||||
return _stream.get();
|
||||
}
|
||||
|
||||
size_t readBytes(char* buffer, size_t length) {
|
||||
_stream.read(buffer, static_cast<std::streamsize>(length));
|
||||
return static_cast<size_t>(_stream.gcount());
|
||||
}
|
||||
|
||||
private:
|
||||
CustomReader(const CustomReader&);
|
||||
};
|
@ -6,6 +6,8 @@
|
||||
#include <catch.hpp>
|
||||
#include <sstream>
|
||||
|
||||
#include "CustomReader.hpp"
|
||||
|
||||
TEST_CASE("deserializeJson(const std::string&)") {
|
||||
DynamicJsonDocument doc(4096);
|
||||
|
||||
@ -113,3 +115,14 @@ TEST_CASE("deserializeJson(VLA)") {
|
||||
REQUIRE(err == DeserializationError::Ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_CASE("deserializeJson(CustomReader)") {
|
||||
DynamicJsonDocument doc(4096);
|
||||
CustomReader reader("[4,2]");
|
||||
DeserializationError err = deserializeJson(doc, reader);
|
||||
|
||||
REQUIRE(err == DeserializationError::Ok);
|
||||
REQUIRE(doc.size() == 2);
|
||||
REQUIRE(doc[0] == 4);
|
||||
REQUIRE(doc[1] == 2);
|
||||
}
|
||||
|
@ -2,15 +2,15 @@
|
||||
// Copyright Benoit Blanchon 2014-2019
|
||||
// MIT License
|
||||
|
||||
#include <ArduinoJson.h>
|
||||
#include <ArduinoJson/Deserialization/Reader.hpp>
|
||||
#include <catch.hpp>
|
||||
|
||||
using namespace ARDUINOJSON_NAMESPACE;
|
||||
|
||||
TEST_CASE("StdStreamReader") {
|
||||
TEST_CASE("Reader<std::istringstream>") {
|
||||
SECTION("read()") {
|
||||
std::istringstream src("\x01\xFF");
|
||||
StdStreamReader reader(src);
|
||||
Reader<std::istringstream> reader(src);
|
||||
|
||||
REQUIRE(reader.read() == 0x01);
|
||||
REQUIRE(reader.read() == 0xFF);
|
||||
@ -19,7 +19,7 @@ TEST_CASE("StdStreamReader") {
|
||||
|
||||
SECTION("readBytes() all at once") {
|
||||
std::istringstream src("ABC");
|
||||
StdStreamReader reader(src);
|
||||
Reader<std::istringstream> reader(src);
|
||||
|
||||
char buffer[8] = "abcd";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 3);
|
||||
@ -32,7 +32,7 @@ TEST_CASE("StdStreamReader") {
|
||||
|
||||
SECTION("readBytes() in two parts") {
|
||||
std::istringstream src("ABCDEF");
|
||||
StdStreamReader reader(src);
|
||||
Reader<std::istringstream> reader(src);
|
||||
|
||||
char buffer[12] = "abcdefg";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 4);
|
||||
@ -48,9 +48,9 @@ TEST_CASE("StdStreamReader") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("SafeCharPointerReader") {
|
||||
TEST_CASE("BoundedReader<const char*>") {
|
||||
SECTION("read") {
|
||||
SafeCharPointerReader reader("\x01\xFF", 2);
|
||||
BoundedReader<const char*> reader("\x01\xFF", 2);
|
||||
REQUIRE(reader.read() == 0x01);
|
||||
REQUIRE(reader.read() == 0xFF);
|
||||
REQUIRE(reader.read() == -1);
|
||||
@ -58,7 +58,7 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() all at once") {
|
||||
SafeCharPointerReader reader("ABCD", 3);
|
||||
BoundedReader<const char*> reader("ABCD", 3);
|
||||
|
||||
char buffer[8] = "abcd";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 3);
|
||||
@ -70,7 +70,7 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() in two parts") {
|
||||
SafeCharPointerReader reader("ABCDEF", 6);
|
||||
BoundedReader<const char*> reader("ABCDEF", 6);
|
||||
|
||||
char buffer[8] = "abcdefg";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 4);
|
||||
@ -86,9 +86,9 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("UnsafeCharPointerReader") {
|
||||
TEST_CASE("Reader<const char*>") {
|
||||
SECTION("read()") {
|
||||
UnsafeCharPointerReader reader("\x01\xFF\x00\x12");
|
||||
Reader<const char*> reader("\x01\xFF\x00\x12");
|
||||
REQUIRE(reader.read() == 0x01);
|
||||
REQUIRE(reader.read() == 0xFF);
|
||||
REQUIRE(reader.read() == 0);
|
||||
@ -96,7 +96,7 @@ TEST_CASE("UnsafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() all at once") {
|
||||
UnsafeCharPointerReader reader("ABCD");
|
||||
Reader<const char*> reader("ABCD");
|
||||
|
||||
char buffer[8] = "abcd";
|
||||
REQUIRE(reader.readBytes(buffer, 3) == 3);
|
||||
@ -108,7 +108,7 @@ TEST_CASE("UnsafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() in two parts") {
|
||||
UnsafeCharPointerReader reader("ABCDEF");
|
||||
Reader<const char*> reader("ABCDEF");
|
||||
|
||||
char buffer[8] = "abcdefg";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 4);
|
||||
|
@ -86,11 +86,11 @@ TEST_CASE("memcpy_P") {
|
||||
CHECK(dst[3] == 0);
|
||||
}
|
||||
|
||||
TEST_CASE("SafeCharPointerReader") {
|
||||
using ARDUINOJSON_NAMESPACE::SafeFlashStringReader;
|
||||
TEST_CASE("BoundedReader<const __FlashStringHelper*>") {
|
||||
using namespace ARDUINOJSON_NAMESPACE;
|
||||
|
||||
SECTION("read") {
|
||||
SafeFlashStringReader reader(F("\x01\xFF"), 2);
|
||||
BoundedReader<const __FlashStringHelper*> reader(F("\x01\xFF"), 2);
|
||||
REQUIRE(reader.read() == 0x01);
|
||||
REQUIRE(reader.read() == 0xFF);
|
||||
REQUIRE(reader.read() == -1);
|
||||
@ -98,7 +98,7 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() all at once") {
|
||||
SafeFlashStringReader reader(F("ABCD"), 3);
|
||||
BoundedReader<const __FlashStringHelper*> reader(F("ABCD"), 3);
|
||||
|
||||
char buffer[8] = "abcd";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 3);
|
||||
@ -110,7 +110,7 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() in two parts") {
|
||||
SafeFlashStringReader reader(F("ABCDEF"), 6);
|
||||
BoundedReader<const __FlashStringHelper*> reader(F("ABCDEF"), 6);
|
||||
|
||||
char buffer[8] = "abcdefg";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 4);
|
||||
@ -126,11 +126,11 @@ TEST_CASE("SafeCharPointerReader") {
|
||||
}
|
||||
}
|
||||
|
||||
TEST_CASE("UnsafeFlashStringReader") {
|
||||
using ARDUINOJSON_NAMESPACE::UnsafeFlashStringReader;
|
||||
TEST_CASE("Reader<const __FlashStringHelper*>") {
|
||||
using namespace ARDUINOJSON_NAMESPACE;
|
||||
|
||||
SECTION("read()") {
|
||||
UnsafeFlashStringReader reader(F("\x01\xFF\x00\x12"));
|
||||
Reader<const __FlashStringHelper*> reader(F("\x01\xFF\x00\x12"));
|
||||
REQUIRE(reader.read() == 0x01);
|
||||
REQUIRE(reader.read() == 0xFF);
|
||||
REQUIRE(reader.read() == 0);
|
||||
@ -138,7 +138,7 @@ TEST_CASE("UnsafeFlashStringReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() all at once") {
|
||||
UnsafeFlashStringReader reader(F("ABCD"));
|
||||
Reader<const __FlashStringHelper*> reader(F("ABCD"));
|
||||
|
||||
char buffer[8] = "abcd";
|
||||
REQUIRE(reader.readBytes(buffer, 3) == 3);
|
||||
@ -150,7 +150,7 @@ TEST_CASE("UnsafeFlashStringReader") {
|
||||
}
|
||||
|
||||
SECTION("readBytes() in two parts") {
|
||||
UnsafeFlashStringReader reader(F("ABCDEF"));
|
||||
Reader<const __FlashStringHelper*> reader(F("ABCDEF"));
|
||||
|
||||
char buffer[8] = "abcdefg";
|
||||
REQUIRE(reader.readBytes(buffer, 4) == 4);
|
||||
|
@ -5,6 +5,8 @@
|
||||
#include <ArduinoJson.h>
|
||||
#include <catch.hpp>
|
||||
|
||||
#include "CustomReader.hpp"
|
||||
|
||||
TEST_CASE("deserializeMsgPack(const std::string&)") {
|
||||
DynamicJsonDocument doc(4096);
|
||||
|
||||
@ -80,3 +82,14 @@ TEST_CASE("deserializeMsgPack(VLA)") {
|
||||
REQUIRE(err == DeserializationError::Ok);
|
||||
}
|
||||
#endif
|
||||
|
||||
TEST_CASE("deserializeMsgPack(CustomReader)") {
|
||||
DynamicJsonDocument doc(4096);
|
||||
CustomReader reader("\x92\xA5Hello\xA5world");
|
||||
DeserializationError err = deserializeMsgPack(doc, reader);
|
||||
|
||||
REQUIRE(err == DeserializationError::Ok);
|
||||
REQUIRE(doc.size() == 2);
|
||||
REQUIRE(doc[0] == "Hello");
|
||||
REQUIRE(doc[1] == "world");
|
||||
}
|
||||
|
Reference in New Issue
Block a user