mirror of
				https://github.com/eledio-devices/thirdparty-ArduinoJson.git
				synced 2025-10-31 16:14:11 +01:00 
			
		
		
		
	Fixed duplication of char*
This commit is contained in:
		| @@ -127,23 +127,28 @@ class JsonVariant : public Internals::JsonVariantBase<JsonVariant> { | |||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  |   // set(char*) | ||||||
|  |   template <typename T> | ||||||
|  |   bool set(T *value, | ||||||
|  |            typename Internals::enable_if<Internals::IsString<T *>::value>::type | ||||||
|  |                * = 0) { | ||||||
|  |     if (!_data) return false; | ||||||
|  |     const char *dup = Internals::makeString(value).save(_buffer); | ||||||
|  |     if (dup) { | ||||||
|  |       _data->setString(dup); | ||||||
|  |       return true; | ||||||
|  |     } else { | ||||||
|  |       _data->setNull(); | ||||||
|  |       return false; | ||||||
|  |     } | ||||||
|  |   } | ||||||
|  |  | ||||||
|   // set(const char*); |   // set(const char*); | ||||||
|   // set(const char[n]); // VLA |  | ||||||
|   bool set(const char *value) { |   bool set(const char *value) { | ||||||
|     if (!_data) return false; |     if (!_data) return false; | ||||||
|     _data->setString(value); |     _data->setString(value); | ||||||
|     return true; |     return true; | ||||||
|   } |   } | ||||||
|   // set(const unsigned char*); |  | ||||||
|   // set(const unsigned char[n]); // VLA |  | ||||||
|   bool set(const unsigned char *value) { |  | ||||||
|     return set(reinterpret_cast<const char *>(value)); |  | ||||||
|   } |  | ||||||
|   // set(const signed char*); |  | ||||||
|   // set(const signed char[n]); // VLA |  | ||||||
|   bool set(const signed char *value) { |  | ||||||
|     return set(reinterpret_cast<const char *>(value)); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   bool set(const JsonVariant &value) { |   bool set(const JsonVariant &value) { | ||||||
|     if (!_data) return false; |     if (!_data) return false; | ||||||
|   | |||||||
| @@ -38,7 +38,9 @@ endif() | |||||||
| if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") | if(CMAKE_CXX_COMPILER_ID MATCHES "GNU") | ||||||
| 	add_compile_options( | 	add_compile_options( | ||||||
| 		-Wstrict-null-sentinel | 		-Wstrict-null-sentinel | ||||||
|  | 		-Wno-vla # Allow VLA in tests | ||||||
| 	) | 	) | ||||||
|  | 	add_definitions(-DHAS_VARIABLE_LENGTH_ARRAY) | ||||||
|  |  | ||||||
| 	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.5) | 	if(CMAKE_CXX_COMPILER_VERSION VERSION_GREATER 4.5) | ||||||
| 		add_compile_options(-Wlogical-op) # the flag exists in 4.4 but is buggy | 		add_compile_options(-Wlogical-op) # the flag exists in 4.4 but is buggy | ||||||
| @@ -53,6 +55,11 @@ if(CMAKE_CXX_COMPILER_ID MATCHES "Clang") | |||||||
| 	add_compile_options( | 	add_compile_options( | ||||||
| 		-Wc++11-compat | 		-Wc++11-compat | ||||||
| 		-Wdeprecated-register | 		-Wdeprecated-register | ||||||
|  | 		-Wno-vla-extension # Allow VLA in tests | ||||||
|  | 	) | ||||||
|  | 	add_definitions( | ||||||
|  | 		-DHAS_VARIABLE_LENGTH_ARRAY | ||||||
|  | 		-DSUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR | ||||||
| 	) | 	) | ||||||
| endif() | endif() | ||||||
|  |  | ||||||
|   | |||||||
| @@ -7,57 +7,69 @@ | |||||||
|  |  | ||||||
| TEST_CASE("JsonArray::add()") { | TEST_CASE("JsonArray::add()") { | ||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
|   JsonArray _array = doc.to<JsonArray>(); |   JsonArray array = doc.to<JsonArray>(); | ||||||
|  |  | ||||||
|   SECTION("int") { |   SECTION("int") { | ||||||
|     _array.add(123); |     array.add(123); | ||||||
|     REQUIRE(123 == _array[0].as<int>()); |     REQUIRE(123 == array[0].as<int>()); | ||||||
|     REQUIRE(_array[0].is<int>()); |     REQUIRE(array[0].is<int>()); | ||||||
|     REQUIRE(_array[0].is<double>()); |     REQUIRE(array[0].is<double>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("double") { |   SECTION("double") { | ||||||
|     _array.add(123.45); |     array.add(123.45); | ||||||
|     REQUIRE(123.45 == _array[0].as<double>()); |     REQUIRE(123.45 == array[0].as<double>()); | ||||||
|     REQUIRE(_array[0].is<double>()); |     REQUIRE(array[0].is<double>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<bool>()); |     REQUIRE_FALSE(array[0].is<bool>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("bool") { |   SECTION("bool") { | ||||||
|     _array.add(true); |     array.add(true); | ||||||
|     REQUIRE(true == _array[0].as<bool>()); |     REQUIRE(true == array[0].as<bool>()); | ||||||
|     REQUIRE(_array[0].is<bool>()); |     REQUIRE(array[0].is<bool>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("const char*") { |   SECTION("const char*") { | ||||||
|     const char* str = "hello"; |     const char* str = "hello"; | ||||||
|     _array.add(str); |     array.add(str); | ||||||
|     REQUIRE(str == _array[0].as<std::string>()); |     REQUIRE(str == array[0].as<std::string>()); | ||||||
|     REQUIRE(_array[0].is<const char*>()); |     REQUIRE(array[0].is<const char*>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("vla") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     array.add(vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == array[0]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   SECTION("nested array") { |   SECTION("nested array") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr = doc2.to<JsonArray>(); | ||||||
|  |  | ||||||
|     _array.add(arr); |     array.add(arr); | ||||||
|  |  | ||||||
|     REQUIRE(arr == _array[0].as<JsonArray>()); |     REQUIRE(arr == array[0].as<JsonArray>()); | ||||||
|     REQUIRE(_array[0].is<JsonArray>()); |     REQUIRE(array[0].is<JsonArray>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("nested object") { |   SECTION("nested object") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonObject obj = doc2.to<JsonObject>(); |     JsonObject obj = doc2.to<JsonObject>(); | ||||||
|  |  | ||||||
|     _array.add(obj); |     array.add(obj); | ||||||
|  |  | ||||||
|     REQUIRE(obj == _array[0].as<JsonObject>()); |     REQUIRE(obj == array[0].as<JsonObject>()); | ||||||
|     REQUIRE(_array[0].is<JsonObject>()); |     REQUIRE(array[0].is<JsonObject>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("array subscript") { |   SECTION("array subscript") { | ||||||
| @@ -66,9 +78,9 @@ TEST_CASE("JsonArray::add()") { | |||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr = doc2.to<JsonArray>(); | ||||||
|     arr.add(str); |     arr.add(str); | ||||||
|  |  | ||||||
|     _array.add(arr[0]); |     array.add(arr[0]); | ||||||
|  |  | ||||||
|     REQUIRE(str == _array[0]); |     REQUIRE(str == array[0]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("object subscript") { |   SECTION("object subscript") { | ||||||
| @@ -77,49 +89,49 @@ TEST_CASE("JsonArray::add()") { | |||||||
|     JsonObject obj = doc2.to<JsonObject>(); |     JsonObject obj = doc2.to<JsonObject>(); | ||||||
|     obj["x"] = str; |     obj["x"] = str; | ||||||
|  |  | ||||||
|     _array.add(obj["x"]); |     array.add(obj["x"]); | ||||||
|  |  | ||||||
|     REQUIRE(str == _array[0]); |     REQUIRE(str == array[0]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should not duplicate const char*") { |   SECTION("should not duplicate const char*") { | ||||||
|     _array.add("world"); |     array.add("world"); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1); |     const size_t expectedSize = JSON_ARRAY_SIZE(1); | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate char*") { |   SECTION("should duplicate char*") { | ||||||
|     _array.add(const_cast<char*>("world")); |     array.add(const_cast<char*>("world")); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate std::string") { |   SECTION("should duplicate std::string") { | ||||||
|     _array.add(std::string("world")); |     array.add(std::string("world")); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should not duplicate serialized(const char*)") { |   SECTION("should not duplicate serialized(const char*)") { | ||||||
|     _array.add(serialized("{}")); |     array.add(serialized("{}")); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1); |     const size_t expectedSize = JSON_ARRAY_SIZE(1); | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate serialized(char*)") { |   SECTION("should duplicate serialized(char*)") { | ||||||
|     _array.add(serialized(const_cast<char*>("{}"))); |     array.add(serialized(const_cast<char*>("{}"))); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 2; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 2; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate serialized(std::string)") { |   SECTION("should duplicate serialized(std::string)") { | ||||||
|     _array.add(serialized(std::string("{}"))); |     array.add(serialized(std::string("{}"))); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 2; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 2; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate serialized(std::string)") { |   SECTION("should duplicate serialized(std::string)") { | ||||||
|     _array.add(serialized(std::string("\0XX", 3))); |     array.add(serialized(std::string("\0XX", 3))); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 3; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 3; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -9,57 +9,70 @@ using namespace Catch::Matchers; | |||||||
|  |  | ||||||
| TEST_CASE("JsonArray::set()") { | TEST_CASE("JsonArray::set()") { | ||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
|   JsonArray _array = doc.to<JsonArray>(); |   JsonArray array = doc.to<JsonArray>(); | ||||||
|   _array.add(0); |   array.add(0); | ||||||
|  |  | ||||||
|   SECTION("int") { |   SECTION("int") { | ||||||
|     _array.set(0, 123); |     array.set(0, 123); | ||||||
|     REQUIRE(123 == _array[0].as<int>()); |     REQUIRE(123 == array[0].as<int>()); | ||||||
|     REQUIRE(_array[0].is<int>()); |     REQUIRE(array[0].is<int>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<bool>()); |     REQUIRE_FALSE(array[0].is<bool>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("double") { |   SECTION("double") { | ||||||
|     _array.set(0, 123.45); |     array.set(0, 123.45); | ||||||
|     REQUIRE(123.45 == _array[0].as<double>()); |     REQUIRE(123.45 == array[0].as<double>()); | ||||||
|     REQUIRE(_array[0].is<double>()); |     REQUIRE(array[0].is<double>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("bool") { |   SECTION("bool") { | ||||||
|     _array.set(0, true); |     array.set(0, true); | ||||||
|     REQUIRE(true == _array[0].as<bool>()); |     REQUIRE(true == array[0].as<bool>()); | ||||||
|     REQUIRE(_array[0].is<bool>()); |     REQUIRE(array[0].is<bool>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("const char*") { |   SECTION("const char*") { | ||||||
|     _array.set(0, "hello"); |     array.set(0, "hello"); | ||||||
|     REQUIRE_THAT(_array[0].as<const char*>(), Equals("hello")); |     REQUIRE_THAT(array[0].as<const char*>(), Equals("hello")); | ||||||
|     REQUIRE(_array[0].is<const char*>()); |     REQUIRE(array[0].is<const char*>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("set()") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     array.add("hello"); | ||||||
|  |     array.set(0, vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == array[0]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   SECTION("nested array") { |   SECTION("nested array") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr = doc2.to<JsonArray>(); | ||||||
|  |  | ||||||
|     _array.set(0, arr); |     array.set(0, arr); | ||||||
|  |  | ||||||
|     REQUIRE(arr == _array[0].as<JsonArray>()); |     REQUIRE(arr == array[0].as<JsonArray>()); | ||||||
|     REQUIRE(_array[0].is<JsonArray>()); |     REQUIRE(array[0].is<JsonArray>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("nested object") { |   SECTION("nested object") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonObject obj = doc2.to<JsonObject>(); |     JsonObject obj = doc2.to<JsonObject>(); | ||||||
|  |  | ||||||
|     _array.set(0, obj); |     array.set(0, obj); | ||||||
|  |  | ||||||
|     REQUIRE(obj == _array[0].as<JsonObject>()); |     REQUIRE(obj == array[0].as<JsonObject>()); | ||||||
|     REQUIRE(_array[0].is<JsonObject>()); |     REQUIRE(array[0].is<JsonObject>()); | ||||||
|     REQUIRE_FALSE(_array[0].is<int>()); |     REQUIRE_FALSE(array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("array subscript") { |   SECTION("array subscript") { | ||||||
| @@ -67,9 +80,9 @@ TEST_CASE("JsonArray::set()") { | |||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr = doc2.to<JsonArray>(); | ||||||
|     arr.add("hello"); |     arr.add("hello"); | ||||||
|  |  | ||||||
|     _array.set(0, arr[0]); |     array.set(0, arr[0]); | ||||||
|  |  | ||||||
|     REQUIRE_THAT(_array[0].as<char*>(), Equals("hello")); |     REQUIRE_THAT(array[0].as<char*>(), Equals("hello")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("object subscript") { |   SECTION("object subscript") { | ||||||
| @@ -77,25 +90,25 @@ TEST_CASE("JsonArray::set()") { | |||||||
|     JsonObject obj = doc2.to<JsonObject>(); |     JsonObject obj = doc2.to<JsonObject>(); | ||||||
|     obj["x"] = "hello"; |     obj["x"] = "hello"; | ||||||
|  |  | ||||||
|     _array.set(0, obj["x"]); |     array.set(0, obj["x"]); | ||||||
|  |  | ||||||
|     REQUIRE_THAT(_array[0].as<char*>(), Equals("hello")); |     REQUIRE_THAT(array[0].as<char*>(), Equals("hello")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should not duplicate const char*") { |   SECTION("should not duplicate const char*") { | ||||||
|     _array.set(0, "world"); |     array.set(0, "world"); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1); |     const size_t expectedSize = JSON_ARRAY_SIZE(1); | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate char*") { |   SECTION("should duplicate char*") { | ||||||
|     _array.set(0, const_cast<char*>("world")); |     array.set(0, const_cast<char*>("world")); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate std::string") { |   SECTION("should duplicate std::string") { | ||||||
|     _array.set(0, std::string("world")); |     array.set(0, std::string("world")); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|   | |||||||
| @@ -8,85 +8,85 @@ | |||||||
|  |  | ||||||
| TEST_CASE("JsonArray::operator[]") { | TEST_CASE("JsonArray::operator[]") { | ||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
|   JsonArray _array = doc.to<JsonArray>(); |   JsonArray array = doc.to<JsonArray>(); | ||||||
|   _array.add(0); |   array.add(0); | ||||||
|  |  | ||||||
|   SECTION("int") { |   SECTION("int") { | ||||||
|     _array[0] = 123; |     array[0] = 123; | ||||||
|     REQUIRE(123 == _array[0].as<int>()); |     REQUIRE(123 == array[0].as<int>()); | ||||||
|     REQUIRE(true == _array[0].is<int>()); |     REQUIRE(true == array[0].is<int>()); | ||||||
|     REQUIRE(false == _array[0].is<bool>()); |     REQUIRE(false == array[0].is<bool>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
| #if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 | #if ARDUINOJSON_USE_LONG_LONG || ARDUINOJSON_USE_INT64 | ||||||
|   SECTION("long long") { |   SECTION("long long") { | ||||||
|     _array[0] = 9223372036854775807; |     array[0] = 9223372036854775807; | ||||||
|     REQUIRE(9223372036854775807 == _array[0].as<long long>()); |     REQUIRE(9223372036854775807 == array[0].as<long long>()); | ||||||
|     REQUIRE(true == _array[0].is<int>()); |     REQUIRE(true == array[0].is<int>()); | ||||||
|     REQUIRE(false == _array[0].is<bool>()); |     REQUIRE(false == array[0].is<bool>()); | ||||||
|   } |   } | ||||||
| #endif | #endif | ||||||
|  |  | ||||||
|   SECTION("double") { |   SECTION("double") { | ||||||
|     _array[0] = 123.45; |     array[0] = 123.45; | ||||||
|     REQUIRE(123.45 == _array[0].as<double>()); |     REQUIRE(123.45 == array[0].as<double>()); | ||||||
|     REQUIRE(true == _array[0].is<double>()); |     REQUIRE(true == array[0].is<double>()); | ||||||
|     REQUIRE(false == _array[0].is<int>()); |     REQUIRE(false == array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("bool") { |   SECTION("bool") { | ||||||
|     _array[0] = true; |     array[0] = true; | ||||||
|     REQUIRE(true == _array[0].as<bool>()); |     REQUIRE(true == array[0].as<bool>()); | ||||||
|     REQUIRE(true == _array[0].is<bool>()); |     REQUIRE(true == array[0].is<bool>()); | ||||||
|     REQUIRE(false == _array[0].is<int>()); |     REQUIRE(false == array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("const char*") { |   SECTION("const char*") { | ||||||
|     const char* str = "hello"; |     const char* str = "hello"; | ||||||
|  |  | ||||||
|     _array[0] = str; |     array[0] = str; | ||||||
|     REQUIRE(str == _array[0].as<const char*>()); |     REQUIRE(str == array[0].as<const char*>()); | ||||||
|     REQUIRE(str == _array[0].as<char*>());  // <- short hand |     REQUIRE(str == array[0].as<char*>());  // <- short hand | ||||||
|     REQUIRE(true == _array[0].is<const char*>()); |     REQUIRE(true == array[0].is<const char*>()); | ||||||
|     REQUIRE(false == _array[0].is<int>()); |     REQUIRE(false == array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("nested array") { |   SECTION("nested array") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr2 = doc2.to<JsonArray>(); | ||||||
|  |  | ||||||
|     _array[0] = arr; |     array[0] = arr2; | ||||||
|  |  | ||||||
|     REQUIRE(arr == _array[0].as<JsonArray>()); |     REQUIRE(arr2 == array[0].as<JsonArray>()); | ||||||
|     REQUIRE(arr == _array[0].as<JsonArray>());  // <- short hand |     REQUIRE(arr2 == array[0].as<JsonArray>());  // <- short hand | ||||||
|     // REQUIRE(arr == _array[0].as<const JsonArray>()); |     // REQUIRE(arr2 == array[0].as<const JsonArray>()); | ||||||
|     // REQUIRE(arr == _array[0].as<const JsonArray>());  // <- short hand |     // REQUIRE(arr2 == array[0].as<const JsonArray>());  // <- short hand | ||||||
|     REQUIRE(true == _array[0].is<JsonArray>()); |     REQUIRE(true == array[0].is<JsonArray>()); | ||||||
|     REQUIRE(false == _array[0].is<int>()); |     REQUIRE(false == array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("nested object") { |   SECTION("nested object") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonObject obj = doc2.to<JsonObject>(); |     JsonObject obj = doc2.to<JsonObject>(); | ||||||
|  |  | ||||||
|     _array[0] = obj; |     array[0] = obj; | ||||||
|  |  | ||||||
|     REQUIRE(obj == _array[0].as<JsonObject>()); |     REQUIRE(obj == array[0].as<JsonObject>()); | ||||||
|     REQUIRE(obj == _array[0].as<const JsonObject>());  // <- short hand |     REQUIRE(obj == array[0].as<const JsonObject>());  // <- short hand | ||||||
|     REQUIRE(true == _array[0].is<JsonObject>()); |     REQUIRE(true == array[0].is<JsonObject>()); | ||||||
|     REQUIRE(false == _array[0].is<int>()); |     REQUIRE(false == array[0].is<int>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("array subscript") { |   SECTION("array subscript") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr2 = doc2.to<JsonArray>(); | ||||||
|     const char* str = "hello"; |     const char* str = "hello"; | ||||||
|  |  | ||||||
|     arr.add(str); |     arr2.add(str); | ||||||
|  |  | ||||||
|     _array[0] = arr[0]; |     array[0] = arr2[0]; | ||||||
|  |  | ||||||
|     REQUIRE(str == _array[0]); |     REQUIRE(str == array[0]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("object subscript") { |   SECTION("object subscript") { | ||||||
| @@ -96,26 +96,50 @@ TEST_CASE("JsonArray::operator[]") { | |||||||
|  |  | ||||||
|     obj["x"] = str; |     obj["x"] = str; | ||||||
|  |  | ||||||
|     _array[0] = obj["x"]; |     array[0] = obj["x"]; | ||||||
|  |  | ||||||
|     REQUIRE(str == _array[0]); |     REQUIRE(str == array[0]); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should not duplicate const char*") { |   SECTION("should not duplicate const char*") { | ||||||
|     _array[0] = "world"; |     array[0] = "world"; | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1); |     const size_t expectedSize = JSON_ARRAY_SIZE(1); | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate char*") { |   SECTION("should duplicate char*") { | ||||||
|     _array[0] = const_cast<char*>("world"); |     array[0] = const_cast<char*>("world"); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("should duplicate std::string") { |   SECTION("should duplicate std::string") { | ||||||
|     _array[0] = std::string("world"); |     array[0] = std::string("world"); | ||||||
|     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; |     const size_t expectedSize = JSON_ARRAY_SIZE(1) + 6; | ||||||
|     REQUIRE(expectedSize == doc.memoryUsage()); |     REQUIRE(expectedSize == doc.memoryUsage()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("set(VLA)") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     array.add("hello"); | ||||||
|  |     array[0].set(vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == array[0]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("operator=(VLA)") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     array.add("hello"); | ||||||
|  |     array[0] = vla; | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == array[0]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
| @@ -3,15 +3,14 @@ | |||||||
| # MIT License | # MIT License | ||||||
|  |  | ||||||
| add_executable(JsonDeserializerTests | add_executable(JsonDeserializerTests | ||||||
|  | 	DeserializationError.cpp | ||||||
| 	deserializeJsonArray.cpp | 	deserializeJsonArray.cpp | ||||||
| 	deserializeJsonArrayStatic.cpp | 	deserializeJsonArrayStatic.cpp | ||||||
| 	deserializeJsonObject.cpp | 	deserializeJsonObject.cpp | ||||||
| 	deserializeJsonObjectStatic.cpp | 	deserializeJsonObjectStatic.cpp | ||||||
| 	deserializeJsonValue.cpp | 	deserializeJsonValue.cpp | ||||||
| 	DeserializationError.cpp | 	input_types.cpp | ||||||
| 	nestingLimit.cpp | 	nestingLimit.cpp | ||||||
| 	std_istream.cpp |  | ||||||
| 	std_string.cpp |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(JsonDeserializerTests catch) | target_link_libraries(JsonDeserializerTests catch) | ||||||
|   | |||||||
| @@ -6,6 +6,35 @@ | |||||||
| #include <catch.hpp> | #include <catch.hpp> | ||||||
| #include <sstream> | #include <sstream> | ||||||
| 
 | 
 | ||||||
|  | TEST_CASE("deserializeJson(const std::string&)") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  | 
 | ||||||
|  |   SECTION("should accept const string") { | ||||||
|  |     const std::string input("[42]"); | ||||||
|  | 
 | ||||||
|  |     DeserializationError err = deserializeJson(doc, input); | ||||||
|  | 
 | ||||||
|  |     REQUIRE(err == DeserializationError::Ok); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   SECTION("should accept temporary string") { | ||||||
|  |     DeserializationError err = deserializeJson(doc, std::string("[42]")); | ||||||
|  | 
 | ||||||
|  |     REQUIRE(err == DeserializationError::Ok); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   SECTION("should duplicate content") { | ||||||
|  |     std::string input("[\"hello\"]"); | ||||||
|  | 
 | ||||||
|  |     DeserializationError err = deserializeJson(doc, input); | ||||||
|  |     input[2] = 'X';  // alter the string tomake sure we made a copy
 | ||||||
|  | 
 | ||||||
|  |     JsonArray array = doc.as<JsonArray>(); | ||||||
|  |     REQUIRE(err == DeserializationError::Ok); | ||||||
|  |     REQUIRE(std::string("hello") == array[0]); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
| TEST_CASE("deserializeJson(std::istream&)") { | TEST_CASE("deserializeJson(std::istream&)") { | ||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
| 
 | 
 | ||||||
| @@ -71,3 +100,16 @@ TEST_CASE("deserializeJson(std::istream&)") { | |||||||
|     REQUIRE('1' == char(json.get())); |     REQUIRE('1' == char(json.get())); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  | TEST_CASE("deserializeJson(VLA)") { | ||||||
|  |   int i = 9; | ||||||
|  |   char vla[i]; | ||||||
|  |   strcpy(vla, "{\"a\":42}"); | ||||||
|  | 
 | ||||||
|  |   StaticJsonDocument<JSON_OBJECT_SIZE(1)> doc; | ||||||
|  |   DeserializationError err = deserializeJson(doc, vla); | ||||||
|  | 
 | ||||||
|  |   REQUIRE(err == DeserializationError::Ok); | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @@ -1,35 +0,0 @@ | |||||||
| // ArduinoJson - arduinojson.org |  | ||||||
| // Copyright Benoit Blanchon 2014-2018 |  | ||||||
| // MIT License |  | ||||||
|  |  | ||||||
| #include <ArduinoJson.h> |  | ||||||
| #include <catch.hpp> |  | ||||||
|  |  | ||||||
| TEST_CASE("deserializeJson(const std::string&)") { |  | ||||||
|   DynamicJsonDocument doc; |  | ||||||
|  |  | ||||||
|   SECTION("should accept const string") { |  | ||||||
|     const std::string input("[42]"); |  | ||||||
|  |  | ||||||
|     DeserializationError err = deserializeJson(doc, input); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("should accept temporary string") { |  | ||||||
|     DeserializationError err = deserializeJson(doc, std::string("[42]")); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("should duplicate content") { |  | ||||||
|     std::string input("[\"hello\"]"); |  | ||||||
|  |  | ||||||
|     DeserializationError err = deserializeJson(doc, input); |  | ||||||
|     input[2] = 'X';  // alter the string tomake sure we made a copy |  | ||||||
|  |  | ||||||
|     JsonArray array = doc.as<JsonArray>(); |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|     REQUIRE(std::string("hello") == array[0]); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| @@ -4,8 +4,11 @@ | |||||||
|  |  | ||||||
| add_executable(JsonObjectTests  | add_executable(JsonObjectTests  | ||||||
| 	containsKey.cpp | 	containsKey.cpp | ||||||
|  | 	createNestedArray.cpp | ||||||
|  | 	createNestedObject.cpp | ||||||
| 	get.cpp | 	get.cpp | ||||||
| 	invalid.cpp | 	invalid.cpp | ||||||
|  | 	is.cpp | ||||||
| 	isNull.cpp | 	isNull.cpp | ||||||
| 	iterator.cpp | 	iterator.cpp | ||||||
| 	remove.cpp | 	remove.cpp | ||||||
|   | |||||||
| @@ -8,23 +8,29 @@ | |||||||
| TEST_CASE("JsonObject::containsKey()") { | TEST_CASE("JsonObject::containsKey()") { | ||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
|   JsonObject obj = doc.to<JsonObject>(); |   JsonObject obj = doc.to<JsonObject>(); | ||||||
|  |   obj.set("hello", 42); | ||||||
|  |  | ||||||
|   SECTION("ContainsKeyReturnsFalseForNonExistingKey") { |   SECTION("returns false if key not present") { | ||||||
|     obj.set("hello", 42); |  | ||||||
|  |  | ||||||
|     REQUIRE(false == obj.containsKey("world")); |     REQUIRE(false == obj.containsKey("world")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("ContainsKeyReturnsTrueForDefinedValue") { |   SECTION("returns true if key present") { | ||||||
|     obj.set("hello", 42); |  | ||||||
|  |  | ||||||
|     REQUIRE(true == obj.containsKey("hello")); |     REQUIRE(true == obj.containsKey("hello")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|   SECTION("ContainsKeyReturnsFalseAfterRemove") { |   SECTION("returns false after remove()") { | ||||||
|     obj.set("hello", 42); |  | ||||||
|     obj.remove("hello"); |     obj.remove("hello"); | ||||||
|  |  | ||||||
|     REQUIRE(false == obj.containsKey("hello")); |     REQUIRE(false == obj.containsKey("hello")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("key is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     REQUIRE(true == obj.containsKey(vla)); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										25
									
								
								test/JsonObject/createNestedArray.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/JsonObject/createNestedArray.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | // ArduinoJson - arduinojson.org | ||||||
|  | // Copyright Benoit Blanchon 2014-2018 | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #include <ArduinoJson.h> | ||||||
|  | #include <catch.hpp> | ||||||
|  |  | ||||||
|  | TEST_CASE("JsonObject::createNestedArray()") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  |   JsonObject obj = doc.to<JsonObject>(); | ||||||
|  |  | ||||||
|  |   SECTION("key is a const char*") { | ||||||
|  |     obj.createNestedArray("hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("key is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     obj.createNestedArray(vla); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  | } | ||||||
							
								
								
									
										25
									
								
								test/JsonObject/createNestedObject.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										25
									
								
								test/JsonObject/createNestedObject.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,25 @@ | |||||||
|  | // ArduinoJson - arduinojson.org | ||||||
|  | // Copyright Benoit Blanchon 2014-2018 | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #include <ArduinoJson.h> | ||||||
|  | #include <catch.hpp> | ||||||
|  |  | ||||||
|  | TEST_CASE("JsonObject::createNestedObject()") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  |   JsonObject obj = doc.to<JsonObject>(); | ||||||
|  |  | ||||||
|  |   SECTION("key is a const char*") { | ||||||
|  |     obj.createNestedObject("hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("key is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     obj.createNestedObject(vla); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  | } | ||||||
| @@ -11,9 +11,20 @@ TEST_CASE("JsonObject::get()") { | |||||||
|   DynamicJsonDocument doc; |   DynamicJsonDocument doc; | ||||||
|   JsonObject obj = doc.to<JsonObject>(); |   JsonObject obj = doc.to<JsonObject>(); | ||||||
|  |  | ||||||
|   SECTION("GetConstCharPointer_GivenStringLiteral") { |   SECTION("get<const char*>(const char*)") { | ||||||
|     obj.set("hello", "world"); |     obj.set("hello", "world"); | ||||||
|     const char* value = obj.get<const char*>("hello"); |     const char* value = obj.get<const char*>("hello"); | ||||||
|     REQUIRE_THAT(value, Equals("world")); |     REQUIRE_THAT(value, Equals("world")); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("get<const char*>(VLA)") { | ||||||
|  |     obj.set("hello", "world"); | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj.get<char*>(vla)); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
							
								
								
									
										28
									
								
								test/JsonObject/is.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										28
									
								
								test/JsonObject/is.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,28 @@ | |||||||
|  | // ArduinoJson - arduinojson.org | ||||||
|  | // Copyright Benoit Blanchon 2014-2018 | ||||||
|  | // MIT License | ||||||
|  |  | ||||||
|  | #include <ArduinoJson.h> | ||||||
|  | #include <catch.hpp> | ||||||
|  |  | ||||||
|  | TEST_CASE("JsonObject::is<T>()") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  |   JsonObject obj = doc.to<JsonObject>(); | ||||||
|  |   obj["int"] = 42; | ||||||
|  |   obj["str"] = "hello"; | ||||||
|  |  | ||||||
|  |   SECTION("is<int>(const char*)") { | ||||||
|  |     REQUIRE(true == obj.is<int>("int")); | ||||||
|  |     REQUIRE(false == obj.is<int>("str")); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #if HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("is<T>(VLA)") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "int"); | ||||||
|  |  | ||||||
|  |     REQUIRE(true == obj.is<int>(vla)); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  | } | ||||||
| @@ -39,4 +39,17 @@ TEST_CASE("JsonObject::remove()") { | |||||||
|     serializeJson(obj, result); |     serializeJson(obj, result); | ||||||
|     REQUIRE("{\"a\":0,\"c\":2}" == result); |     REQUIRE("{\"a\":0,\"c\":2}" == result); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("key is a vla") { | ||||||
|  |     obj["hello"] = 1; | ||||||
|  |  | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |     obj.remove(vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(0 == obj.size()); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
| @@ -42,6 +42,38 @@ TEST_CASE("JsonObject::set()") { | |||||||
|     REQUIRE_FALSE(obj["hello"].is<long>()); |     REQUIRE_FALSE(obj["hello"].is<long>()); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("key is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     obj.set(vla, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("value is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     obj.set("hello", vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("key and value are VLAs") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     obj.set(vla, vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["world"]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   SECTION("nested array") { |   SECTION("nested array") { | ||||||
|     DynamicJsonDocument doc2; |     DynamicJsonDocument doc2; | ||||||
|     JsonArray arr = doc2.to<JsonArray>(); |     JsonArray arr = doc2.to<JsonArray>(); | ||||||
|   | |||||||
| @@ -159,4 +159,58 @@ TEST_CASE("JsonObject::operator[]") { | |||||||
|     REQUIRE(obj.size() == 1); |     REQUIRE(obj.size() == 1); | ||||||
|     REQUIRE(obj[null] == 0); |     REQUIRE(obj[null] == 0); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #if defined(HAS_VARIABLE_LENGTH_ARRAY) && \ | ||||||
|  |     !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR) | ||||||
|  |   SECTION("obj[VLA] = str") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     obj[vla] = "world"; | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("obj[str] = VLA") {  // issue #416 | ||||||
|  |     int i = 32; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     obj["hello"] = vla; | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"].as<char*>()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("obj.set(VLA, str)") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     obj[vla] = "world"; | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("obj.set(str, VLA)") { | ||||||
|  |     int i = 32; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "world"); | ||||||
|  |  | ||||||
|  |     obj["hello"].set(vla); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == obj["hello"].as<char*>()); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("obj[VLA]") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     deserializeJson(doc, "{\"hello\":\"world\"}"); | ||||||
|  |  | ||||||
|  |     obj = doc.as<JsonObject>(); | ||||||
|  |     REQUIRE(std::string("world") == obj[vla]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
| @@ -179,6 +179,38 @@ TEST_CASE("JsonVariant comparisons") { | |||||||
|     REQUIRE_FALSE(null == variant); |     REQUIRE_FALSE(null == variant); | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("VLA equals") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     DynamicJsonDocument doc; | ||||||
|  |     JsonVariant variant = doc.to<JsonVariant>(); | ||||||
|  |     variant.set("hello"); | ||||||
|  |  | ||||||
|  |     REQUIRE((vla == variant)); | ||||||
|  |     REQUIRE((variant == vla)); | ||||||
|  |     REQUIRE_FALSE((vla != variant)); | ||||||
|  |     REQUIRE_FALSE((variant != vla)); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("VLA differs") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     DynamicJsonDocument doc; | ||||||
|  |     JsonVariant variant = doc.to<JsonVariant>(); | ||||||
|  |     variant.set("world"); | ||||||
|  |  | ||||||
|  |     REQUIRE((vla != variant)); | ||||||
|  |     REQUIRE((variant != vla)); | ||||||
|  |     REQUIRE_FALSE((vla == variant)); | ||||||
|  |     REQUIRE_FALSE((variant == vla)); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|   DynamicJsonDocument doc1, doc2, doc3; |   DynamicJsonDocument doc1, doc2, doc3; | ||||||
|   JsonVariant variant1 = doc1.to<JsonVariant>(); |   JsonVariant variant1 = doc1.to<JsonVariant>(); | ||||||
|   JsonVariant variant2 = doc2.to<JsonVariant>(); |   JsonVariant variant2 = doc2.to<JsonVariant>(); | ||||||
|   | |||||||
| @@ -138,3 +138,74 @@ TEST_CASE("JsonVariant set()/get()") { | |||||||
|     checkValue<JsonObject>(object); |     checkValue<JsonObject>(object); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("JsonVariant and strings") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  |   JsonVariant variant = doc.to<JsonVariant>(); | ||||||
|  |  | ||||||
|  |   SECTION("stores const char* by reference") { | ||||||
|  |     char str[16]; | ||||||
|  |  | ||||||
|  |     strcpy(str, "hello"); | ||||||
|  |     variant.set(static_cast<const char *>(str)); | ||||||
|  |     strcpy(str, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "world"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("stores char* by copy") { | ||||||
|  |     char str[16]; | ||||||
|  |  | ||||||
|  |     strcpy(str, "hello"); | ||||||
|  |     variant.set(str); | ||||||
|  |     strcpy(str, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("stores unsigned char* by copy") { | ||||||
|  |     char str[16]; | ||||||
|  |  | ||||||
|  |     strcpy(str, "hello"); | ||||||
|  |     variant.set(reinterpret_cast<unsigned char *>(str)); | ||||||
|  |     strcpy(str, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("stores signed char* by copy") { | ||||||
|  |     char str[16]; | ||||||
|  |  | ||||||
|  |     strcpy(str, "hello"); | ||||||
|  |     variant.set(reinterpret_cast<signed char *>(str)); | ||||||
|  |     strcpy(str, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  |   SECTION("stores VLA by copy") { | ||||||
|  |     int n = 16; | ||||||
|  |     char str[n]; | ||||||
|  |  | ||||||
|  |     strcpy(str, "hello"); | ||||||
|  |     variant.set(str); | ||||||
|  |     strcpy(str, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "hello"); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
|  |  | ||||||
|  |   SECTION("stores std::string by copy") { | ||||||
|  |     std::string str; | ||||||
|  |  | ||||||
|  |     str = "hello"; | ||||||
|  |     variant.set(str); | ||||||
|  |     str.replace(0, 5, "world"); | ||||||
|  |  | ||||||
|  |     REQUIRE(variant == "hello"); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   // TODO: string | ||||||
|  |   // TODO: serialized() | ||||||
|  | } | ||||||
|   | |||||||
| @@ -93,4 +93,29 @@ TEST_CASE("JsonVariant::operator[]") { | |||||||
|       REQUIRE(std::string("world") == var["hello"]); |       REQUIRE(std::string("world") == var["hello"]); | ||||||
|     } |     } | ||||||
|   } |   } | ||||||
|  |  | ||||||
|  | #if defined(HAS_VARIABLE_LENGTH_ARRAY) && \ | ||||||
|  |     !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR) | ||||||
|  |   SECTION("key is a VLA") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     deserializeJson(doc, "{\"hello\":\"world\"}"); | ||||||
|  |     JsonVariant variant = doc.as<JsonVariant>(); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == variant[vla]); | ||||||
|  |   } | ||||||
|  |  | ||||||
|  |   SECTION("key is a VLA, const JsonVariant") { | ||||||
|  |     int i = 16; | ||||||
|  |     char vla[i]; | ||||||
|  |     strcpy(vla, "hello"); | ||||||
|  |  | ||||||
|  |     deserializeJson(doc, "{\"hello\":\"world\"}"); | ||||||
|  |     const JsonVariant variant = doc.as<JsonVariant>(); | ||||||
|  |  | ||||||
|  |     REQUIRE(std::string("world") == variant[vla]); | ||||||
|  |   } | ||||||
|  | #endif | ||||||
| } | } | ||||||
|   | |||||||
| @@ -8,7 +8,6 @@ add_executable(MiscTests | |||||||
| 	TypeTraits.cpp | 	TypeTraits.cpp | ||||||
| 	unsigned_char.cpp | 	unsigned_char.cpp | ||||||
| 	version.cpp | 	version.cpp | ||||||
| 	vla.cpp |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(MiscTests catch) | target_link_libraries(MiscTests catch) | ||||||
|   | |||||||
| @@ -1,327 +0,0 @@ | |||||||
| // ArduinoJson - arduinojson.org |  | ||||||
| // Copyright Benoit Blanchon 2014-2018 |  | ||||||
| // MIT License |  | ||||||
|  |  | ||||||
| #include <ArduinoJson.h> |  | ||||||
| #include <catch.hpp> |  | ||||||
|  |  | ||||||
| #if defined(__clang__) |  | ||||||
| #pragma clang diagnostic ignored "-Wvla-extension" |  | ||||||
| #define CONFLICTS_WITH_BUILTIN_OPERATOR |  | ||||||
| #elif defined(__GNUC__) |  | ||||||
| #pragma GCC diagnostic ignored "-Wvla" |  | ||||||
| #else |  | ||||||
| #define VLA_NOT_SUPPORTED |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef VLA_NOT_SUPPORTED |  | ||||||
|  |  | ||||||
| TEST_CASE("Variable Length Array") { |  | ||||||
|   SECTION("deserializeJson()") { |  | ||||||
|     int i = 9; |  | ||||||
|     char vla[i]; |  | ||||||
|     strcpy(vla, "{\"a\":42}"); |  | ||||||
|  |  | ||||||
|     StaticJsonDocument<JSON_OBJECT_SIZE(1)> doc; |  | ||||||
|     DeserializationError err = deserializeJson(doc, vla); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("deserializeMsgPack()") { |  | ||||||
|     int i = 16; |  | ||||||
|     char vla[i]; |  | ||||||
|     memcpy(vla, "\xDE\x00\x01\xA5Hello\xA5world", 15); |  | ||||||
|  |  | ||||||
|     StaticJsonDocument<JSON_OBJECT_SIZE(1)> doc; |  | ||||||
|     DeserializationError err = deserializeMsgPack(doc, vla); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("JsonVariant") { |  | ||||||
|     DynamicJsonDocument doc; |  | ||||||
|  |  | ||||||
|     SECTION("set()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "42"); |  | ||||||
|  |  | ||||||
|       JsonVariant variant = doc.to<JsonVariant>(); |  | ||||||
|       variant.set(vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(42 == variant.as<int>()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
| #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR |  | ||||||
|     SECTION("operator[]") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|       JsonVariant variant = doc.as<JsonVariant>(); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == variant[vla]); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR |  | ||||||
|     SECTION("operator[] const") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|       const JsonVariant variant = doc.as<JsonVariant>(); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == variant[vla]); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     SECTION("operator==") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       JsonVariant variant = doc.to<JsonVariant>(); |  | ||||||
|       variant.set("hello"); |  | ||||||
|  |  | ||||||
|       REQUIRE((vla == variant)); |  | ||||||
|       REQUIRE((variant == vla)); |  | ||||||
|       REQUIRE_FALSE((vla != variant)); |  | ||||||
|       REQUIRE_FALSE((variant != vla)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("operator!=") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       JsonVariant variant; |  | ||||||
|       variant.set("world"); |  | ||||||
|  |  | ||||||
|       REQUIRE((vla != variant)); |  | ||||||
|       REQUIRE((variant != vla)); |  | ||||||
|       REQUIRE_FALSE((vla == variant)); |  | ||||||
|       REQUIRE_FALSE((variant == vla)); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("JsonObject") { |  | ||||||
| #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR |  | ||||||
|     SECTION("operator[]") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj[vla] = "world"; |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["hello"]); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
| #ifndef CONFLICTS_WITH_BUILTIN_OPERATOR |  | ||||||
|     SECTION("operator[] const") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|  |  | ||||||
|       JsonObject obj = doc.as<JsonObject>(); |  | ||||||
|       REQUIRE(std::string("world") == obj[vla]); |  | ||||||
|     } |  | ||||||
| #endif |  | ||||||
|  |  | ||||||
|     SECTION("get()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|  |  | ||||||
|       JsonObject obj = doc.as<JsonObject>(); |  | ||||||
|       REQUIRE(std::string("world") == obj.get<char*>(vla)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("set() key") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj.set(vla, "world"); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["hello"]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("set() value") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj.set("hello", vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["hello"]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("set() key&value") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj.set(vla, vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["world"]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("containsKey()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|  |  | ||||||
|       JsonObject obj = doc.as<JsonObject>(); |  | ||||||
|       REQUIRE(true == obj.containsKey(vla)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("remove()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       deserializeJson(doc, "{\"hello\":\"world\"}"); |  | ||||||
|       JsonObject obj = doc.as<JsonObject>(); |  | ||||||
|       obj.remove(vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(0 == obj.size()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("is<T>()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       deserializeJson(doc, "{\"hello\":42}"); |  | ||||||
|       JsonObject obj = doc.as<JsonObject>(); |  | ||||||
|  |  | ||||||
|       REQUIRE(true == obj.is<int>(vla)); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("createNestedArray()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj.createNestedArray(vla); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("createNestedObject()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "hello"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj.createNestedObject(vla); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("JsonObjectSubscript") { |  | ||||||
|     SECTION("operator=") {  // issue #416 |  | ||||||
|       int i = 32; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj["hello"] = vla; |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["hello"].as<char*>()); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("set()") { |  | ||||||
|       int i = 32; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonObject obj = doc.to<JsonObject>(); |  | ||||||
|       obj["hello"].set(vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == obj["hello"].as<char*>()); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("JsonArray") { |  | ||||||
|     SECTION("add()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonArray arr = doc.to<JsonArray>(); |  | ||||||
|       arr.add(vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == arr[0]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("set()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonArray arr = doc.to<JsonArray>(); |  | ||||||
|       arr.add("hello"); |  | ||||||
|       arr.set(0, vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == arr[0]); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("JsonArraySubscript") { |  | ||||||
|     SECTION("set()") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonArray arr = doc.to<JsonArray>(); |  | ||||||
|       arr.add("hello"); |  | ||||||
|       arr[0].set(vla); |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == arr[0]); |  | ||||||
|     } |  | ||||||
|  |  | ||||||
|     SECTION("operator=") { |  | ||||||
|       int i = 16; |  | ||||||
|       char vla[i]; |  | ||||||
|       strcpy(vla, "world"); |  | ||||||
|  |  | ||||||
|       DynamicJsonDocument doc; |  | ||||||
|       JsonArray arr = doc.to<JsonArray>(); |  | ||||||
|       arr.add("hello"); |  | ||||||
|       arr[0] = vla; |  | ||||||
|  |  | ||||||
|       REQUIRE(std::string("world") == arr[0]); |  | ||||||
|     } |  | ||||||
|   } |  | ||||||
| } |  | ||||||
| #endif |  | ||||||
| @@ -9,10 +9,9 @@ add_executable(MsgPackDeserializerTests | |||||||
| 	deserializeVariant.cpp | 	deserializeVariant.cpp | ||||||
| 	doubleToFloat.cpp | 	doubleToFloat.cpp | ||||||
| 	incompleteInput.cpp | 	incompleteInput.cpp | ||||||
|  | 	input_types.cpp | ||||||
| 	nestingLimit.cpp | 	nestingLimit.cpp | ||||||
| 	notSupported.cpp | 	notSupported.cpp | ||||||
| 	std_string.cpp |  | ||||||
| 	std_istream.cpp |  | ||||||
| ) | ) | ||||||
|  |  | ||||||
| target_link_libraries(MsgPackDeserializerTests catch) | target_link_libraries(MsgPackDeserializerTests catch) | ||||||
|   | |||||||
| @@ -44,3 +44,39 @@ TEST_CASE("deserializeMsgPack(const std::string&)") { | |||||||
|     REQUIRE(arr[1] == 2); |     REQUIRE(arr[1] == 2); | ||||||
|   } |   } | ||||||
| } | } | ||||||
|  | 
 | ||||||
|  | TEST_CASE("deserializeMsgPack(std::istream&)") { | ||||||
|  |   DynamicJsonDocument doc; | ||||||
|  | 
 | ||||||
|  |   SECTION("should accept a zero in input") { | ||||||
|  |     std::istringstream input(std::string("\x92\x00\x02", 3)); | ||||||
|  | 
 | ||||||
|  |     DeserializationError err = deserializeMsgPack(doc, input); | ||||||
|  | 
 | ||||||
|  |     REQUIRE(err == DeserializationError::Ok); | ||||||
|  |     JsonArray arr = doc.as<JsonArray>(); | ||||||
|  |     REQUIRE(arr[0] == 0); | ||||||
|  |     REQUIRE(arr[1] == 2); | ||||||
|  |   } | ||||||
|  | 
 | ||||||
|  |   SECTION("should detect incomplete input") { | ||||||
|  |     std::istringstream input("\x92\x00\x02"); | ||||||
|  | 
 | ||||||
|  |     DeserializationError err = deserializeMsgPack(doc, input); | ||||||
|  | 
 | ||||||
|  |     REQUIRE(err == DeserializationError::IncompleteInput); | ||||||
|  |   } | ||||||
|  | } | ||||||
|  | 
 | ||||||
|  | #ifdef HAS_VARIABLE_LENGTH_ARRAY | ||||||
|  | TEST_CASE("deserializeMsgPack(VLA)") { | ||||||
|  |   int i = 16; | ||||||
|  |   char vla[i]; | ||||||
|  |   memcpy(vla, "\xDE\x00\x01\xA5Hello\xA5world", 15); | ||||||
|  | 
 | ||||||
|  |   StaticJsonDocument<JSON_OBJECT_SIZE(1)> doc; | ||||||
|  |   DeserializationError err = deserializeMsgPack(doc, vla); | ||||||
|  | 
 | ||||||
|  |   REQUIRE(err == DeserializationError::Ok); | ||||||
|  | } | ||||||
|  | #endif | ||||||
| @@ -1,29 +0,0 @@ | |||||||
| // ArduinoJson - arduinojson.org |  | ||||||
| // Copyright Benoit Blanchon 2014-2018 |  | ||||||
| // MIT License |  | ||||||
|  |  | ||||||
| #include <ArduinoJson.h> |  | ||||||
| #include <catch.hpp> |  | ||||||
|  |  | ||||||
| TEST_CASE("deserializeMsgPack(std::istream&)") { |  | ||||||
|   DynamicJsonDocument doc; |  | ||||||
|  |  | ||||||
|   SECTION("should accept a zero in input") { |  | ||||||
|     std::istringstream input(std::string("\x92\x00\x02", 3)); |  | ||||||
|  |  | ||||||
|     DeserializationError err = deserializeMsgPack(doc, input); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::Ok); |  | ||||||
|     JsonArray arr = doc.as<JsonArray>(); |  | ||||||
|     REQUIRE(arr[0] == 0); |  | ||||||
|     REQUIRE(arr[1] == 2); |  | ||||||
|   } |  | ||||||
|  |  | ||||||
|   SECTION("should detect incomplete input") { |  | ||||||
|     std::istringstream input("\x92\x00\x02"); |  | ||||||
|  |  | ||||||
|     DeserializationError err = deserializeMsgPack(doc, input); |  | ||||||
|  |  | ||||||
|     REQUIRE(err == DeserializationError::IncompleteInput); |  | ||||||
|   } |  | ||||||
| } |  | ||||||
		Reference in New Issue
	
	Block a user