Skip to content

Commit 1a1669b

Browse files
committed
Honor TEST_RANDOM_SEED when --rng-seed is not provided; keep CLI > env; add SelfTest and update approvals
1 parent cd93d20 commit 1a1669b

23 files changed

+115
-18
lines changed

src/catch2/catch_config.hpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -61,6 +61,7 @@ namespace Catch {
6161

6262
int abortAfter = -1;
6363
uint32_t rngSeed = generateRandomSeed(GenerateFrom::Default);
64+
bool rngSeedSpecified = false;
6465

6566
unsigned int shardCount = 1;
6667
unsigned int shardIndex = 0;

src/catch2/catch_session.cpp

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -29,6 +29,9 @@
2929
#include <exception>
3030
#include <iomanip>
3131
#include <set>
32+
#include <cstdlib>
33+
#include <cstdint>
34+
#include <climits>
3235

3336
namespace Catch {
3437

@@ -296,6 +299,17 @@ namespace Catch {
296299
}
297300

298301
CATCH_TRY {
302+
if (!m_configData.rngSeedSpecified) {
303+
if (const char* v = std::getenv("TEST_RANDOM_SEED")) {
304+
char* end = nullptr;
305+
unsigned long long parsed = std::strtoull(v, &end, 10);
306+
if (end != v && *end == '\0' && parsed <= UINT32_MAX) {
307+
m_configData.rngSeed = static_cast<std::uint32_t>(parsed);
308+
// intentionally NOT setting rngSeedSpecified; CLI should still override if provided
309+
}
310+
// malformed/out-of-range -> ignore and keep existing default
311+
}
312+
}
299313
config(); // Force config to be constructed
300314

301315
seedRng( *m_config );

src/catch2/internal/catch_commandline.cpp

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -72,9 +72,11 @@ namespace Catch {
7272
auto const setRngSeed = [&]( std::string const& seed ) {
7373
if( seed == "time" ) {
7474
config.rngSeed = generateRandomSeed(GenerateFrom::Time);
75+
config.rngSeedSpecified = true;
7576
return ParserResult::ok(ParseResultType::Matched);
7677
} else if (seed == "random-device") {
7778
config.rngSeed = generateRandomSeed(GenerateFrom::RandomDevice);
79+
config.rngSeedSpecified = true;
7880
return ParserResult::ok(ParseResultType::Matched);
7981
}
8082

@@ -85,6 +87,7 @@ namespace Catch {
8587
return ParserResult::runtimeError( "Could not parse '" + seed + "' as seed" );
8688
}
8789
config.rngSeed = *parsedSeed;
90+
config.rngSeedSpecified = true;
8891
return ParserResult::ok( ParseResultType::Matched );
8992
};
9093
auto const setDefaultColourMode = [&]( std::string const& colourMode ) {

tests/CMakeLists.txt

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -69,6 +69,7 @@ endif() #Temporary workaround
6969
# Please keep these ordered alphabetically
7070
set(TEST_SOURCES
7171
${SELF_TEST_DIR}/TestRegistrations.cpp
72+
${SELF_TEST_DIR}/BazelEnvSeed.tests.cpp
7273
${SELF_TEST_DIR}/IntrospectiveTests/Algorithms.tests.cpp
7374
${SELF_TEST_DIR}/IntrospectiveTests/AssertionHandler.tests.cpp
7475
${SELF_TEST_DIR}/IntrospectiveTests/Clara.tests.cpp
@@ -370,6 +371,14 @@ set_tests_properties(VersionCheck PROPERTIES PASS_REGULAR_EXPRESSION "Catch2 v${
370371
add_test(NAME LibIdentityTest COMMAND $<TARGET_FILE:SelfTest> --libidentify)
371372
set_tests_properties(LibIdentityTest PROPERTIES PASS_REGULAR_EXPRESSION "description: A Catch2 test executable")
372373

374+
add_test(NAME BazelEnvSeedTest
375+
COMMAND $<TARGET_FILE:SelfTest> "[bazel-seed]"
376+
)
377+
set_tests_properties(BazelEnvSeedTest PROPERTIES
378+
ENVIRONMENT "TEST_RANDOM_SEED=12345"
379+
COST 1
380+
)
381+
373382
add_test(NAME FilenameAsTagsTest COMMAND $<TARGET_FILE:SelfTest> -\# --list-tags)
374383
set_tests_properties(FilenameAsTagsTest PROPERTIES PASS_REGULAR_EXPRESSION "\\[#Approx.tests\\]")
375384

tests/SelfTest/Baselines/automake.sw.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -144,6 +144,7 @@ Nor would this
144144
:test-result: FAIL EndsWith string matcher
145145
:test-result: PASS Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
146146
:test-result: PASS Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
147+
:test-result: PASS Env TEST_RANDOM_SEED sets seed when CLI not provided
147148
:test-result: PASS Epsilon only applies to Approx's value
148149
:test-result: XFAIL Equality checks that should fail
149150
:test-result: PASS Equality checks that should succeed

tests/SelfTest/Baselines/automake.sw.multi.approved.txt

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -142,6 +142,7 @@
142142
:test-result: FAIL EndsWith string matcher
143143
:test-result: PASS Enums can quickly have stringification enabled using CATCH_REGISTER_ENUM
144144
:test-result: PASS Enums in namespaces can quickly have stringification enabled using CATCH_REGISTER_ENUM
145+
:test-result: PASS Env TEST_RANDOM_SEED sets seed when CLI not provided
145146
:test-result: PASS Epsilon only applies to Approx's value
146147
:test-result: XFAIL Equality checks that should fail
147148
:test-result: PASS Equality checks that should succeed

tests/SelfTest/Baselines/compact.sw.approved.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -580,6 +580,7 @@ EnumToString.tests.cpp:<line number>: passed: stringify( EnumClass3::Value4 ) ==
580580
EnumToString.tests.cpp:<line number>: passed: stringify( ec3 ) == "Value2" for: "Value2" == "Value2"
581581
EnumToString.tests.cpp:<line number>: passed: stringify( Bikeshed::Colours::Red ) == "Red" for: "Red" == "Red"
582582
EnumToString.tests.cpp:<line number>: passed: stringify( Bikeshed::Colours::Blue ) == "Blue" for: "Blue" == "Blue"
583+
BazelEnvSeed.tests.cpp:<line number>: passed: with 1 message: 'TEST_RANDOM_SEED not set; skipping env-specific check'
583584
Approx.tests.cpp:<line number>: passed: 101.01 != Approx(100).epsilon(0.01) for: 101.01000000000000512 != Approx( 100.0 )
584585
Condition.tests.cpp:<line number>: failed: data.int_seven == 6 for: 7 == 6
585586
Condition.tests.cpp:<line number>: failed: data.int_seven == 8 for: 7 == 8
@@ -2888,7 +2889,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
28882889
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
28892890
Misc.tests.cpp:<line number>: passed:
28902891
Misc.tests.cpp:<line number>: passed:
2891-
test cases: 435 | 317 passed | 95 failed | 6 skipped | 17 failed as expected
2892-
assertions: 2303 | 2105 passed | 157 failed | 41 failed as expected
2892+
test cases: 436 | 318 passed | 95 failed | 6 skipped | 17 failed as expected
2893+
assertions: 2304 | 2106 passed | 157 failed | 41 failed as expected
28932894

28942895

tests/SelfTest/Baselines/compact.sw.multi.approved.txt

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -578,6 +578,7 @@ EnumToString.tests.cpp:<line number>: passed: stringify( EnumClass3::Value4 ) ==
578578
EnumToString.tests.cpp:<line number>: passed: stringify( ec3 ) == "Value2" for: "Value2" == "Value2"
579579
EnumToString.tests.cpp:<line number>: passed: stringify( Bikeshed::Colours::Red ) == "Red" for: "Red" == "Red"
580580
EnumToString.tests.cpp:<line number>: passed: stringify( Bikeshed::Colours::Blue ) == "Blue" for: "Blue" == "Blue"
581+
BazelEnvSeed.tests.cpp:<line number>: passed: with 1 message: 'TEST_RANDOM_SEED not set; skipping env-specific check'
581582
Approx.tests.cpp:<line number>: passed: 101.01 != Approx(100).epsilon(0.01) for: 101.01000000000000512 != Approx( 100.0 )
582583
Condition.tests.cpp:<line number>: failed: data.int_seven == 6 for: 7 == 6
583584
Condition.tests.cpp:<line number>: failed: data.int_seven == 8 for: 7 == 8
@@ -2877,7 +2878,7 @@ InternalBenchmark.tests.cpp:<line number>: passed: med == 18. for: 18.0 == 18.0
28772878
InternalBenchmark.tests.cpp:<line number>: passed: q3 == 23. for: 23.0 == 23.0
28782879
Misc.tests.cpp:<line number>: passed:
28792880
Misc.tests.cpp:<line number>: passed:
2880-
test cases: 435 | 317 passed | 95 failed | 6 skipped | 17 failed as expected
2881-
assertions: 2303 | 2105 passed | 157 failed | 41 failed as expected
2881+
test cases: 436 | 318 passed | 95 failed | 6 skipped | 17 failed as expected
2882+
assertions: 2304 | 2106 passed | 157 failed | 41 failed as expected
28822883

28832884

tests/SelfTest/Baselines/console.std.approved.txt

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1719,6 +1719,6 @@ due to unexpected exception with message:
17191719
Why would you throw a std::string?
17201720

17211721
===============================================================================
1722-
test cases: 435 | 335 passed | 76 failed | 7 skipped | 17 failed as expected
1723-
assertions: 2282 | 2105 passed | 136 failed | 41 failed as expected
1722+
test cases: 436 | 336 passed | 76 failed | 7 skipped | 17 failed as expected
1723+
assertions: 2283 | 2106 passed | 136 failed | 41 failed as expected
17241724

tests/SelfTest/Baselines/console.sw.approved.txt

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -4259,6 +4259,16 @@ EnumToString.tests.cpp:<line number>: PASSED:
42594259
with expansion:
42604260
"Blue" == "Blue"
42614261

4262+
-------------------------------------------------------------------------------
4263+
Env TEST_RANDOM_SEED sets seed when CLI not provided
4264+
-------------------------------------------------------------------------------
4265+
BazelEnvSeed.tests.cpp:<line number>
4266+
...............................................................................
4267+
4268+
BazelEnvSeed.tests.cpp:<line number>: PASSED:
4269+
with message:
4270+
TEST_RANDOM_SEED not set; skipping env-specific check
4271+
42624272
-------------------------------------------------------------------------------
42634273
Epsilon only applies to Approx's value
42644274
-------------------------------------------------------------------------------
@@ -19295,6 +19305,6 @@ Misc.tests.cpp:<line number>
1929519305
Misc.tests.cpp:<line number>: PASSED:
1929619306

1929719307
===============================================================================
19298-
test cases: 435 | 317 passed | 95 failed | 6 skipped | 17 failed as expected
19299-
assertions: 2303 | 2105 passed | 157 failed | 41 failed as expected
19308+
test cases: 436 | 318 passed | 95 failed | 6 skipped | 17 failed as expected
19309+
assertions: 2304 | 2106 passed | 157 failed | 41 failed as expected
1930019310

0 commit comments

Comments
 (0)