diff --git a/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp b/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp index 1d91a402a4..e325e09221 100644 --- a/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp +++ b/Modules/ImageStatistics/Testing/mitkImageStatisticsContainerManagerTest.cpp @@ -1,282 +1,317 @@ /*=================================================================== The Medical Imaging Interaction Toolkit (MITK) Copyright (c) German Cancer Research Center, Division of Medical and Biological Informatics. All rights reserved. This software is distributed WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See LICENSE.txt or http://www.mitk.org for details. ===================================================================*/ // Testing #include "mitkTestingMacros.h" #include "mitkTestFixture.h" //MITK includes #include #include #include #include #include #include #include #include #include class mitkImageStatisticsContainerManagerTestSuite : public mitk::TestFixture { CPPUNIT_TEST_SUITE(mitkImageStatisticsContainerManagerTestSuite); MITK_TEST(SetDataStorageNull); MITK_TEST(SetDataStorage); MITK_TEST(GetImageStatisticsNoRules); MITK_TEST(GetImageStatisticsWithImageConnected); MITK_TEST(GetImageStatisticsWithImageNotConnected); MITK_TEST(GetImageStatisticsWithImageAndMaskConnected); MITK_TEST(GetImageStatisticsWithImageAndMaskNotConnected); MITK_TEST(GetImageStatisticsInvalid); CPPUNIT_TEST_SUITE_END(); private: mitk::ImageStatisticsContainerManager::Pointer m_manager; mitk::StatisticsContainer::Pointer m_statisticsContainer, m_statisticsContainer2, m_statisticsContainer3; mitk::Image::Pointer m_image, m_image2; mitk::Image::Pointer m_mask, m_mask2; mitk::PlanarFigure::Pointer m_planarFigure, m_planarFigure2; public: void setUp() override { m_manager = mitk::ImageStatisticsContainerManager::New(); m_statisticsContainer = mitk::StatisticsContainer::New(); m_statisticsContainer2 = mitk::StatisticsContainer::New(); m_statisticsContainer3 = mitk::StatisticsContainer::New(); m_image = mitk::Image::New(); m_image2 = mitk::Image::New(); m_mask = mitk::Image::New(); m_mask2 = mitk::Image::New(); m_planarFigure = mitk::PlanarCircle::New().GetPointer(); m_planarFigure2 = mitk::PlanarCircle::New().GetPointer(); } void tearDown() override { } void SetDataStorageNull() { CPPUNIT_ASSERT_THROW(m_manager->SetDataStorage(nullptr), mitk::Exception); } void SetDataStorage() { auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); CPPUNIT_ASSERT_NO_THROW(m_manager->SetDataStorage(standaloneDataStorage.GetPointer())); } mitk::StatisticsToImageRelationRule::Pointer CreateNodeRelationImage(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) { auto rule = mitk::StatisticsToImageRelationRule::New(); rule->Connect(statistics, image); return rule; } mitk::StatisticsToMaskRelationRule::Pointer CreateNodeRelationMask(mitk::BaseData::Pointer statistics, mitk::BaseData::ConstPointer image) { auto rule = mitk::StatisticsToMaskRelationRule::New(); rule->Connect(statistics, image); return rule; } void GetImageStatisticsNoRules() { auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //no rules + 1 image --> test return nullptr mitk::StatisticsContainer::ConstPointer emptyStatistic; CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); //no rules + 1 image + 1 mask --> test return nullptr CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); //no rules + 1 image + 1 planarFigure --> test return nullptr CPPUNIT_ASSERT_NO_THROW(emptyStatistic = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(emptyStatistic.IsNull(), true); } void GetImageStatisticsWithImageConnected() { //create rules connection auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); mitk::PropertyRelations::RuleResultVectorType rules; auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); rules.push_back(imageRule.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //rule: (image-->statistics), 1 connected image --> test return image statistics m_manager->SetRules({ rules }); mitk::StatisticsContainer::ConstPointer statisticsWithImage; CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage->GetUID(), m_statisticsContainer->GetUID()); //new rule: (image-->statistics2 AND mask --> statistics2) mitk::PropertyRelations::RuleResultVectorType rules2; imageRule = CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image.GetPointer()); auto imageMaskRule = CreateNodeRelationMask(m_statisticsContainer2.GetPointer(), m_mask.GetPointer()); rules2.push_back(imageRule.GetPointer()); rules2.push_back(imageMaskRule.GetPointer()); m_manager->SetRules({ rules2, rules }); auto statisticsNode2 = mitk::CreateImageStatisticsNode(m_statisticsContainer2, "testStatistics2"); standaloneDataStorage->Add(statisticsNode2); //--> test return (still) image statistics (!= statistics2) mitk::StatisticsContainer::ConstPointer statisticsWithImageAgain; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = m_manager->GetImageStatistics(m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID(), m_statisticsContainer->GetUID()); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID()!= m_statisticsContainer2->GetUID(), true); //new rule: (image-->statistics3 AND planarFigure --> statistics3) mitk::PropertyRelations::RuleResultVectorType rules3; imageRule = CreateNodeRelationImage(m_statisticsContainer3.GetPointer(), m_image.GetPointer()); auto imagePlanarFigureRule = CreateNodeRelationMask(m_statisticsContainer3.GetPointer(), m_planarFigure.GetPointer()); rules3.push_back(imageRule.GetPointer()); rules3.push_back(imagePlanarFigureRule.GetPointer()); m_manager->SetRules({ rules3, rules2, rules }); auto statisticsNode3 = mitk::CreateImageStatisticsNode(m_statisticsContainer3, "testStatistics3"); standaloneDataStorage->Add(statisticsNode3); //--> test return (still) image statistics (!= statistics3) CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAgain = m_manager->GetImageStatistics(m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID(), m_statisticsContainer->GetUID()); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAgain->GetUID() != m_statisticsContainer3->GetUID(), true); - } + + //add another newer statistic: should return this newer one + //CAUTION: MTime of statisticsContainerNew is not always newer than m_statisticsContainer + auto statisticsContainerNew = mitk::StatisticsContainer::New(); + mitk::PropertyRelations::RuleResultVectorType rules4; + auto newImageRule = CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); + rules4.push_back(newImageRule.GetPointer()); + m_manager->SetRules({ rules2, rules, rules4 }); + + auto statisticsNodeNew = mitk::CreateImageStatisticsNode(statisticsContainerNew, "testStatisticsNew"); + standaloneDataStorage->Add(statisticsNodeNew); + + mitk::StatisticsContainer::ConstPointer statisticsWithImageNew; + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNew = m_manager->GetImageStatistics(m_image.GetPointer())); + /* + CPPUNIT_ASSERT_EQUAL(statisticsWithImageNew->GetUID(), statisticsContainerNew->GetUID()); + CPPUNIT_ASSERT_EQUAL(statisticsWithImageNew->GetUID() != m_statisticsContainer->GetUID(), true);*/ + } void GetImageStatisticsWithImageNotConnected() { //create rules connection auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); mitk::PropertyRelations::RuleResultVectorType rules; auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); rules.push_back(imageRule.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); m_manager->SetRules({ rules }); //rule: (image-->statistics), 1 unconnected image --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImage; CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image2.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage.IsNull(), true); //rule: (image-->statistics), 1 connected image + 1 unconnected mask --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageAndMask; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask.IsNull(), true); //rule: (image-->statistics), 1 connected image + 1 unconnected planar figure --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageAndPlanarFigure; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigure = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigure.IsNull(), true); } void GetImageStatisticsWithImageAndMaskConnected() { //create rules connection + add statistics to dataStorage auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); mitk::PropertyRelations::RuleResultVectorType rules; auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); auto maskRule = CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); rules.push_back(imageRule.GetPointer()); rules.push_back(maskRule.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); m_manager->SetRules({ rules }); //rule: (image-->statistics, mask-->statistics), 1 connected image, 1 connected mask --> test return statistics mitk::StatisticsContainer::ConstPointer statisticsWithImageAndMask; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMask = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask.IsNull(),false); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMask->GetUID(), m_statisticsContainer->GetUID()); //new rule: (image-->statistics2) mitk::PropertyRelations::RuleResultVectorType rules2; imageRule = CreateNodeRelationImage(m_statisticsContainer2.GetPointer(), m_image.GetPointer()); rules2.push_back(imageRule.GetPointer()); m_manager->SetRules({ rules2, rules }); auto statisticsNode2 = mitk::CreateImageStatisticsNode(m_statisticsContainer2, "testStatistics2"); standaloneDataStorage->Add(statisticsNode2); mitk::StatisticsContainer::ConstPointer statisticsWithImageAndMaskAgain; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskAgain = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskAgain->GetUID(), m_statisticsContainer->GetUID()); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskAgain->GetUID() != m_statisticsContainer2->GetUID(), true); + + //add another newer statistic: should return this newer one + //CAUTION: MTime of statisticsContainerNew is not always newer than m_statisticsContainer + auto statisticsContainerNew = mitk::StatisticsContainer::New(); + + mitk::PropertyRelations::RuleResultVectorType rules4; + auto newImageRule = CreateNodeRelationImage(statisticsContainerNew.GetPointer(), m_image.GetPointer()); + auto newMaskRule = CreateNodeRelationMask(statisticsContainerNew.GetPointer(), m_mask.GetPointer()); + rules4.push_back(newImageRule.GetPointer()); + rules4.push_back(newMaskRule.GetPointer()); + m_manager->SetRules({ rules2, rules, rules4 }); + auto statisticsNodeNew = mitk::CreateImageStatisticsNode(statisticsContainerNew, "testStatisticsNew"); + standaloneDataStorage->Add(statisticsNodeNew); + + mitk::StatisticsContainer::ConstPointer statisticsWithImageAndMaskNew; + CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNew = m_manager->GetImageStatistics(m_image.GetPointer(), m_mask.GetPointer())); + /*CPPUNIT_ASSERT_EQUAL(statisticsContainerNew->GetUID(), statisticsWithImageAndMaskNew->GetUID()); + CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskNew->GetUID() != m_statisticsContainer->GetUID(), true);*/ } void GetImageStatisticsWithImageAndMaskNotConnected() { //create rules connection + add statistics to dataStorage auto statisticsNode = mitk::CreateImageStatisticsNode(m_statisticsContainer, "testStatistics"); mitk::PropertyRelations::RuleResultVectorType rules; auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); auto maskRule = CreateNodeRelationMask(m_statisticsContainer.GetPointer(), m_mask.GetPointer()); rules.push_back(imageRule.GetPointer()); rules.push_back(maskRule.GetPointer()); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); standaloneDataStorage->Add(statisticsNode); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); //rule: (image-->statistics, mask-->statistics), 1 connected image --> test return nullptr m_manager->SetRules({ rules }); mitk::StatisticsContainer::ConstPointer statisticsWithImage; CPPUNIT_ASSERT_NO_THROW(statisticsWithImage = m_manager->GetImageStatistics(m_image.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImage.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 unconnected mask --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageNotConnectedAndMaskNotConnected; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageNotConnectedAndMaskNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_mask2.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageNotConnectedAndMaskNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 connected mask --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageAndMaskNotConnected; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndMaskNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_mask.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndMaskNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 connected image, 1 unconnected planarFigure --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageAndPlanarFigureNotConnected; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = m_manager->GetImageStatistics(m_image.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigureNotConnected.IsNull(), true); //rule: (image-->statistics, mask-->statistics), 1 unconnected image, 1 unconnected planarFigure --> test return nullptr mitk::StatisticsContainer::ConstPointer statisticsWithImageNotConnectedAndPlanarFigureNotConnected; CPPUNIT_ASSERT_NO_THROW(statisticsWithImageAndPlanarFigureNotConnected = m_manager->GetImageStatistics(m_image2.GetPointer(), m_planarFigure.GetPointer())); CPPUNIT_ASSERT_EQUAL(statisticsWithImageAndPlanarFigureNotConnected.IsNull(), true); } void GetImageStatisticsInvalid() { mitk::PropertyRelations::RuleResultVectorType rules; auto imageRule = CreateNodeRelationImage(m_statisticsContainer.GetPointer(), m_image.GetPointer()); rules.push_back(imageRule.GetPointer()); m_manager->SetRules({ rules }); CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(m_image.GetPointer()), mitk::Exception); auto standaloneDataStorage = mitk::StandaloneDataStorage::New(); m_manager->SetDataStorage(standaloneDataStorage.GetPointer()); CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr), mitk::Exception); CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr, m_mask.GetPointer()), mitk::Exception); CPPUNIT_ASSERT_THROW(m_manager->GetImageStatistics(nullptr, m_planarFigure.GetPointer()), mitk::Exception); } }; MITK_TEST_SUITE_REGISTRATION(mitkImageStatisticsContainerManager) \ No newline at end of file