00001
00002
00003
00004
00005
00006
00007
00008
00009
00010
00011
00012
00013
00014
00015
00016
00017
00018 #include <fstream>
00019 #include <algorithm>
00020
00021 #include "mitkImage.h"
00022 #include "mitkSurface.h"
00023 #include "mitkStringProperty.h"
00024 #include "mitkColorProperty.h"
00025 #include "mitkGroupTagProperty.h"
00026 #include "mitkDataNode.h"
00027 #include "mitkReferenceCountWatcher.h"
00028
00029 #include "mitkDataStorage.h"
00030 #include "mitkStandaloneDataStorage.h"
00031 #include "mitkNodePredicateProperty.h"
00032 #include "mitkNodePredicateDataType.h"
00033 #include "mitkNodePredicateDimension.h"
00034 #include "mitkNodePredicateData.h"
00035 #include "mitkNodePredicateNot.h"
00036 #include "mitkNodePredicateAnd.h"
00037 #include "mitkNodePredicateOr.h"
00038 #include "mitkNodePredicateSource.h"
00039 #include "mitkMessage.h"
00040 #include "mitkStandardFileLocations.h"
00041 #include "mitkPicFileReader.h"
00042 #include "mitkTestingMacros.h"
00043
00044
00045 void TestDataStorage(mitk::DataStorage* ds);
00046
00047 namespace mitk
00048 {
00049 class TestStandaloneDataStorage: public StandaloneDataStorage
00050 {
00051 public:
00052 mitkClassMacro(TestStandaloneDataStorage, mitk::DataStorage);
00053 itkNewMacro(Self);
00054 std::map<const mitk::DataNode*, unsigned long>
00055 GetModifiedObserverTags() const {return m_NodeModifiedObserverTags;}
00056 std::map<const mitk::DataNode*, unsigned long>
00057 GetDeletedObserverTags() const { return m_NodeDeleteObserverTags; }
00058 protected:
00059 TestStandaloneDataStorage() {}
00060 };
00061 }
00062
00063 class DSEventReceiver
00064 {
00065 public:
00066 const mitk::DataNode* m_NodeAdded;
00067 const mitk::DataNode* m_NodeRemoved;
00068
00069 DSEventReceiver()
00070 : m_NodeAdded(NULL), m_NodeRemoved(NULL)
00071 {
00072 }
00073
00074 void OnAdd(const mitk::DataNode* node)
00075 {
00076 m_NodeAdded = node;
00077 }
00078
00079 void OnRemove(const mitk::DataNode* node)
00080 {
00081 m_NodeRemoved = node;
00082 }
00083 };
00084
00092 struct ItkDeleteEventListener
00093 {
00094 ItkDeleteEventListener( mitk::DataStorage* ds )
00095 : m_Node(0), m_DataStorage(ds),
00096 m_DeleteObserverTag(0)
00097 {
00098 }
00099
00100 void SetNode( mitk::DataNode* _Node )
00101 {
00102 if(m_Node)
00103 return;
00104
00105 m_Node = _Node;
00106 itk::MemberCommand<ItkDeleteEventListener>::Pointer onObjectDelete =
00107 itk::MemberCommand<ItkDeleteEventListener>::New();
00108
00109 onObjectDelete->SetCallbackFunction(this, &ItkDeleteEventListener::OnObjectDelete);
00110 m_DeleteObserverTag = m_Node->AddObserver(itk::DeleteEvent(), onObjectDelete);
00111 }
00112
00113 void OnObjectDelete( const itk::Object *caller, const itk::EventObject & )
00114 {
00115 mitk::DataNode::Pointer node = mitk::DataNode::New();
00116 m_DataStorage->Add( node );
00117 m_DataStorage->Remove( node );
00118
00119 m_Node = 0;
00120 }
00121
00122 protected:
00123 mitk::DataNode* m_Node;
00124 mitk::DataStorage::Pointer m_DataStorage;
00125 unsigned int m_DeleteObserverTag;
00126 };
00127
00128
00129
00130
00131
00132 int mitkDataStorageTest(int , char* [])
00133 {
00134 MITK_TEST_BEGIN("DataStorageTest");
00135
00136
00137 mitk::TestStandaloneDataStorage::Pointer testDS
00138 = mitk::TestStandaloneDataStorage::New();
00139 mitk::DataNode::Pointer n1 = mitk::DataNode::New();
00140 testDS->Add(n1);
00141 MITK_TEST_CONDITION_REQUIRED(
00142 testDS->GetModifiedObserverTags().size()==1, "Testing if modified"
00143 " observer was added.");
00144 MITK_TEST_CONDITION_REQUIRED(
00145 testDS->GetDeletedObserverTags().size()==1, "Testing if delete"
00146 " observer was added.");
00147 testDS->Remove(n1);
00148 MITK_TEST_CONDITION_REQUIRED(
00149 testDS->GetModifiedObserverTags().size()==0, "Testing if modified"
00150 " observer was removed.");
00151 MITK_TEST_CONDITION_REQUIRED(
00152 testDS->GetDeletedObserverTags().size()==0, "Testing if delete"
00153 " observer was removed.");
00154
00155
00156 MITK_TEST_OUTPUT( << "Create StandaloneDataStorage : ");
00157 mitk::StandaloneDataStorage::Pointer sds;
00158 try
00159 {
00160 sds = mitk::StandaloneDataStorage::New();
00161 MITK_TEST_CONDITION_REQUIRED(sds.IsNotNull(), "Testing Instatiation");
00162 }
00163 catch (...)
00164 {
00165 MITK_TEST_FAILED_MSG( << "Exception during creation of StandaloneDataStorage");
00166 }
00167
00168 MITK_TEST_OUTPUT( << "Testing StandaloneDataStorage: ");
00169 TestDataStorage(sds);
00170
00171 sds = NULL;
00172
00173 MITK_TEST_END();
00174 }
00175
00176
00177
00178
00179 void TestDataStorage( mitk::DataStorage* ds )
00180 {
00181
00182 MITK_TEST_CONDITION_REQUIRED(ds != NULL, "DataStorage valid?");
00183
00184
00185 mitk::StandardFileLocations::Pointer locator = mitk::StandardFileLocations::GetInstance();
00186 MITK_TEST_CONDITION_REQUIRED(locator.IsNotNull(),"Instantiating StandardFileLocations");
00187 std::string filename = locator->FindFile("US4DCyl.pic.gz", "Core/Code/Testing/Data/");
00188
00189 mitk::PicFileReader::Pointer reader = mitk::PicFileReader::New();
00190 reader -> SetFileName(filename.c_str());
00191 reader -> Update();
00192 mitk::Image::Pointer image = reader -> GetOutput();
00193
00194
00195 mitk::DataNode::Pointer n1 = mitk::DataNode::New();
00196
00197
00198
00199
00200 n1->SetData(image);
00201 n1->SetProperty("name", mitk::StringProperty::New("Node 1 - Image Node"));
00202 mitk::DataStorage::SetOfObjects::Pointer parents1 = mitk::DataStorage::SetOfObjects::New();
00203
00204 mitk::DataNode::Pointer n2 = mitk::DataNode::New();
00205 mitk::Surface::Pointer surface = mitk::Surface::New();
00206 n2->SetData(surface);
00207 n2->SetProperty("name", mitk::StringProperty::New("Node 2 - Surface Node"));
00208 mitk::Color color; color.Set(1.0f, 1.0f, 0.0f);
00209 n2->SetColor(color);
00210 n2->SetProperty("Resection Proposal 1", mitk::GroupTagProperty::New());
00211 mitk::DataStorage::SetOfObjects::Pointer parents2 = mitk::DataStorage::SetOfObjects::New();
00212 parents2->InsertElement(0, n1);
00213
00214 mitk::DataNode::Pointer n3 = mitk::DataNode::New();
00215 n3->SetProperty("name", mitk::StringProperty::New("Node 3 - Empty Node"));
00216 n3->SetProperty("Resection Proposal 1", mitk::GroupTagProperty::New());
00217 n3->SetProperty("Resection Proposal 2", mitk::GroupTagProperty::New());
00218 mitk::DataStorage::SetOfObjects::Pointer parents3 = mitk::DataStorage::SetOfObjects::New();
00219 parents3->InsertElement(0, n2);
00220
00221 mitk::DataNode::Pointer n4 = mitk::DataNode::New();
00222 n4->SetColor(color);
00223 n4->SetProperty("Resection Proposal 2", mitk::GroupTagProperty::New());
00224 mitk::DataStorage::SetOfObjects::Pointer parents4 = mitk::DataStorage::SetOfObjects::New();
00225 parents4->InsertElement(0, n2);
00226 parents4->InsertElement(1, n3);
00227
00228 mitk::DataNode::Pointer n5 = mitk::DataNode::New();
00229 n5->SetProperty("name", mitk::StringProperty::New("Node 5"));
00230
00231 try
00232 {
00233
00234 ds->Add(n1, parents1);
00235 MITK_TEST_CONDITION_REQUIRED((ds->GetAll()->Size() == 1) && (ds->GetAll()->GetElement(0) == n1), "Testing Adding a new object");
00236
00237
00238 MITK_TEST_OUTPUT( << "Check exception on adding the same object again: ");
00239 MITK_TEST_FOR_EXCEPTION(..., ds->Add(n1, parents1));
00240 MITK_TEST_CONDITION(ds->GetAll()->Size() == 1, "Test if object count is correct after exception");
00241
00242
00243 ds->Add(n2, parents2);
00244 MITK_TEST_CONDITION_REQUIRED(ds->GetAll()->Size() == 2, "Testing Adding an object that has a source object");
00245
00246
00247 ds->Add(n3, parents3);
00248 ds->Add(n4, parents4);
00249 ds->Add(n5);
00250 MITK_TEST_CONDITION_REQUIRED(ds->GetAll()->Size() == 5, "Adding some more objects needed for further tests");
00251 }
00252 catch(...)
00253 {
00254 MITK_TEST_FAILED_MSG( << "Exeption during object creation");
00255 }
00256
00257 try
00258 {
00259
00260 {
00261 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetAll();
00262 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00263
00264 MITK_TEST_CONDITION(
00265 (stlAll.size() == 5)
00266 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end()) && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00267 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end()) && (std::find(stlAll.begin(), stlAll.end(), n4) != stlAll.end())
00268 && (std::find(stlAll.begin(), stlAll.end(), n5) != stlAll.end()),
00269 "Testing GetAll()"
00270 );
00271 }
00272
00273 {
00274 mitk::NodePredicateProperty::Pointer predicate(mitk::NodePredicateProperty::New("name", mitk::StringProperty::New("Node 2 - Surface Node")));
00275 mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00276 MITK_TEST_CONDITION((all->Size() == 1) && (all->GetElement(0) == n2), "Requesting a named object");
00277 }
00278
00279
00280 {
00281 mitk::NodePredicateDataType::Pointer predicate(mitk::NodePredicateDataType::New("Image"));
00282 mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00283 MITK_TEST_CONDITION((all->Size() == 1) && (all->GetElement(0) == n1), "Requesting objects of specific data type")
00284 }
00285
00286 {
00287 mitk::NodePredicateDimension::Pointer predicate(mitk::NodePredicateDimension::New( 4 ));
00288 mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00289 MITK_TEST_CONDITION((all->Size() == 1) && (all->GetElement(0) == n1), "Requesting objects of specific dimension")
00290 }
00291
00292 {
00293 mitk::NodePredicateData::Pointer predicate(mitk::NodePredicateData::New(image));
00294 mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00295 MITK_TEST_CONDITION((all->Size() == 1) && (all->GetElement(0) == n1), "Requesting objects with specific data object")
00296 }
00297
00298 {
00299 mitk::NodePredicateData::Pointer predicate(mitk::NodePredicateData::New(NULL));
00300 mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00301 MITK_TEST_CONDITION(
00302 (all->Size() == 3)
00303 && (std::find(all->begin(), all->end(), n3) != all->end())
00304 && (std::find(all->begin(), all->end(), n4) != all->end())
00305 && (std::find(all->begin(), all->end(), n5) != all->end())
00306 , "Requesting objects with NULL data");
00307 }
00308
00309 {
00310 mitk::NodePredicateDataType::Pointer p1 = mitk::NodePredicateDataType::New("Surface");
00311 mitk::NodePredicateProperty::Pointer p2 = mitk::NodePredicateProperty::New("color", mitk::ColorProperty::New(color));
00312 mitk::NodePredicateAnd::Pointer predicate = mitk::NodePredicateAnd::New();
00313 predicate->AddPredicate(p1);
00314 predicate->AddPredicate(p2);
00315 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00316 MITK_TEST_CONDITION((all->Size() == 1) && (all->GetElement(0) == n2), "Requesting objects that meet a conjunction criteria");
00317 }
00318
00319 {
00320 mitk::NodePredicateDataType::Pointer p1(mitk::NodePredicateDataType::New("Image"));
00321 mitk::NodePredicateProperty::Pointer p2(mitk::NodePredicateProperty::New("color", mitk::ColorProperty::New(color)));
00322 mitk::NodePredicateOr::Pointer predicate = mitk::NodePredicateOr::New();
00323 predicate->AddPredicate(p1);
00324 predicate->AddPredicate(p2);
00325 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00326 MITK_TEST_CONDITION(
00327 (all->Size() == 3)
00328 && (std::find(all->begin(), all->end(), n1) != all->end())
00329 && (std::find(all->begin(), all->end(), n2) != all->end())
00330 && (std::find(all->begin(), all->end(), n4) != all->end()),
00331 "Requesting objects that meet a disjunction criteria");
00332 }
00333
00334 {
00335 mitk::ColorProperty::Pointer cp = mitk::ColorProperty::New(color);
00336 mitk::NodePredicateProperty::Pointer proppred(mitk::NodePredicateProperty::New("color", cp));
00337 mitk::NodePredicateNot::Pointer predicate(mitk::NodePredicateNot::New(proppred));
00338
00339 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(predicate);
00340 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00341 MITK_TEST_CONDITION(
00342 (all->Size() == 3)
00343 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end())
00344 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00345 && (std::find(stlAll.begin(), stlAll.end(), n5) != stlAll.end()), "Requesting objects that do not meet a criteria");
00346 }
00347
00348
00349 {
00350 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n3, NULL, true);
00351 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00352 MITK_TEST_CONDITION(
00353 (all->Size() == 1) && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end()),
00354 "Requesting *direct* source objects");
00355 }
00356
00357
00358 {
00359 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n3, NULL, false);
00360 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00361 MITK_TEST_CONDITION(
00362 (all->Size() == 2)
00363 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end())
00364 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end()),
00365 "Requesting *all* source objects");
00366 }
00367
00368
00369 {
00370 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n4, NULL, false);
00371 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00372 MITK_TEST_CONDITION(
00373 (all->Size() == 3)
00374 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end())
00375 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00376 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00377 , "Requesting *all* sources of object with multiple parents");
00378 }
00379
00380
00381 {
00382 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetDerivations(n1, NULL, true);
00383 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00384 MITK_TEST_CONDITION(
00385 (all->Size() == 1)
00386 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00387 , "Requesting *direct* derived objects");
00388
00389 }
00390
00392
00393 {
00394 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetDerivations(n2, NULL, true);
00395 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00396 MITK_TEST_CONDITION(
00397 (all->Size() == 2)
00398 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00399 && (std::find(stlAll.begin(), stlAll.end(), n4) != stlAll.end())
00400 , "Requesting *direct* derived objects with multiple parents/derivations");
00401 }
00402
00403
00404 {
00405 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetDerivations(n1, NULL, false);
00406 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00407 MITK_TEST_CONDITION(
00408 (all->Size() == 3)
00409 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00410 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00411 && (std::find(stlAll.begin(), stlAll.end(), n4) != stlAll.end())
00412 , "Requesting *all* derived objects");
00413 }
00414
00415
00416 {
00417 parents1->InsertElement(0, n4);
00418 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n4, NULL, false);
00419 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00420 MITK_TEST_CONDITION(
00421 (all->Size() == 3)
00422 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end())
00423 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00424 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00425 , "Checking for circular source relationships");
00426 }
00427
00429
00430
00431
00432 {
00433 mitk::GroupTagProperty::Pointer tp = mitk::GroupTagProperty::New();
00434 mitk::NodePredicateProperty::Pointer pred(mitk::NodePredicateProperty::New("Resection Proposal 1", tp));
00435 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(pred);
00436 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00437 MITK_TEST_CONDITION(
00438 (all->Size() == 2)
00439 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00440 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00441 , "Checking GroupTagProperty");
00442 }
00443
00444
00445 {
00446 mitk::GroupTagProperty::Pointer tp = mitk::GroupTagProperty::New();
00447 mitk::NodePredicateProperty::Pointer pred(mitk::NodePredicateProperty::New("Resection Proposal 2", tp));
00448 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSubset(pred);
00449 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00450 MITK_TEST_CONDITION(
00451 (all->Size() == 2)
00452 && (std::find(stlAll.begin(), stlAll.end(), n3) != stlAll.end())
00453 && (std::find(stlAll.begin(), stlAll.end(), n4) != stlAll.end())
00454 , "Checking GroupTagProperty 2");
00455
00456 }
00457
00458
00459 {
00460 mitk::NodePredicateDataType::Pointer pred = mitk::NodePredicateDataType::New("Surface");
00461 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n4, pred, true);
00462 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00463 MITK_TEST_CONDITION(
00464 (all->Size() == 1)
00465 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00466 , "checking direct sources with condition");
00467 }
00468
00469
00470 {
00471 mitk::NodePredicateDataType::Pointer pred = mitk::NodePredicateDataType::New("Image");
00472 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n4, pred, false);
00473 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00474 MITK_TEST_CONDITION(
00475 (all->Size() == 1)
00476 && (std::find(stlAll.begin(), stlAll.end(), n1) != stlAll.end())
00477 , "Checking all sources with condition");
00478 }
00479
00480
00481 {
00482 mitk::NodePredicateDataType::Pointer pred = mitk::NodePredicateDataType::New("VesselTree");
00483 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetSources(n4, pred, false);
00484 MITK_TEST_CONDITION(all->Size() == 0 , "Checking all sources with condition with empty resultset");
00485 }
00486
00487
00488 {
00489 mitk::NodePredicateProperty::Pointer pred = mitk::NodePredicateProperty::New("color");
00490 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetDerivations(n1, pred, true);
00491 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00492 MITK_TEST_CONDITION(
00493 (all->Size() == 1)
00494 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00495 , "Checking direct derivations with condition");
00496 }
00497
00498
00499 {
00500 mitk::NodePredicateProperty::Pointer pred = mitk::NodePredicateProperty::New("color");
00501
00502 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetDerivations(n1, pred, false);
00503 std::vector<mitk::DataNode::Pointer> stlAll = all->CastToSTLConstContainer();
00504 MITK_TEST_CONDITION(
00505 (all->Size() == 2)
00506 && (std::find(stlAll.begin(), stlAll.end(), n2) != stlAll.end())
00507 && (std::find(stlAll.begin(), stlAll.end(), n4) != stlAll.end())
00508 , "Checking direct derivations with condition");
00509 }
00510
00511
00512 MITK_TEST_CONDITION(ds->GetNamedNode("Node 2 - Surface Node") == n2, "Checking named node method");
00513 MITK_TEST_CONDITION(ds->GetNamedNode(std::string("Node 2 - Surface Node")) == n2, "Checking named node(std::string) method");
00514
00515
00516 MITK_TEST_CONDITION(ds->GetNamedNode("This name does not exist") == NULL, "Checking named node method with wrong name");
00517
00518
00519 MITK_TEST_CONDITION(ds->GetNamedObject<mitk::Image>("Node 1 - Image Node") == image, "Checking named object method");
00520 MITK_TEST_CONDITION(ds->GetNamedObject<mitk::Image>(std::string("Node 1 - Image Node")) == image, "Checking named object(std::string) method");
00521
00522
00523 MITK_TEST_CONDITION(ds->GetNamedObject<mitk::Surface>("Node 1 - Image Node") == NULL, "Checking named object method with wrong DataType");
00524
00525
00526 MITK_TEST_CONDITION(ds->GetNamedObject<mitk::Image>("This name does not exist") == NULL, "Checking named object method with wrong name");
00527
00528
00529 MITK_TEST_CONDITION(ds->GetNamedDerivedNode("Node 2 - Surface Node", n1, true) == n2, "Checking GetNamedDerivedNode with valid name & direct derivation only");
00530
00531
00532 MITK_TEST_CONDITION(ds->GetNamedDerivedNode("wrong name", n1, true) == NULL, "Checking GetNamedDerivedNode with invalid name & direct derivation only");
00533
00534
00535 MITK_TEST_CONDITION(ds->GetNamedDerivedNode("Node 3 - Empty Node", n1, false) == n3, "Checking GetNamedDerivedNode with invalid name & direct derivation only");
00536
00537
00538
00539 MITK_TEST_CONDITION(ds->GetNamedDerivedNode("Node 3 - Empty Node", n1, true) == NULL, "Checking GetNamedDerivedNode with valid Name but direct derivation only");
00540
00541
00542 {
00543 mitk::NodePredicateDataType::Pointer p(mitk::NodePredicateDataType::New("Image"));
00544 MITK_TEST_CONDITION(ds->GetNode(p) == n1, "Checking GetNode with valid predicate");
00545 }
00546
00547 {
00548 mitk::NodePredicateDataType::Pointer p(mitk::NodePredicateDataType::New("PointSet"));
00549 MITK_TEST_CONDITION(ds->GetNode(p) == NULL, "Checking GetNode with invalid predicate");
00550 }
00551
00552 }
00553 catch(...)
00554 {
00555 MITK_TEST_FAILED_MSG( << "Exeption during object retrieval (GetXXX() Methods)");
00556 }
00557
00558 try
00559 {
00560
00561
00562 {
00563 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00564 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00565 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00566 int refCountbeforeDS = watcher->GetReferenceCount();
00567 ds->Add(extra);
00568 MITK_TEST_CONDITION(ds->GetNamedNode("extra") == extra, "Adding extra node");
00569 ds->Remove(extra);
00570 MITK_TEST_CONDITION(
00571 (ds->GetNamedNode("extra") == NULL)
00572 && (refCountbeforeDS == watcher->GetReferenceCount())
00573 , "Checking removal of a node without relations");
00574 extra = NULL;
00575 }
00576
00577
00578 {
00579 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00580 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00581
00582 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00583 int refCountbeforeDS = watcher->GetReferenceCount();
00584 ds->Add(extra, n1);
00585
00586 MITK_TEST_CONDITION(
00587 (ds->GetNamedNode("extra") == extra)
00588 && (ds->GetDerivations(n1)->Size() == 2)
00589 , "Adding extra node");
00590 ds->Remove(extra);
00591 MITK_TEST_CONDITION(
00592 (ds->GetNamedNode("extra") == NULL)
00593 && (refCountbeforeDS == watcher->GetReferenceCount())
00594 && (ds->GetDerivations(n1)->Size() == 1)
00595 , "Checking removal of a node with a parent");
00596 extra = NULL;
00597 }
00598
00599
00600 {
00601 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00602 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00603
00604 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00605 int refCountbeforeDS = watcher->GetReferenceCount();
00606 mitk::DataStorage::SetOfObjects::Pointer p = mitk::DataStorage::SetOfObjects::New();
00607 p->push_back(n1);
00608 p->push_back(n2);
00609 ds->Add(extra, p);
00610
00611
00612 MITK_TEST_CONDITION(
00613 (ds->GetNamedNode("extra") == extra)
00614 && (ds->GetDerivations(n1)->Size() == 2)
00615 && (ds->GetDerivations(n2)->Size() == 3)
00616 , "add extra node");
00617
00618 ds->Remove(extra);
00619 MITK_TEST_CONDITION(
00620 (ds->GetNamedNode("extra") == NULL)
00621 && (refCountbeforeDS == watcher->GetReferenceCount())
00622 && (ds->GetDerivations(n1)->Size() == 1)
00623 && (ds->GetDerivations(n2)->Size() == 2)
00624 , "Checking removal of a node with two parents");
00625 extra = NULL;
00626 }
00627
00628
00629 {
00630 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00631 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00632 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00633 int refCountbeforeDS = watcher->GetReferenceCount();
00634 ds->Add(extra);
00635 mitk::DataNode::Pointer d1 = mitk::DataNode::New();
00636 d1->SetProperty("name", mitk::StringProperty::New("d1"));
00637 ds->Add(d1, extra);
00638 mitk::DataNode::Pointer d2 = mitk::DataNode::New();
00639 d2->SetProperty("name", mitk::StringProperty::New("d2"));
00640 ds->Add(d2, extra);
00641
00642 MITK_TEST_CONDITION(
00643 (ds->GetNamedNode("extra") == extra)
00644 && (ds->GetNamedNode("d1") == d1)
00645 && (ds->GetNamedNode("d2") == d2)
00646 && (ds->GetSources(d1)->Size() == 1)
00647 && (ds->GetSources(d2)->Size() == 1)
00648 && (ds->GetDerivations(extra)->Size() == 2)
00649 , "add extra node");
00650
00651 ds->Remove(extra);
00652 MITK_TEST_CONDITION(
00653 (ds->GetNamedNode("extra") == NULL)
00654 && (ds->GetNamedNode("d1") == d1)
00655 && (ds->GetNamedNode("d2") == d2)
00656 && (refCountbeforeDS == watcher->GetReferenceCount())
00657 && (ds->GetSources(d1)->Size() == 0)
00658 && (ds->GetSources(d2)->Size() == 0)
00659 , "Checking removal of a node with two derived nodes");
00660 extra = NULL;
00661 }
00662
00663
00664 {
00665 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00666 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00667 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00668 mitk::ReferenceCountWatcher::Pointer n1watcher = new mitk::ReferenceCountWatcher(n1);
00669 int refCountbeforeDS = watcher->GetReferenceCount();
00670
00671 mitk::DataStorage::SetOfObjects::Pointer p = mitk::DataStorage::SetOfObjects::New();
00672 p->push_back(n1);
00673 p->push_back(n2);
00674 ds->Add(extra, p);
00675
00676 mitk::DataNode::Pointer d1 = mitk::DataNode::New();
00677 d1->SetProperty("name", mitk::StringProperty::New("d1x"));
00678 ds->Add(d1, extra);
00679 mitk::DataNode::Pointer d2 = mitk::DataNode::New();
00680 d2->SetProperty("name", mitk::StringProperty::New("d2x"));
00681 ds->Add(d2, extra);
00682
00683 MITK_TEST_CONDITION(
00684 (ds->GetNamedNode("extra") == extra)
00685 && (ds->GetNamedNode("d1x") == d1)
00686 && (ds->GetNamedNode("d2x") == d2)
00687 && (ds->GetSources(d1)->Size() == 1)
00688 && (ds->GetSources(d2)->Size() == 1)
00689 && (ds->GetDerivations(n1)->Size() == 2)
00690 && (ds->GetDerivations(n2)->Size() == 3)
00691 && (ds->GetDerivations(extra)->Size() == 2)
00692 , "add extra node");
00693
00694 ds->Remove(extra);
00695 MITK_TEST_CONDITION(
00696 (ds->GetNamedNode("extra") == NULL)
00697 && (ds->GetNamedNode("d1x") == d1)
00698 && (ds->GetNamedNode("d2x") == d2)
00699 && (refCountbeforeDS == watcher->GetReferenceCount())
00700 && (ds->GetDerivations(n1)->Size() == 1)
00701 && (ds->GetDerivations(n2)->Size() == 2)
00702 && (ds->GetSources(d1)->Size() == 0)
00703 && (ds->GetSources(d2)->Size() == 0)
00704 , "Checking removal of a node with two parents and two derived nodes");
00705 extra = NULL;
00706 }
00707 }
00708 catch(...)
00709 {
00710 MITK_TEST_FAILED_MSG( << "Exeption during object removal methods");
00711 }
00712
00713
00714
00715
00716 {
00717 MITK_TEST_FOR_EXCEPTION_BEGIN(...);
00718 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00719 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00720 mitk::DataStorage::SetOfObjects::Pointer p = mitk::DataStorage::SetOfObjects::New();
00721 p->push_back(n1);
00722 p->push_back(extra);
00723 ds->Add(extra, p);
00724 MITK_TEST_FOR_EXCEPTION_END(...);
00725 }
00726
00727
00728
00729 {
00730 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00731 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00732 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00733 mitk::DataStorage::SetOfObjects::Pointer p = mitk::DataStorage::SetOfObjects::New();
00734 p->push_back(n1);
00735 p->push_back(n3);
00736 ds->Add(extra, p);
00737 extra = NULL;
00738 ds->Remove(ds->GetNamedNode("extra"));
00739 MITK_TEST_CONDITION(watcher->GetReferenceCount() == 0, "Checking reference count of node after add and remove");
00740 }
00741
00742
00743 {
00744 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00745 extra->SetProperty("name", mitk::StringProperty::New("extra"));
00746
00747 ds->Add(extra);
00748 mitk::DataNode::Pointer d1y = mitk::DataNode::New();
00749 d1y->SetProperty("name", mitk::StringProperty::New("d1y"));
00750 mitk::ReferenceCountWatcher::Pointer watcherD1y = new mitk::ReferenceCountWatcher(d1y);
00751 int refCountbeforeDS = watcherD1y->GetReferenceCount();
00752 ds->Add(d1y, extra);
00753 mitk::DataNode::Pointer d2y = mitk::DataNode::New();
00754 d2y->SetProperty("name", mitk::StringProperty::New("d2y"));
00755 ds->Add(d2y, extra);
00756
00757 MITK_TEST_CONDITION(
00758 (ds->GetNamedNode("extra") == extra)
00759 && (ds->GetNamedNode("d1y") == d1y)
00760 && (ds->GetNamedNode("d2y") == d2y)
00761 && (ds->GetSources(d1y)->Size() == 1)
00762 && (ds->GetSources(d2y)->Size() == 1)
00763 && (ds->GetDerivations(extra)->Size() == 2)
00764 , "add extra node");
00765
00766 ds->Remove(ds->GetDerivations( extra));
00767 MITK_TEST_CONDITION(
00768 (ds->GetNamedNode("extra") == extra)
00769 && (ds->GetNamedNode("d1y") == NULL)
00770 && (ds->GetNamedNode("d2y") == NULL)
00771 && (refCountbeforeDS == watcherD1y->GetReferenceCount())
00772 , "Checking removal of subset of two derived nodes from one parent node");
00773
00774 ds->Remove(extra);
00775 MITK_TEST_CONDITION(
00776 (ds->GetNamedNode("extra") == NULL)
00777 , "Checking removal of a parent node");
00778 extra = NULL;
00779 }
00780
00781
00782 {
00783 const std::set<std::string> groupTags = ds->GetGroupTags();
00784 MITK_TEST_CONDITION(
00785 (groupTags.size() == 2)
00786 && (std::find(groupTags.begin(), groupTags.end(), "Resection Proposal 1") != groupTags.end())
00787 && (std::find(groupTags.begin(), groupTags.end(), "Resection Proposal 2") != groupTags.end())
00788 , "Checking GetGrouptags()");
00789 }
00790
00791
00792
00793 DSEventReceiver listener;
00794 try
00795 {
00796 ds->AddNodeEvent += mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnAdd);
00797 ds->RemoveNodeEvent += mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnRemove);
00798
00799 mitk::DataNode::Pointer extra = mitk::DataNode::New();
00800 mitk::ReferenceCountWatcher::Pointer watcher = new mitk::ReferenceCountWatcher(extra);
00801 ds->Add(extra);
00802
00803 MITK_TEST_CONDITION(listener.m_NodeAdded == extra.GetPointer(), "Checking AddEvent");
00804
00805 ds->Remove(extra);
00806 MITK_TEST_CONDITION(listener.m_NodeRemoved == extra.GetPointer(), "Checking RemoveEvent");
00807
00808
00809 ds->AddNodeEvent -= mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnAdd);
00810 ds->RemoveNodeEvent -= mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnRemove);
00811 listener.m_NodeAdded = NULL;
00812 listener.m_NodeRemoved = NULL;
00813 ds->Add(extra);
00814 ds->Remove(extra);
00815 MITK_TEST_CONDITION((listener.m_NodeRemoved == NULL) && (listener.m_NodeAdded == NULL), "Checking RemoveListener");
00816
00817
00818 std::cout << "Pointer handling after event handling: " << std::flush;
00819 extra = NULL;
00820 MITK_TEST_CONDITION(watcher->GetReferenceCount() == 0, "Pointer handling after event handling");
00821 }
00822 catch(...)
00823 {
00824
00825 ds->AddNodeEvent -= mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnAdd);
00826 ds->RemoveNodeEvent -= mitk::MessageDelegate1<DSEventReceiver, const mitk::DataNode*>(&listener, &DSEventReceiver::OnRemove);
00827 MITK_TEST_FAILED_MSG( << "Exception during object removal methods");
00828 }
00829
00830
00831 const mitk::DataStorage::SetOfObjects::ConstPointer all = ds->GetAll();
00832 mitk::TimeSlicedGeometry::Pointer geometry = ds->ComputeBoundingGeometry3D();
00833 MITK_TEST_CONDITION(geometry->GetTimeSteps()==4, "Test for number or time steps with ComputeBoundingGeometry()");
00834 mitk::TimeBounds timebounds = geometry->GetTimeBounds();
00835 MITK_TEST_CONDITION((timebounds[0]==0)&&(timebounds[1]==4),"Test for timebounds with ComputeBoundingGeometry()");
00836 for (unsigned int i=0; i<geometry->GetTimeSteps(); i++)
00837 {
00838 mitk::Geometry3D::Pointer subGeometry = geometry->GetGeometry3D(i);
00839 mitk::TimeBounds bounds = subGeometry->GetTimeBounds();
00840 MITK_TEST_CONDITION((bounds[0]==i)&&(bounds[1]==i+1),"Test for timebounds of geometry at different time steps with ComputeBoundingGeometry()");
00841 }
00842 geometry = ds->ComputeBoundingGeometry3D(all);
00843 MITK_TEST_CONDITION(geometry->GetTimeSteps()==4, "Test for number or time steps with ComputeBoundingGeometry(allNodes)");
00844 timebounds = geometry->GetTimeBounds();
00845 MITK_TEST_CONDITION((timebounds[0]==0)&&(timebounds[1]==4),"Test for timebounds with ComputeBoundingGeometry(allNodes)");
00846 for (unsigned int i=0; i<geometry->GetTimeSteps(); i++)
00847 {
00848 mitk::Geometry3D::Pointer subGeometry = geometry->GetGeometry3D(i);
00849 mitk::TimeBounds bounds = subGeometry->GetTimeBounds();
00850 MITK_TEST_CONDITION((bounds[0]==i)&&(bounds[1]==i+1),"Test for timebounds of geometry at different time steps with ComputeBoundingGeometry()");
00851 }
00852
00853
00854 try
00855 {
00856 mitk::StandaloneDataStorage::Pointer standaloneDataStorage
00857 = mitk::StandaloneDataStorage::New();
00858 ItkDeleteEventListener listener( standaloneDataStorage );
00859 {
00860 mitk::DataNode::Pointer emptyNode = mitk::DataNode::New();
00861 mitk::DataNode* pEmptyNode = emptyNode;
00862 listener.SetNode( emptyNode );
00863 standaloneDataStorage->Add( emptyNode );
00864 emptyNode = 0;
00865
00866 standaloneDataStorage->Remove( pEmptyNode );
00867 }
00868 }
00869 catch(...)
00870 {
00871 MITK_TEST_FAILED_MSG( << "Exception during testing DataStorage thread safe");
00872 }
00873
00874
00875 ds->Remove(ds->GetAll());
00876 MITK_TEST_CONDITION(ds->GetAll()->Size() == 0, "Checking Clear DataStorage");
00877 }