13 #include "itkMersenneTwisterRandomVariateGenerator.h" 17 #include <itkComposeImageFilter.h> 18 #include <itkEventObject.h> 19 #include <itkImageDuplicator.h> 20 #include <itkImageIterator.h> 21 #include <itkMersenneTwisterRandomVariateGenerator.h> 26 class mitkLevelWindowManagerTestClass
29 static void TestInstantiation()
36 static void TestSetGetDataStorage()
46 manager->SetDataStorage(ds);
48 catch (std::exception &e)
57 static void TestMethodsWithInvalidParameters()
62 manager->SetDataStorage(ds);
68 manager->SetLevelWindowProperty(levelWindowProperty);
74 MITK_TEST_CONDITION(success,
"Testing mitk::LevelWindowManager SetLevelWindowProperty with invalid parameter");
77 static void TestOtherMethods()
82 manager->SetDataStorage(ds);
84 MITK_TEST_CONDITION(manager->IsAutoTopMost(),
"Testing mitk::LevelWindowManager isAutoTopMost");
103 manager->SetAutoTopMostImage(
true);
104 MITK_TEST_CONDITION(manager->IsAutoTopMost(),
"Testing mitk::LevelWindowManager isAutoTopMost()");
107 static void TestRemoveObserver(std::string testImageFile)
112 manager->SetDataStorage(ds);
117 node1->SetData(image1);
120 node2->SetData(image2);
126 static_cast<int>(manager->GetRelevantNodes()->size()) == manager->GetNumberOfObservers(),
127 "Test if number of nodes is similar to number of observers");
131 node3->SetData(image3);
135 static_cast<int>(manager->GetRelevantNodes()->size()) == manager->GetNumberOfObservers(),
136 "Test if number of nodes is similar to number of observers");
151 static bool VerifyRenderingModes()
161 static void TestLevelWindowSliderVisibility(std::string testImageFile)
163 bool renderingModesValid = mitkLevelWindowManagerTestClass::VerifyRenderingModes();
164 if (!renderingModesValid)
166 MITK_ERROR <<
"Exception: Image Rendering.Mode property value types inconsistent.";
172 manager->SetDataStorage(ds);
177 node1->SetData(image1);
182 std::vector<mitk::DataNode::Pointer> nodeVec;
184 nodeVec.push_back(node1);
185 nodeVec.push_back(node2);
186 nodeVec.push_back(node3);
188 typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType;
189 RandomGeneratorType::Pointer rnd = RandomGeneratorType::New();
192 for (
unsigned int i = 0; i < 8; ++i)
194 unsigned int parity = i;
196 for (
unsigned int img = 0; img < 3; ++img)
200 int mode = rnd->GetIntegerVariate() % 3;
205 int mode = rnd->GetIntegerVariate() % 2;
212 renderingModesValid && ((!manager->GetLevelWindowProperty() && !i) || (manager->GetLevelWindowProperty() && i)),
213 "Testing level window property member according to rendering mode");
217 static void TestSetLevelWindowProperty(std::string testImageFile)
221 manager->SetDataStorage(ds);
228 node3->SetIntProperty(
"layer", 1);
229 node2->SetIntProperty(
"layer", 2);
230 node1->SetIntProperty(
"layer", 3);
232 manager->SetAutoTopMostImage(
true);
234 bool isImageForLevelWindow1, isImageForLevelWindow2, isImageForLevelWindow3;
235 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
236 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
237 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
239 MITK_TEST_CONDITION(isImageForLevelWindow1 && !isImageForLevelWindow2 && !isImageForLevelWindow3,
240 "Testing exclusive imageForLevelWindow property for node 1.");
242 manager->SetAutoTopMostImage(
false);
246 manager->SetLevelWindowProperty(prop);
247 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
248 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
249 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
251 MITK_TEST_CONDITION(!isImageForLevelWindow1 && isImageForLevelWindow2 && !isImageForLevelWindow3,
252 "Testing exclusive imageForLevelWindow property for node 2.");
255 manager->SetLevelWindowProperty(prop);
256 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
257 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
258 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
260 MITK_TEST_CONDITION(!isImageForLevelWindow1 && !isImageForLevelWindow2 && isImageForLevelWindow3,
261 "Testing exclusive imageForLevelWindow property for node 3.");
264 manager->SetLevelWindowProperty(prop);
265 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
266 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
267 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
269 MITK_TEST_CONDITION(isImageForLevelWindow1 && !isImageForLevelWindow2 && !isImageForLevelWindow3,
270 "Testing exclusive imageForLevelWindow property for node 3.");
273 static void TestImageForLevelWindowOnVisibilityChange(std::string testImageFile)
277 manager->SetDataStorage(ds);
284 node3->SetIntProperty(
"layer", 1);
285 node2->SetIntProperty(
"layer", 2);
286 node1->SetIntProperty(
"layer", 3);
288 manager->SetAutoTopMostImage(
false);
290 bool isImageForLevelWindow1, isImageForLevelWindow2, isImageForLevelWindow3;
291 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
292 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
293 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
295 MITK_TEST_CONDITION(isImageForLevelWindow1 && !isImageForLevelWindow2 && !isImageForLevelWindow3,
296 "Testing initial imageForLevelWindow setting.");
298 node1->SetVisibility(
false);
299 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
300 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
301 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
303 MITK_TEST_CONDITION(!isImageForLevelWindow1 && isImageForLevelWindow2 && !isImageForLevelWindow3,
304 "Testing exclusive imageForLevelWindow property for node 2.");
306 node2->SetVisibility(
false);
307 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
308 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
309 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
311 MITK_TEST_CONDITION(!isImageForLevelWindow1 && !isImageForLevelWindow2 && isImageForLevelWindow3,
312 "Testing exclusive imageForLevelWindow property for node 3.");
314 node3->SetVisibility(
false);
315 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
316 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
317 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
319 MITK_TEST_CONDITION(!isImageForLevelWindow1 && !isImageForLevelWindow2 && isImageForLevelWindow3,
320 "Testing exclusive imageForLevelWindow property for node 3.");
322 node1->SetVisibility(
true);
323 node1->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow1);
324 node2->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow2);
325 node3->GetBoolProperty(
"imageForLevelWindow", isImageForLevelWindow3);
327 MITK_TEST_CONDITION(isImageForLevelWindow1 && !isImageForLevelWindow2 && !isImageForLevelWindow3,
328 "Testing exclusive imageForLevelWindow property for node 3.");
331 static void TestImageForLevelWindowOnRandomPropertyChange(std::string testImageFile)
333 typedef std::vector<bool> BoolVecType;
334 typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType;
339 manager->SetDataStorage(ds);
345 node3->SetIntProperty(
"layer", 1);
346 node2->SetIntProperty(
"layer", 2);
347 node1->SetIntProperty(
"layer", 3);
350 std::vector<bool> nodesVisible;
351 nodesVisible.resize(3);
352 std::fill(nodesVisible.begin(), nodesVisible.end(),
true);
355 std::vector<bool> nodesForLevelWindow;
356 nodesForLevelWindow.resize(3);
357 std::fill(nodesForLevelWindow.begin(), nodesForLevelWindow.end(),
false);
360 std::vector<mitk::DataNode::Pointer> nodes;
361 nodes.push_back(node1);
362 nodes.push_back(node2);
363 nodes.push_back(node3);
366 manager->SetAutoTopMostImage(
false);
368 bool lvlWin1, lvlWin2, lvlWin3;
369 node1->GetBoolProperty(
"imageForLevelWindow", lvlWin1);
370 node2->GetBoolProperty(
"imageForLevelWindow", lvlWin2);
371 node3->GetBoolProperty(
"imageForLevelWindow", lvlWin3);
373 MITK_TEST_CONDITION(lvlWin1 && !lvlWin2 && !lvlWin3,
"Testing initial imageForLevelWindow setting.");
375 nodesForLevelWindow[0] = lvlWin1;
376 nodesForLevelWindow[1] = lvlWin2;
377 nodesForLevelWindow[2] = lvlWin3;
380 RandomGeneratorType::Pointer ranGen = RandomGeneratorType::New();
381 ranGen->Initialize();
385 int invalidCount = 0;
386 int mustHaveLvlWindow = 4;
387 for (
int run = 0; run < ranCount; ++run)
390 int ran = ranGen->GetIntegerVariate(2);
391 nodes[ran]->SetBoolProperty(
"imageForLevelWindow", !nodesForLevelWindow[ran]);
394 std::vector<bool>::const_iterator found = std::find(nodesForLevelWindow.begin(), nodesForLevelWindow.end(),
true);
395 if (found == nodesForLevelWindow.end())
401 found = std::find(nodesVisible.begin(), nodesVisible.end(),
true);
403 if (!nodesForLevelWindow[ran])
405 mustHaveLvlWindow = pow(2, 2 - ran);
409 mustHaveLvlWindow = 4;
413 node1->GetBoolProperty(
"imageForLevelWindow", lvlWin1);
414 node2->GetBoolProperty(
"imageForLevelWindow", lvlWin2);
415 node3->GetBoolProperty(
"imageForLevelWindow", lvlWin3);
416 nodesForLevelWindow[0] = lvlWin1;
417 nodesForLevelWindow[1] = lvlWin2;
418 nodesForLevelWindow[2] = lvlWin3;
420 int hasLevelWindow = 0;
421 for (
int i = 0; i < 3; ++i)
423 if (nodesForLevelWindow[i])
425 hasLevelWindow += pow(2, 2 - i);
429 validCount += hasLevelWindow == mustHaveLvlWindow ? 1 : 0;
433 while (falseran == 0)
435 falseran = ranGen->GetIntegerVariate(7);
437 BoolVecType falseNodes;
438 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin1 : lvlWin1);
440 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin2 : lvlWin2);
442 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin3 : lvlWin3);
443 int falseLevelWindow = 0;
444 for (
int i = 0; i < 3; ++i)
448 falseLevelWindow += pow(2, 2 - i);
452 invalidCount += falseLevelWindow == mustHaveLvlWindow ? 0 : 1;
455 mustHaveLvlWindow = hasLevelWindow;
458 MITK_TEST_CONDITION(validCount == ranCount,
"Testing proper node for level window property.");
462 static void TestImageForLevelWindowOnRandomVisibilityChange(std::string testImageFile)
464 typedef std::vector<bool> BoolVecType;
465 typedef itk::Statistics::MersenneTwisterRandomVariateGenerator RandomGeneratorType;
470 manager->SetDataStorage(ds);
476 node3->SetIntProperty(
"layer", 1);
477 node2->SetIntProperty(
"layer", 2);
478 node1->SetIntProperty(
"layer", 3);
481 std::vector<bool> nodesVisible;
482 nodesVisible.resize(3);
483 std::fill(nodesVisible.begin(), nodesVisible.end(),
true);
486 std::vector<bool> nodesForLevelWindow;
487 nodesForLevelWindow.resize(3);
488 std::fill(nodesForLevelWindow.begin(), nodesForLevelWindow.end(),
false);
491 std::vector<mitk::DataNode::Pointer> nodes;
492 nodes.push_back(node1);
493 nodes.push_back(node2);
494 nodes.push_back(node3);
497 manager->SetAutoTopMostImage(
false);
499 bool lvlWin1, lvlWin2, lvlWin3;
500 node1->GetBoolProperty(
"imageForLevelWindow", lvlWin1);
501 node2->GetBoolProperty(
"imageForLevelWindow", lvlWin2);
502 node3->GetBoolProperty(
"imageForLevelWindow", lvlWin3);
504 MITK_TEST_CONDITION(lvlWin1 && !lvlWin2 && !lvlWin3,
"Testing initial imageForLevelWindow setting.");
506 nodesForLevelWindow[0] = lvlWin1;
507 nodesForLevelWindow[1] = lvlWin2;
508 nodesForLevelWindow[2] = lvlWin3;
511 RandomGeneratorType::Pointer ranGen = RandomGeneratorType::New();
512 ranGen->Initialize();
516 int invalidCount = 0;
517 int mustHaveLvlWindow = 4;
518 for (
int run = 0; run < ranCount; ++run)
521 int ran = ranGen->GetIntegerVariate(2);
522 nodesVisible[ran] = !nodesVisible[ran];
523 nodes[ran]->SetVisibility(nodesVisible[ran]);
526 std::vector<bool>::const_iterator found = std::find(nodesForLevelWindow.begin(), nodesForLevelWindow.end(),
true);
527 if (found == nodesForLevelWindow.end())
531 int ind = found - nodesForLevelWindow.begin();
534 found = std::find(nodesVisible.begin(), nodesVisible.end(),
true);
535 bool allInvisible = (found == nodesVisible.end());
538 if (!allInvisible && !nodesVisible[ind])
541 for (std::vector<bool>::const_iterator it = nodesVisible.begin(); it != nodesVisible.end(); ++it, ++count)
545 mustHaveLvlWindow = pow(2, 2 - count);
552 node1->GetBoolProperty(
"imageForLevelWindow", lvlWin1);
553 node2->GetBoolProperty(
"imageForLevelWindow", lvlWin2);
554 node3->GetBoolProperty(
"imageForLevelWindow", lvlWin3);
555 nodesForLevelWindow[0] = lvlWin1;
556 nodesForLevelWindow[1] = lvlWin2;
557 nodesForLevelWindow[2] = lvlWin3;
559 int hasLevelWindow = 0;
560 for (
int i = 0; i < 3; ++i)
562 if (nodesForLevelWindow[i])
564 hasLevelWindow += pow(2, 2 - i);
568 validCount += hasLevelWindow == mustHaveLvlWindow ? 1 : 0;
572 while (falseran == 0)
574 falseran = ranGen->GetIntegerVariate(7);
576 BoolVecType falseNodes;
577 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin1 : lvlWin1);
579 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin2 : lvlWin2);
581 falseNodes.push_back((falseran & 1) == 1 ? !lvlWin3 : lvlWin3);
582 int falseLevelWindow = 0;
583 for (
int i = 0; i < 3; ++i)
587 falseLevelWindow += pow(2, 2 - i);
591 invalidCount += falseLevelWindow == mustHaveLvlWindow ? 0 : 1;
594 mustHaveLvlWindow = hasLevelWindow;
597 MITK_TEST_CONDITION(validCount == ranCount,
"Testing proper node for level window property.");
607 std::string testImage = args[1];
609 mitkLevelWindowManagerTestClass::TestInstantiation();
610 mitkLevelWindowManagerTestClass::TestSetGetDataStorage();
611 mitkLevelWindowManagerTestClass::TestMethodsWithInvalidParameters();
612 mitkLevelWindowManagerTestClass::TestOtherMethods();
613 mitkLevelWindowManagerTestClass::TestRemoveObserver(testImage);
614 mitkLevelWindowManagerTestClass::TestLevelWindowSliderVisibility(testImage);
615 mitkLevelWindowManagerTestClass::TestSetLevelWindowProperty(testImage);
616 mitkLevelWindowManagerTestClass::TestImageForLevelWindowOnVisibilityChange(testImage);
617 mitkLevelWindowManagerTestClass::TestImageForLevelWindowOnRandomVisibilityChange(testImage);
618 mitkLevelWindowManagerTestClass::TestImageForLevelWindowOnRandomPropertyChange(testImage);
The LevelWindowProperty class Property for the mitk::LevelWindow.
#define MITK_TEST_CONDITION_REQUIRED(COND, MSG)
section GeneralTestsDeprecatedOldTestingStyle Deprecated macros All tests with MITK_TEST_BEGIN()
#define MITK_TEST_OUTPUT(x)
Output some text.
An object of this class represents an exception of MITK. Please don't instantiate exceptions manually...
#define MITK_TEST_CONDITION(COND, MSG)
int mitkLevelWindowManagerTest(int argc, char *args[])
static DataStorage::SetOfObjects::Pointer Load(const std::string &path, DataStorage &storage, const ReaderOptionsFunctorBase *optionsCallback=nullptr)
Load a file into the given DataStorage.