IAP GITLAB

Skip to content
Snippets Groups Projects
Commit 952c4964 authored by Remy Prechelt's avatar Remy Prechelt
Browse files

Add IsRegistered to RNGManager and unit tests.

parent f07df1c0
No related branches found
No related tags found
No related merge requests found
......@@ -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;
}
*/
......@@ -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.
......
......@@ -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);
}
}
}
}
}
}
}
}
}
......
0% Loading or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment