OpenMesh
Unittests/unittests_trimesh_iterators.hh
00001 #ifndef INCLUDE_UNITTESTS_TRIMESH_ITERATORS_HH
00002 #define INCLUDE_UNITTESTS_TRIMESH_ITERATORS_HH
00003 
00004 #include <gtest/gtest.h>
00005 #include <Unittests/unittests_common.hh>
00006 
00007 #include <iostream>
00008 
00009 class OpenMeshIterators : public OpenMeshBase {
00010 
00011     protected:
00012 
00013         // This function is called before each test is run
00014         virtual void SetUp() {
00015         }
00016 
00017         // This function is called after all tests are through
00018         virtual void TearDown() {
00019 
00020             // Do some final stuff with the member data here...
00021         }
00022 
00023     // Member already defined in OpenMeshBase
00024     //Mesh mesh_;  
00025 };
00026 
00027 /*
00028  * ====================================================================
00029  * Define tests below
00030  * ====================================================================
00031  */
00032 
00033 /*
00034  * Small VertexIterator Test
00035  */
00036 TEST_F(OpenMeshIterators, VertexIter) {
00037 
00038   mesh_.clear();
00039 
00040   // Add some vertices
00041   Mesh::VertexHandle vhandle[4];
00042 
00043   vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 0, 0));
00044   vhandle[1] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
00045   vhandle[2] = mesh_.add_vertex(Mesh::Point(1, 1, 0));
00046   vhandle[3] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
00047 
00048   // Add two faces
00049   std::vector<Mesh::VertexHandle> face_vhandles;
00050 
00051   face_vhandles.push_back(vhandle[2]);
00052   face_vhandles.push_back(vhandle[1]);
00053   face_vhandles.push_back(vhandle[0]);
00054   mesh_.add_face(face_vhandles);
00055 
00056   face_vhandles.clear();
00057 
00058   face_vhandles.push_back(vhandle[2]);
00059   face_vhandles.push_back(vhandle[0]);
00060   face_vhandles.push_back(vhandle[3]);
00061   mesh_.add_face(face_vhandles);
00062 
00063   // Test setup:
00064   //  1 === 2
00065   //  |   / |    
00066   //  |  /  |
00067   //  | /   |
00068   //  0 === 3
00069 
00070   Mesh::VertexIter v_it=mesh_.vertices_begin(); 
00071   Mesh::VertexIter  v_end=mesh_.vertices_end(); 
00072 
00073 
00074   EXPECT_EQ(0, v_it.handle().idx()) << "Index wrong for vertex iterator vertices_begin()";
00075   ++v_it;
00076   EXPECT_EQ(1, v_it.handle().idx()) << "Index wrong in vertex iterator";
00077   ++v_it;
00078   EXPECT_EQ(2, v_it.handle().idx()) << "Index wrong in vertex iterator";
00079   ++v_it;
00080   EXPECT_EQ(3, v_it.handle().idx()) << "Index wrong in vertex iterator";
00081   ++v_it;
00082   EXPECT_EQ(4, v_it.handle().idx()) << "Index wrong in vertex iterator";
00083 
00084   // Check end iterator
00085   EXPECT_EQ(4, v_end.handle().idx()) << "Index wrong in vertex iterator for vertices_end()";    
00086 
00087 }
00088 
00089 /*
00090  * Small EdgeIterator Test
00091  */
00092 TEST_F(OpenMeshIterators, EdgeIter) {
00093 
00094   mesh_.clear();
00095 
00096   // Add some vertices
00097   Mesh::VertexHandle vhandle[4];
00098 
00099   vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 0, 0));
00100   vhandle[1] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
00101   vhandle[2] = mesh_.add_vertex(Mesh::Point(1, 1, 0));
00102   vhandle[3] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
00103 
00104   // Add two faces
00105   std::vector<Mesh::VertexHandle> face_vhandles;
00106 
00107   face_vhandles.push_back(vhandle[2]);
00108   face_vhandles.push_back(vhandle[1]);
00109   face_vhandles.push_back(vhandle[0]);
00110   mesh_.add_face(face_vhandles);
00111 
00112   face_vhandles.clear();
00113 
00114   face_vhandles.push_back(vhandle[2]);
00115   face_vhandles.push_back(vhandle[0]);
00116   face_vhandles.push_back(vhandle[3]);
00117   mesh_.add_face(face_vhandles);
00118 
00119   // Test setup:
00120   //  1 === 2
00121   //  |   / |    
00122   //  |  /  |
00123   //  | /   |
00124   //  0 === 3
00125 
00126 
00127   Mesh::EdgeIter e_it  = mesh_.edges_begin(); 
00128   Mesh::EdgeIter e_end = mesh_.edges_end(); 
00129   
00130   EXPECT_EQ(0, e_it.handle().idx()) << "Wrong start index in edge iterator";
00131   EXPECT_EQ(5, e_end.handle().idx()) << "Wrong end index in edge iterator";
00132 
00133   EXPECT_EQ(1, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() )   << "1: Wrong to vertex handle of halfedge 0";
00134   EXPECT_EQ(2, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() ) << "1: Wrong from vertex handle of halfedge 0";
00135   EXPECT_EQ(2, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() )   << "1: Wrong to vertex handle of halfedge 1";
00136   EXPECT_EQ(1, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() ) << "1: Wrong from vertex handle of halfedge 1";
00137 
00138   ++e_it;
00139   EXPECT_EQ(1, e_it.handle().idx()) << "Wrong index in edge iterator";
00140 
00141   EXPECT_EQ(0, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() )   << "2: Wrong to vertex handle of halfedge 0";
00142   EXPECT_EQ(1, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() ) << "2: Wrong from vertex handle of halfedge 0";
00143   EXPECT_EQ(1, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() )   << "2: Wrong to vertex handle of halfedge 1";
00144   EXPECT_EQ(0, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() ) << "2: Wrong from vertex handle of halfedge 1";
00145 
00146 
00147   ++e_it;
00148   EXPECT_EQ(2, e_it.handle().idx()) << "Wrong index in edge iterator";
00149 
00150   EXPECT_EQ(2, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() )   << "3: Wrong to vertex handle of halfedge 0";
00151   EXPECT_EQ(0, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() ) << "3: Wrong from vertex handle of halfedge 0";
00152   EXPECT_EQ(0, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() )   << "3: Wrong to vertex handle of halfedge 1";
00153   EXPECT_EQ(2, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() ) << "3: Wrong from vertex handle of halfedge 1";
00154 
00155 
00156   ++e_it;
00157   EXPECT_EQ(3, e_it.handle().idx()) << "Wrong index in edge iterator";
00158 
00159   EXPECT_EQ(3, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() )   << "4: Wrong to vertex handle of halfedge 0";
00160   EXPECT_EQ(0, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() ) << "4: Wrong from vertex handle of halfedge 0";
00161   EXPECT_EQ(0, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() )   << "4: Wrong to vertex handle of halfedge 1";
00162   EXPECT_EQ(3, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() ) << "4: Wrong from vertex handle of halfedge 1";
00163 
00164 
00165   ++e_it;
00166   EXPECT_EQ(4, e_it.handle().idx()) << "Wrong index in edge iterator";
00167 
00168   EXPECT_EQ(2, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() )   << "5: Wrong to vertex handle of halfedge 0";
00169   EXPECT_EQ(3, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,0)).idx() ) << "5: Wrong from vertex handle of halfedge 0";
00170   EXPECT_EQ(3, mesh_.to_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() )   << "5: Wrong to vertex handle of halfedge 1";
00171   EXPECT_EQ(2, mesh_.from_vertex_handle(mesh_.halfedge_handle(e_it,1)).idx() ) << "5: Wrong from vertex handle of halfedge 1";
00172 
00173 
00174 }
00175 
00176 /*
00177  * Test with a mesh with one deleted face
00178  */
00179 TEST_F(OpenMeshIterators, FaceIterEmptyMeshOneDeletedFace) {
00180 
00181   mesh_.clear();
00182 
00183   // request delete_face capability
00184   mesh_.request_vertex_status();
00185   mesh_.request_edge_status();
00186   mesh_.request_face_status();
00187 
00188   // Add some vertices
00189   Mesh::VertexHandle vhandle[4];
00190 
00191   vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 0, 0));
00192   vhandle[1] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
00193   vhandle[2] = mesh_.add_vertex(Mesh::Point(1, 1, 0));
00194 
00195   // Add two faces
00196   std::vector<Mesh::VertexHandle> face_vhandles;
00197 
00198   face_vhandles.push_back(vhandle[2]);
00199   face_vhandles.push_back(vhandle[1]);
00200   face_vhandles.push_back(vhandle[0]);
00201   Mesh::FaceHandle fh = mesh_.add_face(face_vhandles);
00202 
00203   // Delete face but keep vertices
00204   bool const is_delete_isolated_vertex = false;
00205   mesh_.delete_face(fh, is_delete_isolated_vertex);
00206 
00207   // Test setup (Face deleted but vertices kept.
00208   //  1 === 2
00209   //  |   /
00210   //  |  /
00211   //  | /
00212   //  0
00213 
00214   Mesh::FaceIter f_it  = mesh_.faces_begin();
00215   Mesh::FaceIter f_end = mesh_.faces_end();
00216 
00217   EXPECT_EQ(0, f_it.handle().idx()) << "Wrong start index in FaceIterator";
00218 
00219   EXPECT_EQ(1, f_end.handle().idx()) << "Wrong end index in FaceIterator";
00220 
00221   ++f_it;
00222   EXPECT_EQ(1, f_it.handle().idx()) << "Wrong end index in FaceIterator after one step";
00223   EXPECT_TRUE(f_it == f_end ) << "Iterator not at end for FaceIterator after one step";
00224 
00225   Mesh::ConstFaceIter cf_it  = mesh_.faces_begin();
00226   Mesh::ConstFaceIter cf_end = mesh_.faces_end();
00227 
00228   EXPECT_EQ(0, cf_it.handle().idx()) << "Wrong start index in ConstFaceIterator";
00229 
00230   EXPECT_EQ(1, cf_end.handle().idx()) << "Wrong end index in ConstFaceIterator";
00231 
00232   ++cf_it;
00233   EXPECT_EQ(1, cf_it.handle().idx()) << "Wrong end index in ConstFaceIterator after one step";
00234   EXPECT_TRUE(cf_it == cf_end ) << "Iterator not at end for ConstFaceIterator after one step";
00235 
00236 
00237   // Same with skipping iterators:
00238   f_it  = mesh_.faces_sbegin();
00239   f_end = mesh_.faces_end();
00240 
00241   EXPECT_EQ(1, f_it.handle().idx()) << "Wrong start index in FaceIterator with skipping";
00242 
00243   EXPECT_EQ(1, f_end.handle().idx()) << "Wrong end index in FaceIterator with skipping";
00244 
00245   EXPECT_TRUE(f_it == f_end ) << "Iterator not at end for FaceIterator with skipping";
00246 
00247   // Same with skipping iterators:
00248   cf_it  = mesh_.faces_sbegin();
00249   cf_end = mesh_.faces_end();
00250 
00251   EXPECT_EQ(1, cf_it.handle().idx()) << "Wrong start index in ConstFaceIterator with skipping";
00252 
00253   EXPECT_EQ(1, cf_end.handle().idx()) << "Wrong end index in ConstFaceIterator with skipping";
00254 
00255   EXPECT_TRUE(cf_it == cf_end ) << "Iterator not at end for ConstFaceIterator with skipping";
00256 
00257 
00258   mesh_.release_vertex_status();
00259   mesh_.release_edge_status();
00260   mesh_.release_face_status();
00261 
00262 }
00263 
00264 #endif // INCLUDE GUARD
 All Classes Namespaces Files Functions Variables Typedefs Enumerations Enumerator Defines