mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	
		
			
				
	
	
		
			228 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			228 lines
		
	
	
		
			5.6 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
| // ArduinoJson - https://arduinojson.org
 | |
| // Copyright © 2014-2023, Benoit BLANCHON
 | |
| // MIT License
 | |
| 
 | |
| #include <Arduino.h>
 | |
| #include <ArduinoJson.hpp>
 | |
| #include <catch.hpp>
 | |
| 
 | |
| #include <sstream>
 | |
| 
 | |
| using namespace ArduinoJson::detail;
 | |
| 
 | |
| TEST_CASE("Reader<std::istringstream>") {
 | |
|   SECTION("read()") {
 | |
|     std::istringstream src("\x01\xFF");
 | |
|     Reader<std::istringstream> reader(src);
 | |
| 
 | |
|     REQUIRE(reader.read() == 0x01);
 | |
|     REQUIRE(reader.read() == 0xFF);
 | |
|     REQUIRE(reader.read() == -1);
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() all at once") {
 | |
|     std::istringstream src("ABC");
 | |
|     Reader<std::istringstream> reader(src);
 | |
| 
 | |
|     char buffer[8] = "abcd";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 3);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'd');
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() in two parts") {
 | |
|     std::istringstream src("ABCDEF");
 | |
|     Reader<std::istringstream> reader(src);
 | |
| 
 | |
|     char buffer[12] = "abcdefg";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 4);
 | |
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'D');
 | |
|     REQUIRE(buffer[4] == 'E');
 | |
|     REQUIRE(buffer[5] == 'F');
 | |
|     REQUIRE(buffer[6] == 'g');
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_CASE("BoundedReader<const char*>") {
 | |
|   SECTION("read") {
 | |
|     BoundedReader<const char*> reader("\x01\xFF", 2);
 | |
|     REQUIRE(reader.read() == 0x01);
 | |
|     REQUIRE(reader.read() == 0xFF);
 | |
|     REQUIRE(reader.read() == -1);
 | |
|     REQUIRE(reader.read() == -1);
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() all at once") {
 | |
|     BoundedReader<const char*> reader("ABCD", 3);
 | |
| 
 | |
|     char buffer[8] = "abcd";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 3);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'd');
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() in two parts") {
 | |
|     BoundedReader<const char*> reader("ABCDEF", 6);
 | |
| 
 | |
|     char buffer[8] = "abcdefg";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 4);
 | |
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'D');
 | |
|     REQUIRE(buffer[4] == 'E');
 | |
|     REQUIRE(buffer[5] == 'F');
 | |
|     REQUIRE(buffer[6] == 'g');
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_CASE("Reader<const char*>") {
 | |
|   SECTION("read()") {
 | |
|     Reader<const char*> reader("\x01\xFF\x00\x12");
 | |
|     REQUIRE(reader.read() == 0x01);
 | |
|     REQUIRE(reader.read() == 0xFF);
 | |
|     REQUIRE(reader.read() == 0);
 | |
|     REQUIRE(reader.read() == 0x12);
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() all at once") {
 | |
|     Reader<const char*> reader("ABCD");
 | |
| 
 | |
|     char buffer[8] = "abcd";
 | |
|     REQUIRE(reader.readBytes(buffer, 3) == 3);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'd');
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() in two parts") {
 | |
|     Reader<const char*> reader("ABCDEF");
 | |
| 
 | |
|     char buffer[8] = "abcdefg";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 4);
 | |
|     REQUIRE(reader.readBytes(buffer + 4, 2) == 2);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'D');
 | |
|     REQUIRE(buffer[4] == 'E');
 | |
|     REQUIRE(buffer[5] == 'F');
 | |
|     REQUIRE(buffer[6] == 'g');
 | |
|   }
 | |
| }
 | |
| 
 | |
| TEST_CASE("IteratorReader") {
 | |
|   SECTION("read()") {
 | |
|     std::string src("\x01\xFF");
 | |
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end());
 | |
| 
 | |
|     REQUIRE(reader.read() == 0x01);
 | |
|     REQUIRE(reader.read() == 0xFF);
 | |
|     REQUIRE(reader.read() == -1);
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() all at once") {
 | |
|     std::string src("ABC");
 | |
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end());
 | |
| 
 | |
|     char buffer[8] = "abcd";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 3);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'd');
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() in two parts") {
 | |
|     std::string src("ABCDEF");
 | |
|     IteratorReader<std::string::const_iterator> reader(src.begin(), src.end());
 | |
| 
 | |
|     char buffer[12] = "abcdefg";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 4);
 | |
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'D');
 | |
|     REQUIRE(buffer[4] == 'E');
 | |
|     REQUIRE(buffer[5] == 'F');
 | |
|     REQUIRE(buffer[6] == 'g');
 | |
|   }
 | |
| }
 | |
| 
 | |
| class StreamStub : public Stream {
 | |
|  public:
 | |
|   StreamStub(const char* s) : stream_(s) {}
 | |
| 
 | |
|   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:
 | |
|   std::istringstream stream_;
 | |
| };
 | |
| 
 | |
| TEST_CASE("Reader<Stream>") {
 | |
|   SECTION("read()") {
 | |
|     StreamStub src("\x01\xFF");
 | |
|     Reader<StreamStub> reader(src);
 | |
| 
 | |
|     REQUIRE(reader.read() == 0x01);
 | |
|     REQUIRE(reader.read() == 0xFF);
 | |
|     REQUIRE(reader.read() == -1);
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() all at once") {
 | |
|     StreamStub src("ABC");
 | |
|     Reader<StreamStub> reader(src);
 | |
| 
 | |
|     char buffer[8] = "abcd";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 3);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'd');
 | |
|   }
 | |
| 
 | |
|   SECTION("readBytes() in two parts") {
 | |
|     StreamStub src("ABCDEF");
 | |
|     Reader<StreamStub> reader(src);
 | |
| 
 | |
|     char buffer[12] = "abcdefg";
 | |
|     REQUIRE(reader.readBytes(buffer, 4) == 4);
 | |
|     REQUIRE(reader.readBytes(buffer + 4, 4) == 2);
 | |
| 
 | |
|     REQUIRE(buffer[0] == 'A');
 | |
|     REQUIRE(buffer[1] == 'B');
 | |
|     REQUIRE(buffer[2] == 'C');
 | |
|     REQUIRE(buffer[3] == 'D');
 | |
|     REQUIRE(buffer[4] == 'E');
 | |
|     REQUIRE(buffer[5] == 'F');
 | |
|     REQUIRE(buffer[6] == 'g');
 | |
|   }
 | |
| }
 |