| 
									
										
										
										
											2021-03-29 17:14:01 +02:00
										 |  |  | // ArduinoJson - https://arduinojson.org
 | 
					
						
							| 
									
										
										
										
											2025-02-24 15:18:26 +01:00
										 |  |  | // Copyright © 2014-2025, Benoit BLANCHON
 | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ArduinoJson.h>
 | 
					
						
							|  |  |  | #include <catch.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  | #include "Allocators.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2025-06-02 19:39:08 +02:00
										 |  |  | using namespace ArduinoJson::detail; | 
					
						
							| 
									
										
										
										
											2023-03-29 19:18:06 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  | TEST_CASE("deserialize JSON array") { | 
					
						
							| 
									
										
										
										
											2023-07-25 14:53:54 +02:00
										 |  |  |   SpyingAllocator spy; | 
					
						
							|  |  |  |   JsonDocument doc(&spy); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |   SECTION("An empty array") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |     DeserializationError err = deserializeJson(doc, "[]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |     JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |     REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  |     REQUIRE(0 == arr.size()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |   SECTION("Spaces") { | 
					
						
							|  |  |  |     SECTION("Before the opening bracket") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "  []"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(0 == arr.size()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Before first value") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[ \t\r\n42]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(1 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == 42); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("After first value") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[42 \t\r\n]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(1 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == 42); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |   SECTION("Values types") { | 
					
						
							|  |  |  |     SECTION("On integer") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[42]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(1 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == 42); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Two integers") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[42,84]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == 42); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == 84); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-09-04 14:33:14 +02:00
										 |  |  |     SECTION("Float") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[4.2,1e2]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							| 
									
										
										
										
											2024-09-04 14:33:14 +02:00
										 |  |  |       REQUIRE(arr[0].as<float>() == Approx(4.2f)); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == 1e2f); | 
					
						
							|  |  |  |       REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							|  |  |  |                                Allocate(sizeofPool()), | 
					
						
							|  |  |  |                                Reallocate(sizeofPool(), sizeofPool(2)), | 
					
						
							|  |  |  |                            }); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("Double") { | 
					
						
							|  |  |  |       DeserializationError err = deserializeJson(doc, "[4.2123456,-7E89]"); | 
					
						
							|  |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							|  |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0].as<double>() == Approx(4.2123456)); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == -7E89); | 
					
						
							|  |  |  |       REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							| 
									
										
										
										
											2025-06-02 19:39:08 +02:00
										 |  |  |                                Allocate(sizeofPool<VariantData>()), | 
					
						
							|  |  |  |                                Allocate(sizeofPool<EightByteValue>()), | 
					
						
							|  |  |  |                                Reallocate(sizeofPool<VariantData>(), | 
					
						
							|  |  |  |                                           sizeofPool<VariantData>(2)), | 
					
						
							|  |  |  |                                Reallocate(sizeofPool<EightByteValue>(), | 
					
						
							|  |  |  |                                           sizeofPool<EightByteValue>(2)), | 
					
						
							| 
									
										
										
										
											2024-09-04 14:33:14 +02:00
										 |  |  |                            }); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Unsigned long") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[4294967295]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(1 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == 4294967295UL); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Boolean") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[true,false]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == true); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == false); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Null") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[null,null]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							| 
									
										
										
										
											2021-03-08 09:58:09 +01:00
										 |  |  |       REQUIRE(arr[0].as<const char*>() == 0); | 
					
						
							|  |  |  |       REQUIRE(arr[1].as<const char*>() == 0); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |   SECTION("Quotes") { | 
					
						
							|  |  |  |     SECTION("Double quotes") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = | 
					
						
							|  |  |  |           deserializeJson(doc, "[ \"hello\" , \"world\" ]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == "hello"); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == "world"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Single quotes") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[ 'hello' , 'world' ]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == "hello"); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == "world"); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("No quotes") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[ hello , world ]"); | 
					
						
							| 
									
										
										
										
											2018-07-04 11:57:30 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::InvalidInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("Double quotes (empty strings)") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[\"\",\"\"]"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == ""); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == ""); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Single quotes (empty strings)") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[\'\',\'\']"); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == arr.size()); | 
					
						
							|  |  |  |       REQUIRE(arr[0] == ""); | 
					
						
							|  |  |  |       REQUIRE(arr[1] == ""); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("No quotes (empty strings)") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[,]"); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::InvalidInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Closing single quotes missing") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[\"]"); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("Closing double quotes missing") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[\']"); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |   SECTION("Premature null-terminator") { | 
					
						
							|  |  |  |     SECTION("After opening bracket") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "["); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     SECTION("After value") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[1"); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     SECTION("After comma") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, "[1,"); | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |   SECTION("Premature end of input") { | 
					
						
							|  |  |  |     const char* input = "[1,2]"; | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     SECTION("After opening bracket") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, input, 1); | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("After value") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, input, 2); | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     SECTION("After comma") { | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, input, 3); | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::IncompleteInput); | 
					
						
							| 
									
										
										
										
											2018-05-14 17:12:59 +02:00
										 |  |  |     } | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("Misc") { | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |     SECTION("Nested objects") { | 
					
						
							|  |  |  |       char jsonString[] = | 
					
						
							|  |  |  |           " [ { \"a\" : 1 , \"b\" : 2 } , { \"c\" : 3 , \"d\" : 4 } ] "; | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       DeserializationError err = deserializeJson(doc, jsonString); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       JsonObject object1 = arr[0]; | 
					
						
							|  |  |  |       const JsonObject object2 = arr[1]; | 
					
						
							|  |  |  |       JsonObject object3 = arr[2]; | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-05-15 18:23:09 +02:00
										 |  |  |       REQUIRE(err == DeserializationError::Ok); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |       REQUIRE(object1.isNull() == false); | 
					
						
							|  |  |  |       REQUIRE(object2.isNull() == false); | 
					
						
							|  |  |  |       REQUIRE(object3.isNull() == true); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(2 == object1.size()); | 
					
						
							|  |  |  |       REQUIRE(2 == object2.size()); | 
					
						
							|  |  |  |       REQUIRE(0 == object3.size()); | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-03-09 16:58:01 +01:00
										 |  |  |       REQUIRE(1 == object1["a"].as<int>()); | 
					
						
							|  |  |  |       REQUIRE(2 == object1["b"].as<int>()); | 
					
						
							|  |  |  |       REQUIRE(3 == object2["c"].as<int>()); | 
					
						
							|  |  |  |       REQUIRE(4 == object2["d"].as<int>()); | 
					
						
							|  |  |  |       REQUIRE(0 == object3["e"].as<int>()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-03-18 14:50:52 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |   SECTION("Should clear the JsonArray") { | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  |     deserializeJson(doc, "[1,2,3,4]"); | 
					
						
							| 
									
										
										
										
											2023-07-31 17:34:17 +02:00
										 |  |  |     spy.clearLog(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-04-17 21:27:45 +02:00
										 |  |  |     deserializeJson(doc, "[]"); | 
					
						
							| 
									
										
										
										
											2018-03-18 14:50:52 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-31 17:34:17 +02:00
										 |  |  |     JsonArray arr = doc.as<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2018-03-18 14:50:52 +01:00
										 |  |  |     REQUIRE(arr.size() == 0); | 
					
						
							| 
									
										
										
										
											2023-07-26 06:06:38 +02:00
										 |  |  |     REQUIRE(spy.log() == AllocatorLog{ | 
					
						
							| 
									
										
										
										
											2023-07-31 17:34:17 +02:00
										 |  |  |                              Deallocate(sizeofArray(4)), | 
					
						
							| 
									
										
										
										
											2023-07-26 06:06:38 +02:00
										 |  |  |                          }); | 
					
						
							| 
									
										
										
										
											2018-03-18 14:50:52 +01:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-02-26 16:05:16 +01:00
										 |  |  | } | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  | TEST_CASE("deserialize JSON array under memory constraints") { | 
					
						
							| 
									
										
										
										
											2023-07-24 17:21:25 +02:00
										 |  |  |   TimebombAllocator timebomb(100); | 
					
						
							| 
									
										
										
										
											2023-07-25 14:53:54 +02:00
										 |  |  |   SpyingAllocator spy(&timebomb); | 
					
						
							|  |  |  |   JsonDocument doc(&spy); | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |   SECTION("empty array requires no allocation") { | 
					
						
							| 
									
										
										
										
											2023-07-24 17:21:25 +02:00
										 |  |  |     timebomb.setCountdown(0); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |     char input[] = "[]"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     DeserializationError err = deserializeJson(doc, input); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(err == DeserializationError::Ok); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |   SECTION("allocation of pool list fails") { | 
					
						
							| 
									
										
										
										
											2023-07-24 17:21:25 +02:00
										 |  |  |     timebomb.setCountdown(0); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |     char input[] = "[1]"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     DeserializationError err = deserializeJson(doc, input); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(err == DeserializationError::NoMemory); | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |     REQUIRE(doc.as<std::string>() == "[]"); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |   SECTION("allocation of pool fails") { | 
					
						
							| 
									
										
										
										
											2023-07-24 17:21:25 +02:00
										 |  |  |     timebomb.setCountdown(0); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |     char input[] = "[1]"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     DeserializationError err = deserializeJson(doc, input); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     REQUIRE(err == DeserializationError::NoMemory); | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |     REQUIRE(doc.as<std::string>() == "[]"); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |   SECTION("allocation of string fails in array") { | 
					
						
							| 
									
										
										
										
											2023-07-24 17:21:25 +02:00
										 |  |  |     timebomb.setCountdown(1); | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |     char input[] = "[0,\"hi!\"]"; | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  | 
 | 
					
						
							|  |  |  |     DeserializationError err = deserializeJson(doc, input); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-17 14:39:57 +02:00
										 |  |  |     REQUIRE(err == DeserializationError::NoMemory); | 
					
						
							|  |  |  |     REQUIRE(doc.as<std::string>() == "[0,null]"); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("don't store space characters") { | 
					
						
							|  |  |  |     deserializeJson(doc, "  [ \"1234567\" ] "); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2023-07-26 06:06:38 +02:00
										 |  |  |     REQUIRE(spy.log() == | 
					
						
							|  |  |  |             AllocatorLog{ | 
					
						
							|  |  |  |                 Allocate(sizeofPool()), | 
					
						
							|  |  |  |                 Allocate(sizeofStringBuffer()), | 
					
						
							|  |  |  |                 Reallocate(sizeofStringBuffer(), sizeofString("1234567")), | 
					
						
							| 
									
										
										
										
											2023-07-31 17:34:17 +02:00
										 |  |  |                 Reallocate(sizeofPool(), sizeofArray(1)), | 
					
						
							| 
									
										
										
										
											2023-07-26 06:06:38 +02:00
										 |  |  |             }); | 
					
						
							| 
									
										
										
										
											2023-03-15 14:54:55 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } |