1
2 #include <gtest/gtest.h>
3 #include <Unittests/unittests_common.hh>
4 //#include <OpenMesh/Tools/Smoother/JacobiLaplaceSmootherT.hh>
5
6 namespace {
7
8 class OpenMesh_Poly : public OpenMeshBasePoly {
9
10 protected:
11
12 // This function is called before each test is run
SetUp()13 virtual void SetUp() {
14
15 // Do some initial stuff with the member data here...
16 }
17
18 // This function is called after all tests are through
TearDown()19 virtual void TearDown() {
20
21 // Do some final stuff with the member data here...
22 }
23
24 // Member already defined in OpenMeshBase
25 //Mesh mesh_;
26 };
27
28 class OpenMesh_Triangle : public OpenMeshBase {
29
30 protected:
31
32 // This function is called before each test is run
SetUp()33 virtual void SetUp() {
34
35 // Do some initial stuff with the member data here...
36 }
37
38 // This function is called after all tests are through
TearDown()39 virtual void TearDown() {
40
41 // Do some final stuff with the member data here...
42 }
43
44 // Member already defined in OpenMeshBase
45 //Mesh mesh_;
46 };
47
48
49
50 /*
51 * ====================================================================
52 * Define tests below
53 * ====================================================================
54 */
55
56 #if (defined(_MSC_VER) && (_MSC_VER >= 1800)) || __cplusplus > 199711L || defined(__GXX_EXPERIMENTAL_CXX0X__)
57
58 /*
59 */
TEST_F(OpenMesh_Triangle,cpp11_initializer_test)60 TEST_F(OpenMesh_Triangle, cpp11_initializer_test) {
61
62 OpenMesh::Vec3d vec1 = { 1, 0, 0};
63 OpenMesh::Vec3d vec2 = {0, 0.777971, 0.996969};
64
65
66 EXPECT_EQ( dot(vec1,vec2) ,0.0 );
67
68 }
69
70
71 // ////////////////////////////////////////////////////////////////////
72 // C++11 Range tests
73 // ////////////////////////////////////////////////////////////////////
74
75
76 /**
77 * @brief TEST_F test the vertexrange behaviour on trimeshes
78 */
TEST_F(OpenMesh_Triangle,cpp11_vertexrange_test)79 TEST_F(OpenMesh_Triangle, cpp11_vertexrange_test) {
80 //check empty vertexrange
81 mesh_.clear();
82 for(Mesh::VertexHandle t : mesh_.vertices())
83 {
84 FAIL() << "The Vertexrange for an empty Mesh is not empty";
85 EXPECT_TRUE(t.is_valid()); // Just so we don't get an unused variable warning.
86 }
87
88 //add vertices to mesh
89 mesh_.add_vertex(Mesh::Point(0, 1, 0));
90 mesh_.add_vertex(Mesh::Point(1, 0, 0));
91 mesh_.add_vertex(Mesh::Point(2, 1, 0));
92 mesh_.add_vertex(Mesh::Point(0,-1, 0));
93 mesh_.add_vertex(Mesh::Point(2,-1, 0));
94
95 //check nonempty mesh vertexrange
96 int iteration_counter = 0;
97 for(Mesh::VertexHandle t : mesh_.vertices())
98 {
99 EXPECT_TRUE(t.is_valid());
100 ++iteration_counter;
101 }
102 EXPECT_EQ(iteration_counter,5);
103 }
104
105 /**
106 * @brief TEST_F test the vertexrange behaviour on polymeshes
107 */
TEST_F(OpenMesh_Poly,cpp11_vertexrange_test)108 TEST_F(OpenMesh_Poly, cpp11_vertexrange_test) {
109 //check empty vertexrange
110 mesh_.clear();
111 for(PolyMesh::VertexHandle t : mesh_.vertices())
112 {
113 FAIL() << "The Vertexrange for an empty Mesh is not empty";
114 EXPECT_TRUE(t.is_valid()); // Just so we don't get an unused variable warning.
115 }
116
117 //add vertices to mesh
118 mesh_.add_vertex(PolyMesh::Point(0, 1, 0));
119 mesh_.add_vertex(PolyMesh::Point(1, 0, 0));
120 mesh_.add_vertex(PolyMesh::Point(2, 1, 0));
121 mesh_.add_vertex(PolyMesh::Point(0,-1, 0));
122 mesh_.add_vertex(PolyMesh::Point(2,-1, 0));
123
124 //check nonempty mesh vertexrange
125 int iteration_counter = 0;
126 for(PolyMesh::VertexHandle t : mesh_.vertices())
127 {
128 EXPECT_TRUE(t.is_valid());
129 ++iteration_counter;
130 }
131 EXPECT_EQ(iteration_counter,5);
132 }
133
134 /**
135 * @brief TEST_F test vvrange behaviour on trimeshes
136 */
TEST_F(OpenMesh_Triangle,cpp11_vvrange_test)137 TEST_F(OpenMesh_Triangle, cpp11_vvrange_test) {
138 //check empty vv_range
139 mesh_.clear();
140 Mesh::VertexHandle vhandle[5];
141 vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
142 for(Mesh::VertexHandle t : mesh_.vv_range(vhandle[0]))
143 {
144 FAIL() << "The vvrange for a single vertex in a TriMesh is not empty";
145 EXPECT_TRUE(t.is_valid()); // Just so we don't get an unused variable warning.
146 }
147
148 //add more vertices
149 vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
150 vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 0));
151 vhandle[3] = mesh_.add_vertex(Mesh::Point(0,-1, 0));
152 vhandle[4] = mesh_.add_vertex(Mesh::Point(2,-1, 0));
153
154 // Add 4 faces
155 std::vector<Mesh::VertexHandle> face_vhandles;
156
157 face_vhandles.push_back(vhandle[0]);
158 face_vhandles.push_back(vhandle[1]);
159 face_vhandles.push_back(vhandle[2]);
160 mesh_.add_face(face_vhandles);
161
162 face_vhandles.clear();
163
164 face_vhandles.push_back(vhandle[1]);
165 face_vhandles.push_back(vhandle[3]);
166 face_vhandles.push_back(vhandle[4]);
167 mesh_.add_face(face_vhandles);
168
169 face_vhandles.clear();
170
171 face_vhandles.push_back(vhandle[0]);
172 face_vhandles.push_back(vhandle[3]);
173 face_vhandles.push_back(vhandle[1]);
174 mesh_.add_face(face_vhandles);
175
176 face_vhandles.clear();
177
178 face_vhandles.push_back(vhandle[2]);
179 face_vhandles.push_back(vhandle[1]);
180 face_vhandles.push_back(vhandle[4]);
181 mesh_.add_face(face_vhandles);
182
183 //check nonempty vvrange
184 int iteration_counter = 0;
185 for(Mesh::VertexHandle t : mesh_.vv_range(vhandle[1]))
186 {
187 EXPECT_TRUE(t.is_valid());
188 ++iteration_counter;
189 }
190 EXPECT_EQ(iteration_counter,4);
191 }
192
193 /**
194 * @brief TEST_F test the vvrange behaviour on polymeshes
195 */
TEST_F(OpenMesh_Poly,cpp11_vvrange_test)196 TEST_F(OpenMesh_Poly, cpp11_vvrange_test) {
197 //check empty vv_range
198 mesh_.clear();
199 Mesh::VertexHandle vhandle[5];
200 vhandle[0] = mesh_.add_vertex(PolyMesh::Point(0, 1, 0));
201 for(PolyMesh::VertexHandle t : mesh_.vv_range(vhandle[0]))
202 {
203 FAIL() << "The vvrange for a single vertex in a PolyMesh is not empty";
204 EXPECT_TRUE(t.is_valid()); // Just so we don't get an unused variable warning.
205 }
206
207 //add more vertices
208 vhandle[1] = mesh_.add_vertex(PolyMesh::Point(1, 0, 0));
209 vhandle[2] = mesh_.add_vertex(PolyMesh::Point(2, 1, 0));
210 vhandle[3] = mesh_.add_vertex(PolyMesh::Point(0,-1, 0));
211 vhandle[4] = mesh_.add_vertex(PolyMesh::Point(2,-1, 0));
212
213 // Add 4 faces
214 std::vector<PolyMesh::VertexHandle> face_vhandles;
215
216 face_vhandles.push_back(vhandle[0]);
217 face_vhandles.push_back(vhandle[1]);
218 face_vhandles.push_back(vhandle[2]);
219 mesh_.add_face(face_vhandles);
220
221 face_vhandles.clear();
222
223 face_vhandles.push_back(vhandle[1]);
224 face_vhandles.push_back(vhandle[3]);
225 face_vhandles.push_back(vhandle[4]);
226 mesh_.add_face(face_vhandles);
227
228 face_vhandles.clear();
229
230 face_vhandles.push_back(vhandle[0]);
231 face_vhandles.push_back(vhandle[3]);
232 face_vhandles.push_back(vhandle[1]);
233 mesh_.add_face(face_vhandles);
234
235 face_vhandles.clear();
236
237 face_vhandles.push_back(vhandle[2]);
238 face_vhandles.push_back(vhandle[1]);
239 face_vhandles.push_back(vhandle[4]);
240 mesh_.add_face(face_vhandles);
241
242 //check nonempty vvrange
243 int iteration_counter = 0;
244 for(PolyMesh::VertexHandle t : mesh_.vv_range(vhandle[1]))
245 {
246 EXPECT_TRUE(t.is_valid());
247 ++iteration_counter;
248 }
249 EXPECT_EQ(iteration_counter,4);
250 }
251
252
253 /**
254 * @brief Test combined vertex iterator and vertex vertex iter.
255 */
TEST_F(OpenMesh_Triangle,cpp11_test_enumerate_combined_run)256 TEST_F(OpenMesh_Triangle, cpp11_test_enumerate_combined_run) {
257 //check empty vv_range
258 mesh_.clear();
259 Mesh::VertexHandle vhandle[5];
260 vhandle[0] = mesh_.add_vertex(Mesh::Point(0, 1, 0));
261 for(Mesh::VertexHandle t : mesh_.vv_range(vhandle[0]))
262 {
263 FAIL() << "The vvrange for a single vertex in a TriMesh is not empty";
264 EXPECT_TRUE(t.is_valid()); // Just so we don't get an unused variable warning.
265 }
266
267 //add more vertices
268 vhandle[1] = mesh_.add_vertex(Mesh::Point(1, 0, 0));
269 vhandle[2] = mesh_.add_vertex(Mesh::Point(2, 1, 3));
270 vhandle[3] = mesh_.add_vertex(Mesh::Point(0,-1, 4));
271 vhandle[4] = mesh_.add_vertex(Mesh::Point(2,3, 5));
272
273 // Add 4 faces
274 std::vector<Mesh::VertexHandle> face_vhandles;
275
276 face_vhandles.push_back(vhandle[0]);
277 face_vhandles.push_back(vhandle[1]);
278 face_vhandles.push_back(vhandle[2]);
279 mesh_.add_face(face_vhandles);
280
281 face_vhandles.clear();
282
283 face_vhandles.push_back(vhandle[1]);
284 face_vhandles.push_back(vhandle[3]);
285 face_vhandles.push_back(vhandle[4]);
286 mesh_.add_face(face_vhandles);
287
288 face_vhandles.clear();
289
290 face_vhandles.push_back(vhandle[0]);
291 face_vhandles.push_back(vhandle[3]);
292 face_vhandles.push_back(vhandle[1]);
293 mesh_.add_face(face_vhandles);
294
295 face_vhandles.clear();
296
297 face_vhandles.push_back(vhandle[2]);
298 face_vhandles.push_back(vhandle[1]);
299 face_vhandles.push_back(vhandle[4]);
300 mesh_.add_face(face_vhandles);
301
302 Mesh::Point p = Mesh::Point(0,0,0);
303 for ( auto vh : mesh_.vertices() ) {
304
305 for ( auto vv_it : mesh_.vv_range(vh) ) {
306 p += mesh_.point(vv_it);
307 }
308
309 }
310
311 EXPECT_EQ(p[0],16);
312 EXPECT_EQ(p[1],12);
313 EXPECT_EQ(p[2],36);
314
315 }
316
317
318 #endif
319
320 }
321