Files
mfem/tests/unit/run_unit_tests.hpp
T

110 lines
2.8 KiB
C++

// Copyright (c) 2010-2025, Lawrence Livermore National Security, LLC. Produced
// at the Lawrence Livermore National Laboratory. All Rights reserved. See files
// LICENSE and NOTICE for details. LLNL-CODE-806117.
//
// This file is part of the MFEM library. For more information and source code
// availability visit https://mfem.org.
//
// MFEM is free software; you can redistribute it and/or modify it under the
// terms of the BSD-3 license. We welcome feedback and contributions, see file
// CONTRIBUTING.md for details.
#ifndef MFEM_RUN_UNIT_TEST
#define MFEM_RUN_UNIT_TEST
#include "unit_tests.hpp"
bool launch_all_non_regression_tests = false;
bool verbose_tests = false;
std::string mfem_data_dir;
static int RunCatchSession(int argc, char *argv[],
const std::vector<std::string> &testsOrTags,
bool root=true)
{
// There must be exactly one instance.
Catch::Session session;
// Build a new command line parser on top of Catch's
using namespace Catch::clara;
bool enable_mfem_out = false;
auto cli = session.cli()
| Opt(launch_all_non_regression_tests) ["--all"] ("all tests")
| Opt(mfem_data_dir, "") ["--data"] ("mfem/data repository")
| Opt(enable_mfem_out) ["--enable-output"] ("enable mfem::out")
| Opt(verbose_tests) ["--verbose"] ("verbose output");
session.cli(cli);
// For floating point comparisons, print 8 digits for single precision
// values, and 16 digits for double precision values.
Catch::StringMaker<float>::precision = 8;
Catch::StringMaker<double>::precision = 16;
// Apply provided command line arguments.
int r = session.applyCommandLine(argc, argv);
if (r != 0) { return r; }
auto cfg = session.configData();
cfg.testsOrTags.insert(cfg.testsOrTags.end(), testsOrTags.begin(),
testsOrTags.end());
if (mfem_data_dir == "") { cfg.testsOrTags.push_back("~[MFEMData]"); }
session.useConfigData(cfg);
if (!verbose_tests && !enable_mfem_out)
{
mfem::out.Disable();
}
if (root)
{
std::cout << "INFO: Test filter: ";
for (std::string &filter : cfg.testsOrTags)
{
std::cout << filter << " ";
}
std::cout << std::endl;
}
int result = session.run();
return result;
}
static inline bool Root()
{
#ifdef MFEM_USE_MPI
return mfem::Mpi::IsInitialized() ? mfem::Mpi::Root() : true;
#else
return true;
#endif
}
#ifdef CATCH_CONFIG_NOSTDOUT
namespace Catch
{
std::ofstream null_stream;
std::ostream& cout()
{
if (Root()) { return std::cout; }
else { return null_stream; }
}
std::ostream& cerr()
{
if (Root()) { return std::cerr; }
else { return null_stream; }
}
std::ostream& clog()
{
if (Root()) { return std::clog; }
else { return null_stream; }
}
} // namespace Catch
#endif
#endif