| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  | // ArduinoJson - https://arduinojson.org
 | 
					
						
							|  |  |  | // Copyright © 2014-2024, Benoit BLANCHON
 | 
					
						
							|  |  |  | // MIT License
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #include <ArduinoJson.h>
 | 
					
						
							|  |  |  | #include <catch.hpp>
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  | #include "Literals.hpp"
 | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  | TEST_CASE("JsonVariantConst::operator[]") { | 
					
						
							|  |  |  |   JsonDocument doc; | 
					
						
							|  |  |  |   JsonVariantConst var = doc.to<JsonVariant>(); | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("null") { | 
					
						
							|  |  |  |     REQUIRE(0 == var.size()); | 
					
						
							|  |  |  |     REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     REQUIRE(var[0].isNull()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("string") { | 
					
						
							|  |  |  |     doc.set("hello world"); | 
					
						
							|  |  |  |     REQUIRE(0 == var.size()); | 
					
						
							|  |  |  |     REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     REQUIRE(var[0].isNull()); | 
					
						
							|  |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("array") { | 
					
						
							|  |  |  |     JsonArray array = doc.to<JsonArray>(); | 
					
						
							|  |  |  |     array.add("A"); | 
					
						
							|  |  |  |     array.add("B"); | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  |     SECTION("int") { | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE("A"_s == var[0]); | 
					
						
							|  |  |  |       REQUIRE("B"_s == var[1]); | 
					
						
							|  |  |  |       REQUIRE("A"_s == var[static_cast<unsigned char>(0)]);  // issue #381
 | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  |       REQUIRE(var[666].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[3].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("const char*") { | 
					
						
							|  |  |  |       REQUIRE(var["0"].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     SECTION("JsonVariant") { | 
					
						
							|  |  |  |       array.add(1); | 
					
						
							| 
									
										
										
										
											2024-06-07 09:35:45 +02:00
										 |  |  |       REQUIRE(var[var[2]] == "B"_s); | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  |       REQUIRE(var[var[3]].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |   SECTION("object") { | 
					
						
							|  |  |  |     JsonObject object = doc.to<JsonObject>(); | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |     object["ab"_s] = "AB"; | 
					
						
							|  |  |  |     object["abc"_s] = "ABC"; | 
					
						
							|  |  |  |     object["abc\0d"_s] = "ABCD"; | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-25 11:32:03 +01:00
										 |  |  |     SECTION("string literal") { | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       REQUIRE(var["ab"] == "AB"_s); | 
					
						
							|  |  |  |       REQUIRE(var["abc"] == "ABC"_s); | 
					
						
							| 
									
										
										
										
											2024-11-25 11:32:03 +01:00
										 |  |  |       REQUIRE(var["abc\0d"] == "ABCD"_s); | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       REQUIRE(var["def"].isNull()); | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |       REQUIRE(var[0].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-25 11:32:03 +01:00
										 |  |  |     SECTION("const char*") { | 
					
						
							|  |  |  |       REQUIRE(var[static_cast<const char*>("ab")] == "AB"_s); | 
					
						
							|  |  |  |       REQUIRE(var[static_cast<const char*>("abc")] == "ABC"_s); | 
					
						
							|  |  |  |       REQUIRE(var[static_cast<const char*>("abc\0d")] == "ABC"_s); | 
					
						
							|  |  |  |       REQUIRE(var[static_cast<const char*>("def")].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[static_cast<const char*>(0)].isNull()); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |     SECTION("supports std::string") { | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       REQUIRE(var["ab"_s] == "AB"_s); | 
					
						
							|  |  |  |       REQUIRE(var["abc"_s] == "ABC"_s); | 
					
						
							|  |  |  |       REQUIRE(var["abc\0d"_s] == "ABCD"_s); | 
					
						
							|  |  |  |       REQUIRE(var["def"_s].isNull()); | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | #if defined(HAS_VARIABLE_LENGTH_ARRAY) && \
 | 
					
						
							|  |  |  |     !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR) | 
					
						
							|  |  |  |     SECTION("supports VLA") { | 
					
						
							|  |  |  |       size_t i = 16; | 
					
						
							|  |  |  |       char vla[i]; | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       strcpy(vla, "abc"); | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  | 
 | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       REQUIRE(var[vla] == "ABC"_s); | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |     } | 
					
						
							|  |  |  | #endif
 | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  |     SECTION("supports JsonVariant") { | 
					
						
							| 
									
										
										
										
											2024-11-14 14:56:47 +01:00
										 |  |  |       object["key1"] = "ab"; | 
					
						
							|  |  |  |       object["key2"] = "abc"; | 
					
						
							|  |  |  |       object["key3"] = "abc\0d"_s; | 
					
						
							|  |  |  |       object["key4"] = "foo"; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |       REQUIRE(var[var["key1"]] == "AB"_s); | 
					
						
							|  |  |  |       REQUIRE(var[var["key2"]] == "ABC"_s); | 
					
						
							|  |  |  |       REQUIRE(var[var["key3"]] == "ABCD"_s); | 
					
						
							|  |  |  |       REQUIRE(var[var["key4"]].isNull()); | 
					
						
							|  |  |  |       REQUIRE(var[var["key5"]].isNull()); | 
					
						
							| 
									
										
										
										
											2024-05-14 21:06:02 +02:00
										 |  |  |     } | 
					
						
							| 
									
										
										
										
											2024-01-08 19:31:29 +01:00
										 |  |  |   } | 
					
						
							|  |  |  | } |