Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkDispatcherTest.cpp
Go to the documentation of this file.
1 /*============================================================================
2 
3 The Medical Imaging Interaction Toolkit (MITK)
4 
5 Copyright (c) German Cancer Research Center (DKFZ)
6 All rights reserved.
7 
8 Use of this source code is governed by a 3-clause BSD license that can be
9 found in the LICENSE file.
10 
11 ============================================================================*/
12 
13 // Testing
14 #include "mitkTestFixture.h"
15 #include "mitkTestingMacros.h"
16 // MITK includes
17 #include <mitkCoreServices.h>
18 #include "mitkBaseRenderer.h"
19 #include "mitkDataInteractor.h"
20 #include "mitkDataNode.h"
21 #include "mitkDispatcher.h"
23 #include "mitkVtkPropRenderer.h"
24 // ITK includes
25 #include "itkLightObject.h"
26 
27 class mitkDispatcherTestSuite : public mitk::TestFixture
28 {
29  CPPUNIT_TEST_SUITE(mitkDispatcherTestSuite);
30  MITK_TEST(DispatcherExists_Success);
31  MITK_TEST(AddInteractorConnectedToDataStorage_IncreaseNumberOfInteractors);
32  MITK_TEST(AddDataNodeToInteractor_NoIncreasedNumberOfInteractors);
33  MITK_TEST(AddInteractorNotConnectedToDataStorage_NoRegisteredInteractor);
34  MITK_TEST(ConnectInteractorToDataStorage_ReplaceInteractorEntry);
35  MITK_TEST(NewDataNodeAndInteractor_IncreasedNumberOfInteractors);
36  MITK_TEST(InteractorsPointToSameDataNode_DecreasedNumberOfInteractors);
37  MITK_TEST(SetDataNodeToNullptr_RemoveInteractor);
38  MITK_TEST(RemoveDataNode_RemoveInteractor);
39  MITK_TEST(GetReferenceCountDataNode_Success);
40  MITK_TEST(GetReferenceCountInteractors_Success);
41  CPPUNIT_TEST_SUITE_END();
42 
43 private:
44 
45  vtkRenderWindow *m_RenWin;
47 
50 
54 public:
55 
56  /*
57  * Tests the process of creating Interactors and assigning DataNodes to them.
58  * Test checks if these Interactors are added to the Dispatcher under different conditions,
59  * and in different call order.
60  */
61 
62  void setUp()
63  {
64  // Here BindDispatcherInteractor and Dispatcher should be created automatically
65  m_RenWin = vtkRenderWindow::New();
66  m_Renderer = mitk::VtkPropRenderer::New("ContourRenderer", m_RenWin);
68  m_Dn = mitk::DataNode::New();
69  m_Dn2 = mitk::DataNode::New();
71  m_Ei2 = mitk::DataInteractor::New();
72  m_Renderer->SetDataStorage(m_Ds);
73  }
74 
75  void tearDown()
76  {
77  m_RenWin->Delete();
78  m_Renderer = nullptr;
79  m_Ds = nullptr;
80  m_Dn = nullptr;
81  m_Dn2 = nullptr;
82  m_Ei = nullptr;
83  m_Ei2 = nullptr;
84  }
85 
86  void DispatcherExists_Success()
87  {
88  CPPUNIT_ASSERT_MESSAGE("01 Check Existence of Dispatcher.",
89  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 0);
90  }
91 
92  void AddInteractorConnectedToDataStorage_IncreaseNumberOfInteractors()
93  {
94  m_Ei->SetDataNode(m_Dn);
95  m_Ds->Add(m_Dn);
96 
97  CPPUNIT_ASSERT_MESSAGE("02 Expected number of registered Interactors is 1",
98  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 1);
99  }
100 
101  void AddDataNodeToInteractor_NoIncreasedNumberOfInteractors()
102  {
103  m_Ei->SetDataNode(m_Dn);
104  m_Renderer->SetDataStorage(m_Ds);
105  m_Ds->Add(m_Dn);
106  // This _must not_ result in additionally registered interactors.
107  m_Ei->SetDataNode(m_Dn);
108  CPPUNIT_ASSERT_MESSAGE("03 Expected number of registered Interactors is 1",
109  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 1);
110  }
111 
112  void AddInteractorNotConnectedToDataStorage_NoRegisteredInteractor()
113  {
114  // Switching the DataNode of an Interactor also must not result in extra registered Interactors in Dispatcher
115  // since dn2 is not connected to DataStorage
116  m_Ei->SetDataNode(m_Dn2);
117 
118  CPPUNIT_ASSERT_MESSAGE("04 Expected number of registered Interactors is 0",
119  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 0);
120  }
121 
122  void ConnectInteractorToDataStorage_ReplaceInteractorEntry()
123  {
124  m_Ei->SetDataNode(m_Dn2);
125  // DataNode Added to DataStorage, now Interactor entry in Dispatcher should be replaced,
126  // hence we restore Interactor in the Dispatcher
127  m_Ds->Add(m_Dn2);
128 
129  CPPUNIT_ASSERT_MESSAGE("05 Expected number of registered Interactors is 1",
130  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 1);
131  }
132 
133  void NewDataNodeAndInteractor_IncreasedNumberOfInteractors()
134  {
135  m_Ei->SetDataNode(m_Dn2);
136  m_Ds->Add(m_Dn2);
137  m_Ds->Add(m_Dn);
138  // New DataNode and new interactor, this should result in additional Interactor in the Dispatcher.
139  m_Ei2->SetDataNode(m_Dn);
140 
141  CPPUNIT_ASSERT_MESSAGE("06 Exprected number of registered Interactors is 2",
142  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 2);
143  }
144 
145  void InteractorsPointToSameDataNode_DecreasedNumberOfInteractors()
146  {
147  m_Ds->Add(m_Dn2);
148  m_Ds->Add(m_Dn);
149  m_Ei->SetDataNode(m_Dn2);
150  m_Ei2->SetDataNode(m_Dn);
151  // Here ei and ei2 point to the same dn2; dn2 now only points to ei2, so ei is abandoned,
152  // therefore ei1 is expected to be removed
153 
154  m_Ei2->SetDataNode(m_Dn2);
155  CPPUNIT_ASSERT_MESSAGE("07 Expected number of registered Interactors is 1",
156  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 1);
157  }
158 
159  void SetDataNodeToNullptr_RemoveInteractor()
160  {
161  m_Ds->Add(m_Dn2);
162  m_Ei2->SetDataNode(m_Dn2);
163  // Setting DataNode in Interactor to nullptr, should remove Interactor from Dispatcher
164  m_Ei2->SetDataNode(nullptr);
165  CPPUNIT_ASSERT_MESSAGE("08 Expected number of registered Interactors is 0",
166  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 0);
167  }
168 
169  void RemoveDataNode_RemoveInteractor()
170  {
171  // Add DN again check if it is registered
172  m_Ds->Add(m_Dn);
173  m_Ei2->SetDataNode(m_Dn);
174 
175  CPPUNIT_ASSERT_MESSAGE("09 Expected number of registered Interactors is 1",
176  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 1);
177 
178  // If DN is removed Interactors should be too
179  m_Ds->Remove(m_Dn);
180  CPPUNIT_ASSERT_MESSAGE("10 ExpectedNumber of registered Interactors is 0",
181  m_Renderer->GetDispatcher()->GetNumberOfInteractors() == 0);
182  }
183 
184  void GetReferenceCountDataNode_Success()
185  {
186  m_Ds->Add(m_Dn);
187  m_Ei2->SetDataNode(m_Dn);
188  m_Ds->Remove(m_Dn);
189  // after DN is removed from DS its reference count must be back to one
190  CPPUNIT_ASSERT_MESSAGE("11 Expected number of references of DataNode is 1",
191  m_Dn->GetReferenceCount() == 1);
192  }
193 
194  void GetReferenceCountInteractors_Success()
195  {
196  m_Ei->SetDataNode(m_Dn2);
197  m_Ds->Add(m_Dn2);
198  m_Ei2->SetDataNode(m_Dn2);
199  CPPUNIT_ASSERT_MESSAGE("12 Expected number of references of Interactors is 1",
200  m_Ei->GetReferenceCount() == 1);
201  }
202 };
203 MITK_TEST_SUITE_REGISTRATION(mitkDispatcher)
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
static Pointer New()
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
static Pointer New()
Test fixture for parameterized tests.
static Pointer New(const char *_arga, vtkRenderWindow *_argb)