mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	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