mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Fix filter not working in zero-copy mode (fixes #1697)
This commit is contained in:
		| @@ -5,6 +5,7 @@ HEAD | |||||||
| ---- | ---- | ||||||
|  |  | ||||||
| * Fix crash when adding an object member in a too small `JsonDocument` | * Fix crash when adding an object member in a too small `JsonDocument` | ||||||
|  | * Fix filter not working in zero-copy mode (issue #1697) | ||||||
|  |  | ||||||
| v6.19.0 (2022-01-08) | v6.19.0 (2022-01-08) | ||||||
| ------- | ------- | ||||||
|   | |||||||
| @@ -667,6 +667,20 @@ TEST_CASE("Filtering") { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Zero-copy mode") {  // issue #1697 | ||||||
|  |   char input[] = "{\"include\":42,\"exclude\":666}"; | ||||||
|  |  | ||||||
|  |   StaticJsonDocument<256> filter; | ||||||
|  |   filter["include"] = true; | ||||||
|  |  | ||||||
|  |   StaticJsonDocument<256> doc; | ||||||
|  |   DeserializationError err = | ||||||
|  |       deserializeJson(doc, input, DeserializationOption::Filter(filter)); | ||||||
|  |  | ||||||
|  |   REQUIRE(err == DeserializationError::Ok); | ||||||
|  |   CHECK(doc.as<std::string>() == "{\"include\":42}"); | ||||||
|  | } | ||||||
|  |  | ||||||
| TEST_CASE("Overloads") { | TEST_CASE("Overloads") { | ||||||
|   StaticJsonDocument<256> doc; |   StaticJsonDocument<256> doc; | ||||||
|   StaticJsonDocument<256> filter; |   StaticJsonDocument<256> filter; | ||||||
|   | |||||||
| @@ -279,6 +279,22 @@ TEST_CASE("deserialize JSON object") { | |||||||
|       REQUIRE(err == DeserializationError::Ok); |       REQUIRE(err == DeserializationError::Ok); | ||||||
|       REQUIRE(doc["a"] == 2); |       REQUIRE(doc["a"] == 2); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|  |     SECTION("Repeated key with zero copy mode") {  // issue #1697 | ||||||
|  |       char input[] = "{a:{b:{c:1}},a:2}"; | ||||||
|  |       DeserializationError err = deserializeJson(doc, input); | ||||||
|  |  | ||||||
|  |       REQUIRE(err == DeserializationError::Ok); | ||||||
|  |       REQUIRE(doc["a"] == 2); | ||||||
|  |     } | ||||||
|  |  | ||||||
|  |     SECTION("NUL in keys") {  // we don't support NULs in keys | ||||||
|  |       DeserializationError err = | ||||||
|  |           deserializeJson(doc, "{\"x\\u0000a\":1,\"x\\u0000b\":2}"); | ||||||
|  |  | ||||||
|  |       REQUIRE(err == DeserializationError::Ok); | ||||||
|  |       REQUIRE(doc.as<std::string>() == "{\"x\":2}"); | ||||||
|  |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("Should clear the JsonObject") { |   SECTION("Should clear the JsonObject") { | ||||||
|   | |||||||
| @@ -1027,6 +1027,20 @@ TEST_CASE("deserializeMsgPack() filter") { | |||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("Zero-copy mode") {  // issue #1697 | ||||||
|  |   char input[] = "\x82\xA7include\x01\xA6ignore\x02"; | ||||||
|  |  | ||||||
|  |   StaticJsonDocument<256> filter; | ||||||
|  |   filter["include"] = true; | ||||||
|  |  | ||||||
|  |   StaticJsonDocument<256> doc; | ||||||
|  |   DeserializationError err = | ||||||
|  |       deserializeMsgPack(doc, input, 18, DeserializationOption::Filter(filter)); | ||||||
|  |  | ||||||
|  |   CHECK(err == DeserializationError::Ok); | ||||||
|  |   CHECK(doc.as<std::string>() == "{\"include\":1}"); | ||||||
|  | } | ||||||
|  |  | ||||||
| TEST_CASE("Overloads") { | TEST_CASE("Overloads") { | ||||||
|   StaticJsonDocument<256> doc; |   StaticJsonDocument<256> doc; | ||||||
|   StaticJsonDocument<256> filter; |   StaticJsonDocument<256> filter; | ||||||
|   | |||||||
| @@ -18,7 +18,6 @@ class StringMover { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   FORCE_INLINE String save() { |   FORCE_INLINE String save() { | ||||||
|     _writePtr[0] = 0;  // terminator |  | ||||||
|     String s = str(); |     String s = str(); | ||||||
|     _writePtr++; |     _writePtr++; | ||||||
|     return s; |     return s; | ||||||
| @@ -33,6 +32,7 @@ class StringMover { | |||||||
|   } |   } | ||||||
|  |  | ||||||
|   String str() const { |   String str() const { | ||||||
|  |     _writePtr[0] = 0;  // terminator | ||||||
|     return String(_startPtr, size(), true); |     return String(_startPtr, size(), true); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user