OpenMesh
|
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