From 952c4964aff388f17420fc0d2a2a6ed0556092d9 Mon Sep 17 00:00:00 2001
From: Remy Prechelt <prechelt@hawaii.edu>
Date: Thu, 9 Jul 2020 20:43:55 -1000
Subject: [PATCH] Add IsRegistered to RNGManager and unit tests.

---
 Framework/Random/RNGManager.cc | 18 ++++++++++--------
 Framework/Random/RNGManager.h  | 16 +++++++++-------
 Framework/Random/testRandom.cc | 32 +++++++++++++++++++++++---------
 3 files changed, 42 insertions(+), 24 deletions(-)

diff --git a/Framework/Random/RNGManager.cc b/Framework/Random/RNGManager.cc
index ab60ff721..8b595f123 100644
--- a/Framework/Random/RNGManager.cc
+++ b/Framework/Random/RNGManager.cc
@@ -7,6 +7,7 @@
  */
 
 #include <corsika/random/RNGManager.h>
+#include <sstream>
 
 void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStreamName) {
   corsika::random::RNG rng;
@@ -20,7 +21,15 @@ void corsika::random::RNGManager::RegisterRandomStream(std::string const& pStrea
 
 corsika::random::RNG& corsika::random::RNGManager::GetRandomStream(
     std::string const& pStreamName) {
-  return rngs.at(pStreamName);
+  if (IsRegistered(pStreamName)) {
+    return rngs.at(pStreamName);
+  } else { // this stream name is not in the map
+    throw std::runtime_error(pStreamName + " is not a registered stream.");
+  }
+}
+
+bool corsika::random::RNGManager::IsRegistered(std::string const& pStreamName) const {
+  return rngs.count(pStreamName) > 0;
 }
 
 std::stringstream corsika::random::RNGManager::dumpState() const {
@@ -44,10 +53,3 @@ void corsika::random::RNGManager::SeedAll() {
     entry.second.seed(sseq);
   }
 }
-
-/*
-void corsika::random::RNGManager::SetSeedSeq(std::string const& pStreamName,
-                                             std::seed_seq const& pSeedSeq) {
-  seeds[pStreamName] = pSeedSeq;
-}
-*/
diff --git a/Framework/Random/RNGManager.h b/Framework/Random/RNGManager.h
index 15e90d69a..0826642a8 100644
--- a/Framework/Random/RNGManager.h
+++ b/Framework/Random/RNGManager.h
@@ -12,7 +12,6 @@
 
 #include <map>
 #include <random>
-#include <sstream>
 #include <string>
 
 /*!
@@ -23,7 +22,10 @@ namespace corsika::random {
 
   using RNG = std::mt19937; //!< the actual RNG type that will be used
 
-  class RNGManager : public corsika::utl::Singleton<RNGManager> {
+  /*!
+   * Manage random number generators.
+   */
+  class RNGManager final : public corsika::utl::Singleton<RNGManager> {
 
     friend class corsika::utl::Singleton<RNGManager>;
 
@@ -48,17 +50,17 @@ namespace corsika::random {
      */
     RNG& GetRandomStream(std::string const& pStreamName);
 
+    /*!
+     * Check whether a stream has been registered.
+     */
+    bool IsRegistered(std::string const& pStreamName) const;
+
     /*!
      * dumps the names and states of all registered random-number streams
      * into a std::stringstream.
      */
     std::stringstream dumpState() const;
 
-    /**
-     * set seed_seq of \a pStreamName to \a pSeedSeq
-     */
-    // void SetSeedSeq(std::string const& pStreamName, std::seed_seq& const pSeedSeq);
-
     /**
      * Set explicit seeds for all currently registered streams. The actual seed values
      * are incremented from \a vSeed.
diff --git a/Framework/Random/testRandom.cc b/Framework/Random/testRandom.cc
index 9a1d96fbb..14971167d 100644
--- a/Framework/Random/testRandom.cc
+++ b/Framework/Random/testRandom.cc
@@ -23,18 +23,32 @@ SCENARIO("random-number streams can be registered and retrieved") {
   GIVEN("a RNGManager") {
     RNGManager& rngManager = RNGManager::GetInstance();
 
-    WHEN("a sequence is registered by name") {
-      rngManager.RegisterRandomStream("stream_A");
+    WHEN("the sequence name is not registered") {
+      REQUIRE(rngManager.IsRegistered("stream_A") == false);
 
-      THEN("the sequence can be retrieved") {
-        REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A"));
-      }
+      THEN("a sequence is registered by name") {
+        rngManager.RegisterRandomStream("stream_A");
 
-      THEN("an unknown sequence cannot be retrieved") {
-        REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN"));
-      }
+        THEN("the sequence can be retrieved") {
+          REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A"));
+
+          THEN("we can check that the sequence exists") {
+            REQUIRE_NOTHROW(rngManager.GetRandomStream("stream_A"));
 
-      // seeding not covered yet
+            THEN("an unknown sequence cannot be retrieved") {
+              REQUIRE(rngManager.IsRegistered("stream_A") == true);
+
+              THEN("an unknown sequence cannot be retrieved") {
+                REQUIRE_THROWS(rngManager.GetRandomStream("stream_UNKNOWN"));
+
+                THEN("an unknown sequence is not registered") {
+                  REQUIRE(rngManager.IsRegistered("stream_UNKNOWN") == false);
+                }
+              }
+            }
+          }
+        }
+      }
     }
   }
 }
-- 
GitLab