Simplified tests of JsonVariant::is<T>()

This commit is contained in:
Benoit Blanchon
2021-02-23 08:27:48 +01:00
parent 22904a48a6
commit 8a3f8510d6

View File

@ -7,160 +7,225 @@
enum MYENUM2 { ONE = 1, TWO = 2 }; enum MYENUM2 { ONE = 1, TWO = 2 };
template <typename TVariant> TEST_CASE("JsonVariant::is<T>()") {
void checkIsArray(TVariant var) {
REQUIRE(var.template is<JsonArray>());
REQUIRE_FALSE(var.template is<bool>());
REQUIRE_FALSE(var.template is<double>());
REQUIRE_FALSE(var.template is<float>());
REQUIRE_FALSE(var.template is<int>());
REQUIRE_FALSE(var.template is<long>());
REQUIRE_FALSE(var.template is<const char *>());
REQUIRE_FALSE(var.template is<JsonObject>());
}
void testArray(JsonArray value) {
DynamicJsonDocument doc(4096); DynamicJsonDocument doc(4096);
JsonVariant variant = doc.to<JsonVariant>();
JsonVariant var = doc.to<JsonVariant>(); SECTION("null") {
var.set(value); CHECK(variant.is<JsonObject>() == false);
CHECK(variant.is<JsonArray>() == false);
checkIsArray(var); CHECK(variant.is<bool>() == false);
CHECK(variant.is<char *>() == false);
JsonVariantConst cvar = var; CHECK(variant.is<int>() == false);
checkIsArray(cvar); CHECK(variant.is<std::string>() == false);
CHECK(variant.is<float>() == false);
CHECK(variant.is<MYENUM2>() == false);
} }
template <typename TVariant> SECTION("true") {
void checkIsBool(TVariant var) { variant.set(true);
REQUIRE(var.template is<bool>());
REQUIRE_FALSE(var.template is<double>()); CHECK(variant.is<bool>() == true);
REQUIRE_FALSE(var.template is<float>()); CHECK(variant.is<JsonObject>() == false);
REQUIRE_FALSE(var.template is<int>()); CHECK(variant.is<JsonArray>() == false);
REQUIRE_FALSE(var.template is<long>()); CHECK(variant.is<char *>() == false);
REQUIRE_FALSE(var.template is<const char *>()); CHECK(variant.is<int>() == false);
REQUIRE_FALSE(var.template is<JsonArray>()); CHECK(variant.is<std::string>() == false);
REQUIRE_FALSE(var.template is<JsonObject>()); CHECK(variant.is<float>() == false);
CHECK(variant.is<MYENUM2>() == false);
} }
void testBool(bool value) { SECTION("false") {
DynamicJsonDocument doc(4096); variant.set(false);
JsonVariant var = doc.to<JsonVariant>();
var.set(value);
checkIsBool(var); CHECK(variant.is<bool>() == true);
checkIsBool(JsonVariantConst(var)); CHECK(variant.is<JsonObject>() == false);
} CHECK(variant.is<JsonArray>() == false);
CHECK(variant.is<char *>() == false);
template <typename TVariant> CHECK(variant.is<int>() == false);
void checkIsFloat(TVariant var) { CHECK(variant.is<std::string>() == false);
REQUIRE(var.template is<double>()); CHECK(variant.is<float>() == false);
REQUIRE(var.template is<float>()); CHECK(variant.is<MYENUM2>() == false);
REQUIRE_FALSE(var.template is<bool>());
REQUIRE_FALSE(var.template is<int>());
REQUIRE_FALSE(var.template is<long>());
REQUIRE_FALSE(var.template is<const char *>());
REQUIRE_FALSE(var.template is<JsonArray>());
REQUIRE_FALSE(var.template is<JsonObject>());
}
void testFloat(double value) {
DynamicJsonDocument doc(4096);
JsonVariant var = doc.to<JsonVariant>();
var.set(value);
checkIsFloat(var);
checkIsFloat(JsonVariantConst(var));
}
template <typename TVariant>
void checkIsInteger(TVariant var) {
REQUIRE(var.template is<long>());
REQUIRE(var.template is<int>());
REQUIRE(var.template is<float>());
REQUIRE(var.template is<double>());
REQUIRE(var.template is<MYENUM2>());
REQUIRE_FALSE(var.template is<bool>());
REQUIRE_FALSE(var.template is<const char *>());
REQUIRE_FALSE(var.template is<JsonArray>());
REQUIRE_FALSE(var.template is<JsonObject>());
}
template <typename T>
void testInteger(T value) {
DynamicJsonDocument doc(4096);
JsonVariant var = doc.to<JsonVariant>();
var.set(value);
checkIsInteger(var);
checkIsInteger(JsonVariantConst(var));
}
template <typename TVariant>
void checkIsString(TVariant var) {
REQUIRE(var.template is<const char *>());
REQUIRE(var.template is<std::string>());
REQUIRE_FALSE(var.template is<bool>());
REQUIRE_FALSE(var.template is<int>());
REQUIRE_FALSE(var.template is<double>());
REQUIRE_FALSE(var.template is<float>());
REQUIRE_FALSE(var.template is<long>());
REQUIRE_FALSE(var.template is<MYENUM2>());
REQUIRE_FALSE(var.template is<JsonArray>());
REQUIRE_FALSE(var.template is<JsonObject>());
}
void testString(const char *value) {
DynamicJsonDocument doc(4096);
JsonVariant var = doc.to<JsonVariant>();
var.set(value);
checkIsString(var);
checkIsString(JsonVariantConst(var));
}
TEST_CASE("JsonVariant::is()") {
SECTION("JsonArray") {
DynamicJsonDocument doc(4096);
JsonArray array = doc.to<JsonArray>();
testArray(array);
}
SECTION("bool") {
testBool(true);
testBool(false);
}
SECTION("double") {
testFloat(4.2);
} }
SECTION("int") { SECTION("int") {
testInteger(42); variant.set(42);
CHECK(variant.is<int>() == true);
CHECK(variant.is<short>() == true);
CHECK(variant.is<long>() == true);
CHECK(variant.is<double>() == true);
CHECK(variant.is<float>() == true);
CHECK(variant.is<MYENUM2>() == true);
CHECK(variant.is<bool>() == false);
CHECK(variant.is<JsonObject>() == false);
CHECK(variant.is<JsonArray>() == false);
CHECK(variant.is<char *>() == false);
CHECK(variant.is<std::string>() == false);
} }
SECTION("long") { SECTION("double") {
testInteger(42L); variant.set(4.2);
CHECK(variant.is<double>() == true);
CHECK(variant.is<float>() == true);
CHECK(variant.is<bool>() == false);
CHECK(variant.is<JsonObject>() == false);
CHECK(variant.is<JsonArray>() == false);
CHECK(variant.is<char *>() == false);
CHECK(variant.is<int>() == false);
CHECK(variant.is<std::string>() == false);
CHECK(variant.is<MYENUM2>() == false);
} }
SECTION("string") { SECTION("const char*") {
testString("42"); variant.set("4.2");
CHECK(variant.is<char *>() == true);
CHECK(variant.is<const char *>() == true);
CHECK(variant.is<std::string>() == true);
CHECK(variant.is<double>() == false);
CHECK(variant.is<float>() == false);
CHECK(variant.is<bool>() == false);
CHECK(variant.is<JsonObject>() == false);
CHECK(variant.is<JsonArray>() == false);
CHECK(variant.is<int>() == false);
CHECK(variant.is<MYENUM2>() == false);
} }
SECTION("JsonArray") {
variant.to<JsonArray>();
CHECK(variant.is<JsonArray>() == true);
CHECK(variant.is<JsonObject>() == false);
CHECK(variant.is<int>() == false);
CHECK(variant.is<float>() == false);
CHECK(variant.is<bool>() == false);
CHECK(variant.is<char *>() == false);
CHECK(variant.is<MYENUM2>() == false);
}
SECTION("JsonObject") {
variant.to<JsonObject>();
CHECK(variant.is<JsonObject>() == true);
CHECK(variant.is<JsonArray>() == false);
CHECK(variant.is<int>() == false);
CHECK(variant.is<float>() == false);
CHECK(variant.is<bool>() == false);
CHECK(variant.is<char *>() == false);
CHECK(variant.is<MYENUM2>() == false);
}
}
TEST_CASE("JsonVariantConst::is<T>()") {
DynamicJsonDocument doc(4096);
JsonVariant variant = doc.to<JsonVariant>();
JsonVariantConst cvariant = variant;
SECTION("null") { SECTION("null") {
DynamicJsonDocument doc(4096); CHECK(cvariant.is<JsonObject>() == false);
deserializeJson(doc, "[null]"); CHECK(cvariant.is<JsonArray>() == false);
JsonVariant v = doc[0]; CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<std::string>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
REQUIRE(v.is<bool>() == false); SECTION("true") {
REQUIRE(v.is<char *>() == false); variant.set(true);
REQUIRE(v.is<int>() == false);
REQUIRE(v.is<std::string>() == false); CHECK(cvariant.is<bool>() == true);
REQUIRE(v.is<float>() == false); CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<std::string>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
SECTION("false") {
variant.set(false);
CHECK(cvariant.is<bool>() == true);
CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<std::string>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
SECTION("int") {
variant.set(42);
CHECK(cvariant.is<int>() == true);
CHECK(cvariant.is<short>() == true);
CHECK(cvariant.is<long>() == true);
CHECK(cvariant.is<double>() == true);
CHECK(cvariant.is<float>() == true);
CHECK(cvariant.is<MYENUM2>() == true);
CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<std::string>() == false);
}
SECTION("double") {
variant.set(4.2);
CHECK(cvariant.is<double>() == true);
CHECK(cvariant.is<float>() == true);
CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<std::string>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
SECTION("const char*") {
variant.set("4.2");
CHECK(cvariant.is<char *>() == true);
CHECK(cvariant.is<const char *>() == true);
CHECK(cvariant.is<std::string>() == true);
CHECK(cvariant.is<double>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
SECTION("JsonArray") {
variant.to<JsonArray>();
CHECK(cvariant.is<JsonArray>() == true);
CHECK(cvariant.is<JsonObject>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
}
SECTION("JsonObject") {
variant.to<JsonObject>();
CHECK(cvariant.is<JsonObject>() == true);
CHECK(cvariant.is<JsonArray>() == false);
CHECK(cvariant.is<int>() == false);
CHECK(cvariant.is<float>() == false);
CHECK(cvariant.is<bool>() == false);
CHECK(cvariant.is<char *>() == false);
CHECK(cvariant.is<MYENUM2>() == false);
} }
} }