Return JsonArray and JsonObject by value (closes #309)

This commit is contained in:
Benoit Blanchon
2018-07-02 09:35:21 +02:00
parent 4fe2b1100e
commit b105e6f7c4
93 changed files with 983 additions and 1091 deletions

View File

@ -7,10 +7,10 @@ add_executable(JsonVariantTests
compare.cpp
copy.cpp
is.cpp
isnull.cpp
or.cpp
set_get.cpp
subscript.cpp
success.cpp
undefined.cpp
)

View File

@ -193,7 +193,7 @@ TEST_CASE("JsonVariant::as()") {
SECTION("ObjectAsString") {
DynamicJsonDocument doc;
JsonObject& obj = doc.to<JsonObject>();
JsonObject obj = doc.to<JsonObject>();
obj["key"] = "value";
@ -203,7 +203,7 @@ TEST_CASE("JsonVariant::as()") {
SECTION("ArrayAsString") {
DynamicJsonDocument doc;
JsonArray& arr = doc.to<JsonArray>();
JsonArray arr = doc.to<JsonArray>();
arr.add(4);
arr.add(2);
@ -213,19 +213,19 @@ TEST_CASE("JsonVariant::as()") {
SECTION("ArrayAsJsonArray") {
DynamicJsonDocument doc;
JsonArray& arr = doc.to<JsonArray>();
JsonArray arr = doc.to<JsonArray>();
JsonVariant variant = arr;
REQUIRE(&arr == &variant.as<JsonArray&>());
REQUIRE(&arr == &variant.as<JsonArray>()); // <- shorthand
REQUIRE(arr == variant.as<JsonArray>());
REQUIRE(arr == variant.as<JsonArray>()); // <- shorthand
}
SECTION("ObjectAsJsonObject") {
DynamicJsonDocument doc;
JsonObject& obj = doc.to<JsonObject>();
JsonObject obj = doc.to<JsonObject>();
JsonVariant variant = obj;
REQUIRE(&obj == &variant.as<JsonObject&>());
REQUIRE(&obj == &variant.as<JsonObject>()); // <- shorthand
REQUIRE(obj == variant.as<JsonObject>());
REQUIRE(obj == variant.as<JsonObject>()); // <- shorthand
}
}

View File

@ -213,9 +213,9 @@ TEST_CASE("JsonVariant comparisons") {
SECTION("ArrayInVariant") {
DynamicJsonDocument doc1;
JsonArray& array1 = doc1.to<JsonArray>();
JsonArray array1 = doc1.to<JsonArray>();
DynamicJsonDocument doc2;
JsonArray& array2 = doc2.to<JsonArray>();
JsonArray array2 = doc2.to<JsonArray>();
JsonVariant variant1 = array1;
JsonVariant variant2 = array1;
@ -230,9 +230,9 @@ TEST_CASE("JsonVariant comparisons") {
SECTION("ObjectInVariant") {
DynamicJsonDocument doc1;
JsonObject& obj1 = doc1.to<JsonObject>();
JsonObject obj1 = doc1.to<JsonObject>();
DynamicJsonDocument doc2;
JsonObject& obj2 = doc2.to<JsonObject>();
JsonObject obj2 = doc2.to<JsonObject>();
JsonVariant variant1 = obj1;
JsonVariant variant2 = obj1;
@ -247,10 +247,10 @@ TEST_CASE("JsonVariant comparisons") {
SECTION("VariantsOfDifferentTypes") {
DynamicJsonDocument doc1;
JsonObject& obj = doc1.to<JsonObject>();
JsonObject obj = doc1.to<JsonObject>();
DynamicJsonDocument doc2;
JsonArray& arr = doc2.to<JsonArray>();
JsonArray arr = doc2.to<JsonArray>();
JsonVariant variants[] = {
true, 42, 666.667, "hello", arr, obj,
};

View File

@ -43,7 +43,7 @@ TEST_CASE("JsonVariant copy") {
SECTION("ObjectsAreCopiedByReference") {
DynamicJsonDocument doc;
JsonObject& object = doc.to<JsonObject>();
JsonObject object = doc.to<JsonObject>();
_variant1 = object;
@ -54,7 +54,7 @@ TEST_CASE("JsonVariant copy") {
SECTION("ArraysAreCopiedByReference") {
DynamicJsonDocument doc;
JsonArray& array = doc.to<JsonArray>();
JsonArray array = doc.to<JsonArray>();
_variant1 = array;

View File

@ -7,9 +7,9 @@
void checkIsArray(JsonVariant var) {
REQUIRE(var.is<JsonArray>());
REQUIRE(var.is<JsonArray&>());
REQUIRE(var.is<JsonArray>());
REQUIRE(var.is<const JsonArray>());
REQUIRE(var.is<const JsonArray>());
REQUIRE(var.is<const JsonArray&>());
REQUIRE_FALSE(var.is<bool>());
REQUIRE_FALSE(var.is<double>());
@ -71,7 +71,7 @@ void checkIsString(JsonVariant var) {
TEST_CASE("JsonVariant::is()") {
SECTION("JsonArray") {
DynamicJsonDocument doc;
JsonArray& array = doc.to<JsonArray>();
JsonArray array = doc.to<JsonArray>();
checkIsArray(array);
}

View File

@ -5,40 +5,40 @@
#include <ArduinoJson.h>
#include <catch.hpp>
TEST_CASE("JsonVariant::success()") {
TEST_CASE("JsonVariant::isNull()") {
SECTION("ReturnsFalse_WhenUndefined") {
JsonVariant variant;
REQUIRE(false == variant.success());
REQUIRE(variant.isNull() == true);
}
SECTION("ReturnsTrue_WhenInteger") {
JsonVariant variant = 0;
REQUIRE(true == variant.success());
REQUIRE(variant.isNull() == false);
}
SECTION("ReturnsTrue_WhenEmptyArray") {
DynamicJsonDocument doc;
JsonArray& array = doc.to<JsonArray>();
JsonArray array = doc.to<JsonArray>();
JsonVariant variant = array;
REQUIRE(true == variant.success());
REQUIRE(variant.isNull() == false);
}
SECTION("ReturnsTrue_WhenEmptyObject") {
DynamicJsonDocument doc;
JsonObject& obj = doc.to<JsonObject>();
JsonObject obj = doc.to<JsonObject>();
JsonVariant variant = obj;
REQUIRE(true == variant.success());
REQUIRE(variant.isNull() == false);
}
SECTION("ReturnsFalse_WhenInvalidArray") {
JsonVariant variant = JsonArray::invalid();
REQUIRE(false == variant.success());
JsonVariant variant = JsonArray();
REQUIRE(variant.isNull() == true);
}
SECTION("ReturnsFalse_WhenInvalidObject") {
JsonVariant variant = JsonObject::invalid();
REQUIRE(false == variant.success());
JsonVariant variant = JsonObject();
REQUIRE(variant.isNull() == true);
}
}

View File

@ -123,8 +123,8 @@ TEST_CASE("JsonVariant set()/get()") {
SECTION("CanStoreObject") {
DynamicJsonDocument doc;
JsonObject &object = doc.to<JsonObject>();
JsonObject object = doc.to<JsonObject>();
checkReference<JsonObject>(object);
checkValue<JsonObject>(object);
}
}

View File

@ -8,7 +8,7 @@
TEST_CASE("JsonVariant::operator[]") {
SECTION("Array") {
DynamicJsonDocument doc;
JsonArray& array = doc.to<JsonArray>();
JsonArray array = doc.to<JsonArray>();
array.add("element at index 0");
array.add("element at index 1");
@ -19,14 +19,14 @@ TEST_CASE("JsonVariant::operator[]") {
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_FALSE(var[666].success());
REQUIRE_FALSE(var[3].success());
REQUIRE_FALSE(var["0"].success());
REQUIRE(var[666].isNull());
REQUIRE(var[3].isNull());
REQUIRE(var["0"].isNull());
}
SECTION("Object") {
DynamicJsonDocument doc;
JsonObject& object = doc.to<JsonObject>();
JsonObject object = doc.to<JsonObject>();
object["a"] = "element at key \"a\"";
object["b"] = "element at key \"b\"";
@ -35,27 +35,27 @@ TEST_CASE("JsonVariant::operator[]") {
REQUIRE(2 == var.size());
REQUIRE(std::string("element at key \"a\"") == var["a"]);
REQUIRE(std::string("element at key \"b\"") == var["b"]);
REQUIRE_FALSE(var["c"].success());
REQUIRE_FALSE(var[0].success());
REQUIRE(var["c"].isNull());
REQUIRE(var[0].isNull());
}
SECTION("Undefined") {
JsonVariant var = JsonVariant();
REQUIRE(0 == var.size());
REQUIRE_FALSE(var["0"].success());
REQUIRE_FALSE(var[0].success());
REQUIRE(var["0"].isNull());
REQUIRE(var[0].isNull());
}
SECTION("String") {
JsonVariant var = "hello world";
REQUIRE(0 == var.size());
REQUIRE_FALSE(var["0"].success());
REQUIRE_FALSE(var[0].success());
REQUIRE(var["0"].isNull());
REQUIRE(var[0].isNull());
}
SECTION("ObjectSetValue") {
DynamicJsonDocument doc;
JsonObject& obj = doc.to<JsonObject>();
JsonObject obj = doc.to<JsonObject>();
JsonVariant var = obj;
var["hello"] = "world";
REQUIRE(1 == var.size());
@ -64,7 +64,7 @@ TEST_CASE("JsonVariant::operator[]") {
SECTION("ArraySetValue") {
DynamicJsonDocument doc;
JsonArray& arr = doc.to<JsonArray>();
JsonArray arr = doc.to<JsonArray>();
arr.add("hello");
JsonVariant var = arr;
var[0] = "world";

View File

@ -29,26 +29,26 @@ TEST_CASE("JsonVariant undefined") {
}
SECTION("AsArrayReturnInvalid") {
REQUIRE(JsonArray::invalid() == variant.as<JsonArray&>());
REQUIRE(JsonArray() == variant.as<JsonArray>());
}
SECTION("AsConstArrayReturnInvalid") {
REQUIRE(JsonArray::invalid() == variant.as<const JsonArray&>());
REQUIRE(JsonArray() == variant.as<const JsonArray>());
}
SECTION("AsObjectReturnInvalid") {
REQUIRE(JsonObject::invalid() == variant.as<JsonObject&>());
REQUIRE(JsonObject() == variant.as<JsonObject>());
}
SECTION("AsConstObjectReturnInvalid") {
REQUIRE(JsonObject::invalid() == variant.as<const JsonObject&>());
REQUIRE(JsonObject() == variant.as<const JsonObject>());
}
SECTION("AsArrayWrapperReturnInvalid") {
REQUIRE(JsonArray::invalid() == variant.as<JsonArray>());
REQUIRE(JsonArray() == variant.as<JsonArray>());
}
SECTION("AsObjectWrapperReturnInvalid") {
REQUIRE(JsonObject::invalid() == variant.as<JsonObject>());
REQUIRE(JsonObject() == variant.as<JsonObject>());
}
}