// ArduinoJson - https://arduinojson.org // Copyright Benoit Blanchon 2014-2021 // MIT License #include #include TEST_CASE("JsonVariant::operator[]") { DynamicJsonDocument doc(4096); JsonVariant var = doc.to(); SECTION("The JsonVariant is undefined") { 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(); SECTION("get value") { array.add("element at index 0"); array.add("element at index 1"); REQUIRE(2 == var.size()); var[0].as(); // 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(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()); REQUIRE(var.as() == 123); } } SECTION("The JsonVariant is a JsonObject") { JsonObject object = var.to(); 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 arr = var["hello"].to(); REQUIRE(arr.isNull() == false); } } #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(); 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(); REQUIRE(std::string("world") == variant[vla]); } #endif } TEST_CASE("JsonVariantConst::operator[]") { DynamicJsonDocument doc(4096); JsonVariant var = doc.to(); JsonVariantConst cvar = var; SECTION("The JsonVariant is undefined") { 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(); 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(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(); 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() == true); } SECTION("Don't auto promote non-null JsonVariant to JsonObject") { var.set(42); var["hello"] = "world"; REQUIRE(var.is() == false); } SECTION("Don't auto promote null JsonVariant to JsonObject when reading") { const char* value = var["hello"]; REQUIRE(var.is() == false); REQUIRE(value == 0); } }