| 
									
										
										
										
											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
 | 
					
						
							| 
									
										
										
										
											2014-11-04 10:20:47 +01:00
										 |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2014-11-11 16:54:46 +01:00
										 |  |  | #include <ArduinoJson.h>
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  | #include <catch.hpp>
 | 
					
						
							| 
									
										
										
										
											2014-11-04 10:20:47 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  | #include "Literals.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  | TEST_CASE("JsonVariant::operator[]") { | 
					
						
							| 
									
										
										
										
											2023-07-17 18:15:13 +02:00
										 |  |  |   JsonDocument doc; | 
					
						
							| 
									
										
										
										
											2018-08-21 17:56:16 +02:00
										 |  |  |   JsonVariant var = doc.to<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2021-12-16 14:55:26 +01:00
										 |  |  |   SECTION("The JsonVariant is null") { | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |     REQUIRE(0 == var.size()); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |     REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     REQUIRE(var[0].isNull()); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2014-11-04 10:33:09 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |   SECTION("The JsonVariant is a string") { | 
					
						
							| 
									
										
										
										
											2018-08-21 17:56:16 +02:00
										 |  |  |     var.set("hello world"); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |     REQUIRE(0 == var.size()); | 
					
						
							| 
									
										
										
										
											2018-07-02 09:35:21 +02:00
										 |  |  |     REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     REQUIRE(var[0].isNull()); | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-12-10 14:45:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |   SECTION("The JsonVariant is a JsonArray") { | 
					
						
							| 
									
										
										
										
											2018-09-11 16:05:56 +02:00
										 |  |  |     JsonArray array = var.to<JsonArray>(); | 
					
						
							| 
									
										
										
										
											2016-12-10 14:45:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |     SECTION("get value") { | 
					
						
							|  |  |  |       array.add("element at index 0"); | 
					
						
							|  |  |  |       array.add("element at index 1"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(2 == var.size()); | 
					
						
							| 
									
										
										
										
											2019-01-29 14:09:09 +01:00
										 |  |  |       var[0].as<std::string>(); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       // REQUIRE("element at index 0"_s == );
 | 
					
						
							|  |  |  |       REQUIRE("element at index 1"_s == var[1]); | 
					
						
							|  |  |  |       REQUIRE("element at index 0"_s == | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |               var[static_cast<unsigned char>(0)]);  // issue #381
 | 
					
						
							|  |  |  |       REQUIRE(var[666].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[3].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("set value") { | 
					
						
							|  |  |  |       array.add("hello"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-20 08:59:25 +01:00
										 |  |  |       var[1] = "world"; | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2020-02-20 08:59:25 +01:00
										 |  |  |       REQUIRE(var.size() == 2); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("world"_s == var[1]); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("set value in a nested object") { | 
					
						
							| 
									
										
										
										
											2023-08-09 11:31:29 +02:00
										 |  |  |       array.add<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |       var[0]["hello"] = "world"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(1 == var.size()); | 
					
						
							|  |  |  |       REQUIRE(1 == var[0].size()); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("world"_s == var[0]["hello"]); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2021-09-10 08:40:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("variant[0] when variant contains an integer") { | 
					
						
							|  |  |  |       var.set(123); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       var[0] = 345;  // no-op
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(var.is<int>()); | 
					
						
							|  |  |  |       REQUIRE(var.as<int>() == 123); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("use JsonVariant as index") { | 
					
						
							|  |  |  |       array.add("A"); | 
					
						
							|  |  |  |       array.add("B"); | 
					
						
							|  |  |  |       array.add(1); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(var[var[2]] == "B"); | 
					
						
							|  |  |  |       REQUIRE(var[var[3]].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2016-12-10 14:45:58 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |   SECTION("The JsonVariant is a JsonObject") { | 
					
						
							| 
									
										
										
										
											2018-09-11 16:05:56 +02:00
										 |  |  |     JsonObject object = var.to<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("get value") { | 
					
						
							|  |  |  |       object["a"] = "element at key \"a\""; | 
					
						
							|  |  |  |       object["b"] = "element at key \"b\""; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(2 == var.size()); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("element at key \"a\""_s == var["a"]); | 
					
						
							|  |  |  |       REQUIRE("element at key \"b\""_s == var["b"]); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |       REQUIRE(var["c"].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[0].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("set value, key is a const char*") { | 
					
						
							|  |  |  |       var["hello"] = "world"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(1 == var.size()); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("world"_s == var["hello"]); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("set value, key is a char[]") { | 
					
						
							|  |  |  |       char key[] = "hello"; | 
					
						
							|  |  |  |       var[key] = "world"; | 
					
						
							|  |  |  |       key[0] = '!';  // make sure the key is duplicated
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(1 == var.size()); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("world"_s == var["hello"]); | 
					
						
							| 
									
										
										
										
											2018-07-18 20:19:22 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2018-09-11 16:05:56 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("var[key].to<JsonArray>()") { | 
					
						
							|  |  |  |       JsonArray arr = var["hello"].to<JsonArray>(); | 
					
						
							|  |  |  |       REQUIRE(arr.isNull() == false); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("use JsonVariant as key") { | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       object["a"] = "A"; | 
					
						
							|  |  |  |       object["ab"] = "AB"; | 
					
						
							|  |  |  |       object["ab\0c"_s] = "ABC"; | 
					
						
							|  |  |  |       object["key1"] = "a"; | 
					
						
							|  |  |  |       object["key2"] = "ab"; | 
					
						
							|  |  |  |       object["key3"] = "ab\0c"_s; | 
					
						
							|  |  |  |       object["key4"] = "foo"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(var[var["key1"]] == "A"); | 
					
						
							|  |  |  |       REQUIRE(var[var["key2"]] == "AB"); | 
					
						
							|  |  |  |       REQUIRE(var[var["key3"]] == "ABC"); | 
					
						
							|  |  |  |       REQUIRE(var[var["key4"]].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[var["key5"]].isNull()); | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2017-04-18 18:22:24 +02:00
										 |  |  |   } | 
					
						
							| 
									
										
										
										
											2018-08-22 14:37:17 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | #if defined(HAS_VARIABLE_LENGTH_ARRAY) && \
 | 
					
						
							|  |  |  |     !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR) | 
					
						
							|  |  |  |   SECTION("key is a VLA") { | 
					
						
							| 
									
										
										
										
											2022-02-25 09:23:51 +01:00
										 |  |  |     size_t i = 16; | 
					
						
							| 
									
										
										
										
											2018-08-22 14:37:17 +02:00
										 |  |  |     char vla[i]; | 
					
						
							|  |  |  |     strcpy(vla, "hello"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deserializeJson(doc, "{\"hello\":\"world\"}"); | 
					
						
							|  |  |  |     JsonVariant variant = doc.as<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |     REQUIRE("world"_s == variant[vla]); | 
					
						
							| 
									
										
										
										
											2018-08-22 14:37:17 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("key is a VLA, const JsonVariant") { | 
					
						
							| 
									
										
										
										
											2022-02-25 09:23:51 +01:00
										 |  |  |     size_t i = 16; | 
					
						
							| 
									
										
										
										
											2018-08-22 14:37:17 +02:00
										 |  |  |     char vla[i]; | 
					
						
							|  |  |  |     strcpy(vla, "hello"); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     deserializeJson(doc, "{\"hello\":\"world\"}"); | 
					
						
							|  |  |  |     const JsonVariant variant = doc.as<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |     REQUIRE("world"_s == variant[vla]); | 
					
						
							| 
									
										
										
										
											2018-08-22 14:37:17 +02:00
										 |  |  |   } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2016-12-10 14:45:58 +01:00
										 |  |  | } |