| 
									
										
										
										
											2021-03-29 17:14:01 +02:00
										 |  |  | // ArduinoJson - https://arduinojson.org
 | 
					
						
							| 
									
										
										
										
											2024-01-03 08:47:06 +01:00
										 |  |  | // Copyright © 2014-2024, Benoit BLANCHON
 | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ArduinoJson.h>
 | 
					
						
							|  |  |  | #include <stdint.h>
 | 
					
						
							|  |  |  | #include <catch.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-23 18:36:24 +02:00
										 |  |  | #include "Allocators.hpp"
 | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  | #include "Literals.hpp"
 | 
					
						
							| 
									
										
										
										
											2024-05-23 18:36:24 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-08-09 10:57:52 +02:00
										 |  |  | TEST_CASE("JsonVariant::add(T)") { | 
					
						
							| 
									
										
										
										
											2023-07-17 18:15:13 +02:00
										 |  |  |   JsonDocument doc; | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  |   JsonVariant var = doc.to<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-10 08:40:02 +02:00
										 |  |  |   SECTION("add integer to new variant") { | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  |     var.add(42); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(var.as<std::string>() == "[42]"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-10 08:40:02 +02:00
										 |  |  |   SECTION("add const char* to new variant") { | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  |     var.add("hello"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(var.as<std::string>() == "[\"hello\"]"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-09-10 08:40:02 +02:00
										 |  |  |   SECTION("add std::string to new variant") { | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |     var.add("hello"_s); | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(var.as<std::string>() == "[\"hello\"]"); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2021-09-10 08:40:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   SECTION("add integer to integer") { | 
					
						
							|  |  |  |     var.set(123); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var.add(456);  // no-op
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(var.as<std::string>() == "123"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("add integer to object") { | 
					
						
							|  |  |  |     var["val"] = 123; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     var.add(456);  // no-op
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(var.as<std::string>() == "{\"val\":123}"); | 
					
						
							|  |  |  |   } | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-08-09 10:57:52 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_CASE("JsonVariant::add<T>()") { | 
					
						
							|  |  |  |   JsonDocument doc; | 
					
						
							|  |  |  |   JsonVariant var = doc.to<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("JsonArray") { | 
					
						
							|  |  |  |     JsonArray array = var.add<JsonArray>(); | 
					
						
							|  |  |  |     array.add(1); | 
					
						
							|  |  |  |     array.add(2); | 
					
						
							|  |  |  |     REQUIRE(doc.as<std::string>() == "[[1,2]]"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("JsonVariant") { | 
					
						
							|  |  |  |     JsonVariant variant = var.add<JsonVariant>(); | 
					
						
							|  |  |  |     variant.set(42); | 
					
						
							|  |  |  |     REQUIRE(doc.as<std::string>() == "[42]"); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } | 
					
						
							| 
									
										
										
										
											2024-05-23 18:36:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_CASE("JsonObject::add(JsonObject) ") { | 
					
						
							|  |  |  |   JsonDocument doc1; | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |   doc1["hello"_s] = "world"_s; | 
					
						
							| 
									
										
										
										
											2024-05-23 18:36:24 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   TimebombAllocator allocator(10); | 
					
						
							|  |  |  |   SpyingAllocator spy(&allocator); | 
					
						
							|  |  |  |   JsonDocument doc2(&spy); | 
					
						
							|  |  |  |   JsonVariant variant = doc2.to<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("success") { | 
					
						
							|  |  |  |     bool result = variant.add(doc1.as<JsonObject>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(result == true); | 
					
						
							|  |  |  |     REQUIRE(doc2.as<std::string>() == "[{\"hello\":\"world\"}]"); | 
					
						
							|  |  |  |     REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							|  |  |  |                              Allocate(sizeofPool()), | 
					
						
							|  |  |  |                              Allocate(sizeofString("hello")), | 
					
						
							|  |  |  |                              Allocate(sizeofString("world")), | 
					
						
							|  |  |  |                          }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("partial failure") {  // issue #2081
 | 
					
						
							|  |  |  |     allocator.setCountdown(2); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool result = variant.add(doc1.as<JsonObject>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(result == false); | 
					
						
							|  |  |  |     REQUIRE(doc2.as<std::string>() == "[]"); | 
					
						
							|  |  |  |     REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							|  |  |  |                              Allocate(sizeofPool()), | 
					
						
							|  |  |  |                              Allocate(sizeofString("hello")), | 
					
						
							|  |  |  |                              AllocateFail(sizeofString("world")), | 
					
						
							|  |  |  |                              Deallocate(sizeofString("hello")), | 
					
						
							|  |  |  |                          }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("complete failure") { | 
					
						
							|  |  |  |     allocator.setCountdown(0); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     bool result = variant.add(doc1.as<JsonObject>()); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(result == false); | 
					
						
							|  |  |  |     REQUIRE(doc2.as<std::string>() == "[]"); | 
					
						
							|  |  |  |     REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							|  |  |  |                              AllocateFail(sizeofPool()), | 
					
						
							|  |  |  |                          }); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | } |