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..464d44a29d 100644
--- a/tests/src/Base/Reader.cpp
+++ b/tests/src/Base/Reader.cpp
@@ -292,3 +292,49 @@ 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({ Reader()->getAttributeAsInteger("missing"); }, Base::XMLBaseException);
+ EXPECT_EQ(value2, "expected value");
+ EXPECT_THROW({ Reader()->getAttributeAsInteger("missing"); }, Base::XMLBaseException);
+ EXPECT_EQ(value4, -123);
+ EXPECT_THROW({ Reader()->getAttributeAsUnsigned("missing"); }, Base::XMLBaseException);
+ EXPECT_EQ(value6, 123);
+ EXPECT_THROW({ 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({ Reader()->getAttributeAsInteger("missing", "Not an Integer"); },
+ std::invalid_argument);
+ EXPECT_THROW({ Reader()->getAttributeAsInteger("missing", "Not an Unsigned"); },
+ std::invalid_argument);
+ EXPECT_THROW({ Reader()->getAttributeAsInteger("missing", "Not a Float"); },
+ std::invalid_argument);
+}