From 1419865b89d4eeb1e40a4c52d8ca474b75edb34d Mon Sep 17 00:00:00 2001 From: Magne Sjaastad Date: Fri, 26 Jan 2018 13:46:15 +0100 Subject: [PATCH] #2411 AppFwk : Increase precision when writing real numbers to XML --- .../cafInternalPdmXmlFieldReaderWriter.h | 5 + .../cafPdmXml_UnitTests/CMakeLists.txt | 1 + .../cafPdmXmlNumberTest.cpp | 110 ++++++++++++++++++ 3 files changed, 116 insertions(+) create mode 100644 Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlNumberTest.cpp diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldReaderWriter.h b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldReaderWriter.h index 8e5ddb8736..864294268f 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldReaderWriter.h +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafInternalPdmXmlFieldReaderWriter.h @@ -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); } diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt index 468c827c18..7a56128283 100644 --- a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/CMakeLists.txt @@ -19,6 +19,7 @@ add_executable (${PROJECT_NAME} cafPdmXmlBasicTest.cpp cafPdmAdvancedTemplateTest.cpp + cafPdmXmlNumberTest.cpp ) message(STATUS ${PROJECT_NAME}" - Qt includes : " ${QT_LIBRARIES}) diff --git a/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlNumberTest.cpp b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlNumberTest.cpp new file mode 100644 index 0000000000..50f5db1294 --- /dev/null +++ b/Fwk/AppFwk/cafProjectDataModel/cafPdmXml/cafPdmXml_UnitTests/cafPdmXmlNumberTest.cpp @@ -0,0 +1,110 @@ + +#include "gtest/gtest.h" + +#include "cafPdmDataValueField.h" +#include "cafPdmObjectHandle.h" +#include "cafPdmXmlObjectHandle.h" +#include "cafPdmXmlObjectHandleMacros.h" + +#include + +#include + +//-------------------------------------------------------------------------------------------------- +/// +//-------------------------------------------------------------------------------------------------- +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 m_valueA; + caf::PdmDataValueField m_valueB; + + caf::PdmDataValueField m_floatValueA; + caf::PdmDataValueField 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); + } +}