#2411 AppFwk : Increase precision when writing real numbers to XML

This commit is contained in:
Magne Sjaastad 2018-01-26 13:46:15 +01:00
parent 5640f91b68
commit 1419865b89
3 changed files with 116 additions and 0 deletions

View File

@ -30,6 +30,11 @@ struct PdmFieldWriter
{
QString dataString;
QTextStream data(&dataString, QIODevice::WriteOnly);
// Use precision of 15 to cover most value ranges for double values
// Default Qt behavior is precision of 6
data.setRealNumberPrecision(15);
data << fieldValue;
xmlStream.writeCharacters(dataString);
}

View File

@ -19,6 +19,7 @@ add_executable (${PROJECT_NAME}
cafPdmXmlBasicTest.cpp
cafPdmAdvancedTemplateTest.cpp
cafPdmXmlNumberTest.cpp
)
message(STATUS ${PROJECT_NAME}" - Qt includes : " ${QT_LIBRARIES})

View File

@ -0,0 +1,110 @@
#include "gtest/gtest.h"
#include "cafPdmDataValueField.h"
#include "cafPdmObjectHandle.h"
#include "cafPdmXmlObjectHandle.h"
#include "cafPdmXmlObjectHandleMacros.h"
#include <QXmlStreamWriter>
#include <cmath>
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
class SimpleObjectWithNumbers : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandle
{
CAF_PDM_XML_HEADER_INIT;
public:
SimpleObjectWithNumbers() : PdmObjectHandle(), PdmXmlObjectHandle(this, false)
{
CAF_PDM_XML_InitField(&m_valueA, "ValueA");
CAF_PDM_XML_InitField(&m_valueB, "ValueB");
CAF_PDM_XML_InitField(&m_floatValueA, "FloatValueA");
CAF_PDM_XML_InitField(&m_floatValueB, "FloatValueB");
}
caf::PdmDataValueField<double> m_valueA;
caf::PdmDataValueField<double> m_valueB;
caf::PdmDataValueField<float> m_floatValueA;
caf::PdmDataValueField<float> m_floatValueB;
};
CAF_PDM_XML_SOURCE_INIT(SimpleObjectWithNumbers, "SimpleObjectWithNumbers");
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(SerializeNumbers, SimpleObjectWithDoubleValues)
{
double valueA = 0.123456789;
double valueB = 123456789 + valueA;
QString objectAsText;
{
SimpleObjectWithNumbers obj1;
obj1.m_valueA = valueA;
obj1.m_valueB = valueB;
objectAsText = obj1.writeObjectToXmlString();
}
{
SimpleObjectWithNumbers obj1;
obj1.readObjectFromXmlString(objectAsText, caf::PdmDefaultObjectFactory::instance());
{
double epsilon = 1e-7;
double diffA = fabs(obj1.m_valueA - valueA);
EXPECT_TRUE(diffA < epsilon);
}
{
double epsilon = 3e-7;
double diffB = fabs(obj1.m_valueB - valueB);
EXPECT_TRUE(diffB < epsilon);
}
}
}
//--------------------------------------------------------------------------------------------------
///
//--------------------------------------------------------------------------------------------------
TEST(SerializeNumbers, SimpleObjectWithFloatValues)
{
float valueA = 0.123456789;
float valueB = 123456 + valueA;
QString objectAsText;
{
SimpleObjectWithNumbers obj1;
obj1.m_floatValueA = valueA;
obj1.m_floatValueB = valueB;
objectAsText = obj1.writeObjectToXmlString();
}
{
SimpleObjectWithNumbers obj1;
obj1.readObjectFromXmlString(objectAsText, caf::PdmDefaultObjectFactory::instance());
double epsilon = 1e-7;
double diffA = fabs(obj1.m_floatValueA - valueA);
EXPECT_TRUE(diffA < epsilon);
double diffB = fabs(obj1.m_floatValueB - valueB);
EXPECT_TRUE(diffB < epsilon);
}
}