|
@@ -1,35 +1,35 @@
|
|
#include <test_common.h>
|
|
#include <test_common.h>
|
|
#include <igl/cotmatrix.h>
|
|
#include <igl/cotmatrix.h>
|
|
|
|
|
|
-class cotmatrix : public ::testing::TestWithParam<std::string> {};
|
|
|
|
-
|
|
|
|
-TEST_P(cotmatrix, constant_in_null_space)
|
|
|
|
-{
|
|
|
|
- Eigen::MatrixXd V;
|
|
|
|
- Eigen::MatrixXi F;
|
|
|
|
- Eigen::SparseMatrix<double> L;
|
|
|
|
- // Load example mesh: GetParam() will be name of mesh file
|
|
|
|
- test_common::load_mesh(GetParam(), V, F);
|
|
|
|
- igl::cotmatrix(V,F,L);
|
|
|
|
- ASSERT_EQ(V.rows(),L.rows());
|
|
|
|
- ASSERT_EQ(L.rows(),L.cols());
|
|
|
|
- Eigen::VectorXd C = Eigen::VectorXd::Ones(L.rows());
|
|
|
|
- Eigen::VectorXd Z = Eigen::VectorXd::Zero(L.rows());
|
|
|
|
- // ASSERT_EQ(a,b);
|
|
|
|
- // ASSERT_TRUE(a==b);
|
|
|
|
- // ASSERT_NEAR(a,b,1e-15)
|
|
|
|
- ASSERT_LT(((L*C)-(Z)).norm(),1e-12);
|
|
|
|
-}
|
|
|
|
-
|
|
|
|
-INSTANTIATE_TEST_CASE_P
|
|
|
|
-(
|
|
|
|
- all_meshes,
|
|
|
|
- cotmatrix,
|
|
|
|
- ::testing::ValuesIn(test_common::all_meshes()),
|
|
|
|
- test_common::string_test_name
|
|
|
|
-);
|
|
|
|
-
|
|
|
|
-TEST(cotmatrix, cube)
|
|
|
|
|
|
+// class cotmatrix : public ::testing::TestWithParam<std::string> {};
|
|
|
|
+
|
|
|
|
+// TEST_P(cotmatrix, constant_in_null_space)
|
|
|
|
+// {
|
|
|
|
+// Eigen::MatrixXd V;
|
|
|
|
+// Eigen::MatrixXi F;
|
|
|
|
+// Eigen::SparseMatrix<double> L;
|
|
|
|
+// // Load example mesh: GetParam() will be name of mesh file
|
|
|
|
+// test_common::load_mesh(GetParam(), V, F);
|
|
|
|
+// igl::cotmatrix(V,F,L);
|
|
|
|
+// REQUIRE (L.rows() == V.rows());
|
|
|
|
+// REQUIRE (L.cols() == L.rows());
|
|
|
|
+// Eigen::VectorXd C = Eigen::VectorXd::Ones(L.rows());
|
|
|
|
+// Eigen::VectorXd Z = Eigen::VectorXd::Zero(L.rows());
|
|
|
|
+// REQUIRE (b == a);
|
|
|
|
+// REQUIRE (a==b);
|
|
|
|
+// // ASSERT_NEAR(a,b,1e-15)
|
|
|
|
+// REQUIRE (1e-12 > ((L*C)-(Z)).norm());
|
|
|
|
+// }
|
|
|
|
+
|
|
|
|
+// INSTANTIATE_TEST_CASE_P
|
|
|
|
+// (
|
|
|
|
+// all_meshes,
|
|
|
|
+// cotmatrix,
|
|
|
|
+// ::testing::ValuesIn(test_common::all_meshes()),
|
|
|
|
+// test_common::string_test_name
|
|
|
|
+// );
|
|
|
|
+
|
|
|
|
+TEST_CASE("cotmatrix: cube", "[igl]")
|
|
{
|
|
{
|
|
//The allowed error for this test
|
|
//The allowed error for this test
|
|
const double epsilon = 1e-15;
|
|
const double epsilon = 1e-15;
|
|
@@ -52,49 +52,48 @@ TEST(cotmatrix, cube)
|
|
//So the cotangent matrix always are (0+0) or (0.5+0.5)
|
|
//So the cotangent matrix always are (0+0) or (0.5+0.5)
|
|
Eigen::SparseMatrix<double> L1;
|
|
Eigen::SparseMatrix<double> L1;
|
|
igl::cotmatrix(V,F,L1);
|
|
igl::cotmatrix(V,F,L1);
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
#ifdef IGL_EDGE_LENGTHS_SQUARED_H
|
|
#ifdef IGL_EDGE_LENGTHS_SQUARED_H
|
|
//Hard assert if we have edge_lenght_squared
|
|
//Hard assert if we have edge_lenght_squared
|
|
- ASSERT_EQ(-3.0, L1.coeff(f,f));
|
|
|
|
- ASSERT_EQ(0.0, L1.row(f).sum());
|
|
|
|
- ASSERT_EQ(0.0, L1.col(f).sum());
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == -3.0);
|
|
|
|
+ REQUIRE (L1.row(f).sum() == 0.0);
|
|
|
|
+ REQUIRE (L1.col(f).sum() == 0.0);
|
|
#else
|
|
#else
|
|
//Soft assert if we have not edge_lenght_squared
|
|
//Soft assert if we have not edge_lenght_squared
|
|
- ASSERT_NEAR(-3.0, L1.coeff(f,f), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
#endif
|
|
#endif
|
|
|
|
|
|
}
|
|
}
|
|
|
|
|
|
//Same for huge cube.
|
|
//Same for huge cube.
|
|
igl::cotmatrix(V_huge,F,L1);
|
|
igl::cotmatrix(V_huge,F,L1);
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
- ASSERT_NEAR(-3.0, L1.coeff(f,f), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
}
|
|
}
|
|
|
|
|
|
//Same for tiny cube. we need to use a tolerance this time...
|
|
//Same for tiny cube. we need to use a tolerance this time...
|
|
igl::cotmatrix(V_tiny,F,L1);
|
|
igl::cotmatrix(V_tiny,F,L1);
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
- ASSERT_NEAR(-3.0, L1.coeff(f,f), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
}
|
|
}
|
|
|
|
+}
|
|
|
|
|
|
-}//TEST(cotmatrix, cube)
|
|
|
|
-
|
|
|
|
-TEST(cotmatrix, tetrahedron)
|
|
|
|
|
|
+TEST_CASE("cotmatrix: tetrahedron", "[igl]")
|
|
{
|
|
{
|
|
//The allowed error for this test
|
|
//The allowed error for this test
|
|
const double epsilon = 1e-15;
|
|
const double epsilon = 1e-15;
|
|
@@ -128,56 +127,55 @@ TEST(cotmatrix, tetrahedron)
|
|
//Check the regular tetrahedron of side sqrt(2)
|
|
//Check the regular tetrahedron of side sqrt(2)
|
|
igl::cotmatrix(V,F_equi,L1);
|
|
igl::cotmatrix(V,F_equi,L1);
|
|
|
|
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
- ASSERT_NEAR(-3 / tan(M_PI / 3.0), L1.coeff(f,f), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3 / tan(M_PI / 3.0)).margin( epsilon));
|
|
else
|
|
else
|
|
- ASSERT_NEAR(0.0, L1.coeff(f,f), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (0.0).margin( epsilon));
|
|
#ifdef IGL_EDGE_LENGTHS_SQUARED_H
|
|
#ifdef IGL_EDGE_LENGTHS_SQUARED_H
|
|
//Hard assert if we have edge_lenght_squared
|
|
//Hard assert if we have edge_lenght_squared
|
|
- ASSERT_EQ(0.0, L1.row(f).sum());
|
|
|
|
- ASSERT_EQ(0.0, L1.col(f).sum());
|
|
|
|
|
|
+ REQUIRE (L1.row(f).sum() == 0.0);
|
|
|
|
+ REQUIRE (L1.col(f).sum() == 0.0);
|
|
#else
|
|
#else
|
|
//Soft assert if we have not edge_lenght_squared
|
|
//Soft assert if we have not edge_lenght_squared
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
#endif
|
|
#endif
|
|
}
|
|
}
|
|
|
|
|
|
//Check the huge regular tetrahedron
|
|
//Check the huge regular tetrahedron
|
|
igl::cotmatrix(V_huge,F_equi,L1);
|
|
igl::cotmatrix(V_huge,F_equi,L1);
|
|
|
|
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
- ASSERT_NEAR(-3 / tan(M_PI / 3.0), L1.coeff(f,f), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3 / tan(M_PI / 3.0)).margin( epsilon));
|
|
else
|
|
else
|
|
- ASSERT_NEAR(0.0, L1.coeff(f,f), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
}
|
|
}
|
|
|
|
|
|
//Check the tiny regular tetrahedron
|
|
//Check the tiny regular tetrahedron
|
|
igl::cotmatrix(V_tiny,F_equi,L1);
|
|
igl::cotmatrix(V_tiny,F_equi,L1);
|
|
|
|
|
|
- ASSERT_EQ(V.rows(), L1.rows());
|
|
|
|
- ASSERT_EQ(V.rows(), L1.cols());
|
|
|
|
|
|
+ REQUIRE (L1.rows() == V.rows());
|
|
|
|
+ REQUIRE (L1.cols() == V.rows());
|
|
for(int f = 0;f<L1.rows();f++)
|
|
for(int f = 0;f<L1.rows();f++)
|
|
{
|
|
{
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
//Check the diagonal. Only can value 0.0 for unused vertex or -3 / tan(60)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
if (L1.coeff(f,f) < -0.1)
|
|
- ASSERT_NEAR(-3 / tan(M_PI / 3.0), L1.coeff(f,f), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (-3 / tan(M_PI / 3.0)).margin( epsilon));
|
|
else
|
|
else
|
|
- ASSERT_NEAR(0.0, L1.coeff(f,f), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.row(f).sum(), epsilon);
|
|
|
|
- ASSERT_NEAR(0.0, L1.col(f).sum(), epsilon);
|
|
|
|
|
|
+ REQUIRE (L1.coeff(f,f) == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.row(f).sum() == Approx (0.0).margin( epsilon));
|
|
|
|
+ REQUIRE (L1.col(f).sum() == Approx (0.0).margin( epsilon));
|
|
}
|
|
}
|
|
-
|
|
|
|
-}//TEST(cotmatrix, tetrahedron)
|
|
|
|
|
|
+}
|