Fix missing namespace qualification and docs for Manifold gtest macro Change-Id: Iae9a0d13191a777921208cb58d919f0e85b1bf92
diff --git a/include/ceres/manifold_test_utils.h b/include/ceres/manifold_test_utils.h index 3f9fb21..dd1f931 100644 --- a/include/ceres/manifold_test_utils.h +++ b/include/ceres/manifold_test_utils.h
@@ -42,24 +42,51 @@ namespace ceres { -// Matchers and macros for help with testing Manifold objects. +// Matchers and macros to simplify testing of custom Manifold objects using the +// gtest testing framework. // // Testing a Manifold has two parts. // -// 1. Checking that Manifold::Plus is correctly defined. This requires per -// manifold tests. +// 1. Checking that Manifold::Plus() and Manifold::Minus() are correctly +// defined. This requires per manifold tests. // // 2. The other methods of the manifold have mathematical properties that make -// it compatible with Plus, as described in: +// them compatible with Plus() and Minus(), as described in [1]. // -// "Integrating Generic Sensor Fusion Algorithms with Sound State -// Representations through Encapsulation of Manifolds" -// By C. Hertzberg, R. Wagner, U. Frese and L. Schroder -// https://arxiv.org/pdf/1107.1119.pdf +// To verify these general requirements for a custom Manifold, use the +// EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD() macro from within a gtest test. Note +// that additional domain-specific tests may also be prudent, e.g to verify the +// behaviour of a Quaternion Manifold about pi. // -// These tests are implemented using generic matchers defined below which can -// all be called by the macro EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, -// delta, y, tolerance). See manifold_test.cc for example usage. +// [1] "Integrating Generic Sensor Fusion Algorithms with Sound State +// Representations through Encapsulation of Manifolds", C. Hertzberg, +// R. Wagner, U. Frese and L. Schroder, https://arxiv.org/pdf/1107.1119.pdf + +// Verifies the general requirements for a custom Manifold are satisfied to +// within the specified (numerical) tolerance. +// +// Example usage for a custom Manifold: ExampleManifold: +// +// TEST(ExampleManifold, ManifoldInvariantsHold) { +// constexpr double kTolerance = 1.0e-9; +// ExampleManifold manifold; +// ceres::Vector x = ceres::Vector::Zero(manifold.AmbientSize()); +// ceres::Vector y = ceres::Vector::Zero(manifold.AmbientSize()); +// ceres::Vector delta = ceres::Vector::Zero(manifold.TangentSize()); +// EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, kTolerance); +// } +#define EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, tolerance) \ + ::ceres::Vector zero_tangent = ::ceres::Vector::Zero(manifold.TangentSize()); \ + EXPECT_THAT(manifold, ::ceres::XPlusZeroIsXAt(x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::XMinusXIsZeroAt(x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::MinusPlusIsIdentityAt(x, delta, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::MinusPlusIsIdentityAt(x, zero_tangent, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::PlusMinusIsIdentityAt(x, x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::PlusMinusIsIdentityAt(x, y, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::HasCorrectPlusJacobianAt(x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::HasCorrectMinusJacobianAt(x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::MinusPlusJacobianIsIdentityAt(x, tolerance)); \ + EXPECT_THAT(manifold, ::ceres::HasCorrectRightMultiplyByPlusJacobianAt(x, tolerance)); // Checks that the invariant Plus(x, 0) == x holds. MATCHER_P2(XPlusZeroIsXAt, x, tolerance, "") { @@ -312,17 +339,4 @@ return true; } -#define EXPECT_THAT_MANIFOLD_INVARIANTS_HOLD(manifold, x, delta, y, tolerance) \ - Vector zero_tangent = Vector::Zero(manifold.TangentSize()); \ - EXPECT_THAT(manifold, XPlusZeroIsXAt(x, tolerance)); \ - EXPECT_THAT(manifold, XMinusXIsZeroAt(x, tolerance)); \ - EXPECT_THAT(manifold, MinusPlusIsIdentityAt(x, delta, tolerance)); \ - EXPECT_THAT(manifold, MinusPlusIsIdentityAt(x, zero_tangent, tolerance)); \ - EXPECT_THAT(manifold, PlusMinusIsIdentityAt(x, x, tolerance)); \ - EXPECT_THAT(manifold, PlusMinusIsIdentityAt(x, y, tolerance)); \ - EXPECT_THAT(manifold, HasCorrectPlusJacobianAt(x, tolerance)); \ - EXPECT_THAT(manifold, HasCorrectMinusJacobianAt(x, tolerance)); \ - EXPECT_THAT(manifold, MinusPlusJacobianIsIdentityAt(x, tolerance)); \ - EXPECT_THAT(manifold, HasCorrectRightMultiplyByPlusJacobianAt(x, tolerance)); - } // namespace ceres