Report the failure context in the solver and preprocessor tests Failing solver, preprocessor and tiny solver tests do not report why the solve or the preprocessing failed, and several tests use the deprecated gtest tuple aliases, placeholder names or a misspelled suite name. Stream the error messages and the compared values into the assertions, use the standard tuple and give the tests descriptive names. Change-Id: I164448f4b6abfb9da0cd1d11a063360b26154b75
diff --git a/internal/ceres/block_jacobi_preconditioner_test.cc b/internal/ceres/block_jacobi_preconditioner_test.cc index ca19a0d..98ddca1 100644 --- a/internal/ceres/block_jacobi_preconditioner_test.cc +++ b/internal/ceres/block_jacobi_preconditioner_test.cc
@@ -42,7 +42,7 @@ namespace ceres::internal { -TEST(BlockSparseJacobiPreconditioner, _) { +TEST(BlockSparseJacobiPreconditioner, InvertsDiagonalBlocksOfHessian) { constexpr int kNumtrials = 10; BlockSparseMatrix::RandomMatrixOptions options; options.num_col_blocks = 3; @@ -95,7 +95,7 @@ } } -TEST(CompressedRowSparseJacobiPreconditioner, _) { +TEST(CompressedRowSparseJacobiPreconditioner, InvertsDiagonalBlocksOfHessian) { constexpr int kNumtrials = 10; CompressedRowSparseMatrix::RandomMatrixOptions options; options.num_col_blocks = 3;
diff --git a/internal/ceres/compressed_col_sparse_matrix_utils_test.cc b/internal/ceres/compressed_col_sparse_matrix_utils_test.cc index 5e0601f..a5406a5 100644 --- a/internal/ceres/compressed_col_sparse_matrix_utils_test.cc +++ b/internal/ceres/compressed_col_sparse_matrix_utils_test.cc
@@ -41,7 +41,7 @@ namespace ceres::internal { -TEST(_, BlockPermutationToScalarPermutation) { +TEST(CompressedColSparseMatrixUtils, BlockPermutationToScalarPermutation) { // Block structure // 0 --1- ---2--- ---3--- 4 // [0, 1, 2, 3, 4, 5, 6, 7, 8, 9] @@ -77,7 +77,7 @@ } } -TEST(_, ScalarMatrixToBlockMatrix) { +TEST(CompressedColSparseMatrixUtils, ScalarMatrixToBlockMatrix) { // Block sparsity. // // [1 2 3 2]
diff --git a/internal/ceres/conjugate_gradients_solver_test.cc b/internal/ceres/conjugate_gradients_solver_test.cc index 4727564..f54e19c 100644 --- a/internal/ceres/conjugate_gradients_solver_test.cc +++ b/internal/ceres/conjugate_gradients_solver_test.cc
@@ -87,7 +87,7 @@ ASSERT_DOUBLE_EQ(3, x(2)); } -TEST(ConjuateGradientTest, Solves3x3SymmetricSystem) { +TEST(ConjugateGradientTest, Solves3x3SymmetricSystem) { std::unique_ptr<TripletSparseMatrix> A(new TripletSparseMatrix(3, 3, 9)); Vector b(3); Vector x(3);
diff --git a/internal/ceres/dense_cholesky_test.cc b/internal/ceres/dense_cholesky_test.cc index 161b57c..d5d5eec 100644 --- a/internal/ceres/dense_cholesky_test.cc +++ b/internal/ceres/dense_cholesky_test.cc
@@ -34,6 +34,7 @@ #include <memory> #include <sstream> #include <string> +#include <tuple> #include <utility> #include "Eigen/Core" @@ -49,7 +50,7 @@ namespace ceres::internal { -using Param = ::testing::tuple<DenseLinearAlgebraLibraryType, bool>; +using Param = std::tuple<DenseLinearAlgebraLibraryType, bool>; constexpr bool kMixedPrecision = true; constexpr bool kFullPrecision = false; @@ -58,8 +59,8 @@ std::string ParamInfoToString(testing::TestParamInfo<Param> info) { Param param = info.param; std::stringstream ss; - ss << DenseLinearAlgebraLibraryTypeToString(::testing::get<0>(param)) << "_" - << (::testing::get<1>(param) ? "MixedPrecision" : "FullPrecision"); + ss << DenseLinearAlgebraLibraryTypeToString(std::get<0>(param)) << "_" + << (std::get<1>(param) ? "MixedPrecision" : "FullPrecision"); return ss.str(); } } // namespace @@ -81,8 +82,8 @@ std::string error; ASSERT_TRUE(context.InitCuda(&error)) << error; #endif // CERES_NO_CUDA - options.dense_linear_algebra_library_type = ::testing::get<0>(GetParam()); - options.use_mixed_precision_solves = ::testing::get<1>(GetParam()); + options.dense_linear_algebra_library_type = std::get<0>(GetParam()); + options.use_mixed_precision_solves = std::get<1>(GetParam()); const int kNumRefinementSteps = 4; if (options.use_mixed_precision_solves) { options.max_num_refinement_iterations = kNumRefinementSteps;
diff --git a/internal/ceres/dense_linear_solver_test.cc b/internal/ceres/dense_linear_solver_test.cc index f764713..3556788 100644 --- a/internal/ceres/dense_linear_solver_test.cc +++ b/internal/ceres/dense_linear_solver_test.cc
@@ -32,6 +32,7 @@ #include <memory> #include <sstream> #include <string> +#include <tuple> #include "ceres/casts.h" #include "ceres/context_impl.h" @@ -52,21 +53,21 @@ static std::string ParamInfoToString(testing::TestParamInfo<Param> info) { Param param = info.param; std::stringstream ss; - ss << LinearSolverTypeToString(::testing::get<0>(param)) << "_" - << DenseLinearAlgebraLibraryTypeToString(::testing::get<1>(param)) << "_" - << (::testing::get<2>(param) ? "Regularized" : "Unregularized") << "_" - << ::testing::get<3>(param); + ss << LinearSolverTypeToString(std::get<0>(param)) << "_" + << DenseLinearAlgebraLibraryTypeToString(std::get<1>(param)) << "_" + << (std::get<2>(param) ? "Regularized" : "Unregularized") << "_" + << std::get<3>(param); return ss.str(); } class DenseLinearSolverTest : public ::testing::TestWithParam<Param> {}; -TEST_P(DenseLinearSolverTest, _) { +TEST_P(DenseLinearSolverTest, SolvesNormalEquations) { Param param = GetParam(); - const bool regularized = testing::get<2>(param); + const bool regularized = std::get<2>(param); std::unique_ptr<LinearLeastSquaresProblem> problem = - CreateLinearLeastSquaresProblemFromId(testing::get<3>(param)); + CreateLinearLeastSquaresProblemFromId(std::get<3>(param)); DenseSparseMatrix lhs(*down_cast<TripletSparseMatrix*>(problem->A.get())); const int num_cols = lhs.num_cols(); @@ -76,8 +77,8 @@ rhs.head(num_rows) = ConstVectorRef(problem->b.get(), num_rows); LinearSolver::Options options; - options.type = ::testing::get<0>(param); - options.dense_linear_algebra_library_type = ::testing::get<1>(param); + options.type = std::get<0>(param); + options.dense_linear_algebra_library_type = std::get<1>(param); ContextImpl context; options.context = &context; std::unique_ptr<LinearSolver> solver(LinearSolver::Create(options));
diff --git a/internal/ceres/line_search_preprocessor_test.cc b/internal/ceres/line_search_preprocessor_test.cc index 7119973..c3f7e23 100644 --- a/internal/ceres/line_search_preprocessor_test.cc +++ b/internal/ceres/line_search_preprocessor_test.cc
@@ -47,7 +47,7 @@ options.minimizer_type = LINE_SEARCH; LineSearchPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; } TEST(LineSearchPreprocessor, ProblemWithInvalidParameterBlock) { @@ -104,7 +104,7 @@ LineSearchPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; } template <int kNumResiduals, int... Ns> @@ -130,9 +130,9 @@ LineSearchPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; EXPECT_EQ(pp.evaluator_options.linear_solver_type, CGNR); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); } } // namespace ceres::internal
diff --git a/internal/ceres/partitioned_matrix_view_test.cc b/internal/ceres/partitioned_matrix_view_test.cc index 72ad1c4..0ab744a 100644 --- a/internal/ceres/partitioned_matrix_view_test.cc +++ b/internal/ceres/partitioned_matrix_view_test.cc
@@ -34,6 +34,7 @@ #include <random> #include <sstream> #include <string> +#include <tuple> #include <vector> #include "absl/log/check.h" @@ -50,20 +51,20 @@ const double kEpsilon = 1e-14; // Param = <problem_id, num_threads> -using Param = ::testing::tuple<int, int>; +using Param = std::tuple<int, int>; static std::string ParamInfoToString(testing::TestParamInfo<Param> info) { Param param = info.param; std::stringstream ss; - ss << ::testing::get<0>(param) << "_" << ::testing::get<1>(param); + ss << std::get<0>(param) << "_" << std::get<1>(param); return ss.str(); } class PartitionedMatrixViewTest : public ::testing::TestWithParam<Param> { protected: void SetUp() final { - const int problem_id = ::testing::get<0>(GetParam()); - const int num_threads = ::testing::get<1>(GetParam()); + const int problem_id = std::get<0>(GetParam()); + const int num_threads = std::get<1>(GetParam()); auto problem = CreateLinearLeastSquaresProblemFromId(problem_id); ASSERT_TRUE(problem != nullptr); A_ = std::move(problem->A);
diff --git a/internal/ceres/reorder_program_test.cc b/internal/ceres/reorder_program_test.cc index a2cbeb3..33f17c4 100644 --- a/internal/ceres/reorder_program_test.cc +++ b/internal/ceres/reorder_program_test.cc
@@ -68,7 +68,7 @@ class BinaryCostFunction : public MockCostFunctionBase<2, 1, 1> {}; class TernaryCostFunction : public MockCostFunctionBase<2, 1, 1, 1> {}; -TEST(_, ReorderResidualBlockNormalFunction) { +TEST(ReorderProgram, ReorderResidualBlockNormalFunction) { ProblemImpl problem; double x; double y; @@ -122,7 +122,7 @@ } } -TEST(_, ApplyOrderingOrderingTooSmall) { +TEST(ReorderProgram, ApplyOrderingOrderingTooSmall) { ProblemImpl problem; double x; double y; @@ -142,7 +142,7 @@ problem.parameter_map(), linear_solver_ordering, &program, &message)); } -TEST(_, ApplyOrderingNormal) { +TEST(ReorderProgram, ApplyOrderingNormal) { ProblemImpl problem; double x; double y; @@ -175,7 +175,7 @@ // group. This is essential for deterministic behavior - without preserving // the original order, the ordering would depend on pointer addresses which // can vary between runs due to ASLR or different memory allocation patterns. -TEST(_, ApplyOrderingPreservesOrderWithinGroups) { +TEST(ReorderProgram, ApplyOrderingPreservesOrderWithinGroups) { // Use heap-allocated parameter blocks to ensure pointer addresses are // not in any predictable order (simulating what happens in real usage). std::vector<std::unique_ptr<double[]>> params; @@ -318,7 +318,7 @@ } #endif // CERES_NO_SUITESPARSE -TEST(_, ReorderResidualBlocksbyPartition) { +TEST(ReorderProgram, ReorderResidualBlocksbyPartition) { ProblemImpl problem; double x; double y;
diff --git a/internal/ceres/solver_test.cc b/internal/ceres/solver_test.cc index 0623903..22043f9 100644 --- a/internal/ceres/solver_test.cc +++ b/internal/ceres/solver_test.cc
@@ -43,10 +43,14 @@ #include "ceres/problem.h" #include "ceres/problem_impl.h" #include "ceres/sized_cost_function.h" +#include "gmock/gmock.h" #include "gtest/gtest.h" namespace ceres::internal { +using ::testing::Each; +using ::testing::IsEmpty; + TEST(SolverOptions, DefaultTrustRegionOptionsAreValid) { Solver::Options options; options.minimizer_type = TRUST_REGION; @@ -116,9 +120,7 @@ num_iterations = summary.num_successful_steps + summary.num_unsuccessful_steps; EXPECT_GT(num_iterations, 1); - for (double value : callback.x_values) { - EXPECT_EQ(50.0, value); - } + EXPECT_THAT(callback.x_values, Each(50.0)); // Second: update_state_every_iteration=true, evaluation_callback=nullptr. x = 50.0; @@ -128,8 +130,9 @@ num_iterations = summary.num_successful_steps + summary.num_unsuccessful_steps; EXPECT_GT(num_iterations, 1); - EXPECT_EQ(original_x, callback.x_values[0]); - EXPECT_NE(original_x, callback.x_values[1]); + ASSERT_GE(callback.x_values.size(), 2); + EXPECT_EQ(callback.x_values[0], original_x); + EXPECT_NE(callback.x_values[1], original_x); } TEST(Solver, UpdateStateEveryIterationOptionWithEvaluationCallback) { @@ -160,8 +163,9 @@ num_iterations = summary.num_successful_steps + summary.num_unsuccessful_steps; EXPECT_GT(num_iterations, 1); - EXPECT_EQ(original_x, callback.x_values[0]); - EXPECT_NE(original_x, callback.x_values[1]); + ASSERT_GE(callback.x_values.size(), 2); + EXPECT_EQ(callback.x_values[0], original_x); + EXPECT_NE(callback.x_values[1], original_x); // Second: update_state_every_iteration=false, evaluation_callback=!nullptr. x = 50.0; @@ -171,8 +175,9 @@ num_iterations = summary.num_successful_steps + summary.num_unsuccessful_steps; EXPECT_GT(num_iterations, 1); - EXPECT_EQ(original_x, callback.x_values[0]); - EXPECT_NE(original_x, callback.x_values[1]); + ASSERT_GE(callback.x_values.size(), 2); + EXPECT_EQ(callback.x_values[0], original_x); + EXPECT_NE(callback.x_values[1], original_x); } TEST(Solver, CantMixEvaluationCallbackWithInnerIterations) { @@ -335,11 +340,11 @@ Solver::Options options; Solver::Summary summary; Solve(options, &problem, &summary); - EXPECT_TRUE(summary.IsSolutionUsable()); + EXPECT_TRUE(summary.IsSolutionUsable()) << summary.message; EXPECT_EQ(summary.fixed_cost, expected_cost); EXPECT_EQ(summary.initial_cost, expected_cost); EXPECT_EQ(summary.final_cost, expected_cost); - EXPECT_EQ(summary.iterations.size(), 0); + EXPECT_THAT(summary.iterations, IsEmpty()); } struct LinearCostFunction { @@ -470,22 +475,22 @@ std::string message; Solver::Options options; options.linear_solver_type = DENSE_NORMAL_CHOLESKY; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dense_linear_algebra_library_type = EIGEN; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; if (IsDenseLinearAlgebraLibraryTypeAvailable(LAPACK)) { options.use_mixed_precision_solves = false; options.dense_linear_algebra_library_type = LAPACK; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { options.use_mixed_precision_solves = false; options.dense_linear_algebra_library_type = LAPACK; @@ -500,7 +505,7 @@ options.use_mixed_precision_solves = false; options.dense_linear_algebra_library_type = EIGEN; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; EXPECT_FALSE(options.IsValid(&message)); @@ -508,7 +513,7 @@ if (IsDenseLinearAlgebraLibraryTypeAvailable(LAPACK)) { options.use_mixed_precision_solves = false; options.dense_linear_algebra_library_type = LAPACK; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; EXPECT_FALSE(options.IsValid(&message)); } else { @@ -536,7 +541,7 @@ options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -544,15 +549,15 @@ if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } #ifndef CERES_NO_EIGEN_METIS @@ -560,19 +565,19 @@ if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } #else options.linear_solver_ordering_type = NESDIS; @@ -593,7 +598,7 @@ options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable( options.sparse_linear_algebra_library_type)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -605,19 +610,19 @@ #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif } @@ -627,26 +632,26 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif } #else @@ -668,7 +673,7 @@ options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable( options.sparse_linear_algebra_library_type)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -677,7 +682,7 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -693,11 +698,11 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -717,11 +722,11 @@ options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; @@ -736,11 +741,11 @@ options.dense_linear_algebra_library_type)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = true; @@ -770,7 +775,7 @@ options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -778,7 +783,7 @@ if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -794,11 +799,11 @@ if (IsSparseLinearAlgebraLibraryTypeAvailable(EIGEN_SPARSE)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -827,7 +832,7 @@ options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable( options.sparse_linear_algebra_library_type)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -839,7 +844,7 @@ #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif options.use_mixed_precision_solves = false; @@ -857,14 +862,14 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; #ifdef CERES_NO_CHOLMOD_FLOAT EXPECT_FALSE(options.IsValid(&message)); #else - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; #endif options.use_mixed_precision_solves = false; @@ -894,7 +899,7 @@ options.dynamic_sparsity = false; if (IsSparseLinearAlgebraLibraryTypeAvailable( options.sparse_linear_algebra_library_type)) { - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; } else { EXPECT_FALSE(options.IsValid(&message)); } @@ -903,7 +908,7 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -919,11 +924,11 @@ options.sparse_linear_algebra_library_type)) { options.use_mixed_precision_solves = false; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = true; options.dynamic_sparsity = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.use_mixed_precision_solves = false; options.dynamic_sparsity = true; @@ -944,7 +949,7 @@ options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -957,7 +962,7 @@ options.sparse_linear_algebra_library_type = EIGEN_SPARSE; options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -970,7 +975,7 @@ options.sparse_linear_algebra_library_type = SUITE_SPARSE; options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -983,7 +988,7 @@ options.sparse_linear_algebra_library_type = ACCELERATE_SPARSE; options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1017,7 +1022,7 @@ options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1031,7 +1036,7 @@ options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1045,7 +1050,7 @@ options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1059,7 +1064,7 @@ options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1113,7 +1118,7 @@ options.sparse_linear_algebra_library_type)) { options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1129,7 +1134,7 @@ options.sparse_linear_algebra_library_type)) { options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1145,7 +1150,7 @@ options.sparse_linear_algebra_library_type)) { options.dynamic_sparsity = false; options.use_mixed_precision_solves = false; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.dynamic_sparsity = true; options.use_mixed_precision_solves = false; @@ -1188,11 +1193,11 @@ options.linear_solver_type = ITERATIVE_SCHUR; options.sparse_linear_algebra_library_type = NO_SPARSE; options.preconditioner_type = IDENTITY; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = CLUSTER_TRIDIAGONAL; @@ -1206,7 +1211,7 @@ options.preconditioner_type = JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = CLUSTER_TRIDIAGONAL; @@ -1219,11 +1224,11 @@ options.linear_solver_type = ITERATIVE_SCHUR; options.sparse_linear_algebra_library_type = EIGEN_SPARSE; options.preconditioner_type = IDENTITY; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_EQ(options.IsValid(&message), IsSparseLinearAlgebraLibraryTypeAvailable( @@ -1241,7 +1246,7 @@ options.preconditioner_type = JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = CLUSTER_TRIDIAGONAL; @@ -1254,11 +1259,11 @@ options.linear_solver_type = ITERATIVE_SCHUR; options.sparse_linear_algebra_library_type = SUITE_SPARSE; options.preconditioner_type = IDENTITY; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_EQ(options.IsValid(&message), IsSparseLinearAlgebraLibraryTypeAvailable( @@ -1276,7 +1281,7 @@ options.preconditioner_type = JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = CLUSTER_TRIDIAGONAL; @@ -1289,11 +1294,11 @@ options.linear_solver_type = ITERATIVE_SCHUR; options.sparse_linear_algebra_library_type = ACCELERATE_SPARSE; options.preconditioner_type = IDENTITY; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_EQ(options.IsValid(&message), IsSparseLinearAlgebraLibraryTypeAvailable( @@ -1311,7 +1316,7 @@ options.preconditioner_type = JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = SCHUR_JACOBI; - EXPECT_TRUE(options.IsValid(&message)); + EXPECT_TRUE(options.IsValid(&message)) << message; options.preconditioner_type = CLUSTER_JACOBI; EXPECT_FALSE(options.IsValid(&message)); options.preconditioner_type = CLUSTER_TRIDIAGONAL;
diff --git a/internal/ceres/tiny_solver_test.cc b/internal/ceres/tiny_solver_test.cc index 9a13c26..900e4ae 100644 --- a/internal/ceres/tiny_solver_test.cc +++ b/internal/ceres/tiny_solver_test.cc
@@ -132,8 +132,15 @@ Vec2 expected_residuals; Eigen::Matrix<double, 2, 3> expected_jacobian; f(x.data(), expected_residuals.data(), expected_jacobian.data()); - EXPECT_TRUE(expected_residuals.isApprox(solver.Residuals())); - EXPECT_TRUE(expected_jacobian.isApprox(solver.Jacobian())); + // The comparison must not allocate since the tests forbid heap allocations. + // The failure message is only evaluated if the comparison fails. + EXPECT_TRUE(expected_residuals.isApprox(solver.Residuals())) + << "expected: " << expected_residuals.transpose() + << "\nactual: " << solver.Residuals().transpose(); + EXPECT_TRUE(expected_jacobian.isApprox(solver.Jacobian())) + << "expected:\n" + << expected_jacobian << "\nactual:\n" + << solver.Jacobian(); } // A test case for when the cost function is statically sized.
diff --git a/internal/ceres/trust_region_preprocessor_test.cc b/internal/ceres/trust_region_preprocessor_test.cc index 2579361..9d00bf2 100644 --- a/internal/ceres/trust_region_preprocessor_test.cc +++ b/internal/ceres/trust_region_preprocessor_test.cc
@@ -48,7 +48,7 @@ Solver::Options options; TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; } TEST(TrustRegionPreprocessor, ProblemWithInvalidParameterBlock) { @@ -113,7 +113,7 @@ Solver::Options options; TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; } template <int kNumResiduals, int... Ns> @@ -161,12 +161,12 @@ options.linear_solver_type = linear_solver_type; TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; EXPECT_EQ(pp.options.linear_solver_type, linear_solver_type); EXPECT_EQ(pp.linear_solver_options.type, linear_solver_type); EXPECT_EQ(pp.evaluator_options.linear_solver_type, linear_solver_type); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); } protected: @@ -213,13 +213,13 @@ Solver::Options options; TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; EXPECT_EQ(pp.options.linear_solver_type, options.linear_solver_type); EXPECT_EQ(pp.linear_solver_options.type, options.linear_solver_type); EXPECT_EQ(pp.evaluator_options.linear_solver_type, options.linear_solver_type); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); EXPECT_TRUE(pp.minimizer_options.is_constrained); } @@ -246,12 +246,12 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; EXPECT_EQ(pp.options.linear_solver_type, DENSE_SCHUR); EXPECT_EQ(pp.linear_solver_options.type, DENSE_SCHUR); EXPECT_EQ(pp.evaluator_options.linear_solver_type, DENSE_SCHUR); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); } TEST_F(LinearSolverAndEvaluatorCreationTest, @@ -268,12 +268,12 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; EXPECT_EQ(pp.options.linear_solver_type, DENSE_QR); EXPECT_EQ(pp.linear_solver_options.type, DENSE_QR); EXPECT_EQ(pp.evaluator_options.linear_solver_type, DENSE_QR); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); } TEST_F(LinearSolverAndEvaluatorCreationTest, @@ -289,12 +289,12 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; EXPECT_EQ(pp.options.linear_solver_type, DENSE_SCHUR); EXPECT_EQ(pp.linear_solver_options.type, DENSE_SCHUR); EXPECT_EQ(pp.evaluator_options.linear_solver_type, DENSE_SCHUR); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); } TEST(TrustRegionPreprocessorTest, InnerIterationsWithOneParameterBlock) { @@ -307,10 +307,10 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); - EXPECT_TRUE(pp.inner_iteration_minimizer.get() == nullptr); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem, &pp)) << pp.error; + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); + EXPECT_EQ(pp.inner_iteration_minimizer.get(), nullptr); } TEST_F(LinearSolverAndEvaluatorCreationTest, @@ -320,10 +320,10 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); - EXPECT_TRUE(pp.inner_iteration_minimizer.get() != nullptr); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); + EXPECT_NE(pp.inner_iteration_minimizer.get(), nullptr); } TEST_F(LinearSolverAndEvaluatorCreationTest, InvalidInnerIterationsOrdering) { @@ -349,10 +349,10 @@ TrustRegionPreprocessor preprocessor; PreprocessedProblem pp; - EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)); - EXPECT_TRUE(pp.linear_solver.get() != nullptr); - EXPECT_TRUE(pp.evaluator.get() != nullptr); - EXPECT_TRUE(pp.inner_iteration_minimizer.get() != nullptr); + EXPECT_TRUE(preprocessor.Preprocess(options, &problem_, &pp)) << pp.error; + EXPECT_NE(pp.linear_solver.get(), nullptr); + EXPECT_NE(pp.evaluator.get(), nullptr); + EXPECT_NE(pp.inner_iteration_minimizer.get(), nullptr); } } // namespace internal