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