DGtal  0.6.devel
 All Data Structures Namespaces Files Functions Variables Typedefs Enumerations Enumerator Friends Groups Pages
testGridCurve.cpp
1 
32 
33 #include <iostream>
34 #include <fstream>
35 #include <sstream>
36 #include <exception>
37 #include <boost/program_options.hpp>
38 
39 #include "DGtal/base/Common.h"
40 
41 #include "DGtal/kernel/SpaceND.h"
42 #include "DGtal/kernel/domains/HyperRectDomain.h"
43 #include "DGtal/topology/KhalimskySpaceND.h"
44 #include "DGtal/geometry/curves/GridCurve.h"
45 
46 #include "DGtal/io/boards/Board2D.h"
47 
48 #include "DGtal/io/boards/CDrawableWithBoard2D.h"
49 
50 #include "ConfigTest.h"
51 
53 
54 using namespace std;
55 using namespace DGtal;
56 
58 // Functions for testing class FreemanChain.
60 
65 template <typename KSpace>
66 bool testIOGridCurve(const string& filename)
67 {
68 
69  unsigned int d = KSpace::Point::dimension;
70  GridCurve<KSpace> c; //grid curve
71 
73  trace.info() << endl;
74  trace.info() << "Reading GridCurve d=" << d << " ";
75 
76  ifstream instream; // input stream
77  instream.open (filename.c_str(), ifstream::in);
78 
79  c.initFromVectorStream(instream);
80 
81  trace.info() << "(" << c.size() << ") elts" << std::endl;
82  trace.info() << c << endl;
83 
85  std::stringstream s;
86  s << "gridcurve" << d << ".dat";
87 
88  trace.info() << "Writing GridCurve d=" << d << " in " << s.str() << endl;
89 
90  ofstream outstream(s.str().c_str()); //output stream
91  if (!outstream.is_open()) return false;
92  else {
93  c.writeVectorToStream(outstream);
94  }
95  outstream.close();
96 
97  return true;
98 }
99 
100 
105 bool testIsOpen(const string &filename, const bool& aFlag)
106 {
107 
108  trace.info() << endl;
109  trace.info() << "Open/Closed test" << endl;
110 
111  GridCurve<KhalimskySpaceND<2> > c; //grid curve
112 
113  ifstream instream; // input stream
114  instream.open (filename.c_str(), ifstream::in);
115  c.initFromVectorStream(instream);
116 
117  trace.info() << c.isOpen() << " == " << aFlag << endl;
118 
119  return (c.isOpen() == aFlag);
120 }
121 
126 bool testExceptions(const string &filename)
127 {
128 
129  GridCurve<KhalimskySpaceND<2> > c; //grid curve
130 
131  trace.info() << endl;
132  trace.info() << "Trying to read bad file: " << filename << endl;
133 
134  ifstream instream; // input stream
135  instream.open (filename.c_str(), ifstream::in);
136 
137  try {
138  c.initFromVectorStream(instream);
139  trace.info() << "no exception catched!?" << endl;
140  return false;
141  } catch (DGtal::ConnectivityException& e) {
142  trace.info() << e.what() << endl;
143  return true;
144  } catch (DGtal::InputException& e) {
145  trace.info() << e.what() << endl;
146  return true;
147  } catch (exception& e) {
148  trace.info() << e.what() << endl;
149  return true;
150  }
151 }
152 
157 bool testDrawGridCurve(const string &filename)
158 {
159 
160  GridCurve<KhalimskySpaceND<2> > c; //grid curve
161 
162  trace.info() << endl;
163  trace.info() << "Displaying GridCurve " << endl;
164 
165  //reading grid curve
166  fstream inputStream;
167  inputStream.open (filename.c_str(), ios::in);
168  c.initFromVectorStream(inputStream);
169  inputStream.close();
170 
171  //displaying it
172  Board2D aBoard;
173  aBoard.setUnit(Board2D::UCentimeter);
174  aBoard << c;
175  aBoard.saveEPS( "GridCurve.eps", Board2D::BoundingBox, 5000 );
176 #ifdef WITH_CAIRO
177  aBoard.saveCairo("GridCurve-cairo.pdf", Board2D::CairoPDF, Board2D::BoundingBox, 5000);
178 #endif
179 
180  return true;
181 }
182 
183 
188 template <typename Range>
189 bool testRange(const Range &aRange)
190 {
191 
192  trace.info() << endl;
193  trace.info() << "Testing Range" << endl;
194 
196  std::vector<Value> v1,v2,v3,v4;
197 
198 {
199  trace.info() << "Forward" << endl;
200  typename Range::ConstIterator i = aRange.begin();
201  typename Range::ConstIterator end = aRange.end();
202  for ( ; i != end; ++i) {
203  //cout << *i << endl;
204  v1.push_back(*i);
205  }
206 }
207 {
208  trace.info() << "Backward" << endl;
209  typename Range::ConstReverseIterator i = aRange.rbegin();
210  typename Range::ConstReverseIterator end = aRange.rend();
211  for ( ; i != end; ++i) {
212  //cout << *i << endl;
213  v2.push_back(*i);
214  }
215 }
216 {
217  trace.info() << "Circulator" << endl;
218  typename Range::ConstCirculator c = aRange.c();
219  typename Range::ConstCirculator cend = aRange.c();
220  if (isNotEmpty(c,cend))
221  {
222  do
223  {
224  //cout << *c << endl;
225  v3.push_back(*c);
226  c++;
227  } while (c!=cend);
228  }
229 }
230 
231 {
232  trace.info() << "Reverse Circulator" << endl;
233  typename Range::ConstReverseCirculator c = aRange.rc();
234  typename Range::ConstReverseCirculator cend = aRange.rc();
235  if (isNotEmpty(c,cend))
236  {
237  do
238  {
239  //cout << *c << endl;
240  v4.push_back(*c);
241  c++;
242  } while (c!=cend);
243  }
244 }
245 
246  return ( std::equal(v1.begin(),v1.end(),v3.begin())
247  && std::equal(v2.begin(),v2.end(),v4.begin())
248  && std::equal(v1.begin(),v1.end(),v2.rbegin())
249  && std::equal(v3.begin(),v3.end(),v4.rbegin()) );
250 }
251 
252 template <typename Range>
253 bool testPairsRange(const Range &aRange)
254 {
255 
256  trace.info() << endl;
257  trace.info() << "Testing Range" << endl;
258 
259 {
260  trace.info() << "Forward" << endl;
261  typename Range::ConstIterator i = aRange.begin();
262  typename Range::ConstIterator end = aRange.end();
263  for ( ; i != end; ++i) {
264  cout << (*i).first << " " << (*i).second << endl;
265  }
266 }
267 {
268  trace.info() << "Backward" << endl;
269  typename Range::ConstReverseIterator i = aRange.rbegin();
270  typename Range::ConstReverseIterator end = aRange.rend();
271  for ( ; i != end; ++i) {
272  cout << i->first << " " << i->second << endl;
273  }
274 }
275 
276  return true;
277 }
278 
279 template <typename Range>
280 bool testDisplayRange(const Range &aRange)
281 {
282 
283  trace.info() << endl;
284  trace.info() << "Displaying Range" << endl;
285  trace.info() << aRange << endl;
286 
287  return true;
288 }
289 
290 template <typename Range>
291 bool testDrawRange(const Range &aRange, const string &aName, const string& aDomainMode)
292 {
293 
294  std::stringstream s;
295  s << aName << "Range.eps";
296 
297  trace.info() << endl;
298  trace.info() << "Drawing " << s.str() << " " << endl;
299 
300  //board
301  Board2D aBoard;
302  aBoard.setUnit(Board2D::UCentimeter);
303  //displaying domain
304  PointVector<2,int> low(-1,-1);
305  PointVector<2,int> up(3,3);
306  if (aDomainMode == "Paving") up = PointVector<2,int>(4,4);
307  HyperRectDomain< SpaceND<2,int> > aDomain( low,up );
308  aBoard << SetMode(aDomain.className(), aDomainMode) << aDomain;
309  //displaying range
310  aBoard << aRange;
311  //save
312  aBoard.saveEPS( s.str().c_str(), Board2D::BoundingBox, 5000 );
313 
314  return true;
315 }
316 
317 template <typename Range>
318 void testRangeConceptChecking()
319 {
320  BOOST_CONCEPT_ASSERT(( CDrawableWithBoard2D<Range> ));
321  BOOST_CONCEPT_ASSERT(( CConstBidirectionalRange<Range> ));
322 }
323 
325 // Standard services - public :
326 
327 int main( int argc, char** argv )
328 {
329  trace.beginBlock ( "Testing class GridCurve" );
330  trace.info() << "Args:";
331  for ( int i = 0; i < argc; ++i )
332  trace.info() << " " << argv[ i ];
333  trace.info() << endl;
334 
335 
336  std::string sinus2D4 = testPath + "samples/sinus2D4.dat";
337  std::string polyg2D = testPath + "samples/polyg2D.dat";
338  std::string sinus3D = testPath + "samples/sinus3D.dat";
339  std::string emptyFile = testPath + "samples/emptyFile.dat";
340  std::string square = testPath + "samples/smallSquare.dat";
341 
342  typedef KhalimskySpaceND<2> K2;
343  typedef KhalimskySpaceND<3> K3;
344 
346  typedef GridCurve<K2> GridCurve;
347 
348 testRangeConceptChecking<GridCurve::SCellsRange>();
349 testRangeConceptChecking<GridCurve::PointsRange>();
350 testRangeConceptChecking<GridCurve::MidPointsRange>();
351 testRangeConceptChecking<GridCurve::ArrowsRange>();
352 testRangeConceptChecking<GridCurve::InnerPointsRange>();
353 testRangeConceptChecking<GridCurve::OuterPointsRange>();
354 testRangeConceptChecking<GridCurve::IncidentPointsRange>();
355 
357  bool res = testIOGridCurve<K2>(sinus2D4)
358  && testIOGridCurve<K3>(sinus3D)
359  && testExceptions(sinus3D)
360  && testExceptions(polyg2D)
361  && testExceptions(emptyFile)
362  && testDrawGridCurve(sinus2D4)
363  && testIsOpen(sinus2D4,true)
364  && testIsOpen(square,false);
365 
366 
367  //reading grid curve
368  GridCurve c;
369  fstream inputStream;
370  inputStream.open (square.c_str(), ios::in);
371  c.initFromVectorStream(inputStream);
372  inputStream.close();
373 
374  res = res
375  && testRange<GridCurve::SCellsRange>(c.getSCellsRange())
376  && testRange<GridCurve::PointsRange>(c.getPointsRange())
377  && testRange<GridCurve::MidPointsRange>(c.getMidPointsRange())
378  && testPairsRange<GridCurve::ArrowsRange>(c.getArrowsRange())
379  && testRange<GridCurve::InnerPointsRange>(c.getInnerPointsRange())
380  && testRange<GridCurve::OuterPointsRange>(c.getOuterPointsRange())
381  && testPairsRange<GridCurve::IncidentPointsRange>(c.getIncidentPointsRange())
382  && testRange<GridCurve::CodesRange>(c.getCodesRange())
383 ;
384 
385  res = res
386  && testDisplayRange<GridCurve::SCellsRange>(c.getSCellsRange())
387  && testDisplayRange<GridCurve::PointsRange>(c.getPointsRange())
388  && testDisplayRange<GridCurve::MidPointsRange>(c.getMidPointsRange())
389  && testDisplayRange<GridCurve::ArrowsRange>(c.getArrowsRange())
390  && testDisplayRange<GridCurve::InnerPointsRange>(c.getInnerPointsRange())
391  && testDisplayRange<GridCurve::OuterPointsRange>(c.getOuterPointsRange())
392  && testDisplayRange<GridCurve::IncidentPointsRange>(c.getIncidentPointsRange())
393  && testDisplayRange<GridCurve::CodesRange>(c.getCodesRange())
394 ;
395 
396  res = res
397  && testDrawRange<GridCurve::SCellsRange>(c.getSCellsRange(),"1cells","Grid")
398  && testDrawRange<GridCurve::PointsRange>(c.getPointsRange(),"Points","Paving")
399  && testDrawRange<GridCurve::MidPointsRange>(c.getMidPointsRange(),"MidPoints","Paving")
400  && testDrawRange<GridCurve::ArrowsRange>(c.getArrowsRange(),"Arrows","Paving")
401  && testDrawRange<GridCurve::InnerPointsRange>(c.getInnerPointsRange(),"InnerPoints","Grid")
402  && testDrawRange<GridCurve::OuterPointsRange>(c.getOuterPointsRange(),"OuterPoints","Grid")
403  && testDrawRange<GridCurve::IncidentPointsRange>(c.getIncidentPointsRange(),"IncidentPoints","Grid")
404 ;
405 
407 
408  trace.emphase() << ( res ? "Passed." : "Error." ) << endl;
409  trace.endBlock();
410 
411  return res ? 0 : 1;
412 }
413 // //