Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkPointSetOnEmptyTest.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 /*
14  * mitkPointSetTestOnEmpty.cpp
15  *
16  * Created on: Apr 23, 2014
17  * Author: wirkert
18  */
23 #include "mitkTestFixture.h"
24 #include "mitkTestingMacros.h"
25 
26 #include <mitkInteractionConst.h>
27 #include <mitkPointOperation.h>
28 #include <mitkPointSet.h>
29 #include <mitkVector.h>
30 
31 #include <fstream>
32 
33 class mitkPointSetOnEmptyTestSuite : public mitk::TestFixture
34 {
35  CPPUNIT_TEST_SUITE(mitkPointSetOnEmptyTestSuite);
36 
37  MITK_TEST(TestInstantiation);
38  MITK_TEST(TestIsEmpty);
39  MITK_TEST(TestGetITKPointSet);
40  MITK_TEST(TestGetSizeIsZero);
41  MITK_TEST(TestAddPointDirectly);
42  MITK_TEST(TestPointSetClone);
43  MITK_TEST(TestPointDataContainerCorrectAfterPointSetManipulation);
44 
45  CPPUNIT_TEST_SUITE_END();
46 
47 private:
48  mitk::PointSet::Pointer pointSet;
49 
50  void TestPointContainerPointDataContainer(mitk::PointSet *ps)
51  {
52  mitk::PointSet::PointsContainer *pc = ps->GetPointSet()->GetPoints();
53  mitk::PointSet::PointDataContainer *pd = ps->GetPointSet()->GetPointData();
54  CPPUNIT_ASSERT_EQUAL_MESSAGE(
55  "PointContainer and PointDataContainer have same size", true, pc->Size() == pd->Size());
56  mitk::PointSet::PointsContainer::ConstIterator pIt = pc->Begin();
57  mitk::PointSet::PointDataContainer::ConstIterator dIt = pd->Begin();
58  bool failed = false;
59  for (; pIt != pc->End(); ++pIt, ++dIt)
60  if (pIt->Index() != dIt->Index())
61  {
62  failed = true;
63  break;
64  }
65  CPPUNIT_ASSERT_EQUAL_MESSAGE("Indices in PointContainer and PointDataContainer are equal", false, failed);
66  }
67 
68 public:
69  void setUp() override
70  {
71  // Create PointSet
72  pointSet = mitk::PointSet::New();
73  }
74 
75  void tearDown() override { pointSet = nullptr; }
76  void TestInstantiation() { CPPUNIT_ASSERT_EQUAL_MESSAGE("Testing instantiation", true, pointSet.IsNotNull()); }
77  void TestGetITKPointSet()
78  {
79  // try to get the itkPointSet
80  mitk::PointSet::DataType::Pointer itkdata = nullptr;
81  itkdata = pointSet->GetPointSet();
82  CPPUNIT_ASSERT_EQUAL_MESSAGE("try to get the itkPointSet from a newly created PointSet", true, itkdata.IsNotNull());
83  }
84 
85  void TestGetSizeIsZero()
86  {
87  // fresh PointSet has to be empty!
88  CPPUNIT_ASSERT_EQUAL_MESSAGE("check if the PointSet size is 0 ", true, pointSet->GetSize() == 0);
89  }
90 
91  void TestIsEmpty()
92  {
93  CPPUNIT_ASSERT_EQUAL_MESSAGE("check if the PointSet is empty", true, pointSet->IsEmptyTimeStep(0));
94  }
95 
96  void TestAddPointDirectly()
97  {
98  // add a point directly
99  int id = 0;
100  mitk::Point3D point;
101  mitk::FillVector3D(point, 1.0, 2.0, 3.0);
102  ++id;
103  pointSet->GetPointSet()->GetPoints()->InsertElement(id, point);
104 
105  CPPUNIT_ASSERT_EQUAL_MESSAGE(
106  "check if added points exists", true, pointSet->GetSize() == 1 || pointSet->IndexExists(id));
107 
108  mitk::Point3D tempPoint;
109 
110  tempPoint.Fill(0);
111  tempPoint = pointSet->GetPoint(id);
112 
113  CPPUNIT_ASSERT_EQUAL_MESSAGE("check if added point contains real value", true, point == tempPoint);
114  }
115 
116  void TestPointSetClone(void)
117  {
118  pointSet->Expand(3);
119  mitk::Point3D new0, new1, new2;
120  new0.Fill(0);
121  new1.Fill(1);
122  new2.Fill(2);
123  pointSet->InsertPoint(5, new0, mitk::PTCORNER, 0);
124  pointSet->InsertPoint(112, new1, 0);
125  pointSet->InsertPoint(2, new2, 0);
126  pointSet->InsertPoint(2, new0, 1);
127  pointSet->InsertPoint(1, new1, 1);
128  pointSet->InsertPoint(0, new2, 1);
129  pointSet->InsertPoint(0, new0, 2);
130  pointSet->InsertPoint(2, new1, 2);
131  pointSet->InsertPoint(1, new2, 2);
132 
133  MITK_TEST_OUTPUT(<< "... pointset ts: " << pointSet->GetTimeSteps())
134  mitk::PointSet::Pointer clonePS = pointSet->Clone();
135  MITK_TEST_OUTPUT(<< "... clone pointset ts: " << clonePS->GetTimeSteps())
136 
137  for (unsigned int t = 0; t < pointSet->GetTimeSteps(); t++)
138  {
139  MITK_TEST_OUTPUT(<< "testing timestep: " << t)
140  CPPUNIT_ASSERT_EQUAL_MESSAGE("Clone has same size", true, pointSet->GetSize(t) == clonePS->GetSize(t));
141 
142  // test for equal point coordinates
143  for (mitk::PointSet::PointsConstIterator i = pointSet->Begin(), j = clonePS->Begin();
144  i != pointSet->End() && j != clonePS->End();
145  ++i, ++j)
146  {
147  CPPUNIT_ASSERT_EQUAL_MESSAGE(
148  "Cloned PS and PS have same points", true, i.Index() == j.Index() && mitk::Equal(i.Value(), j.Value()));
149  }
150 
151  // test for equal point data
152  mitk::PointSet::PointDataContainer *pointDataCont = pointSet->GetPointSet(t)->GetPointData();
153  mitk::PointSet::PointDataContainer *clonePointDataCont = clonePS->GetPointSet(t)->GetPointData();
154  CPPUNIT_ASSERT_EQUAL_MESSAGE("Valid point data container", true, pointDataCont && clonePointDataCont);
155  CPPUNIT_ASSERT_EQUAL_MESSAGE(
156  "Cloned point data container has same size", true, pointDataCont->Size() == clonePointDataCont->Size());
157  for (mitk::PointSet::PointDataConstIterator i = pointDataCont->Begin(), j = clonePointDataCont->Begin();
158  i != pointDataCont->End() && j != clonePointDataCont->End();
159  ++i, ++j)
160  {
161  CPPUNIT_ASSERT_EQUAL_MESSAGE(
162  "Cloned PS and PS have same point data", true, i.Index() == j.Index() && i.Value() == j.Value());
163  }
164  }
165 
166  CPPUNIT_ASSERT_EQUAL_MESSAGE("check if the PointSet is not empty", false, clonePS->IsEmptyTimeStep(0));
167 
168  CPPUNIT_ASSERT_EQUAL_MESSAGE(
169  "Testing cloned point set's size!", true, clonePS->GetPointSetSeriesSize() == pointSet->GetPointSetSeriesSize());
170  CPPUNIT_ASSERT_EQUAL_MESSAGE(
171  "Testing that the clone is not the source PS!", true, clonePS.GetPointer() != pointSet.GetPointer());
172  CPPUNIT_ASSERT_EQUAL_MESSAGE("Testing if the geometry is cloned correctly!",
173  true,
174  clonePS->GetGeometry()->GetCenter() == pointSet->GetGeometry()->GetCenter());
175  CPPUNIT_ASSERT_EQUAL_MESSAGE(
176  "Testing if the property list is cloned correctly!",
177  true,
178  clonePS->GetPropertyList()->GetMap()->size() == pointSet->GetPropertyList()->GetMap()->size());
179  // Also testing, that clone is independent from original
180  mitk::Point3D p, p2;
181  p.Fill(42);
182  p2.Fill(84);
183  clonePS->InsertPoint(0, p);
184  pointSet->InsertPoint(0, p2);
185  p = clonePS->GetPoint(0);
186  p2 = pointSet->GetPoint(0);
187  CPPUNIT_ASSERT_EQUAL_MESSAGE("Testing that the clone is independent from source!", true, p != p2);
188  }
189 
190  void TestPointDataContainerCorrectAfterPointSetManipulation(void)
191  {
192  /* call everything that might modify PointContainer and PointDataContainer */
193  MITK_TEST_OUTPUT(<< "Test InsertPoint(), SetPoint() and SwapPointPosition()");
195  mitk::FillVector3D(point, 2.2, 3.3, -4.4);
196  pointSet->InsertPoint(17, point);
197  pointSet->SetPoint(4, point);
198  pointSet->SetPoint(7, point);
199  pointSet->SetPoint(2, point);
200  pointSet->SwapPointPosition(7, true);
201  pointSet->SwapPointPosition(3, true);
202  pointSet->SwapPointPosition(2, false);
203  TestPointContainerPointDataContainer(pointSet);
204 
205  MITK_TEST_OUTPUT(<< "Test OpREMOVE");
206  mitk::PointOperation op1(mitk::OpREMOVE, mitk::Point3D(), 2); // existing index
207  pointSet->ExecuteOperation(&op1);
208  mitk::PointOperation op1b(mitk::OpREMOVE, mitk::Point3D(), 112); // non existing index
209  pointSet->ExecuteOperation(&op1b);
210  TestPointContainerPointDataContainer(pointSet);
211 
212  MITK_TEST_OUTPUT(<< "Test OpMove");
213  mitk::PointOperation op2(mitk::OpMOVE, mitk::Point3D(), 4); // existing index
214  pointSet->ExecuteOperation(&op2);
215  mitk::PointOperation op3(mitk::OpMOVE, mitk::Point3D(), 34); // non existing index
216  pointSet->ExecuteOperation(&op3);
217  TestPointContainerPointDataContainer(pointSet);
218 
219  MITK_TEST_OUTPUT(<< "Test OpINSERT");
220  mitk::PointOperation op4(mitk::OpINSERT, mitk::Point3D(), 38); // non existing index
221  pointSet->ExecuteOperation(&op4);
222  mitk::PointOperation op5(mitk::OpINSERT, mitk::Point3D(), 17); // existing index
223  pointSet->ExecuteOperation(&op5);
224  TestPointContainerPointDataContainer(pointSet);
225  }
226 };
227 
228 MITK_TEST_SUITE_REGISTRATION(mitkPointSetOnEmpty)
DataType::PointDataContainer PointDataContainer
Definition: mitkPointSet.h:137
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
static Pointer New()
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
Constants for most interaction classes, due to the generic StateMachines.
DataType::PointsContainer::ConstIterator PointsConstIterator
Definition: mitkPointSet.h:136
void FillVector3D(Tout &out, mitk::ScalarType x, mitk::ScalarType y, mitk::ScalarType z)
Definition: mitkArray.h:106
DataType::PointDataContainerIterator PointDataConstIterator
Definition: mitkPointSet.h:139
#define MITK_TEST_OUTPUT(x)
Output some text.
Data structure which stores a set of points. Superclass of mitk::Mesh.
Definition: mitkPointSet.h:75
virtual DataType::Pointer GetPointSet(int t=0) const
returns the pointset
Test fixture for parameterized tests.
Operation that handles all actions on one Point.
DataType::PointsContainer PointsContainer
Definition: mitkPointSet.h:134
MITKNEWMODULE_EXPORT bool Equal(mitk::ExampleDataStructure *leftHandSide, mitk::ExampleDataStructure *rightHandSide, mitk::ScalarType eps, bool verbose)
Returns true if the example data structures are considered equal.