mirror of
https://github.com/OPM/ResInsight.git
synced 2025-02-25 18:55:39 -06:00
#5339 AppFwk : Fix robustness for serialization of PdmPtrArrayField
This commit is contained in:
parent
8b1aa319a6
commit
29e6b09ee9
@ -320,11 +320,11 @@ PdmObjectHandle* PdmReferenceHelper::objectFromFieldReference(PdmFieldHandle* fr
|
|||||||
{
|
{
|
||||||
if (!fromField) return nullptr;
|
if (!fromField) return nullptr;
|
||||||
if (reference.isEmpty()) return nullptr;
|
if (reference.isEmpty()) return nullptr;
|
||||||
|
if (reference.trimmed().isEmpty()) return nullptr;
|
||||||
|
|
||||||
QStringList decodedReference = reference.split(QRegExp("\\s+"), QString::SkipEmptyParts);
|
QStringList decodedReference = reference.split(QRegExp("\\s+"), QString::SkipEmptyParts);
|
||||||
PdmObjectHandle* lastCommonAnchestor = fromField->ownerObject();
|
PdmObjectHandle* lastCommonAnchestor = fromField->ownerObject();
|
||||||
CAF_ASSERT(lastCommonAnchestor);
|
CAF_ASSERT(lastCommonAnchestor);
|
||||||
CAF_ASSERT(decodedReference.size());
|
|
||||||
|
|
||||||
while (!decodedReference.empty() && decodedReference.front() == "..")
|
while (!decodedReference.empty() && decodedReference.front() == "..")
|
||||||
{
|
{
|
||||||
|
@ -32,6 +32,7 @@ add_executable (${PROJECT_NAME}
|
|||||||
cafPdmXmlBasicTest.cpp
|
cafPdmXmlBasicTest.cpp
|
||||||
cafPdmAdvancedTemplateTest.cpp
|
cafPdmAdvancedTemplateTest.cpp
|
||||||
cafPdmXmlNumberTest.cpp
|
cafPdmXmlNumberTest.cpp
|
||||||
|
cafPdmPtrArrayTest.cpp
|
||||||
)
|
)
|
||||||
|
|
||||||
if (Qt5Core_FOUND)
|
if (Qt5Core_FOUND)
|
||||||
|
@ -0,0 +1,153 @@
|
|||||||
|
|
||||||
|
#include "gtest/gtest.h"
|
||||||
|
|
||||||
|
#include "cafPdmChildArrayField.h"
|
||||||
|
#include "cafPdmObjectHandle.h"
|
||||||
|
#include "cafPdmReferenceHelper.h"
|
||||||
|
#include "cafPdmXmlObjectHandle.h"
|
||||||
|
#include "cafPdmXmlObjectHandleMacros.h"
|
||||||
|
#include "cafPdmDataValueField.h"
|
||||||
|
#include "cafPdmPtrArrayField.h"
|
||||||
|
|
||||||
|
|
||||||
|
class MyItemPdmObject : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandle
|
||||||
|
{
|
||||||
|
CAF_PDM_XML_HEADER_INIT;
|
||||||
|
public:
|
||||||
|
|
||||||
|
MyItemPdmObject() : PdmObjectHandle(), PdmXmlObjectHandle(this, false)
|
||||||
|
{
|
||||||
|
CAF_PDM_XML_InitField(&m_name, "Name");
|
||||||
|
}
|
||||||
|
|
||||||
|
explicit MyItemPdmObject(QString name) : PdmObjectHandle(), PdmXmlObjectHandle(this, false)
|
||||||
|
{
|
||||||
|
CAF_PDM_XML_InitField(&m_name, "Name");
|
||||||
|
m_name = name;
|
||||||
|
}
|
||||||
|
|
||||||
|
~MyItemPdmObject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
// Fields
|
||||||
|
caf::PdmDataValueField<QString> m_name;
|
||||||
|
};
|
||||||
|
CAF_PDM_XML_SOURCE_INIT(MyItemPdmObject, "MyItemPdmObject");
|
||||||
|
|
||||||
|
class MyContainerPdmObject : public caf::PdmObjectHandle, public caf::PdmXmlObjectHandle
|
||||||
|
{
|
||||||
|
CAF_PDM_XML_HEADER_INIT;
|
||||||
|
public:
|
||||||
|
|
||||||
|
MyContainerPdmObject() : PdmObjectHandle(), PdmXmlObjectHandle(this, false)
|
||||||
|
{
|
||||||
|
CAF_PDM_XML_InitField(&m_items, "Items");
|
||||||
|
CAF_PDM_XML_InitField(&m_containers, "Containers");
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
~MyContainerPdmObject()
|
||||||
|
{
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
// Fields
|
||||||
|
caf::PdmChildArrayField<MyItemPdmObject*> m_items;
|
||||||
|
caf::PdmPtrArrayField<MyItemPdmObject*> m_containers;
|
||||||
|
|
||||||
|
};
|
||||||
|
CAF_PDM_XML_SOURCE_INIT(MyContainerPdmObject, "MyContainerPdmObject");
|
||||||
|
|
||||||
|
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
TEST(PtrArrayBaseTest, PtrArraySerializeTest)
|
||||||
|
{
|
||||||
|
|
||||||
|
MyContainerPdmObject* objA = new MyContainerPdmObject;
|
||||||
|
|
||||||
|
MyItemPdmObject* s1 = new MyItemPdmObject;
|
||||||
|
MyItemPdmObject* s2 = new MyItemPdmObject;
|
||||||
|
MyItemPdmObject* s3 = new MyItemPdmObject;
|
||||||
|
|
||||||
|
objA->m_items.push_back(s1);
|
||||||
|
objA->m_items.push_back(s2);
|
||||||
|
objA->m_items.push_back(s3);
|
||||||
|
|
||||||
|
objA->m_containers.push_back(s1);
|
||||||
|
objA->m_containers.push_back(s2);
|
||||||
|
objA->m_containers.push_back(s3);
|
||||||
|
|
||||||
|
//delete s2;
|
||||||
|
|
||||||
|
QString serializedString;
|
||||||
|
{
|
||||||
|
serializedString = objA->writeObjectToXmlString();
|
||||||
|
|
||||||
|
std::cout << serializedString.toStdString() << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
MyContainerPdmObject* ihd1 = new MyContainerPdmObject;
|
||||||
|
|
||||||
|
QXmlStreamReader xmlStream(serializedString);
|
||||||
|
|
||||||
|
ihd1->readObjectFromXmlString(serializedString, caf::PdmDefaultObjectFactory::instance());
|
||||||
|
ihd1->resolveReferencesRecursively();
|
||||||
|
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
///
|
||||||
|
//--------------------------------------------------------------------------------------------------
|
||||||
|
TEST(PtrArrayBaseTest, DeleteObjectPtrArraySerializeTest)
|
||||||
|
{
|
||||||
|
|
||||||
|
MyContainerPdmObject* objA = new MyContainerPdmObject;
|
||||||
|
|
||||||
|
MyItemPdmObject* s1 = new MyItemPdmObject;
|
||||||
|
MyItemPdmObject* s2 = new MyItemPdmObject;
|
||||||
|
MyItemPdmObject* s3 = new MyItemPdmObject;
|
||||||
|
|
||||||
|
objA->m_items.push_back(s1);
|
||||||
|
objA->m_items.push_back(s2);
|
||||||
|
objA->m_items.push_back(s3);
|
||||||
|
|
||||||
|
objA->m_containers.push_back(s1);
|
||||||
|
objA->m_containers.push_back(s2);
|
||||||
|
objA->m_containers.push_back(s3);
|
||||||
|
|
||||||
|
delete s2;
|
||||||
|
|
||||||
|
QString serializedString;
|
||||||
|
{
|
||||||
|
serializedString = objA->writeObjectToXmlString();
|
||||||
|
|
||||||
|
std::cout << serializedString.toStdString() << std::endl;
|
||||||
|
|
||||||
|
}
|
||||||
|
|
||||||
|
{
|
||||||
|
MyContainerPdmObject* ihd1 = new MyContainerPdmObject;
|
||||||
|
|
||||||
|
QXmlStreamReader xmlStream(serializedString);
|
||||||
|
|
||||||
|
ihd1->readObjectFromXmlString(serializedString, caf::PdmDefaultObjectFactory::instance());
|
||||||
|
ihd1->resolveReferencesRecursively();
|
||||||
|
|
||||||
|
EXPECT_TRUE(ihd1->m_containers.at(0) != nullptr);
|
||||||
|
EXPECT_TRUE(ihd1->m_containers.at(1) == nullptr); // Deleted
|
||||||
|
EXPECT_TRUE(ihd1->m_containers.at(2) == nullptr); // Pointing to item at index 2, does not longer exist
|
||||||
|
|
||||||
|
EXPECT_TRUE(ihd1->m_items.size() == size_t(2));
|
||||||
|
EXPECT_TRUE(ihd1->m_items[0] != nullptr);
|
||||||
|
EXPECT_TRUE(ihd1->m_items[1] != nullptr);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
Loading…
Reference in New Issue
Block a user