Unit Tests for libigl¶
The libigl unit test are included in the main repository inside the tests
folder.
There is a CMake flag to enable/disable the testings LIBIGL_BUILD_TESTS
which is
disabled by default when libigl is not a toplevel project, that is when you are using
libigl as a library in your own project.
Tip
Before writing any new unit test, be sure you are up-to-date with the master branch to use the latest version of libigl available.
Dependencies¶
- Catch2 is an auto-downloaded dependency.
Build And Test¶
Use cmake
to generate a Makefile
that will build and test upon issuing
make
:
mkdir build
cd build
cmake ..
Then build and test with
make
make test
This will first compile the tests and then immediately run the tests. If tests are succeeding you should see output similar to:
Test project /usr/local/libigl-unit-tests/build
Start 1: run_igl_mosek_tests
1/4 Test #1: run_igl_mosek_tests ..............***Exception: Other 0.00 sec
Start 2: run_igl_boolean_tests
2/4 Test #2: run_igl_boolean_tests ............ Passed 1.12 sec
Start 3: run_igl_cgal_tests
3/4 Test #3: run_igl_cgal_tests ............... Passed 2.46 sec
Start 4: run_igl_tests
We refer to the Catch2 manual for additional options.
Generating New Tests¶
To create a new test, just create a file with the same name of the file you want to test
inside the include\igl
in the tests
folder. Then just add
#include <test_common.h>
TEST_CASE("<function_name> <possible description>", "[igl]")
{
//test code goes here
}
You can use functions like test_common::assert_eq
to assert equality between two Eigen matrices.
The cumsum test is a good
simple example of a test case.
Many libigl functions act on triangle meshes, you can use igl::read_triangle_mesh(test_common::data_path("cube.obj"), V, F)
to load a triangle mesh located in the test data folder.
Note
The data used for testing is not in the main libigl repository. Instead it is contained in the libigl-tests-data repository. It is automatically downloaded when LIBIGL_BUILD_TESTS
is enabled.
Conventions¶
When naming a test for a function igl::extra::function_name
use:
TEST_CASE("function_name: my_description", "[igl/extra]")
{
...
}
where my_description
can be used to identify the type of unit test being run on the function function_name
.
Example¶
The test for igl::copyleft::cgal::order_facets_around_edges
in
include/igl/copyleft/cgal/order_facets_around_edges.cpp
is:
TEST_CASE("copyleft_cgal_order_facets_around_edges: Simple", "[igl/copyleft/cgal]")
{
...
}
which tests this function on example data containing a triplet of faces.
Guarantees¶
None.
(Obviously?) The presence of a unit test here for some function (e.g.,
igl::cotmatrix
) is not a guarantee or even an endorsement of the notion that
the libigl function igl::cotmatrix
is bug free or “fully tested” or “heavily
tested” or even “adequately tested”.
Need Work?¶
Some of the most used libigl functions
grep -hr "^#include \"" ../libigl/include/igl | sed -e 's/\(\.\.\/\)//g' | sort | uniq -c | sort
still don’t have unit tests.