From 629e65b15b8e659502a2d21e3097af5e342a4a1f Mon Sep 17 00:00:00 2001 From: Laurent Pinchart Date: Tue, 16 Aug 2022 01:20:59 +0300 Subject: 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 Reviewed-by: Paul Elder Reviewed-by: Jacopo Mondi --- test/yaml-parser.cpp | 86 +++++++++++++++++++++++++++++----------------------- 1 file changed, 48 insertions(+), 38 deletions(-) (limited to 'test') diff --git a/test/yaml-parser.cpp b/test/yaml-parser.cpp index 6729e1bd..803e70be 100644 --- a/test/yaml-parser.cpp +++ b/test/yaml-parser.cpp @@ -149,6 +149,52 @@ protected: return TestPass; } + int testIntegerObject(const YamlObject &obj, const char *name, Type type, + int64_t value) + { + uint64_t unsignedValue = static_cast(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().value_or("") != strValue || + obj.get("") != strValue) { + std::cerr + << "Object " << name << " failed to parse as " + << "string" << std::endl; + return TestFail; + } + + if (obj.get().value_or(0.0) != value || + obj.get(0.0) != value) { + std::cerr + << "Object " << name << " failed to parse as " + << "double" << std::endl; + return TestFail; + } + + if (obj.get().value_or(0) != value || + obj.get(0) != value) { + std::cerr + << "Object " << name << " failed to parse as " + << "int32_t" << std::endl; + return TestFail; + } + + if (!isSigned) { + if (obj.get().value_or(0) != unsignedValue || + obj.get(0) != unsignedValue) { + std::cerr + << "Object " << name << " failed to parse as " + << "uint32_t" << std::endl; + return TestFail; + } + } + + return TestPass; + } + int run() { /* Test invalid YAML file */ @@ -215,23 +261,8 @@ protected: if (testObjectType(int32Obj, "int32_t", Type::Int32) != TestPass) return TestFail; - if (int32Obj.get().value_or(0) != -100 || - int32Obj.get(0) != -100) { - cerr << "Integer object parse as wrong value" << std::endl; + if (testIntegerObject(int32Obj, "int32_t", Type::Int32, -100) != TestPass) return TestFail; - } - - if (int32Obj.get().value_or("") != "-100" || - int32Obj.get("") != "-100") { - cerr << "Integer object fail to parse as string" << std::endl; - return TestFail; - } - - if (int32Obj.get().value_or(0.0) != -100.0 || - int32Obj.get(0.0) != -100.0) { - cerr << "Integer object fail to parse as double" << std::endl; - return TestFail; - } /* Test uint32_t object */ auto &uint32Obj = (*root)["uint32_t"]; @@ -239,29 +270,8 @@ protected: if (testObjectType(uint32Obj, "uint32_t", Type::UInt32) != TestPass) return TestFail; - if (uint32Obj.get().value_or(0) != 100 || - uint32Obj.get(0) != 100) { - cerr << "Unsigned integer object fail to parse as integer" << std::endl; + if (testIntegerObject(uint32Obj, "uint32_t", Type::UInt32, 100) != TestPass) return TestFail; - } - - if (uint32Obj.get().value_or("") != "100" || - uint32Obj.get("") != "100") { - cerr << "Unsigned integer object fail to parse as string" << std::endl; - return TestFail; - } - - if (uint32Obj.get().value_or(0.0) != 100.0 || - uint32Obj.get(0.0) != 100.0) { - cerr << "Unsigned integer object fail to parse as double" << std::endl; - return TestFail; - } - - if (uint32Obj.get().value_or(0) != 100 || - uint32Obj.get(0) != 100) { - cerr << "Unsigned integer object parsed as wrong value" << std::endl; - return TestFail; - } /* Test double value */ auto &doubleObj = (*root)["double"]; -- cgit v1.2.1