29 m_ReferenceDS(reference),
31 m_HierarchyPassed(true),
33 m_PropertiesPassed(true),
34 m_MappersPassed(true),
35 m_InteractorsPassed(true),
48 DescribeHierarchyOfNodes(m_ReferenceDS, m_RefNodesByHierarchy);
49 DescribeHierarchyOfNodes(m_TestDS, m_TestNodesByHierarchy);
51 m_HierarchyPassed =
true;
53 m_PropertiesPassed =
true;
54 m_MappersPassed =
true;
55 m_InteractorsPassed =
true;
59 m_HierarchyPassed = CompareHierarchy(verbose);
62 CompareDataNodes(verbose);
64 if ((m_TestAspects &
CMP_Data) && !m_DataPassed)
68 if ((m_TestAspects &
CMP_Mappers) && !m_MappersPassed)
76 return m_AspectsFailed == 0;
83 << (m_TestAspects &
CMP_Hierarchy ? (m_HierarchyPassed ?
"pass" :
"fail") :
"skipped");
85 << (m_TestAspects &
CMP_Data ? (m_DataPassed ?
"pass" :
"fail") :
"skipped");
87 << (m_TestAspects &
CMP_Properties ? (m_PropertiesPassed ?
"pass" :
"fail") :
"skipped");
89 << (m_TestAspects &
CMP_Mappers ? (m_MappersPassed ?
"pass" :
"fail") :
"skipped");
91 << (m_TestAspects &
CMP_Interactors ? (m_InteractorsPassed ?
"pass" :
"fail") :
"skipped");
93 if (m_AspectsFailed == 0)
96 MITK_INFO <<
" Summary: " << m_AspectsFailed <<
" failures";
100 HierarchyDescriptorMap &result)
103 if (storage.IsNull())
106 mitk::DataStorage::SetOfObjects::ConstPointer allNodes = storage->GetAll();
107 for (
auto node : *allNodes)
109 std::string descriptor = GenerateHierarchyDescriptor(node, storage);
110 result.insert(std::make_pair(descriptor, node));
119 std::string thisDataDescriptor =
"nullptr";
122 thisDataDescriptor = data->GetNameOfClass();
124 std::string thisNodeName = node->GetName();
126 std::string thisNodesDescriptor = std::string(
"_") + thisDataDescriptor +
"_(" + thisNodeName +
")";
127 return thisNodesDescriptor;
133 std::string thisNodesDescriptor = GenerateNodeDescriptor(node);
134 mitk::DataStorage::SetOfObjects::ConstPointer parents =
135 storage->GetSources(node,
nullptr,
true);
138 std::vector<std::string> parentDescriptors;
140 for (
auto parent : *parents)
141 parentDescriptors.push_back(GenerateHierarchyDescriptor(parent, storage));
144 std::sort(parentDescriptors.begin(), parentDescriptors.end());
147 if (!parentDescriptors.empty())
149 thisNodesDescriptor +=
" <(";
150 for (
auto descriptor : parentDescriptors)
152 if (descriptor != parentDescriptors.front())
154 thisNodesDescriptor +=
" + ";
156 thisNodesDescriptor += descriptor;
158 thisNodesDescriptor +=
")";
161 return thisNodesDescriptor;
164 bool mitk::DataStorageCompare::CompareHierarchy(
bool verbose)
166 int numberOfMisMatches = 0;
173 for (
auto entry : m_RefNodesByHierarchy)
175 const std::string &key = entry.first;
178 unsigned int timesInReference = m_RefNodesByHierarchy.count(key);
179 unsigned int timesInTest = m_TestNodesByHierarchy.count(key);
181 if (timesInTest != timesInReference)
183 ++numberOfMisMatches;
186 MITK_WARN <<
"### Hierarchy mismatch problem";
187 MITK_WARN <<
" Reference storage has " << timesInReference <<
" node(s), test storage " << timesInTest;
188 MITK_WARN <<
" Node name '" << node->GetName() <<
"'";
189 MITK_WARN <<
" Reference hierarchy descriptor: " << key;
195 for (
auto entry : m_TestNodesByHierarchy)
197 const std::string &key = entry.first;
200 unsigned int timesInReference = m_RefNodesByHierarchy.count(key);
201 unsigned int timesInTest = m_TestNodesByHierarchy.count(key);
205 if (timesInTest > timesInReference)
207 ++numberOfMisMatches;
211 MITK_WARN <<
"### Hierarchy mismatch problem";
212 MITK_WARN <<
" Test storage has more nodes (" << timesInReference <<
") than reference storage (" 213 << timesInTest <<
")";
214 MITK_WARN <<
" Node name '" << node->GetName() <<
"'";
215 MITK_WARN <<
" Reference hierarchy descriptor: " << key;
223 if (verbose && numberOfMisMatches > 0)
225 MITK_WARN <<
"Dumping test storage because there were errors:";
226 for (
auto entry : m_TestNodesByHierarchy)
228 const std::string &key = entry.first;
230 MITK_WARN <<
" Test node '" << node->GetName() <<
"', hierarchy : " << key;
234 return numberOfMisMatches == 0;
239 if (reference ==
nullptr && test ==
nullptr)
242 if (reference ==
nullptr && test !=
nullptr)
245 MITK_WARN <<
" Reference node is nullptr, test node is not (type " << test->GetNameOfClass() <<
")";
249 if (reference !=
nullptr && test ==
nullptr)
252 MITK_WARN <<
" Test node is nullptr, reference node is not (type " << reference->GetNameOfClass() <<
")";
260 m_PropertiesPassed &= ArePropertyListsEqual(*reference, *test, verbose);
263 m_MappersPassed &= AreMappersEqual(*reference, *test, verbose);
268 return m_AspectsFailed == 0;
274 if (reference ==
nullptr && test ==
nullptr)
277 if (reference ==
nullptr && test !=
nullptr)
280 MITK_WARN <<
" Reference data is nullptr, test data is not (type " << test->GetNameOfClass() <<
")";
284 if (reference !=
nullptr && test ==
nullptr)
287 MITK_WARN <<
" Test data is nullptr, reference data is not (type " << reference->GetNameOfClass() <<
")";
292 if (reference->GetNameOfClass() != test->GetNameOfClass())
295 MITK_WARN <<
" Mismatch: Reference data is '" << reference->GetNameOfClass() <<
"', " 296 <<
"test data is '" << test->GetNameOfClass() <<
"'";
301 std::string ldapFilter = std::string(
"(basedata=") + reference->GetNameOfClass() +
"*)";
302 std::vector<us::ServiceReference<BaseDataCompare>> comparators =
304 if (comparators.empty())
307 MITK_ERROR <<
"Comparison error: no comparator for objects of type '" << reference->GetNameOfClass() <<
"'";
310 else if (comparators.size() > 1)
312 MITK_WARN <<
"Comparison warning: multiple comparisons possible for objects of type '" 313 << reference->GetNameOfClass() <<
"'. Using just one.";
320 MITK_ERROR <<
"Service lookup error, cannot get comparator for class " << reference->GetNameOfClass();
323 return comparator->AreEqual(reference, test, m_Eps, verbose);
325 catch (std::exception &e)
327 MITK_ERROR <<
"Exception during comparison: " << e.what();
332 bool mitk::DataStorageCompare::ArePropertyListsEqual(
const mitk::DataNode &reference,
339 refListNames.push_back(
"");
340 testListNames.push_back(
"");
344 if (refListNames.size() != testListNames.size())
346 for (
auto name : refListNames)
347 if (std::find(testListNames.begin(), testListNames.end(), name) == testListNames.end())
349 MITK_WARN <<
"Propertylist '" << name <<
"' from reference node (" << reference.
GetName()
350 <<
") not found in test node.";
354 for (
auto name : testListNames)
355 if (std::find(refListNames.begin(), refListNames.end(), name) == refListNames.end())
357 MITK_WARN <<
"Propertylist '" << name <<
"' did not exist in reference node (" << reference.
GetName()
358 <<
"), but is present in test node.";
367 for (
auto name : refListNames)
371 MITK_WARN <<
"Property mismatch while comparing propertylist '" << name <<
"'. See messages above.";
379 bool mitk::DataStorageCompare::ArePropertyListsEqual(
const mitk::PropertyList &reference,
387 for (
auto refEntry : *refMap)
389 std::string propertyKey = refEntry.first;
393 if (testProperty.IsNull())
396 MITK_WARN <<
"Property '" << propertyKey <<
"' not found in test, only in reference.";
401 if (!(*refProperty == *testProperty))
405 MITK_WARN <<
"Property '" << propertyKey <<
"' does not match original.";
406 MITK_WARN <<
"Reference was: " << refProperty->GetValueAsString();
407 MITK_WARN <<
"Test was:" << testProperty->GetValueAsString();
417 bool mitk::DataStorageCompare::AreMappersEqual(
const mitk::DataNode &reference,
426 if (refMapper2D ==
nullptr && testMapper2D ==
nullptr)
430 else if (refMapper2D !=
nullptr && testMapper2D ==
nullptr)
434 MITK_WARN <<
"Mapper for 2D was '" << refMapper2D->GetNameOfClass() <<
"' in reference, is 'nullptr" 435 <<
"' in test (DataNode '" << reference.
GetName() <<
"')";
439 else if (refMapper2D ==
nullptr && testMapper2D !=
nullptr)
443 MITK_WARN <<
"Mapper for 2D was 'nullptr" 444 <<
"' in reference, is '" << testMapper2D->GetNameOfClass() <<
"' in test (DataNode '" 445 << reference.
GetName() <<
"')";
449 else if (refMapper2D->GetNameOfClass() != testMapper2D->GetNameOfClass())
453 MITK_WARN <<
"Mapper for 2D was '" << refMapper2D->GetNameOfClass() <<
"' in reference, is '" 454 << testMapper2D->GetNameOfClass() <<
"' in test (DataNode '" << reference.
GetName() <<
"')";
462 if (refMapper3D ==
nullptr && testMapper3D ==
nullptr)
466 else if (refMapper3D !=
nullptr && testMapper3D ==
nullptr)
470 MITK_WARN <<
"Mapper for 3D was '" << refMapper3D->GetNameOfClass() <<
"' in reference, is 'nullptr" 471 <<
"' in test (DataNode '" << reference.
GetName() <<
"')";
475 else if (refMapper3D ==
nullptr && testMapper3D !=
nullptr)
479 MITK_WARN <<
"Mapper for 3D was 'nullptr" 480 <<
"' in reference, is '" << testMapper3D->GetNameOfClass() <<
"' in test (DataNode '" 481 << reference.
GetName() <<
"')";
485 else if (refMapper3D->GetNameOfClass() != testMapper3D->GetNameOfClass())
489 MITK_WARN <<
"Mapper for 3D was '" << refMapper3D->GetNameOfClass() <<
"' in reference, is '" 490 << testMapper3D->GetNameOfClass() <<
"' in test (DataNode '" << reference.
GetName() <<
"')";
498 bool mitk::DataStorageCompare::CompareDataNodes(
bool verbose)
500 int numberOfMisMatches = 0;
502 for (
auto entry : m_RefNodesByHierarchy)
504 const std::string &key = entry.first;
507 unsigned int timesInReference = m_RefNodesByHierarchy.count(key);
508 unsigned int timesInTest = m_TestNodesByHierarchy.count(key);
510 if (timesInReference == 1 && timesInTest == 1)
513 auto testEntry = m_TestNodesByHierarchy.find(key);
515 if (!AreNodesEqual(refNode, testNode, verbose))
517 ++numberOfMisMatches;
520 MITK_WARN <<
"### DataNode mismatch problem";
521 MITK_WARN <<
" Node '" << key <<
"' did not compare to equal (see warnings above).";
527 ++numberOfMisMatches;
530 MITK_WARN <<
"### DataNode mismatch problem";
531 MITK_WARN <<
" Reference storage has " << timesInReference <<
" node(s), test storage " << timesInTest;
532 MITK_WARN <<
" This does not match or we don't know how to figure out comparison partners";
537 return numberOfMisMatches == 0;
Data management class that handles 'was created by' relations.
std::vector< MapOfPropertyLists::key_type > PropertyListKeyNames
Base of all data objects.
bool CompareVerbose()
Shorthand for Compare(true).
Follow Up Storage - Class to facilitate loading/accessing structured follow-up data.
Key-value list holding instances of BaseProperty.
DataStorageCompare(const DataStorage *reference, const DataStorage *test, Tests flags=CMP_All, double eps=mitk::eps)
Constructor taking reference and test DataStorage.
Base class of all mappers, Vtk as well as OpenGL mappers.
void * GetService(const ServiceReferenceBase &reference)
BaseData * GetData() const
Get the data object (instance of BaseData, e.g., an Image) managed by this DataNode.
std::map< std::string, BaseProperty::Pointer > PropertyMap
bool Compare(bool verbose=false)
Execute the comparison.
PropertyListKeyNames GetPropertyListNames() const
The "names" used for (renderer-specific) PropertyLists in GetPropertyList(string).
std::vector< ServiceReferenceU > GetServiceReferences(const std::string &clazz, const std::string &filter=std::string())
mitk::PropertyList * GetPropertyList(const mitk::BaseRenderer *renderer=nullptr) const
Get the PropertyList of the renderer. If renderer is nullptr, the BaseRenderer-independent PropertyLi...
mitk::Mapper * GetMapper(MapperSlotId id) const
static void RegisterCoreEquals()
Register core type comparators that come with mitk::Equal() functions.
Tests
Flag describing the aspects of comparing two DataStorages.
MITKCORE_EXPORT const ScalarType eps
mitk::BaseProperty * GetProperty(const std::string &propertyKey) const
Get a property by its name.
Interface to compare two BaseData objects for (near) equality.
static ModuleContext * GetModuleContext()
Returns the module context of the calling module.
void Report()
Prints a small summary of what tests have been executed and which ones failed or passed.
Class for nodes of the DataTree.
bool GetName(std::string &nodeName, const mitk::BaseRenderer *renderer=nullptr, const char *propertyKey="name") const
Convenience access method for accessing the name of an object (instance of StringProperty with proper...
const PropertyMap * GetMap() const