| 
									
										
										
										
											2021-03-29 17:14:01 +02:00
										 |  |  | // ArduinoJson - https://arduinojson.org
 | 
					
						
							| 
									
										
										
										
											2023-02-16 11:45:01 +01:00
										 |  |  | // Copyright © 2014-2023, Benoit BLANCHON
 | 
					
						
							| 
									
										
										
										
											2014-10-23 23:39:22 +02:00
										 |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-11 16:54:46 +01:00
										 |  |  | #include <ArduinoJson.h>
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  | #include <catch.hpp>
 | 
					
						
							|  |  |  | #include <string>
 | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2022-08-09 16:52:17 +02:00
										 |  |  | static void checkObject(const JsonObject obj, const std::string& expected) { | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   char actual[256]; | 
					
						
							| 
									
										
										
										
											2021-04-29 20:59:15 +02:00
										 |  |  |   memset(actual, '!', sizeof(actual)); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-01 09:24:58 +01:00
										 |  |  |   size_t actualLen = serializeJson(obj, actual); | 
					
						
							|  |  |  |   size_t measuredLen = measureJson(obj); | 
					
						
							| 
									
										
										
										
											2014-10-23 19:54:00 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   REQUIRE(expected.size() == measuredLen); | 
					
						
							| 
									
										
										
										
											2021-04-29 20:59:15 +02:00
										 |  |  |   REQUIRE(expected.size() == actualLen); | 
					
						
							|  |  |  |   REQUIRE(actual[actualLen] == 0);  // serializeJson() adds a null terminator
 | 
					
						
							|  |  |  |   REQUIRE(expected == actual); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2018-03-01 09:24:58 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_CASE("serializeJson(JsonObject)") { | 
					
						
							| 
									
										
										
										
											2023-03-20 10:49:01 +01:00
										 |  |  |   JsonDocument doc(4096); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |   JsonObject obj = doc.to<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("EmptyObject") { | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("TwoStrings") { | 
					
						
							|  |  |  |     obj["key1"] = "value1"; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["key2"] = "value2"; | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"key1\":\"value1\",\"key2\":\"value2\"}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("RemoveFirst") { | 
					
						
							|  |  |  |     obj["key1"] = "value1"; | 
					
						
							|  |  |  |     obj["key2"] = "value2"; | 
					
						
							|  |  |  |     obj.remove("key1"); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"key2\":\"value2\"}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("RemoveLast") { | 
					
						
							|  |  |  |     obj["key1"] = "value1"; | 
					
						
							|  |  |  |     obj["key2"] = "value2"; | 
					
						
							|  |  |  |     obj.remove("key2"); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"key1\":\"value1\"}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("RemoveUnexistingKey") { | 
					
						
							|  |  |  |     obj["key1"] = "value1"; | 
					
						
							|  |  |  |     obj["key2"] = "value2"; | 
					
						
							|  |  |  |     obj.remove("key3"); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"key1\":\"value1\",\"key2\":\"value2\"}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("ReplaceExistingKey") { | 
					
						
							|  |  |  |     obj["key"] = "value1"; | 
					
						
							|  |  |  |     obj["key"] = "value2"; | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"key\":\"value2\"}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("TwoIntegers") { | 
					
						
							|  |  |  |     obj["a"] = 1; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["b"] = 2; | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":1,\"b\":2}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-12 09:08:20 +02:00
										 |  |  |   SECTION("serialized(const char*)") { | 
					
						
							|  |  |  |     obj["a"] = serialized("[1,2]"); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["b"] = serialized("[4,5]"); | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":[1,2],\"b\":[4,5]}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-04-16 16:15:01 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-05-20 09:06:53 +02:00
										 |  |  |   SECTION("Two doubles") { | 
					
						
							|  |  |  |     obj["a"] = 12.34; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["b"] = 56.78; | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":12.34,\"b\":56.78}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("TwoNull") { | 
					
						
							| 
									
										
										
										
											2022-08-09 16:52:17 +02:00
										 |  |  |     obj["a"] = static_cast<char*>(0); | 
					
						
							|  |  |  |     obj["b"] = static_cast<char*>(0); | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":null,\"b\":null}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("TwoBooleans") { | 
					
						
							|  |  |  |     obj["a"] = true; | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["b"] = false; | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":true,\"b\":false}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("ThreeNestedArrays") { | 
					
						
							| 
									
										
										
										
											2023-03-20 10:49:01 +01:00
										 |  |  |     JsonDocument b(4096); | 
					
						
							|  |  |  |     JsonDocument c(4096); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |     obj.createNestedArray("a"); | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  |     obj["b"] = b.to<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["c"] = c.to<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":[],\"b\":[],\"c\":[]}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   SECTION("ThreeNestedObjects") { | 
					
						
							| 
									
										
										
										
											2023-03-20 10:49:01 +01:00
										 |  |  |     JsonDocument b(4096); | 
					
						
							|  |  |  |     JsonDocument c(4096); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |     obj.createNestedObject("a"); | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  |     obj["b"] = b.to<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2018-10-18 14:51:02 +02:00
										 |  |  |     obj["c"] = c.to<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2014-10-16 16:23:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2019-12-24 16:41:00 +01:00
										 |  |  |     checkObject(obj, "{\"a\":{},\"b\":{},\"c\":{}}"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-10-23 23:45:36 +02:00
										 |  |  | } |