mirror of
				https://github.com/bblanchon/ArduinoJson.git
				synced 2025-11-04 08:31:36 +01:00 
			
		
		
		
	Instead of storing a pointer, the function copies the `VariantData`. Benefits: * smaller code * no impact on programs that don't use this feature Drawbacks: * changes to the original variant are not always reflected on the copy * modifying the original from the shallow copy leads to UB
		
			
				
	
	
		
			205 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
			
		
		
	
	
			205 lines
		
	
	
		
			5.3 KiB
		
	
	
	
		
			C++
		
	
	
	
	
	
// ArduinoJson - https://arduinojson.org
 | 
						|
// Copyright © 2014-2022, Benoit BLANCHON
 | 
						|
// MIT License
 | 
						|
 | 
						|
#include <ArduinoJson.h>
 | 
						|
#include <catch.hpp>
 | 
						|
 | 
						|
TEST_CASE("JsonVariant::operator[]") {
 | 
						|
  DynamicJsonDocument doc(4096);
 | 
						|
  JsonVariant var = doc.to<JsonVariant>();
 | 
						|
 | 
						|
  SECTION("The JsonVariant is null") {
 | 
						|
    REQUIRE(0 == var.size());
 | 
						|
    REQUIRE(var["0"].isNull());
 | 
						|
    REQUIRE(var[0].isNull());
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a string") {
 | 
						|
    var.set("hello world");
 | 
						|
    REQUIRE(0 == var.size());
 | 
						|
    REQUIRE(var["0"].isNull());
 | 
						|
    REQUIRE(var[0].isNull());
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a JsonArray") {
 | 
						|
    JsonArray array = var.to<JsonArray>();
 | 
						|
 | 
						|
    SECTION("get value") {
 | 
						|
      array.add("element at index 0");
 | 
						|
      array.add("element at index 1");
 | 
						|
 | 
						|
      REQUIRE(2 == var.size());
 | 
						|
      var[0].as<std::string>();
 | 
						|
      // REQUIRE(std::string("element at index 0") == );
 | 
						|
      REQUIRE(std::string("element at index 1") == var[1]);
 | 
						|
      REQUIRE(std::string("element at index 0") ==
 | 
						|
              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");
 | 
						|
 | 
						|
      var[1] = "world";
 | 
						|
 | 
						|
      REQUIRE(var.size() == 2);
 | 
						|
      REQUIRE(std::string("world") == var[1]);
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("set value in a nested object") {
 | 
						|
      array.createNestedObject();
 | 
						|
 | 
						|
      var[0]["hello"] = "world";
 | 
						|
 | 
						|
      REQUIRE(1 == var.size());
 | 
						|
      REQUIRE(1 == var[0].size());
 | 
						|
      REQUIRE(std::string("world") == var[0]["hello"]);
 | 
						|
    }
 | 
						|
 | 
						|
    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);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a JsonObject") {
 | 
						|
    JsonObject object = var.to<JsonObject>();
 | 
						|
 | 
						|
    SECTION("get value") {
 | 
						|
      object["a"] = "element at key \"a\"";
 | 
						|
      object["b"] = "element at key \"b\"";
 | 
						|
 | 
						|
      REQUIRE(2 == var.size());
 | 
						|
      REQUIRE(std::string("element at key \"a\"") == var["a"]);
 | 
						|
      REQUIRE(std::string("element at key \"b\"") == var["b"]);
 | 
						|
      REQUIRE(var["c"].isNull());
 | 
						|
      REQUIRE(var[0].isNull());
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("set value, key is a const char*") {
 | 
						|
      var["hello"] = "world";
 | 
						|
 | 
						|
      REQUIRE(1 == var.size());
 | 
						|
      REQUIRE(std::string("world") == var["hello"]);
 | 
						|
    }
 | 
						|
 | 
						|
    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());
 | 
						|
      REQUIRE(std::string("world") == var["hello"]);
 | 
						|
    }
 | 
						|
 | 
						|
    SECTION("var[key].to<JsonArray>()") {
 | 
						|
      JsonArray arr = var["hello"].to<JsonArray>();
 | 
						|
      REQUIRE(arr.isNull() == false);
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
#if defined(HAS_VARIABLE_LENGTH_ARRAY) && \
 | 
						|
    !defined(SUBSCRIPT_CONFLICTS_WITH_BUILTIN_OPERATOR)
 | 
						|
  SECTION("key is a VLA") {
 | 
						|
    size_t 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") {
 | 
						|
    size_t 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
 | 
						|
}
 | 
						|
 | 
						|
TEST_CASE("JsonVariantConst::operator[]") {
 | 
						|
  DynamicJsonDocument doc(4096);
 | 
						|
  JsonVariant var = doc.to<JsonVariant>();
 | 
						|
  JsonVariantConst cvar = var;
 | 
						|
 | 
						|
  SECTION("The JsonVariant is null") {
 | 
						|
    REQUIRE(0 == cvar.size());
 | 
						|
    REQUIRE(cvar["0"].isNull());
 | 
						|
    REQUIRE(cvar[0].isNull());
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a string") {
 | 
						|
    var.set("hello world");
 | 
						|
    REQUIRE(0 == cvar.size());
 | 
						|
    REQUIRE(cvar["0"].isNull());
 | 
						|
    REQUIRE(cvar[0].isNull());
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a JsonArray") {
 | 
						|
    JsonArray array = var.to<JsonArray>();
 | 
						|
 | 
						|
    SECTION("get value") {
 | 
						|
      array.add("element at index 0");
 | 
						|
      array.add("element at index 1");
 | 
						|
 | 
						|
      REQUIRE(2 == cvar.size());
 | 
						|
      REQUIRE(std::string("element at index 0") == cvar[0]);
 | 
						|
      REQUIRE(std::string("element at index 1") == cvar[1]);
 | 
						|
      REQUIRE(std::string("element at index 0") ==
 | 
						|
              var[static_cast<unsigned char>(0)]);  // issue #381
 | 
						|
      REQUIRE(cvar[666].isNull());
 | 
						|
      REQUIRE(cvar[3].isNull());
 | 
						|
      REQUIRE(cvar["0"].isNull());
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("The JsonVariant is a JsonObject") {
 | 
						|
    JsonObject object = var.to<JsonObject>();
 | 
						|
 | 
						|
    SECTION("get value") {
 | 
						|
      object["a"] = "element at key \"a\"";
 | 
						|
      object["b"] = "element at key \"b\"";
 | 
						|
 | 
						|
      REQUIRE(2 == cvar.size());
 | 
						|
      REQUIRE(std::string("element at key \"a\"") == cvar["a"]);
 | 
						|
      REQUIRE(std::string("element at key \"b\"") == cvar["b"]);
 | 
						|
      REQUIRE(cvar["c"].isNull());
 | 
						|
      REQUIRE(cvar[0].isNull());
 | 
						|
    }
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("Auto promote null JsonVariant to JsonObject") {
 | 
						|
    var["hello"] = "world";
 | 
						|
 | 
						|
    REQUIRE(var.is<JsonObject>() == true);
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("Don't auto promote non-null JsonVariant to JsonObject") {
 | 
						|
    var.set(42);
 | 
						|
    var["hello"] = "world";
 | 
						|
 | 
						|
    REQUIRE(var.is<JsonObject>() == false);
 | 
						|
  }
 | 
						|
 | 
						|
  SECTION("Don't auto promote null JsonVariant to JsonObject when reading") {
 | 
						|
    const char* value = var["hello"];
 | 
						|
 | 
						|
    REQUIRE(var.is<JsonObject>() == false);
 | 
						|
    REQUIRE(value == 0);
 | 
						|
  }
 | 
						|
}
 |