diff --git a/src/Base/Reader.cpp b/src/Base/Reader.cpp index 17894c2bb2..20b615bede 100644 --- a/src/Base/Reader.cpp +++ b/src/Base/Reader.cpp @@ -111,20 +111,18 @@ unsigned int Base::XMLReader::getAttributeCount() const long Base::XMLReader::getAttributeAsInteger(const char* AttrName, const char* defaultValue) const { - const int base = 10; - return strtol(getAttribute(AttrName, defaultValue), nullptr, base); + return stol(getAttribute(AttrName, defaultValue)); } unsigned long Base::XMLReader::getAttributeAsUnsigned(const char* AttrName, const char* defaultValue) const { - const int base = 10; - return strtoul(getAttribute(AttrName, defaultValue), nullptr, base); + return stoul(getAttribute(AttrName, defaultValue), nullptr); } double Base::XMLReader::getAttributeAsFloat(const char* AttrName, const char* defaultValue) const { - return strtod(getAttribute(AttrName, defaultValue), nullptr); + return stod(getAttribute(AttrName, defaultValue), nullptr); } const char* Base::XMLReader::getAttribute(const char* AttrName, // NOLINT diff --git a/tests/src/Base/Reader.cpp b/tests/src/Base/Reader.cpp index ab6f8a4baa..76d08f981a 100644 --- a/tests/src/Base/Reader.cpp +++ b/tests/src/Base/Reader.cpp @@ -292,3 +292,53 @@ TEST_F(ReaderTest, charStreamBase64Encoded) // Conversion done using https://www.base64encode.org for testing purposes EXPECT_EQ(std::string("FreeCAD rocks! 🪨🪨🪨"), std::string(buffer.data())); } + +TEST_F(ReaderTest, validDefaults) +{ + // Arrange + auto xmlBody = R"( + + +)"; + + givenDataAsXMLStream(xmlBody); + + // Act + const char* value2 = Reader()->getAttribute("missing", "expected value"); + int value4 = Reader()->getAttributeAsInteger("missing", "-123"); + unsigned value6 = Reader()->getAttributeAsUnsigned("missing", "123"); + float value8 = Reader()->getAttributeAsFloat("missing", "1.234"); + + // Assert + EXPECT_THROW({ int value1 = Reader()->getAttributeAsInteger("missing"); }, + Base::XMLBaseException); + EXPECT_EQ(value2, "expected value"); + EXPECT_THROW({ int value3 = Reader()->getAttributeAsInteger("missing"); }, + Base::XMLBaseException); + EXPECT_EQ(value4, -123); + EXPECT_THROW({ int value5 = Reader()->getAttributeAsUnsigned("missing"); }, + Base::XMLBaseException); + EXPECT_EQ(value6, 123); + EXPECT_THROW({ int value7 = Reader()->getAttributeAsFloat("missing"); }, + Base::XMLBaseException); + EXPECT_NEAR(value8, 1.234, 0.001); +} + +TEST_F(ReaderTest, invalidDefaults) +{ + // Arrange + auto xmlBody = R"( + + +)"; + + givenDataAsXMLStream(xmlBody); + + // Act / Assert + EXPECT_THROW({ int value4 = Reader()->getAttributeAsInteger("missing", "Not an Integer"); }, + std::invalid_argument); + EXPECT_THROW({ int value6 = Reader()->getAttributeAsInteger("missing", "Not an Unsigned"); }, + std::invalid_argument); + EXPECT_THROW({ int value8 = Reader()->getAttributeAsInteger("missing", "Not a Float"); }, + std::invalid_argument); +}