From a24b57019a5d1ec459047c245db65f89dfeb9db5 Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Fri, 30 Oct 2020 10:41:34 +0100
Subject: [PATCH] Improve Catch2 integration

Mainly dealing with outputs
---
 tests/mpi_test_main.cpp | 83 ++++++++++++++++++++++-------------------
 tests/test_main.cpp     | 33 +++++++++-------
 2 files changed, 64 insertions(+), 52 deletions(-)

diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp
index df55a88dc..33ab8ed16 100644
--- a/tests/mpi_test_main.cpp
+++ b/tests/mpi_test_main.cpp
@@ -33,50 +33,57 @@ main(int argc, char* argv[])
   Catch::Session session;
   int result = session.applyCommandLine(argc, argv);
 
-  if (parallel::rank() != 0) {
-    // Disable outputs for ranks != 0
-    setenv("GCOV_PREFIX", gcov_prefix.string().c_str(), 1);
-    parallel_output /= output_base_name + std::to_string(parallel::rank());
-
-    Catch::ConfigData data{session.configData()};
-    data.outputFilename = parallel_output.string();
-    session.useConfigData(data);
-  }
-
   if (result == 0) {
-    // Disable outputs from tested classes to the standard output
-    std::cout.setstate(std::ios::badbit);
-
-    SynchronizerManager::create();
-    MeshDataManager::create();
-    DiamondDualConnectivityManager::create();
-    DiamondDualMeshManager::create();
-
-    test_MeshDataBase::create();
-
-    if (parallel::rank() == 0) {
-      if (parallel::size() > 1) {
-        session.config().stream() << rang::fgB::green << "Other rank outputs are stored in corresponding files"
-                                  << rang::style::reset << '\n';
-
-        for (size_t i_rank = 1; i_rank < parallel::size(); ++i_rank) {
-          std::filesystem::path parallel_output(std::string{PUGS_BINARY_DIR});
-          parallel_output /= output_base_name + std::to_string(i_rank);
-          session.config().stream() << " - " << rang::fg::green << parallel_output.parent_path().string()
-                                    << parallel_output.preferred_separator << rang::style::reset << rang::fgB::green
-                                    << parallel_output.filename().string() << rang::style::reset << '\n';
+    const auto& config = session.config();
+    if (config.listReporters() or config.listTags() or config.listTestNamesOnly() or config.listTests()) {
+      if (parallel::rank() == 0) {
+        session.run();
+      }
+    } else {
+      if (parallel::rank() != 0) {
+        // Disable outputs for ranks != 0
+        setenv("GCOV_PREFIX", gcov_prefix.string().c_str(), 1);
+        parallel_output /= output_base_name + std::to_string(parallel::rank());
+
+        Catch::ConfigData data{session.configData()};
+        data.outputFilename = parallel_output.string();
+        session.useConfigData(data);
+      }
+
+      // Disable outputs from tested classes to the standard output
+      std::cout.setstate(std::ios::badbit);
+
+      SynchronizerManager::create();
+      MeshDataManager::create();
+      DiamondDualConnectivityManager::create();
+      DiamondDualMeshManager::create();
+
+      test_MeshDataBase::create();
+
+      if (parallel::rank() == 0) {
+        if (parallel::size() > 1) {
+          session.config().stream() << rang::fgB::green << "Other rank outputs are stored in corresponding files"
+                                    << rang::style::reset << '\n';
+
+          for (size_t i_rank = 1; i_rank < parallel::size(); ++i_rank) {
+            std::filesystem::path parallel_output(std::string{PUGS_BINARY_DIR});
+            parallel_output /= output_base_name + std::to_string(i_rank);
+            session.config().stream() << " - " << rang::fg::green << parallel_output.parent_path().string()
+                                      << parallel_output.preferred_separator << rang::style::reset << rang::fgB::green
+                                      << parallel_output.filename().string() << rang::style::reset << '\n';
+          }
         }
       }
-    }
 
-    result = session.run();
+      result = session.run();
 
-    test_MeshDataBase::destroy();
+      test_MeshDataBase::destroy();
 
-    DiamondDualMeshManager::destroy();
-    DiamondDualConnectivityManager::destroy();
-    MeshDataManager::destroy();
-    SynchronizerManager::destroy();
+      DiamondDualMeshManager::destroy();
+      DiamondDualConnectivityManager::destroy();
+      MeshDataManager::destroy();
+      SynchronizerManager::destroy();
+    }
   }
 
   Kokkos::finalize();
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index 2a9b6268f..1f7a5aafe 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -21,28 +21,33 @@ main(int argc, char* argv[])
   int result = session.applyCommandLine(argc, argv);
 
   if (result == 0) {
-    // Disable outputs from tested classes to the standard output
-    std::cout.setstate(std::ios::badbit);
+    const auto& config = session.config();
+    if (config.listReporters() or config.listTags() or config.listTestNamesOnly() or config.listTests()) {
+      result = session.run();
+    } else {
+      // Disable outputs from tested classes to the standard output
+      std::cout.setstate(std::ios::badbit);
 
-    SynchronizerManager::create();
-    MeshDataManager::create();
-    DiamondDualConnectivityManager::create();
-    DiamondDualMeshManager::create();
+      SynchronizerManager::create();
+      MeshDataManager::create();
+      DiamondDualConnectivityManager::create();
+      DiamondDualMeshManager::create();
 
-    test_MeshDataBase::create();
+      test_MeshDataBase::create();
 
-    result = session.run();
+      result = session.run();
 
-    test_MeshDataBase::destroy();
+      test_MeshDataBase::destroy();
 
-    DiamondDualMeshManager::destroy();
-    DiamondDualConnectivityManager::destroy();
-    MeshDataManager::destroy();
-    SynchronizerManager::destroy();
+      DiamondDualMeshManager::destroy();
+      DiamondDualConnectivityManager::destroy();
+      MeshDataManager::destroy();
+      SynchronizerManager::destroy();
+    }
   }
 
   Kokkos::finalize();
   parallel::Messenger::destroy();
-  std::cout << "finalizing\n";
+
   return result;
 }
-- 
GitLab