mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#2411 AppFwk : Increase precision when writing real numbers to XML
This commit is contained in:
parent
5640f91b68
commit
1419865b89
@ -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);
|
||||
}
|
||||
|
@ -19,6 +19,7 @@ add_executable (${PROJECT_NAME}
|
||||
|
||||
cafPdmXmlBasicTest.cpp
|
||||
cafPdmAdvancedTemplateTest.cpp
|
||||
cafPdmXmlNumberTest.cpp
|
||||
)
|
||||
message(STATUS ${PROJECT_NAME}" - Qt includes : " ${QT_LIBRARIES})
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
Loading…
Reference in New Issue
Block a user