Merge pull request #15521 from bgbsww/bgbsww-toponamingSaveRestore1plus

Throw exceptions rather than return default 0
This commit is contained in:
Chris Hennes
2024-07-22 10:46:53 -05:00
committed by GitHub
2 changed files with 49 additions and 5 deletions

View File

@@ -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

View File

@@ -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"(
<node1 attr='1'/>
<node2 attr='2'/>
)";
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"(
<node1 attr='1'/>
<node2 attr='2'/>
)";
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);
}