From ba2efa4f941c60225bce96d69b549f8041fffb32 Mon Sep 17 00:00:00 2001 From: Csaba Pinter Date: Tue, 12 Nov 2013 17:42:42 -0500 Subject: [PATCH] ENH: Added test for MRML node reference serialization and parsing Issue #3416 --- Libs/MRML/Core/Testing/vtkMRMLNodeTest1.cxx | 73 ++++++++++++++++++++- Libs/MRML/Core/vtkMRMLNode.cxx | 2 +- 2 files changed, 71 insertions(+), 4 deletions(-) diff --git a/Libs/MRML/Core/Testing/vtkMRMLNodeTest1.cxx b/Libs/MRML/Core/Testing/vtkMRMLNodeTest1.cxx index a22fd7de3..66247b18a 100644 --- a/Libs/MRML/Core/Testing/vtkMRMLNodeTest1.cxx +++ b/Libs/MRML/Core/Testing/vtkMRMLNodeTest1.cxx @@ -19,6 +19,9 @@ #include #include +// STD includes +#include + //--------------------------------------------------------------------------- class vtkMRMLNodeTestHelper1 : public vtkMRMLNode { @@ -56,8 +59,9 @@ bool TestRemoveReferencingNode(); bool TestNodeReferences(); bool TestReferenceModifiedEvent(); bool TestReferencesWithEvent(); -bool TestAddReferenceedNodeIDEventsWithNoScene(); +bool TestAddReferencedNodeIDEventsWithNoScene(); bool TestReferenceNodeNoObservers(); +bool TestNodeReferenceSerialization(); //--------------------------------------------------------------------------- @@ -81,8 +85,9 @@ int vtkMRMLNodeTest1(int , char * [] ) res = TestNodeReferences() && res; res = TestReferenceModifiedEvent() && res; res = TestReferencesWithEvent() && res; - res = TestAddReferenceedNodeIDEventsWithNoScene() && res; + res = TestAddReferencedNodeIDEventsWithNoScene() && res; res = TestReferenceNodeNoObservers() && res; + res = TestNodeReferenceSerialization() && res; return res ? EXIT_SUCCESS : EXIT_FAILURE; } @@ -953,7 +958,7 @@ bool TestReferencesWithEvent() //---------------------------------------------------------------------------- -bool TestAddReferenceedNodeIDEventsWithNoScene() +bool TestAddReferencedNodeIDEventsWithNoScene() { std::string role1("refrole1"); @@ -1154,3 +1159,65 @@ bool TestReferenceNodeNoObservers() return true; } + +//---------------------------------------------------------------------------- +bool TestNodeReferenceSerialization() +{ + std::string role1("refrole1"); + std::string role2("refrole2"); + + vtkNew scene; + scene->RegisterNodeClass(vtkSmartPointer::New()); + + vtkNew referencingNode; + scene->AddNode(referencingNode.GetPointer()); + + vtkNew referencedNode11; + scene->AddNode(referencedNode11.GetPointer()); + referencingNode->AddNodeReferenceID(role1.c_str(), referencedNode11->GetID()); + + vtkNew referencedNode21; + vtkNew referencedNode22; + scene->AddNode(referencedNode21.GetPointer()); + scene->AddNode(referencedNode22.GetPointer()); + referencingNode->AddNodeReferenceID(role2.c_str(), referencedNode21->GetID()); + referencingNode->AddNodeReferenceID(role2.c_str(), referencedNode22->GetID()); + + std::stringstream ss; + + // Write scene to XML string + scene->SetSaveToXMLString(1); + scene->Commit(); + std::string sceneXMLString = scene->GetSceneXMLString(); + + vtkNew scene2; + scene2->RegisterNodeClass(vtkSmartPointer::New()); + scene2->SetLoadFromXMLString(1); + scene2->SetSceneXMLString(sceneXMLString); + scene2->Import(); + + vtkMRMLNode* referencingNodeImported = NULL; + if (scene2->GetNumberOfNodes() != 4 || + (referencingNodeImported = scene2->GetNodeByID(referencingNode->GetID())) == 0 || + referencingNodeImported->GetNumberOfNodeReferences(role1.c_str()) != 1 || + referencingNodeImported->GetNumberOfNodeReferences(role2.c_str()) != 2 || + referencingNodeImported->GetNthNodeReferenceID(role1.c_str(), 0) == 0 || + strcmp(referencingNodeImported->GetNthNodeReferenceID(role1.c_str(), 0), + referencedNode11->GetID()) != 0 || + referencingNodeImported->GetNthNodeReferenceID(role2.c_str(), 0) == 0 || + strcmp(referencingNodeImported->GetNthNodeReferenceID(role2.c_str(), 0), + referencedNode21->GetID()) != 0 || + referencingNodeImported->GetNthNodeReferenceID(role2.c_str(), 1) == 0 || + strcmp(referencingNodeImported->GetNthNodeReferenceID(role2.c_str(), 1), + referencedNode22->GetID()) != 0) + { + std::cerr << __LINE__ << ": TestNodeReferenceSerialization failed" << std::endl + << "Number of nodes: " << scene2->GetNumberOfNodes() + << "Number of role1 references: " + << referencingNodeImported->GetNumberOfNodeReferences(role1.c_str()) + << "Number of role2 references: " + << referencingNodeImported->GetNumberOfNodeReferences(role2.c_str()); + return false; + } + return true; +} diff --git a/Libs/MRML/Core/vtkMRMLNode.cxx b/Libs/MRML/Core/vtkMRMLNode.cxx index 6793c94de..d1e19ad00 100644 --- a/Libs/MRML/Core/vtkMRMLNode.cxx +++ b/Libs/MRML/Core/vtkMRMLNode.cxx @@ -439,7 +439,7 @@ void vtkMRMLNode::ReadXMLAttributes(const char** atts) void vtkMRMLNode::ParseReferencesAttribute(const char *attValue, std::map &references) { - /// parse refernces in the form "role1:id1 id2;role2:id3;" + /// parse references in the form "role1:id1 id2;role2:id3;" std::string attribute(attValue); std::size_t start = 0; -- GitLab