From aecb90ec602030725db3921910f0ebe1456b90bb Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Del=20Pino?= <stephane.delpino44@gmail.com>
Date: Mon, 26 Jul 2021 12:43:14 +0200
Subject: [PATCH] Add missing tests and simplify implementation

---
 src/utils/RandomEngine.cpp  | 13 ++++------
 tests/CMakeLists.txt        |  1 +
 tests/mpi_test_main.cpp     |  3 +++
 tests/test_RandomEngine.cpp | 52 +++++++++++++++++++++++++++++++++++++
 tests/test_main.cpp         |  3 +++
 5 files changed, 64 insertions(+), 8 deletions(-)
 create mode 100644 tests/test_RandomEngine.cpp

diff --git a/src/utils/RandomEngine.cpp b/src/utils/RandomEngine.cpp
index 508f77a39..9b7efc162 100644
--- a/src/utils/RandomEngine.cpp
+++ b/src/utils/RandomEngine.cpp
@@ -41,13 +41,7 @@ RandomEngine::destroy()
 
 RandomEngine::RandomEngine()
 {
-  uint64_t random_seed = std::random_device{}();
-  parallel::broadcast(random_seed, 0);
-
-  m_random_engine = std::default_random_engine(random_seed);
-
-  std::cout << " * setting " << rang::fgB::green << "random seed" << rang::style::reset << " to " << rang::fgB::yellow
-            << random_seed << rang::style::reset << '\n';
+  this->resetRandomSeed();
 }
 
 void
@@ -62,5 +56,8 @@ RandomEngine::setRandomSeed(const uint64_t random_seed)
 void
 RandomEngine::resetRandomSeed()
 {
-  m_instance = std::unique_ptr<RandomEngine>(new RandomEngine);
+  uint64_t random_seed = std::random_device{}();
+  parallel::broadcast(random_seed, 0);
+
+  this->setRandomSeed(random_seed);
 }
diff --git a/tests/CMakeLists.txt b/tests/CMakeLists.txt
index 7904eedc0..e112df5a6 100644
--- a/tests/CMakeLists.txt
+++ b/tests/CMakeLists.txt
@@ -113,6 +113,7 @@ add_executable (mpi_unit_tests
   test_ItemValueUtils.cpp
   test_Messenger.cpp
   test_Partitioner.cpp
+  test_RandomEngine.cpp
   test_SubItemValuePerItem.cpp
   test_SubItemArrayPerItem.cpp
   )
diff --git a/tests/mpi_test_main.cpp b/tests/mpi_test_main.cpp
index 51a01b0cf..4c9463417 100644
--- a/tests/mpi_test_main.cpp
+++ b/tests/mpi_test_main.cpp
@@ -9,6 +9,7 @@
 #include <mesh/SynchronizerManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
+#include <utils/RandomEngine.hpp>
 #include <utils/pugs_config.hpp>
 
 #include <MeshDataBaseForTests.hpp>
@@ -57,6 +58,7 @@ main(int argc, char* argv[])
       std::cout.setstate(std::ios::badbit);
 
       SynchronizerManager::create();
+      RandomEngine::create();
       MeshDataManager::create();
       DiamondDualConnectivityManager::create();
       DiamondDualMeshManager::create();
@@ -89,6 +91,7 @@ main(int argc, char* argv[])
       DiamondDualMeshManager::destroy();
       DiamondDualConnectivityManager::destroy();
       MeshDataManager::destroy();
+      RandomEngine::destroy();
       SynchronizerManager::destroy();
     }
   }
diff --git a/tests/test_RandomEngine.cpp b/tests/test_RandomEngine.cpp
new file mode 100644
index 000000000..241b40dbe
--- /dev/null
+++ b/tests/test_RandomEngine.cpp
@@ -0,0 +1,52 @@
+#include <catch2/catch_test_macros.hpp>
+#include <catch2/matchers/catch_matchers_all.hpp>
+
+#include <utils/Messenger.hpp>
+#include <utils/RandomEngine.hpp>
+
+#include <utils/pugs_config.hpp>
+
+// clazy:excludeall=non-pod-global-static
+
+TEST_CASE("RandomEngine", "[random]")
+{
+  SECTION("current state")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    REQUIRE(isSynchronized(random_engine));
+  }
+
+  SECTION("set seed")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.setRandomSeed(1402339680);
+
+    REQUIRE(isSynchronized(random_engine));
+
+    REQUIRE(random_engine.getCurrentSeed() == 1402339680);
+  }
+
+  SECTION("reset seed")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.resetRandomSeed();
+
+    REQUIRE(isSynchronized(random_engine));
+  }
+
+  SECTION("de-synchronize seeds")
+  {
+    RandomEngine& random_engine = RandomEngine::instance();
+    random_engine.resetRandomSeed();
+    auto& engine = random_engine.engine();
+
+    for (size_t i = 0; i < parallel::rank(); ++i) {
+      engine();
+    }
+
+    REQUIRE(((parallel::size() == 1) or not isSynchronized(random_engine)));
+
+    random_engine.resetRandomSeed();
+    REQUIRE(isSynchronized(random_engine));
+  }
+}
diff --git a/tests/test_main.cpp b/tests/test_main.cpp
index b5316614d..9c03ba921 100644
--- a/tests/test_main.cpp
+++ b/tests/test_main.cpp
@@ -9,6 +9,7 @@
 #include <mesh/SynchronizerManager.hpp>
 #include <utils/Messenger.hpp>
 #include <utils/PETScWrapper.hpp>
+#include <utils/RandomEngine.hpp>
 #include <utils/SLEPcWrapper.hpp>
 
 #include <MeshDataBaseForTests.hpp>
@@ -34,6 +35,7 @@ main(int argc, char* argv[])
       std::cout.setstate(std::ios::badbit);
 
       SynchronizerManager::create();
+      RandomEngine::create();
       MeshDataManager::create();
       DiamondDualConnectivityManager::create();
       DiamondDualMeshManager::create();
@@ -51,6 +53,7 @@ main(int argc, char* argv[])
       DiamondDualMeshManager::destroy();
       DiamondDualConnectivityManager::destroy();
       MeshDataManager::destroy();
+      RandomEngine::destroy();
       SynchronizerManager::destroy();
     }
   }
-- 
GitLab