From cc19635cdd5e2ef894c76b90f85887e98d10a037 Mon Sep 17 00:00:00 2001 From: Isaak Lim Date: Wed, 27 Feb 2013 11:25:24 +0000 Subject: [PATCH] split unittests_loading into seperate files for different file types git-svn-id: http://www.openmesh.org/svnrepo/OpenMesh/trunk@813 fdac6126-5c0c-442c-9429-916003d36597 --- src/Unittests/unittests.cc | 6 +- src/Unittests/unittests_loading.hh | 732 ---------------------- src/Unittests/unittests_read_write_OBJ.hh | 268 ++++++++ src/Unittests/unittests_read_write_OFF.hh | 99 +++ src/Unittests/unittests_read_write_OM.hh | 145 +++++ src/Unittests/unittests_read_write_PLY.hh | 284 +++++++++ src/Unittests/unittests_read_write_STL.hh | 71 +++ 7 files changed, 872 insertions(+), 733 deletions(-) delete mode 100644 src/Unittests/unittests_loading.hh create mode 100644 src/Unittests/unittests_read_write_OBJ.hh create mode 100644 src/Unittests/unittests_read_write_OFF.hh create mode 100644 src/Unittests/unittests_read_write_OM.hh create mode 100644 src/Unittests/unittests_read_write_PLY.hh create mode 100644 src/Unittests/unittests_read_write_STL.hh diff --git a/src/Unittests/unittests.cc b/src/Unittests/unittests.cc index c0467a07..84872a76 100644 --- a/src/Unittests/unittests.cc +++ b/src/Unittests/unittests.cc @@ -2,7 +2,11 @@ #include "unittests_common.hh" #include "unittests_property.hh" -#include "unittests_loading.hh" +#include "unittests_read_write_OBJ.hh" +#include "unittests_read_write_OFF.hh" +#include "unittests_read_write_OM.hh" +#include "unittests_read_write_PLY.hh" +#include "unittests_read_write_STL.hh" #include "unittests_trimesh_iterators.hh" #include "unittests_trimesh_collapse.hh" #include "unittests_decimater.hh" diff --git a/src/Unittests/unittests_loading.hh b/src/Unittests/unittests_loading.hh deleted file mode 100644 index 671ef578..00000000 --- a/src/Unittests/unittests_loading.hh +++ /dev/null @@ -1,732 +0,0 @@ -#ifndef INCLUDE_UNITTESTS_LOADING_HH -#define INCLUDE_UNITTESTS_LOADING_HH - -#include -#include - - -class OpenMeshLoader : public OpenMeshBase { - - protected: - - // This function is called before each test is run - virtual void SetUp() { - - // Do some initial stuff with the member data here... - } - - // This function is called after all tests are through - virtual void TearDown() { - - // Do some final stuff with the member data here... - } - - // Member already defined in OpenMeshBase - //Mesh mesh_; -}; - -/* - * ==================================================================== - * Define tests below - * ==================================================================== - */ - -/* - * Just load a simple mesh file in obj format and count whether - * the right number of entities has been loaded. - */ -TEST_F(OpenMeshLoader, LoadSimpleOFFFile) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off"); - - EXPECT_TRUE(ok); - - EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(22572u, mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(15048u, mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - - -TEST_F(OpenMeshLoader, WriteAndReadVertexColorsToAndFromOFFFile) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - mesh_.add_vertex( Mesh::Point(0,0,1) ); - mesh_.add_vertex( Mesh::Point(0,1,0) ); - mesh_.add_vertex( Mesh::Point(0,1,1) ); - mesh_.add_vertex( Mesh::Point(1,0,1) ); - - // using the default color type Vec3uc from DefaultTraits in Traits.hh - Mesh::Color testColor(255, 128, 64); - - // setting colors (different from black) - for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) - mesh_.set_color(vit, testColor); - - // check if the colors are correctly setted - int count = 0; - for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) { - Mesh::Color color = mesh_.color(vit); - if ( color[0] != testColor[0] || color[1] != testColor[1] || color[2] != testColor[2] ) - ++ count; - } - - EXPECT_EQ(0, count) << "Vertices have the wrong color!"; - - // write the mesh_ - OpenMesh::IO::Options opt(OpenMesh::IO::Options::VertexColor); - OpenMesh::IO::write_mesh(mesh_, "temp.off", opt); - OpenMesh::IO::read_mesh(mesh_, "temp.off", opt); - - // check if vertices still have the same color - count = 0; - for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) { - Mesh::Color color = mesh_.color(vit); - if ( color[0] != testColor[0] || color[1] != testColor[1] || color[2] != testColor[2] ) - ++ count; - } - - EXPECT_EQ(0, count) << "Vertices should have the same color after writing and reading the OFF file!"; - - mesh_.release_vertex_colors(); -} - -/* - * Just load a simple mesh file in stla format and count whether - * the right number of entities has been loaded. - */ -TEST_F(OpenMeshLoader, LoadSimpleSTLFile) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.stl"); - - EXPECT_TRUE(ok); - - EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(22572u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(15048u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - - - -/* - * Just load a simple mesh file in stlb format and count whether - * the right number of entities has been loaded. - */ -TEST_F(OpenMeshLoader, LoadSimpleSTLBinaryFile) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1Binary.stl"); - - EXPECT_TRUE(ok); - - EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(22572u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(15048u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - - - -/* - * Just load a point file in ply format and count whether - * the right number of entities has been loaded. - */ -TEST_F(OpenMeshLoader, LoadSimplePointPLYFileWithBadEncoding) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "pointCloudBadEncoding.ply"); - - EXPECT_TRUE(ok) << "Unable to load pointCloudBadEncoding.ply"; - - EXPECT_EQ(10u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(0u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(0u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - -/* - * Just load a point file in ply format and count whether - * the right number of entities has been loaded. - */ -TEST_F(OpenMeshLoader, LoadSimplePointPLYFileWithGoodEncoding) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "pointCloudGoodEncoding.ply"); - - EXPECT_TRUE(ok) << "Unable to load pointCloudGoodEncoding.ply"; - - EXPECT_EQ(10u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(0u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(0u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - - -/* - * Just load a obj file of a cube - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJ) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal.obj"); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal.obj"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; -} - -/* - * Just load a obj file of a cube and checks the halfedge and vertex normals - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJCheckHalfEdgeAndVertexNormals) { - - mesh_.clear(); - - mesh_.request_halfedge_normals(); - mesh_.request_vertex_normals(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexNormal; - - std::string file_name = "cube-minimal.obj"; - - bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); - - EXPECT_TRUE(ok) << file_name; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; - - /////////////////////////////////////////////// - //check vertex normals - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[0] ) << "Wrong vertex normal at vertex 0 component 0"; - EXPECT_EQ(-1, mesh_.normal(mesh_.vertex_handle(0))[1] ) << "Wrong vertex normal at vertex 0 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[2] ) << "Wrong vertex normal at vertex 0 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[0] ) << "Wrong vertex normal at vertex 3 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[1] ) << "Wrong vertex normal at vertex 3 component 1"; - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(3))[2] ) << "Wrong vertex normal at vertex 3 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[0] ) << "Wrong vertex normal at vertex 4 component 0"; - EXPECT_EQ(-1, mesh_.normal(mesh_.vertex_handle(4))[1] ) << "Wrong vertex normal at vertex 4 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[2] ) << "Wrong vertex normal at vertex 4 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(7))[0] ) << "Wrong vertex normal at vertex 7 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(7))[1] ) << "Wrong vertex normal at vertex 7 component 1"; - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[2] ) << "Wrong vertex normal at vertex 7 component 2"; - - /////////////////////////////////////////////// - //check halfedge normals - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(0))[0] ) << "Wrong halfedge normal at halfedge 0 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(0))[1] ) << "Wrong halfedge normal at halfedge 0 component 1"; - EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(0))[2] ) << "Wrong halfedge normal at halfedge 0 component 2"; - - EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(10))[0] ) << "Wrong halfedge normal at halfedge 10 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(10))[1] ) << "Wrong halfedge normal at halfedge 10 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(10))[2] ) << "Wrong halfedge normal at halfedge 10 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(19))[0] ) << "Wrong halfedge normal at halfedge 19 component 0"; - EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(19))[1] ) << "Wrong halfedge normal at halfedge 19 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(19))[2] ) << "Wrong halfedge normal at halfedge 19 component 2"; - - EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(24))[0] ) << "Wrong halfedge normal at halfedge 24 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(24))[1] ) << "Wrong halfedge normal at halfedge 24 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(24))[2] ) << "Wrong halfedge normal at halfedge 24 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(30))[0] ) << "Wrong halfedge normal at halfedge 30 component 0"; - EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(30))[1] ) << "Wrong halfedge normal at halfedge 30 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(30))[2] ) << "Wrong halfedge normal at halfedge 30 component 2"; - - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(35))[0] ) << "Wrong halfedge normal at halfedge 35 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(35))[1] ) << "Wrong halfedge normal at halfedge 35 component 1"; - EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(35))[2] ) << "Wrong halfedge normal at halfedge 35 component 2"; - - mesh_.release_vertex_normals(); - mesh_.release_halfedge_normals(); - -} - -/* - * Just load a obj file and set vertex color option before loading - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJForceVertexColorsAlthoughNotAvailable) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - std::string file_name = "cube-minimal.obj"; - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); - - EXPECT_TRUE(ok) << file_name; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; - -} - - -/* - * Just load a obj file of a cube and checks the halfedge texCoords - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJCheckTexCoords) { - - mesh_.clear(); - - mesh_.request_halfedge_texcoords2D(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::FaceTexCoord; - - std::string file_name = "cube-minimal-texCoords.obj"; - - bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); - - EXPECT_TRUE(ok) << file_name; - - EXPECT_EQ(1, mesh_.texcoord2D(mesh_.halfedge_handle(0))[0] ) << "Wrong texCoord at halfedge 0 component 0"; - EXPECT_EQ(1, mesh_.texcoord2D(mesh_.halfedge_handle(0))[1] ) << "Wrong texCoord at halfedge 0 component 1"; - - EXPECT_EQ(3, mesh_.texcoord2D(mesh_.halfedge_handle(10))[0] ) << "Wrong texCoord at halfedge 1 component 0"; - EXPECT_EQ(3, mesh_.texcoord2D(mesh_.halfedge_handle(10))[1] ) << "Wrong texCoord at halfedge 1 component 1"; - - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.halfedge_handle(19))[0] ) << "Wrong texCoord at halfedge 4 component 0"; - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.halfedge_handle(19))[1] ) << "Wrong texCoord at halfedge 4 component 1"; - - EXPECT_EQ(7, mesh_.texcoord2D(mesh_.halfedge_handle(24))[0] ) << "Wrong texCoord at halfedge 7 component 0"; - EXPECT_EQ(7, mesh_.texcoord2D(mesh_.halfedge_handle(24))[1] ) << "Wrong texCoord at halfedge 7 component 1"; - - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.halfedge_handle(30))[0] ) << "Wrong texCoord at halfedge 9 component 0"; - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.halfedge_handle(30))[1] ) << "Wrong texCoord at halfedge 9 component 1"; - - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.halfedge_handle(35))[0] ) << "Wrong texCoord at halfedge 11 component 0"; - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.halfedge_handle(35))[1] ) << "Wrong texCoord at halfedge 11 component 1"; - - mesh_.release_halfedge_texcoords2D(); -} - - -/* - * Just load a obj file of a cube with vertex colors defined directly after the vertex definitions - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJWithVertexColorsAfterVertices) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertex-colors-after-vertex-definition.obj",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertex-colors-after-vertex-definition.obj"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; - - mesh_.release_vertex_colors(); -} - -/* - * Just load a obj file of a cube with vertex colors defined as separate lines - */ -TEST_F(OpenMeshLoader, LoadSimpleOBJWithVertexColorsAsVCLines) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertex-colors-as-vc-lines.obj",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertex-colors-as-vc-lines.obj"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; - - mesh_.release_vertex_colors(); - -} - -/* - * Just load a ply - */ -TEST_F(OpenMeshLoader, LoadSimplePLY) { - - mesh_.clear(); - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal.ply"); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal.ply"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - -} - -/* - * Just load a ply file and set vertex color option before loading - */ -TEST_F(OpenMeshLoader, LoadSimplePLYForceVertexColorsAlthoughNotAvailable) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - std::string file_name = "cube-minimal.ply"; - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); - - EXPECT_TRUE(ok) << file_name; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; -} - -/* - * Just load a ply file of a cube with vertex colors - */ -TEST_F(OpenMeshLoader, LoadSimplePLYWithVertexColors) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertexColors.ply",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertexColors.ply"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; - - mesh_.release_vertex_colors(); -} - -/* - * Just load a ply file of a cube with vertex colors - */ -TEST_F(OpenMeshLoader, LoadPLYFromMeshLabWithVertexColors) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "meshlab.ply",options); - - EXPECT_TRUE(ok) << "Unable to load meshlab.ply"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; - - mesh_.release_vertex_colors(); -} - -/* - * Just load a ply file of a cube with vertex texCoords - */ -TEST_F(OpenMeshLoader, LoadSimplePLYWithTexCoords) { - - mesh_.clear(); - - mesh_.request_vertex_texcoords2D(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexTexCoord; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-texCoords.ply",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-texCoords.ply"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[0] ) << "Wrong vertex color at vertex 2 component 0"; - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[1] ) << "Wrong vertex color at vertex 2 component 1"; - - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_TRUE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; - - mesh_.release_vertex_texcoords2D(); -} - -/* - * Just load a ply with normals, ascii mode - */ -TEST_F(OpenMeshLoader, LoadSimplePLYWithNormals) { - - mesh_.clear(); - - mesh_.request_vertex_normals(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexNormal; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-normals.ply", options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-normals.ply"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_TRUE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; - - - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[0] ) << "Wrong normal at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[1] ) << "Wrong normal at vertex 0 component 1"; - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(0))[2] ) << "Wrong normal at vertex 0 component 2"; - - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(3))[0] ) << "Wrong normal at vertex 3 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[1] ) << "Wrong normal at vertex 3 component 1"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[2] ) << "Wrong normal at vertex 3 component 2"; - - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(4))[0] ) << "Wrong normal at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[1] ) << "Wrong normal at vertex 4 component 1"; - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(4))[2] ) << "Wrong normal at vertex 4 component 2"; - - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[0] ) << "Wrong normal at vertex 7 component 0"; - EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[1] ) << "Wrong normal at vertex 7 component 1"; - EXPECT_EQ(2, mesh_.normal(mesh_.vertex_handle(7))[2] ) << "Wrong normal at vertex 7 component 2"; - - mesh_.release_vertex_normals(); - -} - -/* - * Just load an om file and set vertex color option before loading - */ -TEST_F(OpenMeshLoader, LoadSimpleOMForceVertexColorsAlthoughNotAvailable) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - std::string file_name = "cube-minimal.om"; - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); - - EXPECT_TRUE(ok) << file_name; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; -} - -/* - * Just load an om file of a cube with vertex texCoords - */ -TEST_F(OpenMeshLoader, LoadSimpleOMWithTexCoords) { - - mesh_.clear(); - - mesh_.request_vertex_texcoords2D(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexTexCoord; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-texCoords.om",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-texCoords.om"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[0] ) << "Wrong vertex color at vertex 2 component 0"; - EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[1] ) << "Wrong vertex color at vertex 2 component 1"; - - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_TRUE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; - - mesh_.release_vertex_texcoords2D(); -} - -/* - * Just load an om file of a cube with vertex colors - */ -TEST_F(OpenMeshLoader, LoadSimpleOMWithVertexColors) { - - mesh_.clear(); - - mesh_.request_vertex_colors(); - - OpenMesh::IO::Options options; - options += OpenMesh::IO::Options::VertexColor; - - bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertexColors.om",options); - - EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertexColors.om"; - - EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; - EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; - EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; - - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; - - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; - EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; - EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; - - EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; - EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; - EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; - - mesh_.release_vertex_colors(); -} - -#endif // INCLUDE GUARD diff --git a/src/Unittests/unittests_read_write_OBJ.hh b/src/Unittests/unittests_read_write_OBJ.hh new file mode 100644 index 00000000..ae550bef --- /dev/null +++ b/src/Unittests/unittests_read_write_OBJ.hh @@ -0,0 +1,268 @@ +#ifndef INCLUDE_UNITTESTS_READ_WRITE_OBJ_HH +#define INCLUDE_UNITTESTS_READ_WRITE_OBJ_HH + +#include +#include + + +class OpenMeshReadWriteOBJ : public OpenMeshBase { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + +/* + * Just load a obj file of a cube + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJ) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal.obj"); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal.obj"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + +/* + * Just load a obj file of a cube and checks the halfedge and vertex normals + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJCheckHalfEdgeAndVertexNormals) { + + mesh_.clear(); + + mesh_.request_halfedge_normals(); + mesh_.request_vertex_normals(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexNormal; + + std::string file_name = "cube-minimal.obj"; + + bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); + + EXPECT_TRUE(ok) << file_name; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; + + /////////////////////////////////////////////// + //check vertex normals + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[0] ) << "Wrong vertex normal at vertex 0 component 0"; + EXPECT_EQ(-1, mesh_.normal(mesh_.vertex_handle(0))[1] ) << "Wrong vertex normal at vertex 0 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[2] ) << "Wrong vertex normal at vertex 0 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[0] ) << "Wrong vertex normal at vertex 3 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[1] ) << "Wrong vertex normal at vertex 3 component 1"; + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(3))[2] ) << "Wrong vertex normal at vertex 3 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[0] ) << "Wrong vertex normal at vertex 4 component 0"; + EXPECT_EQ(-1, mesh_.normal(mesh_.vertex_handle(4))[1] ) << "Wrong vertex normal at vertex 4 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[2] ) << "Wrong vertex normal at vertex 4 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(7))[0] ) << "Wrong vertex normal at vertex 7 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(7))[1] ) << "Wrong vertex normal at vertex 7 component 1"; + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[2] ) << "Wrong vertex normal at vertex 7 component 2"; + + /////////////////////////////////////////////// + //check halfedge normals + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(0))[0] ) << "Wrong halfedge normal at halfedge 0 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(0))[1] ) << "Wrong halfedge normal at halfedge 0 component 1"; + EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(0))[2] ) << "Wrong halfedge normal at halfedge 0 component 2"; + + EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(10))[0] ) << "Wrong halfedge normal at halfedge 10 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(10))[1] ) << "Wrong halfedge normal at halfedge 10 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(10))[2] ) << "Wrong halfedge normal at halfedge 10 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(19))[0] ) << "Wrong halfedge normal at halfedge 19 component 0"; + EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(19))[1] ) << "Wrong halfedge normal at halfedge 19 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(19))[2] ) << "Wrong halfedge normal at halfedge 19 component 2"; + + EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(24))[0] ) << "Wrong halfedge normal at halfedge 24 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(24))[1] ) << "Wrong halfedge normal at halfedge 24 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(24))[2] ) << "Wrong halfedge normal at halfedge 24 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(30))[0] ) << "Wrong halfedge normal at halfedge 30 component 0"; + EXPECT_EQ(-1, mesh_.normal(mesh_.halfedge_handle(30))[1] ) << "Wrong halfedge normal at halfedge 30 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(30))[2] ) << "Wrong halfedge normal at halfedge 30 component 2"; + + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(35))[0] ) << "Wrong halfedge normal at halfedge 35 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.halfedge_handle(35))[1] ) << "Wrong halfedge normal at halfedge 35 component 1"; + EXPECT_EQ(1, mesh_.normal(mesh_.halfedge_handle(35))[2] ) << "Wrong halfedge normal at halfedge 35 component 2"; + + mesh_.release_vertex_normals(); + mesh_.release_halfedge_normals(); + +} + +/* + * Just load a obj file and set vertex color option before loading + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJForceVertexColorsAlthoughNotAvailable) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + std::string file_name = "cube-minimal.obj"; + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); + + EXPECT_TRUE(ok) << file_name; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; + +} + + +/* + * Just load a obj file of a cube and checks the halfedge texCoords + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJCheckTexCoords) { + + mesh_.clear(); + + mesh_.request_halfedge_texcoords2D(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::FaceTexCoord; + + std::string file_name = "cube-minimal-texCoords.obj"; + + bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); + + EXPECT_TRUE(ok) << file_name; + + EXPECT_EQ(1, mesh_.texcoord2D(mesh_.halfedge_handle(0))[0] ) << "Wrong texCoord at halfedge 0 component 0"; + EXPECT_EQ(1, mesh_.texcoord2D(mesh_.halfedge_handle(0))[1] ) << "Wrong texCoord at halfedge 0 component 1"; + + EXPECT_EQ(3, mesh_.texcoord2D(mesh_.halfedge_handle(10))[0] ) << "Wrong texCoord at halfedge 1 component 0"; + EXPECT_EQ(3, mesh_.texcoord2D(mesh_.halfedge_handle(10))[1] ) << "Wrong texCoord at halfedge 1 component 1"; + + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.halfedge_handle(19))[0] ) << "Wrong texCoord at halfedge 4 component 0"; + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.halfedge_handle(19))[1] ) << "Wrong texCoord at halfedge 4 component 1"; + + EXPECT_EQ(7, mesh_.texcoord2D(mesh_.halfedge_handle(24))[0] ) << "Wrong texCoord at halfedge 7 component 0"; + EXPECT_EQ(7, mesh_.texcoord2D(mesh_.halfedge_handle(24))[1] ) << "Wrong texCoord at halfedge 7 component 1"; + + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.halfedge_handle(30))[0] ) << "Wrong texCoord at halfedge 9 component 0"; + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.halfedge_handle(30))[1] ) << "Wrong texCoord at halfedge 9 component 1"; + + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.halfedge_handle(35))[0] ) << "Wrong texCoord at halfedge 11 component 0"; + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.halfedge_handle(35))[1] ) << "Wrong texCoord at halfedge 11 component 1"; + + mesh_.release_halfedge_texcoords2D(); +} + + +/* + * Just load a obj file of a cube with vertex colors defined directly after the vertex definitions + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJWithVertexColorsAfterVertices) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertex-colors-after-vertex-definition.obj",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertex-colors-after-vertex-definition.obj"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; + + mesh_.release_vertex_colors(); +} + +/* + * Just load a obj file of a cube with vertex colors defined as separate lines + */ +TEST_F(OpenMeshReadWriteOBJ, LoadSimpleOBJWithVertexColorsAsVCLines) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertex-colors-as-vc-lines.obj",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertex-colors-as-vc-lines.obj"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; + + mesh_.release_vertex_colors(); + +} + +#endif // INCLUDE GUARD diff --git a/src/Unittests/unittests_read_write_OFF.hh b/src/Unittests/unittests_read_write_OFF.hh new file mode 100644 index 00000000..112c04d3 --- /dev/null +++ b/src/Unittests/unittests_read_write_OFF.hh @@ -0,0 +1,99 @@ +#ifndef INCLUDE_UNITTESTS_READ_WRITE_OFF_HH +#define INCLUDE_UNITTESTS_READ_WRITE_OFF_HH + +#include +#include + + +class OpenMeshReadWriteOFF : public OpenMeshBase { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + +/* + * Just load a simple mesh file in obj format and count whether + * the right number of entities has been loaded. + */ +TEST_F(OpenMeshReadWriteOFF, LoadSimpleOFFFile) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.off"); + + EXPECT_TRUE(ok); + + EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(22572u, mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(15048u, mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + + +TEST_F(OpenMeshReadWriteOFF, WriteAndReadVertexColorsToAndFromOFFFile) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + mesh_.add_vertex( Mesh::Point(0,0,1) ); + mesh_.add_vertex( Mesh::Point(0,1,0) ); + mesh_.add_vertex( Mesh::Point(0,1,1) ); + mesh_.add_vertex( Mesh::Point(1,0,1) ); + + // using the default color type Vec3uc from DefaultTraits in Traits.hh + Mesh::Color testColor(255, 128, 64); + + // setting colors (different from black) + for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) + mesh_.set_color(vit, testColor); + + // check if the colors are correctly setted + int count = 0; + for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) { + Mesh::Color color = mesh_.color(vit); + if ( color[0] != testColor[0] || color[1] != testColor[1] || color[2] != testColor[2] ) + ++ count; + } + + EXPECT_EQ(0, count) << "Vertices have the wrong color!"; + + // write the mesh_ + OpenMesh::IO::Options opt(OpenMesh::IO::Options::VertexColor); + OpenMesh::IO::write_mesh(mesh_, "temp.off", opt); + OpenMesh::IO::read_mesh(mesh_, "temp.off", opt); + + // check if vertices still have the same color + count = 0; + for (Mesh::VertexIter vit = mesh_.vertices_begin(), vitend = mesh_.vertices_end(); vit != vitend; ++vit) { + Mesh::Color color = mesh_.color(vit); + if ( color[0] != testColor[0] || color[1] != testColor[1] || color[2] != testColor[2] ) + ++ count; + } + + EXPECT_EQ(0, count) << "Vertices should have the same color after writing and reading the OFF file!"; + + mesh_.release_vertex_colors(); +} + + +#endif // INCLUDE GUARD diff --git a/src/Unittests/unittests_read_write_OM.hh b/src/Unittests/unittests_read_write_OM.hh new file mode 100644 index 00000000..82f6cf3f --- /dev/null +++ b/src/Unittests/unittests_read_write_OM.hh @@ -0,0 +1,145 @@ +#ifndef INCLUDE_UNITTESTS_READ_WRITE_OM_HH +#define INCLUDE_UNITTESTS_READ_WRITE_OM_HH + +#include +#include + + +class OpenMeshReadWriteOM : public OpenMeshBase { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + +/* + * Just load an om file and set vertex color option before loading + */ +TEST_F(OpenMeshReadWriteOM, LoadSimpleOMForceVertexColorsAlthoughNotAvailable) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + std::string file_name = "cube-minimal.om"; + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); + + EXPECT_TRUE(ok) << file_name; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; +} + +/* + * Just load an om file of a cube with vertex texCoords + */ +TEST_F(OpenMeshReadWriteOM, LoadSimpleOMWithTexCoords) { + + mesh_.clear(); + + mesh_.request_vertex_texcoords2D(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexTexCoord; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-texCoords.om",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-texCoords.om"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[0] ) << "Wrong vertex color at vertex 2 component 0"; + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[1] ) << "Wrong vertex color at vertex 2 component 1"; + + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_TRUE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; + + mesh_.release_vertex_texcoords2D(); +} + +/* + * Just load an om file of a cube with vertex colors + */ +TEST_F(OpenMeshReadWriteOM, LoadSimpleOMWithVertexColors) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertexColors.om",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertexColors.om"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; + + mesh_.release_vertex_colors(); +} + +#endif // INCLUDE GUARD diff --git a/src/Unittests/unittests_read_write_PLY.hh b/src/Unittests/unittests_read_write_PLY.hh new file mode 100644 index 00000000..4398fb82 --- /dev/null +++ b/src/Unittests/unittests_read_write_PLY.hh @@ -0,0 +1,284 @@ +#ifndef INCLUDE_UNITTESTS_READ_WRITE_PLY_HH +#define INCLUDE_UNITTESTS_READ_WRITE_PLY_HH + +#include +#include + + +class OpenMeshReadWritePLY : public OpenMeshBase { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + +/* + * Just load a point file in ply format and count whether + * the right number of entities has been loaded. + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePointPLYFileWithBadEncoding) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "pointCloudBadEncoding.ply"); + + EXPECT_TRUE(ok) << "Unable to load pointCloudBadEncoding.ply"; + + EXPECT_EQ(10u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(0u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(0u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + +/* + * Just load a point file in ply format and count whether + * the right number of entities has been loaded. + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePointPLYFileWithGoodEncoding) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "pointCloudGoodEncoding.ply"); + + EXPECT_TRUE(ok) << "Unable to load pointCloudGoodEncoding.ply"; + + EXPECT_EQ(10u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(0u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(0u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + +/* + * Just load a ply + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePLY) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal.ply"); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal.ply"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + +} + +/* + * Just load a ply file and set vertex color option before loading + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePLYForceVertexColorsAlthoughNotAvailable) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + std::string file_name = "cube-minimal.ply"; + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, file_name,options); + + EXPECT_TRUE(ok) << file_name; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + EXPECT_EQ(36u , mesh_.n_halfedges()) << "The number of loaded halfedges is not correct!"; + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; +} + +/* + * Just load a ply file of a cube with vertex colors + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePLYWithVertexColors) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-vertexColors.ply",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-vertexColors.ply"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; + + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; + + mesh_.release_vertex_colors(); +} + +/* + * Just load a ply file of a cube with vertex colors + */ +TEST_F(OpenMeshReadWritePLY, LoadPLYFromMeshLabWithVertexColors) { + + mesh_.clear(); + + mesh_.request_vertex_colors(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexColor; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "meshlab.ply",options); + + EXPECT_TRUE(ok) << "Unable to load meshlab.ply"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(0))[2] ) << "Wrong vertex color at vertex 0 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[0] ) << "Wrong vertex color at vertex 3 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(3))[1] ) << "Wrong vertex color at vertex 3 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(3))[2] ) << "Wrong vertex color at vertex 3 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(4))[2] ) << "Wrong vertex color at vertex 4 component 2"; + + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(0, mesh_.color(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + EXPECT_EQ(255, mesh_.color(mesh_.vertex_handle(7))[2] ) << "Wrong vertex color at vertex 7 component 2"; + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_TRUE(options.vertex_has_color()) << "Wrong user options are returned!"; + + mesh_.release_vertex_colors(); +} + +/* + * Just load a ply file of a cube with vertex texCoords + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePLYWithTexCoords) { + + mesh_.clear(); + + mesh_.request_vertex_texcoords2D(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexTexCoord; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-texCoords.ply",options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-texCoords.ply"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[0] ) << "Wrong vertex color at vertex 0 component 0"; + EXPECT_EQ(10, mesh_.texcoord2D(mesh_.vertex_handle(0))[1] ) << "Wrong vertex color at vertex 0 component 1"; + + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[0] ) << "Wrong vertex color at vertex 2 component 0"; + EXPECT_EQ(6, mesh_.texcoord2D(mesh_.vertex_handle(2))[1] ) << "Wrong vertex color at vertex 2 component 1"; + + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[0] ) << "Wrong vertex color at vertex 4 component 0"; + EXPECT_EQ(9, mesh_.texcoord2D(mesh_.vertex_handle(4))[1] ) << "Wrong vertex color at vertex 4 component 1"; + + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[0] ) << "Wrong vertex color at vertex 7 component 0"; + EXPECT_EQ(12, mesh_.texcoord2D(mesh_.vertex_handle(7))[1] ) << "Wrong vertex color at vertex 7 component 1"; + + + EXPECT_FALSE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_TRUE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; + + mesh_.release_vertex_texcoords2D(); +} + +/* + * Just load a ply with normals, ascii mode + */ +TEST_F(OpenMeshReadWritePLY, LoadSimplePLYWithNormals) { + + mesh_.clear(); + + mesh_.request_vertex_normals(); + + OpenMesh::IO::Options options; + options += OpenMesh::IO::Options::VertexNormal; + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube-minimal-normals.ply", options); + + EXPECT_TRUE(ok) << "Unable to load cube-minimal-normals.ply"; + + EXPECT_EQ(8u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(18u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(12u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; + + EXPECT_TRUE(options.vertex_has_normal()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_texcoord()) << "Wrong user options are returned!"; + EXPECT_FALSE(options.vertex_has_color()) << "Wrong user options are returned!"; + + + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[0] ) << "Wrong normal at vertex 0 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(0))[1] ) << "Wrong normal at vertex 0 component 1"; + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(0))[2] ) << "Wrong normal at vertex 0 component 2"; + + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(3))[0] ) << "Wrong normal at vertex 3 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[1] ) << "Wrong normal at vertex 3 component 1"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(3))[2] ) << "Wrong normal at vertex 3 component 2"; + + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(4))[0] ) << "Wrong normal at vertex 4 component 0"; + EXPECT_EQ(0, mesh_.normal(mesh_.vertex_handle(4))[1] ) << "Wrong normal at vertex 4 component 1"; + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(4))[2] ) << "Wrong normal at vertex 4 component 2"; + + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[0] ) << "Wrong normal at vertex 7 component 0"; + EXPECT_EQ(1, mesh_.normal(mesh_.vertex_handle(7))[1] ) << "Wrong normal at vertex 7 component 1"; + EXPECT_EQ(2, mesh_.normal(mesh_.vertex_handle(7))[2] ) << "Wrong normal at vertex 7 component 2"; + + mesh_.release_vertex_normals(); + +} + +#endif // INCLUDE GUARD diff --git a/src/Unittests/unittests_read_write_STL.hh b/src/Unittests/unittests_read_write_STL.hh new file mode 100644 index 00000000..4a44177f --- /dev/null +++ b/src/Unittests/unittests_read_write_STL.hh @@ -0,0 +1,71 @@ +#ifndef INCLUDE_UNITTESTS_READ_WRITE_STL_HH +#define INCLUDE_UNITTESTS_READ_WRITE_STL_HH + +#include +#include + + +class OpenMeshReadWriteSTL : public OpenMeshBase { + + protected: + + // This function is called before each test is run + virtual void SetUp() { + + // Do some initial stuff with the member data here... + } + + // This function is called after all tests are through + virtual void TearDown() { + + // Do some final stuff with the member data here... + } + + // Member already defined in OpenMeshBase + //Mesh mesh_; +}; + +/* + * ==================================================================== + * Define tests below + * ==================================================================== + */ + +/* + * Just load a simple mesh file in stla format and count whether + * the right number of entities has been loaded. + */ +TEST_F(OpenMeshReadWriteSTL, LoadSimpleSTLFile) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1.stl"); + + EXPECT_TRUE(ok); + + EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(22572u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(15048u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + + + +/* + * Just load a simple mesh file in stlb format and count whether + * the right number of entities has been loaded. + */ +TEST_F(OpenMeshReadWriteSTL, LoadSimpleSTLBinaryFile) { + + mesh_.clear(); + + bool ok = OpenMesh::IO::read_mesh(mesh_, "cube1Binary.stl"); + + EXPECT_TRUE(ok); + + EXPECT_EQ(7526u , mesh_.n_vertices()) << "The number of loaded vertices is not correct!"; + EXPECT_EQ(22572u , mesh_.n_edges()) << "The number of loaded edges is not correct!"; + EXPECT_EQ(15048u , mesh_.n_faces()) << "The number of loaded faces is not correct!"; +} + + +#endif // INCLUDE GUARD