Medical Imaging Interaction Toolkit  2018.4.99-389bf124
Medical Imaging Interaction Toolkit
mitkPointSetLocaleTest.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 
17 // std includes
18 #include <list>
19 #include <string>
20 
21 // MITK includes
22 #include "mitkIOUtil.h"
23 #include "mitkPointSet.h"
25 
26 // VTK includes
27 #include <vtkDebugLeaks.h>
28 
29 // stream includes
30 #include <fstream>
31 #include <iostream>
32 
33 class mitkPointSetLocaleTestSuite : public mitk::TestFixture
34 {
35  CPPUNIT_TEST_SUITE(mitkPointSetLocaleTestSuite);
36 
37  MITK_TEST(TestIfGermanLocaleUsed_Success);
38 
39  CPPUNIT_TEST_SUITE_END();
40 
41 private:
42  typedef std::list<std::string> StringList;
43  StringList m_AllLocales;
44 
45  mitk::PointSet::Pointer m_RefPointSet;
46  mitk::Point3D m_RefPoint;
47 
48  mitk::Point3D m_Point;
49 
50  mitk::PointSet::Pointer m_PointSet;
51 
52  bool ChangeLocale(const std::string &locale)
53  {
54  try
55  {
56  MITK_TEST_OUTPUT(<< "\n** Changing locale from " << setlocale(LC_ALL, nullptr) << " to '" << locale << "'");
57  setlocale(LC_ALL, locale.c_str());
58 
59  std::locale l(locale.c_str());
60  std::cin.imbue(l);
61  std::cout.imbue(l);
62  return true;
63  }
64  catch (...)
65  {
66  MITK_TEST_OUTPUT(<< "Could not activate locale " << locale << "\n");
67  return false;
68  }
69  }
70 
71  void ReaderLocaleTest(mitk::Point3D &refPoint, std::string filename)
72  {
73  MITK_TEST_OUTPUT(<< "---- Reader Test ---- ");
74 
75  m_PointSet = mitk::IOUtil::Load<mitk::PointSet>(filename);
76 
77  if (m_PointSet->GetPointIfExists(0, &m_Point))
78  {
79  CPPUNIT_ASSERT_MESSAGE("read x correct", fabs(refPoint[0] - m_Point[0]) < 0.00001);
80  CPPUNIT_ASSERT_MESSAGE("read y correct", fabs(refPoint[1] - m_Point[1]) < 0.00001);
81  CPPUNIT_ASSERT_MESSAGE("read z correct", fabs(refPoint[2] - m_Point[2]) < 0.00001);
82  }
83  else
84  {
85  MITK_TEST_FAILED_MSG(<< "File " << filename << " can not be read - test will not applied.");
86  return;
87  }
88  }
89 
90  void WriterLocaleTest(mitk::Point3D &refPoint, std::string filename)
91  {
92  MITK_TEST_OUTPUT(<< "---- Writer Test---- ");
93  // create pointset
94  m_RefPointSet = mitk::PointSet::New();
95  m_RefPointSet->InsertPoint(0, refPoint);
96 
97  std::string tmpFilePath = mitk::IOUtil::CreateTemporaryFile("testPointSet_XXXXXX.mps");
98 
99  // write point set
100  mitk::IOUtil::Save(m_RefPointSet, tmpFilePath);
101 
102  std::ifstream stream(tmpFilePath.c_str());
103 
104  // compare two .mps files
105  std::ifstream refStream(filename.c_str());
106 
107  CPPUNIT_ASSERT_MESSAGE("Read reference point set", refStream);
108  CPPUNIT_ASSERT_MESSAGE("Read point set", stream);
109 
110  bool differ = false;
111  if (stream.is_open() && refStream.is_open())
112  {
113  std::string streamLine;
114  std::string refStreamLine;
115  while (!stream.eof() && !refStream.eof())
116  {
117  getline(stream, streamLine);
118  getline(refStream, refStreamLine);
119  if (streamLine.compare(refStreamLine) != 0)
120  {
121  differ = true;
122  break;
123  }
124  }
125  stream.close();
126  refStream.close();
127  }
128  CPPUNIT_ASSERT_MESSAGE("Write point set correct", !differ);
129  }
130 
131 public:
132  void setUp() override
133  {
134  m_RefPointSet = mitk::PointSet::New();
135 
136  // create locale list
137  m_AllLocales.push_back("de_DE");
138  m_AllLocales.push_back("de_DE.utf8");
139  m_AllLocales.push_back("de_DE.UTF-8");
140  m_AllLocales.push_back("de_DE@euro");
141  m_AllLocales.push_back("German_Germany");
142 
143  m_RefPoint[0] = 32.2946;
144  m_RefPoint[1] = -17.7359;
145  m_RefPoint[2] = 29.6502;
146  }
147 
148  void tearDown() override
149  {
150  m_RefPoint[0] = 0;
151  m_RefPoint[1] = 0;
152  m_RefPoint[2] = 0;
153 
154  m_AllLocales.clear();
155  }
156 
157  void TestIfGermanLocaleUsed_Success()
158  {
159  // create reference point set
160  m_RefPointSet->SetPoint(0, m_RefPoint);
161 
162  // QuickFix for MAC OS X
163  // See for more the Bug #3894 comments
164 #if defined(__APPLE__) || defined(MACOSX)
165  m_AllLocales.push_back("C");
166 #endif
167 
168  // write a reference file using the "C" locale once
169  ChangeLocale("C");
170  std::string referenceFilePath = mitk::IOUtil::CreateTemporaryFile("refPointSet_XXXXXX.mps");
171  MITK_INFO << "Reference PointSet in " << referenceFilePath;
172 
173  // write point set
174  mitk::IOUtil::Save(m_RefPointSet, referenceFilePath);
175 
176  unsigned int numberOfTestedGermanLocales(0);
177  for (auto iter = m_AllLocales.begin(); iter != m_AllLocales.end(); ++iter)
178  {
179  if (ChangeLocale(*iter))
180  {
181  ++numberOfTestedGermanLocales;
182  WriterLocaleTest(m_RefPoint, referenceFilePath);
183  ReaderLocaleTest(m_RefPoint, referenceFilePath);
184  }
185  }
186 
187  if (numberOfTestedGermanLocales == 0)
188  {
189  MITK_TEST_OUTPUT(<< "Warning: No German locale was found on the system.");
190  }
191  }
192 };
193 
194 MITK_TEST_SUITE_REGISTRATION(mitkPointSetLocale)
MITK_TEST_SUITE_REGISTRATION(mitkImageToItk)
#define MITK_INFO
Definition: mitkLogMacros.h:18
static Pointer New()
#define MITK_TEST(TESTMETHOD)
Adds a test to the current test suite.
#define MITK_TEST_OUTPUT(x)
Output some text.
#define MITK_TEST_FAILED_MSG(MSG)
Fail and finish test with message MSG.
Test fixture for parameterized tests.
std::vector< std::string > StringList
static void Save(const mitk::BaseData *data, const std::string &path, bool setPathProperty=false)
Save a mitk::BaseData instance.
Definition: mitkIOUtil.cpp:774
static std::string CreateTemporaryFile(std::ofstream &tmpStream, const std::string &templateName="XXXXXX", std::string path=std::string())
Definition: mitkIOUtil.cpp:413