mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Introduce Catch's own RNG based on the PCG family of RNGs
In the future, we will also want to introduce our own `uniform_int_distribution` and `uniform_real_distribution` to get repeatable test runs across different platforms.
This commit is contained in:
		| @@ -7,6 +7,7 @@ | ||||
|  */ | ||||
| #include "catch_context.h" | ||||
| #include "catch_common.h" | ||||
| #include "catch_random_number_generator.h" | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
| @@ -59,4 +60,11 @@ namespace Catch { | ||||
|     IContext::~IContext() = default; | ||||
|     IMutableContext::~IMutableContext() = default; | ||||
|     Context::~Context() = default; | ||||
|  | ||||
|  | ||||
|     SimplePcg32& rng() { | ||||
|         static SimplePcg32 s_rng; | ||||
|         return s_rng; | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -55,6 +55,9 @@ namespace Catch { | ||||
|     } | ||||
|  | ||||
|     void cleanUpContext(); | ||||
|  | ||||
|     class SimplePcg32; | ||||
|     SimplePcg32& rng(); | ||||
| } | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_CONTEXT_H_INCLUDED | ||||
|   | ||||
| @@ -7,23 +7,67 @@ | ||||
|  | ||||
| #include "catch_random_number_generator.h" | ||||
| #include "catch_context.h" | ||||
| #include "catch_run_context.h" | ||||
| #include "catch_interfaces_config.h" | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     std::mt19937& rng() { | ||||
|         static std::mt19937 s_rng; | ||||
|         return s_rng; | ||||
| namespace { | ||||
|  | ||||
| #if defined(_MSC_VER) | ||||
| #pragma warning(push) | ||||
| #pragma warning(disable:4146) // we negate uint32 during the rotate | ||||
| #endif | ||||
|         // Safe rotr implementation thanks to John Regehr | ||||
|         uint32_t rotate_right(uint32_t val, uint32_t count) { | ||||
|             const uint32_t mask = 31; | ||||
|             count &= mask; | ||||
|             return (val >> count) | (val << (-count & mask)); | ||||
|         } | ||||
|  | ||||
| #if defined(_MSC_VER) | ||||
| #pragma warning(pop) | ||||
| #endif | ||||
|  | ||||
| } | ||||
|  | ||||
|  | ||||
|     SimplePcg32::SimplePcg32(result_type seed_) { | ||||
|         seed(seed_); | ||||
|     } | ||||
|  | ||||
|     void seedRng( IConfig const& config ) { | ||||
|         if( config.rngSeed() != 0 ) { | ||||
|             std::srand( config.rngSeed() ); | ||||
|             rng().seed( config.rngSeed() ); | ||||
|  | ||||
|     void SimplePcg32::seed(result_type seed_) { | ||||
|         m_state = 0; | ||||
|         (*this)(); | ||||
|         m_state += seed_; | ||||
|         (*this)(); | ||||
|     } | ||||
|  | ||||
|     void SimplePcg32::discard(uint64_t skip) { | ||||
|         // We could implement this to run in O(log n) steps, but this | ||||
|         // should suffice for our use case. | ||||
|         for (uint64_t s = 0; s < skip; ++s) { | ||||
|             static_cast<void>((*this)()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     unsigned int rngSeed() { | ||||
|         return getCurrentContext().getConfig()->rngSeed(); | ||||
|     SimplePcg32::result_type SimplePcg32::operator()() { | ||||
|         // prepare the output value | ||||
|         const uint32_t xorshifted = static_cast<uint32_t>(((m_state >> 18u) ^ m_state) >> 27u); | ||||
|         const auto output = rotate_right(xorshifted, m_state >> 59u); | ||||
|  | ||||
|         // advance state | ||||
|         m_state = m_state * 6364136223846793005ULL + s_inc; | ||||
|  | ||||
|         return output; | ||||
|     } | ||||
|  | ||||
|     bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { | ||||
|         return lhs.m_state == rhs.m_state; | ||||
|     } | ||||
|  | ||||
|     bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs) { | ||||
|         return lhs.m_state != rhs.m_state; | ||||
|     } | ||||
| } | ||||
|   | ||||
| @@ -7,17 +7,52 @@ | ||||
| #ifndef TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED | ||||
| #define TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED | ||||
|  | ||||
| #include <algorithm> | ||||
| #include <random> | ||||
| #include <cstdint> | ||||
|  | ||||
| namespace Catch { | ||||
|  | ||||
|     struct IConfig; | ||||
|     // This is a simple implementation of C++11 Uniform Random Number | ||||
|     // Generator. It does not provide all operators, because Catch2 | ||||
|     // does not use it, but it should behave as expected inside stdlib's | ||||
|     // distributions. | ||||
|     // The implementation is based on the PCG family (http://pcg-random.org) | ||||
|     class SimplePcg32 { | ||||
|         using state_type = std::uint64_t; | ||||
|     public: | ||||
|         using result_type = std::uint32_t; | ||||
|         static constexpr result_type min() { | ||||
|             return 0; | ||||
|         } | ||||
|         static constexpr result_type max() { | ||||
|             return static_cast<result_type>(-1); | ||||
|         } | ||||
|  | ||||
|     std::mt19937& rng(); | ||||
|     void seedRng( IConfig const& config ); | ||||
|     unsigned int rngSeed(); | ||||
|         // Provide some default initial state for the default constructor | ||||
|         SimplePcg32():SimplePcg32(0xed743cc4U) {} | ||||
|  | ||||
| } | ||||
|         explicit SimplePcg32(result_type seed_); | ||||
|  | ||||
|         void seed(result_type seed_); | ||||
|         void discard(uint64_t skip); | ||||
|  | ||||
|         result_type operator()(); | ||||
|  | ||||
|     private: | ||||
|         friend bool operator==(SimplePcg32 const& lhs, SimplePcg32 const& rhs); | ||||
|         friend bool operator!=(SimplePcg32 const& lhs, SimplePcg32 const& rhs); | ||||
|  | ||||
|         // In theory we also need operator<< and operator>> | ||||
|         // In practice we do not use them, so we will skip them for now | ||||
|  | ||||
|  | ||||
|         std::uint64_t m_state; | ||||
|         // This part of the state determines which "stream" of the numbers | ||||
|         // is chosen -- we take it as a constant for Catch2, so we only | ||||
|         // need to deal with seeding the main state. | ||||
|         // Picked by reading 8 bytes from `/dev/random` :-) | ||||
|         static const std::uint64_t s_inc = (0x13ed0cc53f939476ULL << 1ULL) | 1ULL; | ||||
|     }; | ||||
|  | ||||
| } // end namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_RANDOM_NUMBER_GENERATOR_H_INCLUDED | ||||
|   | ||||
| @@ -506,4 +506,16 @@ namespace Catch { | ||||
|         else | ||||
|             CATCH_INTERNAL_ERROR("No result capture instance"); | ||||
|     } | ||||
|  | ||||
|     void seedRng(IConfig const& config) { | ||||
|         if (config.rngSeed() != 0) { | ||||
|             std::srand(config.rngSeed()); | ||||
|             rng().seed(config.rngSeed()); | ||||
|         } | ||||
|     } | ||||
|  | ||||
|     unsigned int rngSeed() { | ||||
|         return getCurrentContext().getConfig()->rngSeed(); | ||||
|     } | ||||
|  | ||||
| } | ||||
|   | ||||
| @@ -151,6 +151,8 @@ namespace Catch { | ||||
|         bool m_includeSuccessfulResults; | ||||
|     }; | ||||
|  | ||||
|     void seedRng(IConfig const& config); | ||||
|     unsigned int rngSeed(); | ||||
| } // end namespace Catch | ||||
|  | ||||
| #endif // TWOBLUECUBES_CATCH_RUNNER_IMPL_HPP_INCLUDED | ||||
|   | ||||
| @@ -11,6 +11,7 @@ | ||||
| #include "catch_enforce.h" | ||||
| #include "catch_interfaces_registry_hub.h" | ||||
| #include "catch_random_number_generator.h" | ||||
| #include "catch_run_context.h" | ||||
| #include "catch_string_manip.h" | ||||
| #include "catch_test_case_info.h" | ||||
|  | ||||
|   | ||||
| @@ -21,6 +21,7 @@ set(TEST_SOURCES | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/GeneratorsImpl.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/InternalBenchmark.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/PartTracker.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/RandomNumberGeneration.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/Tag.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/String.tests.cpp | ||||
|         ${SELF_TEST_DIR}/IntrospectiveTests/StringManip.tests.cpp | ||||
|   | ||||
| @@ -276,6 +276,10 @@ Tricky.tests.cpp:<line number>: passed: true | ||||
| Tricky.tests.cpp:<line number>: passed: std::vector<int>{1, 2} == std::vector<int>{1, 2} for: { 1, 2 } == { 1, 2 } | ||||
| Tricky.tests.cpp:<line number>: passed: a for: 0x<hex digits> | ||||
| Tricky.tests.cpp:<line number>: passed: a == &foo for: 0x<hex digits> == 0x<hex digits> | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: SimplePcg32{} == SimplePcg32{} for: {?} == {?} | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: SimplePcg32{ 0 } != SimplePcg32{} for: {?} != {?} | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: !(SimplePcg32{ 1 } == SimplePcg32{ 2 }) for: !({?} == {?}) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: !(SimplePcg32{ 1 } != SimplePcg32{ 1 }) for: !({?} != {?}) | ||||
| Approx.tests.cpp:<line number>: passed: td == Approx(10.0) for: StrongDoubleTypedef(10) == Approx( 10.0 ) | ||||
| Approx.tests.cpp:<line number>: passed: Approx(10.0) == td for: Approx( 10.0 ) == StrongDoubleTypedef(10) | ||||
| Approx.tests.cpp:<line number>: passed: td != Approx(11.0) for: StrongDoubleTypedef(10) != Approx( 11.0 ) | ||||
| @@ -731,6 +735,51 @@ Condition.tests.cpp:<line number>: passed: data.str_hello < "hellp" for: "hello" | ||||
| Condition.tests.cpp:<line number>: passed: data.str_hello < "zebra" for: "hello" < "zebra" | ||||
| Condition.tests.cpp:<line number>: passed: data.str_hello > "hellm" for: "hello" > "hellm" | ||||
| Condition.tests.cpp:<line number>: passed: data.str_hello > "a" for: "hello" > "a" | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 4242248763 (0x<hex digits>) | ||||
| == | ||||
| 4242248763 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1867888929 (0x<hex digits>) | ||||
| == | ||||
| 1867888929 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1276619030 (0x<hex digits>) | ||||
| == | ||||
| 1276619030 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1911218783 (0x<hex digits>) | ||||
| == | ||||
| 1911218783 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1827115164 (0x<hex digits>) | ||||
| == | ||||
| 1827115164 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1472234645 (0x<hex digits>) | ||||
| == | ||||
| 1472234645 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 868832940 (0x<hex digits>) | ||||
| == | ||||
| 868832940 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 570883446 (0x<hex digits>) | ||||
| == | ||||
| 570883446 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 889299803 (0x<hex digits>) | ||||
| == | ||||
| 889299803 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 4261393167 (0x<hex digits>) | ||||
| == | ||||
| 4261393167 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 1472234645 (0x<hex digits>) | ||||
| == | ||||
| 1472234645 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 868832940 (0x<hex digits>) | ||||
| == | ||||
| 868832940 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 570883446 (0x<hex digits>) | ||||
| == | ||||
| 570883446 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 889299803 (0x<hex digits>) | ||||
| == | ||||
| 889299803 (0x<hex digits>) | ||||
| RandomNumberGeneration.tests.cpp:<line number>: passed: rng() == 0x<hex digits> for: 4261393167 (0x<hex digits>) | ||||
| == | ||||
| 4261393167 (0x<hex digits>) | ||||
| Message.tests.cpp:<line number>: failed: explicitly with 1 message: 'Message from section one' | ||||
| Message.tests.cpp:<line number>: failed: explicitly with 1 message: 'Message from section two' | ||||
| CmdLine.tests.cpp:<line number>: passed: spec.hasFilters() == false for: false == false | ||||
|   | ||||
| @@ -1380,6 +1380,6 @@ due to unexpected exception with message: | ||||
|   Why would you throw a std::string? | ||||
|  | ||||
| =============================================================================== | ||||
| test cases:  301 |  227 passed |  70 failed |  4 failed as expected | ||||
| assertions: 1570 | 1418 passed | 131 failed | 21 failed as expected | ||||
| test cases:  303 |  229 passed |  70 failed |  4 failed as expected | ||||
| assertions: 1589 | 1437 passed | 131 failed | 21 failed as expected | ||||
|  | ||||
|   | ||||
| @@ -2179,6 +2179,32 @@ Tricky.tests.cpp:<line number>: PASSED: | ||||
| with expansion: | ||||
|   0x<hex digits> == 0x<hex digits> | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Comparison ops | ||||
| ------------------------------------------------------------------------------- | ||||
| RandomNumberGeneration.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( SimplePcg32{} == SimplePcg32{} ) | ||||
| with expansion: | ||||
|   {?} == {?} | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( SimplePcg32{ 0 } != SimplePcg32{} ) | ||||
| with expansion: | ||||
|   {?} != {?} | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE_FALSE( SimplePcg32{ 1 } == SimplePcg32{ 2 } ) | ||||
| with expansion: | ||||
|   !({?} == {?}) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE_FALSE( SimplePcg32{ 1 } != SimplePcg32{ 1 } ) | ||||
| with expansion: | ||||
|   !({?} != {?}) | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Comparison with explicitly convertible types | ||||
| ------------------------------------------------------------------------------- | ||||
| @@ -5494,6 +5520,125 @@ Condition.tests.cpp:<line number>: PASSED: | ||||
| with expansion: | ||||
|   "hello" > "a" | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Our PCG implementation provides expected results for known seeds | ||||
|   Default seeded | ||||
| ------------------------------------------------------------------------------- | ||||
| RandomNumberGeneration.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   4242248763 (0x<hex digits>) | ||||
|   == | ||||
|   4242248763 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1867888929 (0x<hex digits>) | ||||
|   == | ||||
|   1867888929 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1276619030 (0x<hex digits>) | ||||
|   == | ||||
|   1276619030 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1911218783 (0x<hex digits>) | ||||
|   == | ||||
|   1911218783 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1827115164 (0x<hex digits>) | ||||
|   == | ||||
|   1827115164 (0x<hex digits>) | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Our PCG implementation provides expected results for known seeds | ||||
|   Specific seed | ||||
| ------------------------------------------------------------------------------- | ||||
| RandomNumberGeneration.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1472234645 (0x<hex digits>) | ||||
|   == | ||||
|   1472234645 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   868832940 (0x<hex digits>) | ||||
|   == | ||||
|   868832940 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   570883446 (0x<hex digits>) | ||||
|   == | ||||
|   570883446 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   889299803 (0x<hex digits>) | ||||
|   == | ||||
|   889299803 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   4261393167 (0x<hex digits>) | ||||
|   == | ||||
|   4261393167 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   1472234645 (0x<hex digits>) | ||||
|   == | ||||
|   1472234645 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   868832940 (0x<hex digits>) | ||||
|   == | ||||
|   868832940 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   570883446 (0x<hex digits>) | ||||
|   == | ||||
|   570883446 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   889299803 (0x<hex digits>) | ||||
|   == | ||||
|   889299803 (0x<hex digits>) | ||||
|  | ||||
| RandomNumberGeneration.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( rng() == 0x<hex digits> ) | ||||
| with expansion: | ||||
|   4261393167 (0x<hex digits>) | ||||
|   == | ||||
|   4261393167 (0x<hex digits>) | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Output from all sections is reported | ||||
|   one | ||||
| @@ -12565,6 +12710,6 @@ Misc.tests.cpp:<line number> | ||||
| Misc.tests.cpp:<line number>: PASSED: | ||||
|  | ||||
| =============================================================================== | ||||
| test cases:  301 |  211 passed |  86 failed |  4 failed as expected | ||||
| assertions: 1587 | 1418 passed | 148 failed | 21 failed as expected | ||||
| test cases:  303 |  213 passed |  86 failed |  4 failed as expected | ||||
| assertions: 1606 | 1437 passed | 148 failed | 21 failed as expected | ||||
|  | ||||
|   | ||||
| @@ -1,7 +1,7 @@ | ||||
| <?xml version="1.0" encoding="UTF-8"?> | ||||
| <testsuitesloose text artifact | ||||
| > | ||||
|   <testsuite name="<exe-name>" errors="17" failures="132" tests="1588" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||
|   <testsuite name="<exe-name>" errors="17" failures="132" tests="1607" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||
|     <properties> | ||||
|       <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals]"/> | ||||
|       <property name="random-seed" value="1"/> | ||||
| @@ -242,6 +242,7 @@ Exception.tests.cpp:<line number> | ||||
|     <testcase classname="<exe-name>.global" name="Character pretty printing/Low ASCII" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Commas in various macros are allowed" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Comparing function pointers" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Comparison ops" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Comparison with explicitly convertible types" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Comparisons between ints where one side is computed" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Comparisons between unsigned ints and negative signed ints match c++ standard behaviour" time="{duration}"/> | ||||
| @@ -577,6 +578,8 @@ Condition.tests.cpp:<line number> | ||||
|       </failure> | ||||
|     </testcase> | ||||
|     <testcase classname="<exe-name>.global" name="Ordering comparison checks that should succeed" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Our PCG implementation provides expected results for known seeds/Default seeded" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Our PCG implementation provides expected results for known seeds/Specific seed" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Output from all sections is reported/one" time="{duration}"> | ||||
|       <failure type="FAIL"> | ||||
| Message from section one | ||||
|   | ||||
| @@ -2529,6 +2529,41 @@ Nor would this | ||||
|       </Expression> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Comparison ops" tags="[rng]" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|       <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Original> | ||||
|           SimplePcg32{} == SimplePcg32{} | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           {?} == {?} | ||||
|         </Expanded> | ||||
|       </Expression> | ||||
|       <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Original> | ||||
|           SimplePcg32{ 0 } != SimplePcg32{} | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           {?} != {?} | ||||
|         </Expanded> | ||||
|       </Expression> | ||||
|       <Expression success="true" type="REQUIRE_FALSE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Original> | ||||
|           !(SimplePcg32{ 1 } == SimplePcg32{ 2 }) | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           !({?} == {?}) | ||||
|         </Expanded> | ||||
|       </Expression> | ||||
|       <Expression success="true" type="REQUIRE_FALSE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Original> | ||||
|           !(SimplePcg32{ 1 } != SimplePcg32{ 1 }) | ||||
|         </Original> | ||||
|         <Expanded> | ||||
|           !({?} != {?}) | ||||
|         </Expanded> | ||||
|       </Expression> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Comparison with explicitly convertible types" tags="[Approx]" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" > | ||||
|       <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Approx.tests.cpp" > | ||||
|         <Original> | ||||
| @@ -6728,6 +6763,165 @@ Nor would this | ||||
|       </Expression> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Our PCG implementation provides expected results for known seeds" tags="[rng]" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|       <Section name="Default seeded" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             4242248763 (0x<hex digits>) | ||||
| == | ||||
| 4242248763 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1867888929 (0x<hex digits>) | ||||
| == | ||||
| 1867888929 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1276619030 (0x<hex digits>) | ||||
| == | ||||
| 1276619030 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1911218783 (0x<hex digits>) | ||||
| == | ||||
| 1911218783 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1827115164 (0x<hex digits>) | ||||
| == | ||||
| 1827115164 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <OverallResults successes="5" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Specific seed" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1472234645 (0x<hex digits>) | ||||
| == | ||||
| 1472234645 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             868832940 (0x<hex digits>) | ||||
| == | ||||
| 868832940 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             570883446 (0x<hex digits>) | ||||
| == | ||||
| 570883446 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             889299803 (0x<hex digits>) | ||||
| == | ||||
| 889299803 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             4261393167 (0x<hex digits>) | ||||
| == | ||||
| 4261393167 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             1472234645 (0x<hex digits>) | ||||
| == | ||||
| 1472234645 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             868832940 (0x<hex digits>) | ||||
| == | ||||
| 868832940 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             570883446 (0x<hex digits>) | ||||
| == | ||||
| 570883446 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             889299803 (0x<hex digits>) | ||||
| == | ||||
| 889299803 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/IntrospectiveTests/RandomNumberGeneration.tests.cpp" > | ||||
|           <Original> | ||||
|             rng() == 0x<hex digits> | ||||
|           </Original> | ||||
|           <Expanded> | ||||
|             4261393167 (0x<hex digits>) | ||||
| == | ||||
| 4261393167 (0x<hex digits>) | ||||
|           </Expanded> | ||||
|         </Expression> | ||||
|         <OverallResults successes="10" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Output from all sections is reported" tags="[.][failing][messages]" filename="projects/<exe-name>/UsageTests/Message.tests.cpp" > | ||||
|       <Section name="one" filename="projects/<exe-name>/UsageTests/Message.tests.cpp" > | ||||
|         <Failure filename="projects/<exe-name>/UsageTests/Message.tests.cpp" > | ||||
| @@ -14923,7 +15117,7 @@ loose text artifact | ||||
|       </Section> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <OverallResults successes="1418" failures="149" expectedFailures="21"/> | ||||
|     <OverallResults successes="1437" failures="149" expectedFailures="21"/> | ||||
|   </Group> | ||||
|   <OverallResults successes="1418" failures="148" expectedFailures="21"/> | ||||
|   <OverallResults successes="1437" failures="148" expectedFailures="21"/> | ||||
| </Catch> | ||||
|   | ||||
| @@ -0,0 +1,45 @@ | ||||
| /* | ||||
|  *  Created by Martin on 06/10/2019. | ||||
|  * | ||||
|  *  Distributed under the Boost Software License, Version 1.0. (See accompanying | ||||
|  *  file LICENSE_1_0.txt or copy at http://www.boost.org/LICENSE_1_0.txt) | ||||
|  */ | ||||
|  | ||||
| #include "catch.hpp" | ||||
|  | ||||
| #include "internal/catch_random_number_generator.h" | ||||
|  | ||||
| TEST_CASE("Our PCG implementation provides expected results for known seeds", "[rng]") { | ||||
|     Catch::SimplePcg32 rng; | ||||
|     SECTION("Default seeded") { | ||||
|         REQUIRE(rng() == 0xfcdb943b); | ||||
|         REQUIRE(rng() == 0x6f55b921); | ||||
|         REQUIRE(rng() == 0x4c17a916); | ||||
|         REQUIRE(rng() == 0x71eae25f); | ||||
|         REQUIRE(rng() == 0x6ce7909c); | ||||
|     } | ||||
|     SECTION("Specific seed") { | ||||
|         rng.seed(0xabcd1234); | ||||
|         REQUIRE(rng() == 0x57c08495); | ||||
|         REQUIRE(rng() == 0x33c956ac); | ||||
|         REQUIRE(rng() == 0x2206fd76); | ||||
|         REQUIRE(rng() == 0x3501a35b); | ||||
|         REQUIRE(rng() == 0xfdffb30f); | ||||
|  | ||||
|         // Also check repeated output after reseeding | ||||
|         rng.seed(0xabcd1234); | ||||
|         REQUIRE(rng() == 0x57c08495); | ||||
|         REQUIRE(rng() == 0x33c956ac); | ||||
|         REQUIRE(rng() == 0x2206fd76); | ||||
|         REQUIRE(rng() == 0x3501a35b); | ||||
|         REQUIRE(rng() == 0xfdffb30f); | ||||
|     } | ||||
| } | ||||
|  | ||||
| TEST_CASE("Comparison ops", "[rng]") { | ||||
|     using Catch::SimplePcg32; | ||||
|     REQUIRE(SimplePcg32{} == SimplePcg32{}); | ||||
|     REQUIRE(SimplePcg32{ 0 } != SimplePcg32{}); | ||||
|     REQUIRE_FALSE(SimplePcg32{ 1 } == SimplePcg32{ 2 }); | ||||
|     REQUIRE_FALSE(SimplePcg32{ 1 } != SimplePcg32{ 1 }); | ||||
| } | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský