Generate random rng seed if user did not specify one

Closes #2161
This commit is contained in:
Martin Hořeňovský 2021-10-06 00:00:46 +02:00
parent 4e6d306742
commit fce42b62ad
No known key found for this signature in database
GPG Key ID: DE48307B8B0D381A
4 changed files with 34 additions and 6 deletions

View File

@ -72,7 +72,7 @@ namespace Catch {
ShowDurations Config::showDurations() const { return m_data.showDurations; } ShowDurations Config::showDurations() const { return m_data.showDurations; }
double Config::minDuration() const { return m_data.minDuration; } double Config::minDuration() const { return m_data.minDuration; }
TestRunOrder Config::runOrder() const { return m_data.runOrder; } TestRunOrder Config::runOrder() const { return m_data.runOrder; }
unsigned int Config::rngSeed() const { return m_data.rngSeed; } unsigned int Config::rngSeed() const { return *m_data.rngSeed; }
UseColour Config::useColour() const { return m_data.useColour; } UseColour Config::useColour() const { return m_data.useColour; }
bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; } bool Config::shouldDebugBreak() const { return m_data.shouldDebugBreak; }
int Config::abortAfter() const { return m_data.abortAfter; } int Config::abortAfter() const { return m_data.abortAfter; }

View File

@ -11,6 +11,7 @@
#include <catch2/catch_test_spec.hpp> #include <catch2/catch_test_spec.hpp>
#include <catch2/interfaces/catch_interfaces_config.hpp> #include <catch2/interfaces/catch_interfaces_config.hpp>
#include <catch2/internal/catch_unique_ptr.hpp> #include <catch2/internal/catch_unique_ptr.hpp>
#include <catch2/internal/catch_optional.hpp>
#include <vector> #include <vector>
#include <string> #include <string>
@ -33,7 +34,7 @@ namespace Catch {
bool libIdentify = false; bool libIdentify = false;
int abortAfter = -1; int abortAfter = -1;
unsigned int rngSeed = 0; Optional<unsigned int> rngSeed;
bool benchmarkNoAnalysis = false; bool benchmarkNoAnalysis = false;
unsigned int benchmarkSamples = 100; unsigned int benchmarkSamples = 100;

View File

@ -24,6 +24,7 @@
#include <catch2/internal/catch_move_and_forward.hpp> #include <catch2/internal/catch_move_and_forward.hpp>
#include <algorithm> #include <algorithm>
#include <ctime>
#include <iomanip> #include <iomanip>
#include <set> #include <set>
@ -170,6 +171,10 @@ namespace Catch {
if( m_startupExceptions ) if( m_startupExceptions )
return 1; return 1;
if (!m_configData.rngSeed) {
m_configData.rngSeed = static_cast<unsigned int>(std::time(nullptr));
}
auto result = m_cli.parse( Clara::Args( argc, argv ) ); auto result = m_cli.parse( Clara::Args( argc, argv ) );
if( !result ) { if( !result ) {
config(); config();
@ -187,6 +192,7 @@ namespace Catch {
showHelp(); showHelp();
if( m_configData.libIdentify ) if( m_configData.libIdentify )
libIdentify(); libIdentify();
m_config.reset(); m_config.reset();
return 0; return 0;
} }
@ -256,6 +262,7 @@ namespace Catch {
return 0; return 0;
} }
CATCH_TRY { CATCH_TRY {
config(); // Force config to be constructed config(); // Force config to be constructed

View File

@ -7,6 +7,7 @@
// SPDX-License-Identifier: BSL-1.0 // SPDX-License-Identifier: BSL-1.0
#include <catch2/internal/catch_commandline.hpp> #include <catch2/internal/catch_commandline.hpp>
#include <catch2/internal/catch_compiler_capabilities.hpp>
#include <catch2/catch_config.hpp> #include <catch2/catch_config.hpp>
#include <catch2/internal/catch_string_manip.hpp> #include <catch2/internal/catch_string_manip.hpp>
#include <catch2/interfaces/catch_interfaces_registry_hub.hpp> #include <catch2/interfaces/catch_interfaces_registry_hub.hpp>
@ -15,6 +16,7 @@
#include <fstream> #include <fstream>
#include <ctime> #include <ctime>
#include <string>
namespace Catch { namespace Catch {
@ -71,10 +73,28 @@ namespace Catch {
return ParserResult::ok( ParseResultType::Matched ); return ParserResult::ok( ParseResultType::Matched );
}; };
auto const setRngSeed = [&]( std::string const& seed ) { auto const setRngSeed = [&]( std::string const& seed ) {
if( seed != "time" ) if( seed == "time" ) {
return Clara::Detail::convertInto( seed, config.rngSeed ); config.rngSeed = static_cast<unsigned int>(std::time(nullptr));
config.rngSeed = static_cast<unsigned int>( std::time(nullptr) ); return ParserResult::ok(ParseResultType::Matched);
return ParserResult::ok( ParseResultType::Matched ); }
CATCH_TRY {
std::size_t parsedTo = 0;
unsigned long parsedSeed = std::stoul(seed, &parsedTo, 0);
if (parsedTo != seed.size()) {
return ParserResult::runtimeError("Could not parse '" + seed + "' as seed");
}
// TODO: Ideally we could parse unsigned int directly,
// but the stdlib doesn't provide helper for that
// type. After this is refactored to use fixed size
// type, we should check the parsed value is in range
// of the underlying type.
config.rngSeed = static_cast<unsigned int>(parsedSeed);
return ParserResult::ok(ParseResultType::Matched);
} CATCH_CATCH_ANON(std::exception const&) {
return ParserResult::runtimeError("Could not parse '" + seed + "' as seed");
}
}; };
auto const setColourUsage = [&]( std::string const& useColour ) { auto const setColourUsage = [&]( std::string const& useColour ) {
auto mode = toLower( useColour ); auto mode = toLower( useColour );