test: yaml-parser: Centralize integer parse checks

Centralize the signed and unsigned integer parse checks to avoid code
duplication. The diffstat isn't very impressive at this point, but this
will help more when adding 8-bit and 16-bit integer tests.

Signed-off-by: Laurent Pinchart <laurent.pinchart@ideasonboard.com>
Reviewed-by: Paul Elder <paul.elder@ideasboard.com>
Reviewed-by: Jacopo Mondi <jacopo@jmondi.org>
This commit is contained in:
Laurent Pinchart 2022-08-16 01:20:59 +03:00
parent 88746ddf94
commit 629e65b15b

View file

@ -149,6 +149,52 @@ protected:
return TestPass; return TestPass;
} }
int testIntegerObject(const YamlObject &obj, const char *name, Type type,
int64_t value)
{
uint64_t unsignedValue = static_cast<uint64_t>(value);
std::string strValue = std::to_string(value);
bool isSigned = type == Type::Int32;
/* All integers can be parsed as strings or double. */
if (obj.get<string>().value_or("") != strValue ||
obj.get<string>("") != strValue) {
std::cerr
<< "Object " << name << " failed to parse as "
<< "string" << std::endl;
return TestFail;
}
if (obj.get<double>().value_or(0.0) != value ||
obj.get<double>(0.0) != value) {
std::cerr
<< "Object " << name << " failed to parse as "
<< "double" << std::endl;
return TestFail;
}
if (obj.get<int32_t>().value_or(0) != value ||
obj.get<int32_t>(0) != value) {
std::cerr
<< "Object " << name << " failed to parse as "
<< "int32_t" << std::endl;
return TestFail;
}
if (!isSigned) {
if (obj.get<uint32_t>().value_or(0) != unsignedValue ||
obj.get<uint32_t>(0) != unsignedValue) {
std::cerr
<< "Object " << name << " failed to parse as "
<< "uint32_t" << std::endl;
return TestFail;
}
}
return TestPass;
}
int run() int run()
{ {
/* Test invalid YAML file */ /* Test invalid YAML file */
@ -215,23 +261,8 @@ protected:
if (testObjectType(int32Obj, "int32_t", Type::Int32) != TestPass) if (testObjectType(int32Obj, "int32_t", Type::Int32) != TestPass)
return TestFail; return TestFail;
if (int32Obj.get<int32_t>().value_or(0) != -100 || if (testIntegerObject(int32Obj, "int32_t", Type::Int32, -100) != TestPass)
int32Obj.get<int32_t>(0) != -100) {
cerr << "Integer object parse as wrong value" << std::endl;
return TestFail; return TestFail;
}
if (int32Obj.get<string>().value_or("") != "-100" ||
int32Obj.get<string>("") != "-100") {
cerr << "Integer object fail to parse as string" << std::endl;
return TestFail;
}
if (int32Obj.get<double>().value_or(0.0) != -100.0 ||
int32Obj.get<double>(0.0) != -100.0) {
cerr << "Integer object fail to parse as double" << std::endl;
return TestFail;
}
/* Test uint32_t object */ /* Test uint32_t object */
auto &uint32Obj = (*root)["uint32_t"]; auto &uint32Obj = (*root)["uint32_t"];
@ -239,29 +270,8 @@ protected:
if (testObjectType(uint32Obj, "uint32_t", Type::UInt32) != TestPass) if (testObjectType(uint32Obj, "uint32_t", Type::UInt32) != TestPass)
return TestFail; return TestFail;
if (uint32Obj.get<int32_t>().value_or(0) != 100 || if (testIntegerObject(uint32Obj, "uint32_t", Type::UInt32, 100) != TestPass)
uint32Obj.get<int32_t>(0) != 100) {
cerr << "Unsigned integer object fail to parse as integer" << std::endl;
return TestFail; return TestFail;
}
if (uint32Obj.get<string>().value_or("") != "100" ||
uint32Obj.get<string>("") != "100") {
cerr << "Unsigned integer object fail to parse as string" << std::endl;
return TestFail;
}
if (uint32Obj.get<double>().value_or(0.0) != 100.0 ||
uint32Obj.get<double>(0.0) != 100.0) {
cerr << "Unsigned integer object fail to parse as double" << std::endl;
return TestFail;
}
if (uint32Obj.get<uint32_t>().value_or(0) != 100 ||
uint32Obj.get<uint32_t>(0) != 100) {
cerr << "Unsigned integer object parsed as wrong value" << std::endl;
return TestFail;
}
/* Test double value */ /* Test double value */
auto &doubleObj = (*root)["double"]; auto &doubleObj = (*root)["double"];