diff --git a/docs/deprecations.md b/docs/deprecations.md index 20312cd5..b7efa862 100644 --- a/docs/deprecations.md +++ b/docs/deprecations.md @@ -48,6 +48,21 @@ If you are mutating the fixture instance from within the test case, and want to keep doing so in the future, mark the mutated members as `mutable`. +### Generator interfaces + +#### Defaulted `UntypedGeneratorBase::isFinite()` + +> Deprecated in Catch2 vX.Y.Z + +The `UntypedGeneratorBase` currently provides a default implementation +for `isFinite` that always returns `true`. This was done to keep backwards +compatibility with pre-existing generators, as infinite generators can +be diagnosed as errors in some cases. + +In the future, all generators will be expected to override `isFinite`. + + + --- [Home](Readme.md#top) diff --git a/docs/generators.md b/docs/generators.md index f45eac06..5db2941b 100644 --- a/docs/generators.md +++ b/docs/generators.md @@ -276,11 +276,22 @@ struct IGenerator : GeneratorUntypedBase { * Going backwards is not supported. */ virtual void skipToNthElementImpl( std::size_t n ); + + /** + * Returns true if calls to `next` will eventually return false + * + * Note that for backwards compatibility this is currently defaulted + * to return `true`, but in the future all generators will have to + * provide their own implementation. + */ + virtual bool isFinite() const = 0; }; ``` > `skipToNthElementImpl` was added in Catch2 vX.Y.Z +> `isFinite` was added in Catch2 vX.Y.Z + However, to be able to use your custom generator inside `GENERATE`, it will need to be wrapped inside a `GeneratorWrapper`. `GeneratorWrapper` is a value wrapper around a diff --git a/examples/300-Gen-OwnGenerator.cpp b/examples/300-Gen-OwnGenerator.cpp index b7f9d5da..ff28ad73 100644 --- a/examples/300-Gen-OwnGenerator.cpp +++ b/examples/300-Gen-OwnGenerator.cpp @@ -40,6 +40,8 @@ public: return true; } + bool isFinite() const override { return false; } + // Note: this improves the performance only a bit, but it is here // to show how you can override the skip functionality. void skipToNthElementImpl( std::size_t n ) override { diff --git a/examples/301-Gen-MapTypeConversion.cpp b/examples/301-Gen-MapTypeConversion.cpp index 0a284483..26f7538c 100644 --- a/examples/301-Gen-MapTypeConversion.cpp +++ b/examples/301-Gen-MapTypeConversion.cpp @@ -40,6 +40,8 @@ public: bool next() override { return !!std::getline(m_stream, m_line); } + + bool isFinite() const override { return true; } }; std::string const& LineGenerator::get() const { diff --git a/src/catch2/generators/catch_generators.hpp b/src/catch2/generators/catch_generators.hpp index e64f9b5f..719775fb 100644 --- a/src/catch2/generators/catch_generators.hpp +++ b/src/catch2/generators/catch_generators.hpp @@ -64,6 +64,8 @@ namespace Detail { bool next() { return m_generator->countedNext(); } + + bool isFinite() const { return m_generator->isFinite(); } }; @@ -84,6 +86,8 @@ namespace Detail { bool next() override { return false; } + + bool isFinite() const override { return true; } }; template @@ -112,6 +116,8 @@ namespace Detail { ++m_idx; return m_idx < m_values.size(); } + + bool isFinite() const override { return true; } }; template > @@ -176,6 +182,14 @@ namespace Detail { } return m_current < m_generators.size(); } + + bool isFinite() const override { + for (auto const& gen : m_generators) { + if (!gen.isFinite()) { return false; + } + } + return true; + } }; diff --git a/src/catch2/generators/catch_generators_adapters.hpp b/src/catch2/generators/catch_generators_adapters.hpp index 35c103ce..2f6d8ed3 100644 --- a/src/catch2/generators/catch_generators_adapters.hpp +++ b/src/catch2/generators/catch_generators_adapters.hpp @@ -62,6 +62,8 @@ namespace Generators { } return success; } + + bool isFinite() const override { return true; } }; template @@ -103,6 +105,8 @@ namespace Generators { while (!m_predicate(m_generator.get()) && (success = m_generator.next()) == true); return success; } + + bool isFinite() const override { return m_generator.isFinite(); } }; @@ -127,6 +131,9 @@ namespace Generators { m_target_repeats(repeats) { assert(m_target_repeats > 0 && "Repeat generator must repeat at least once"); + if (!m_generator.isFinite()) { + Detail::throw_generator_exception( "Cannot repeat infinite generator" ); + } } T const& get() const override { @@ -160,6 +167,8 @@ namespace Generators { } return m_current_repeat < m_target_repeats; } + + bool isFinite() const override { return m_generator.isFinite(); } }; template @@ -207,6 +216,8 @@ namespace Generators { } return success; } + + bool isFinite() const override { return m_generator.isFinite(); } }; template > @@ -256,6 +267,8 @@ namespace Generators { } return true; } + + bool isFinite() const override { return m_generator.isFinite(); } }; template @@ -297,6 +310,13 @@ namespace Generators { ++m_current_generator; return m_current_generator < m_generators.size(); } + + bool isFinite() const override { + for ( auto const& gen : m_generators ) { + if ( !gen.isFinite() ) { return false; } + } + return true; + } }; template diff --git a/src/catch2/generators/catch_generators_random.cpp b/src/catch2/generators/catch_generators_random.cpp index 00a8e634..d5163c16 100644 --- a/src/catch2/generators/catch_generators_random.cpp +++ b/src/catch2/generators/catch_generators_random.cpp @@ -37,5 +37,10 @@ namespace Catch { m_current_number = m_pimpl->dist( m_pimpl->rng ); return true; } + + bool RandomFloatingGenerator::isFinite() const { + return false; + } + } // namespace Generators } // namespace Catch diff --git a/src/catch2/generators/catch_generators_random.hpp b/src/catch2/generators/catch_generators_random.hpp index 71283561..e0287360 100644 --- a/src/catch2/generators/catch_generators_random.hpp +++ b/src/catch2/generators/catch_generators_random.hpp @@ -42,6 +42,7 @@ public: m_current_number = m_dist(m_rng); return true; } + bool isFinite() const override { return false; } }; template <> @@ -59,6 +60,7 @@ public: bool next() override; ~RandomFloatingGenerator() override; // = default + bool isFinite() const override; }; template @@ -80,6 +82,7 @@ public: m_current_number = m_dist(m_rng); return true; } + bool isFinite() const override { return false; } }; template diff --git a/src/catch2/generators/catch_generators_range.hpp b/src/catch2/generators/catch_generators_range.hpp index 55d673c2..62739b23 100644 --- a/src/catch2/generators/catch_generators_range.hpp +++ b/src/catch2/generators/catch_generators_range.hpp @@ -48,6 +48,8 @@ public: m_current += m_step; return (m_positive) ? (m_current < m_end) : (m_current > m_end); } + + bool isFinite() const override { return true; } }; template @@ -87,6 +89,8 @@ public: ++m_current; return m_current != m_elems.size(); } + + bool isFinite() const override { return true; } }; template ; diff --git a/tests/SelfTest/Baselines/automake.sw.approved.txt b/tests/SelfTest/Baselines/automake.sw.approved.txt index 314feb2f..bc019b38 100644 --- a/tests/SelfTest/Baselines/automake.sw.approved.txt +++ b/tests/SelfTest/Baselines/automake.sw.approved.txt @@ -169,6 +169,7 @@ Nor would this :test-result: PASS Floating point matchers: double :test-result: PASS Floating point matchers: float :test-result: PASS GENERATE can combine literals and generators +:test-result: PASS Generator adapters properly handle isFinite :test-result: PASS Generators -- adapters :test-result: PASS Generators -- simple :test-result: PASS Generators can be skipped forward @@ -226,11 +227,15 @@ Nor would this :test-result: PASS Product with differing arities - std::tuple :test-result: PASS Random seed generation accepts known methods :test-result: PASS Random seed generation reports unknown methods +:test-result: PASS RandomGenerator reports itself as infinite - float +:test-result: PASS RandomGenerator reports itself as infinite - int +:test-result: PASS RandomGenerator reports itself as infinite - long double :test-result: PASS Range type with sentinel :test-result: FAIL Reconstruction should be based on stringification: #914 :test-result: FAIL Regex string matcher :test-result: PASS Registering reporter with '::' in name fails :test-result: PASS Regression test #1 +:test-result: PASS RepeatGenerator refuses infinite generators :test-result: PASS Reporter's write listings to provided stream :test-result: PASS Reproducer for #2309 - a very long description past 80 chars (default console width) with a late colon : blablabla :test-result: PASS SUCCEED counts as a test pass diff --git a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt index e646593d..3079c349 100644 --- a/tests/SelfTest/Baselines/automake.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/automake.sw.multi.approved.txt @@ -167,6 +167,7 @@ :test-result: PASS Floating point matchers: double :test-result: PASS Floating point matchers: float :test-result: PASS GENERATE can combine literals and generators +:test-result: PASS Generator adapters properly handle isFinite :test-result: PASS Generators -- adapters :test-result: PASS Generators -- simple :test-result: PASS Generators can be skipped forward @@ -224,11 +225,15 @@ :test-result: PASS Product with differing arities - std::tuple :test-result: PASS Random seed generation accepts known methods :test-result: PASS Random seed generation reports unknown methods +:test-result: PASS RandomGenerator reports itself as infinite - float +:test-result: PASS RandomGenerator reports itself as infinite - int +:test-result: PASS RandomGenerator reports itself as infinite - long double :test-result: PASS Range type with sentinel :test-result: FAIL Reconstruction should be based on stringification: #914 :test-result: FAIL Regex string matcher :test-result: PASS Registering reporter with '::' in name fails :test-result: PASS Regression test #1 +:test-result: PASS RepeatGenerator refuses infinite generators :test-result: PASS Reporter's write listings to provided stream :test-result: PASS Reproducer for #2309 - a very long description past 80 chars (default console width) with a late colon : blablabla :test-result: PASS SUCCEED counts as a test pass diff --git a/tests/SelfTest/Baselines/compact.sw.approved.txt b/tests/SelfTest/Baselines/compact.sw.approved.txt index 94123b41..f4da808e 100644 --- a/tests/SelfTest/Baselines/compact.sw.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.approved.txt @@ -751,6 +751,16 @@ Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 +GeneratorsImpl.tests.cpp:: passed: finite_cat.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_cat.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: take_1.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: take_2.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: finite_chunk.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_chunk.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: finite_map.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_map.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: finite_filter.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_filter.isFinite()) for: !false Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 @@ -1559,6 +1569,9 @@ RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSee RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(method) RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(method) RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(static_cast(77)) +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false ToString.tests.cpp:: passed: Catch::Detail::stringify(UsesSentinel{}) == "{ }" for: "{ }" == "{ }" Decomposition.tests.cpp:: failed: truthy(false) for: Hey, its truthy! Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "this STRING contains 'abc' as a substring" ) for: "this string contains 'abc' as a substring" matches "this STRING contains 'abc' as a substring" case sensitively @@ -1566,6 +1579,7 @@ Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "con Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "this string contains 'abc' as a" ) for: "this string contains 'abc' as a substring" matches "this string contains 'abc' as a" case sensitively Reporters.tests.cpp:: passed: registry.registerReporter( "with::doublecolons", Catch::Detail::make_unique() ), "'::' is not allowed in reporter name: 'with::doublecolons'" for: "'::' is not allowed in reporter name: 'with::doublecolons'" equals: "'::' is not allowed in reporter name: 'with::doublecolons'" Matchers.tests.cpp:: passed: actual, !UnorderedEquals( expected ) for: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +GeneratorsImpl.tests.cpp:: passed: RepeatGenerator( 2, random( 1, 100 ) ) Reporters.tests.cpp:: passed: !(factories.empty()) for: !false Reporters.tests.cpp:: passed: listingString, ContainsSubstring("fakeTag"s) for: "All available tags: 1 [fakeTag] @@ -2946,7 +2960,7 @@ InternalBenchmark.tests.cpp:: passed: med == 18. for: 18.0 == 18.0 InternalBenchmark.tests.cpp:: passed: q3 == 23. for: 23.0 == 23.0 Misc.tests.cpp:: passed: Misc.tests.cpp:: passed: -test cases: 443 | 323 passed | 96 failed | 6 skipped | 18 failed as expected -assertions: 2362 | 2161 passed | 158 failed | 43 failed as expected +test cases: 448 | 328 passed | 96 failed | 6 skipped | 18 failed as expected +assertions: 2376 | 2175 passed | 158 failed | 43 failed as expected diff --git a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt index e44e771d..d6348ab0 100644 --- a/tests/SelfTest/Baselines/compact.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/compact.sw.multi.approved.txt @@ -749,6 +749,16 @@ Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 +GeneratorsImpl.tests.cpp:: passed: finite_cat.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_cat.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: take_1.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: take_2.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: finite_chunk.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_chunk.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: finite_map.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_map.isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: finite_filter.isFinite() for: true +GeneratorsImpl.tests.cpp:: passed: !(infinite_filter.isFinite()) for: !false Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 Generators.tests.cpp:: passed: i % 2 == 0 for: 0 == 0 @@ -1557,6 +1567,9 @@ RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSee RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(method) RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(method) RandomNumberGeneration.tests.cpp:: passed: Catch::generateRandomSeed(static_cast(77)) +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +GeneratorsImpl.tests.cpp:: passed: !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false ToString.tests.cpp:: passed: Catch::Detail::stringify(UsesSentinel{}) == "{ }" for: "{ }" == "{ }" Decomposition.tests.cpp:: failed: truthy(false) for: Hey, its truthy! Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "this STRING contains 'abc' as a substring" ) for: "this string contains 'abc' as a substring" matches "this STRING contains 'abc' as a substring" case sensitively @@ -1564,6 +1577,7 @@ Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "con Matchers.tests.cpp:: failed: testStringForMatching(), Matches( "this string contains 'abc' as a" ) for: "this string contains 'abc' as a substring" matches "this string contains 'abc' as a" case sensitively Reporters.tests.cpp:: passed: registry.registerReporter( "with::doublecolons", Catch::Detail::make_unique() ), "'::' is not allowed in reporter name: 'with::doublecolons'" for: "'::' is not allowed in reporter name: 'with::doublecolons'" equals: "'::' is not allowed in reporter name: 'with::doublecolons'" Matchers.tests.cpp:: passed: actual, !UnorderedEquals( expected ) for: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +GeneratorsImpl.tests.cpp:: passed: RepeatGenerator( 2, random( 1, 100 ) ) Reporters.tests.cpp:: passed: !(factories.empty()) for: !false Reporters.tests.cpp:: passed: listingString, ContainsSubstring("fakeTag"s) for: "All available tags: 1 [fakeTag] @@ -2935,7 +2949,7 @@ InternalBenchmark.tests.cpp:: passed: med == 18. for: 18.0 == 18.0 InternalBenchmark.tests.cpp:: passed: q3 == 23. for: 23.0 == 23.0 Misc.tests.cpp:: passed: Misc.tests.cpp:: passed: -test cases: 443 | 323 passed | 96 failed | 6 skipped | 18 failed as expected -assertions: 2362 | 2161 passed | 158 failed | 43 failed as expected +test cases: 448 | 328 passed | 96 failed | 6 skipped | 18 failed as expected +assertions: 2376 | 2175 passed | 158 failed | 43 failed as expected diff --git a/tests/SelfTest/Baselines/console.std.approved.txt b/tests/SelfTest/Baselines/console.std.approved.txt index 4529fef8..cd178a0c 100644 --- a/tests/SelfTest/Baselines/console.std.approved.txt +++ b/tests/SelfTest/Baselines/console.std.approved.txt @@ -1743,6 +1743,6 @@ due to unexpected exception with message: Why would you throw a std::string? =============================================================================== -test cases: 443 | 341 passed | 76 failed | 7 skipped | 19 failed as expected -assertions: 2340 | 2161 passed | 136 failed | 43 failed as expected +test cases: 448 | 346 passed | 76 failed | 7 skipped | 19 failed as expected +assertions: 2354 | 2175 passed | 136 failed | 43 failed as expected diff --git a/tests/SelfTest/Baselines/console.sw.approved.txt b/tests/SelfTest/Baselines/console.sw.approved.txt index 48a4c85f..f5166de0 100644 --- a/tests/SelfTest/Baselines/console.sw.approved.txt +++ b/tests/SelfTest/Baselines/console.sw.approved.txt @@ -5314,6 +5314,91 @@ Generators.tests.cpp:: PASSED: with expansion: 0 == 0 +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + concat generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_cat.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_cat.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + take generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( take_1.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( take_2.isFinite() ) +with expansion: + true + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + chunk generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_chunk.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_chunk.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + map +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_map.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_map.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + filter +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_filter.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_filter.isFinite() ) +with expansion: + !false + ------------------------------------------------------------------------------- Generators -- adapters Filtering by predicate @@ -10367,6 +10452,39 @@ RandomNumberGeneration.tests.cpp: RandomNumberGeneration.tests.cpp:: PASSED: REQUIRE_THROWS( Catch::generateRandomSeed(static_cast(77)) ) +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - float +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - int +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - long double +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + ------------------------------------------------------------------------------- Range type with sentinel ------------------------------------------------------------------------------- @@ -10436,6 +10554,15 @@ Matchers.tests.cpp:: PASSED: with expansion: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +------------------------------------------------------------------------------- +RepeatGenerator refuses infinite generators +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_THROWS( RepeatGenerator( 2, random( 1, 100 ) ) ) + ------------------------------------------------------------------------------- Reporter's write listings to provided stream ------------------------------------------------------------------------------- @@ -19717,6 +19844,6 @@ Misc.tests.cpp: Misc.tests.cpp:: PASSED: =============================================================================== -test cases: 443 | 323 passed | 96 failed | 6 skipped | 18 failed as expected -assertions: 2362 | 2161 passed | 158 failed | 43 failed as expected +test cases: 448 | 328 passed | 96 failed | 6 skipped | 18 failed as expected +assertions: 2376 | 2175 passed | 158 failed | 43 failed as expected diff --git a/tests/SelfTest/Baselines/console.sw.multi.approved.txt b/tests/SelfTest/Baselines/console.sw.multi.approved.txt index 7845ed07..bfb0f4bb 100644 --- a/tests/SelfTest/Baselines/console.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/console.sw.multi.approved.txt @@ -5312,6 +5312,91 @@ Generators.tests.cpp:: PASSED: with expansion: 0 == 0 +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + concat generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_cat.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_cat.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + take generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( take_1.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( take_2.isFinite() ) +with expansion: + true + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + chunk generator +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_chunk.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_chunk.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + map +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_map.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_map.isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +Generator adapters properly handle isFinite + filter +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE( finite_filter.isFinite() ) +with expansion: + true + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( infinite_filter.isFinite() ) +with expansion: + !false + ------------------------------------------------------------------------------- Generators -- adapters Filtering by predicate @@ -10365,6 +10450,39 @@ RandomNumberGeneration.tests.cpp: RandomNumberGeneration.tests.cpp:: PASSED: REQUIRE_THROWS( Catch::generateRandomSeed(static_cast(77)) ) +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - float +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - int +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + +------------------------------------------------------------------------------- +RandomGenerator reports itself as infinite - long double +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ) +with expansion: + !false + ------------------------------------------------------------------------------- Range type with sentinel ------------------------------------------------------------------------------- @@ -10434,6 +10552,15 @@ Matchers.tests.cpp:: PASSED: with expansion: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +------------------------------------------------------------------------------- +RepeatGenerator refuses infinite generators +------------------------------------------------------------------------------- +GeneratorsImpl.tests.cpp: +............................................................................... + +GeneratorsImpl.tests.cpp:: PASSED: + REQUIRE_THROWS( RepeatGenerator( 2, random( 1, 100 ) ) ) + ------------------------------------------------------------------------------- Reporter's write listings to provided stream ------------------------------------------------------------------------------- @@ -19706,6 +19833,6 @@ Misc.tests.cpp: Misc.tests.cpp:: PASSED: =============================================================================== -test cases: 443 | 323 passed | 96 failed | 6 skipped | 18 failed as expected -assertions: 2362 | 2161 passed | 158 failed | 43 failed as expected +test cases: 448 | 328 passed | 96 failed | 6 skipped | 18 failed as expected +assertions: 2376 | 2175 passed | 158 failed | 43 failed as expected diff --git a/tests/SelfTest/Baselines/junit.sw.approved.txt b/tests/SelfTest/Baselines/junit.sw.approved.txt index 9f13c847..e3010c82 100644 --- a/tests/SelfTest/Baselines/junit.sw.approved.txt +++ b/tests/SelfTest/Baselines/junit.sw.approved.txt @@ -1,7 +1,7 @@ - + @@ -832,6 +832,12 @@ at Message.tests.cpp: + + + + + + @@ -1342,6 +1348,9 @@ at Message.tests.cpp: + + + @@ -1380,6 +1389,7 @@ at Matchers.tests.cpp: + diff --git a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt index ec33f1ba..cc2c9946 100644 --- a/tests/SelfTest/Baselines/junit.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/junit.sw.multi.approved.txt @@ -1,6 +1,6 @@ - + @@ -831,6 +831,12 @@ at Message.tests.cpp: + + + + + + @@ -1341,6 +1347,9 @@ at Message.tests.cpp: + + + @@ -1379,6 +1388,7 @@ at Matchers.tests.cpp: + diff --git a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt index 1d36a1ff..f790e0eb 100644 --- a/tests/SelfTest/Baselines/sonarqube.sw.approved.txt +++ b/tests/SelfTest/Baselines/sonarqube.sw.approved.txt @@ -150,6 +150,12 @@ at AssertionHandler.tests.cpp: + + + + + + @@ -189,6 +195,10 @@ at AssertionHandler.tests.cpp: + + + + diff --git a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt index 9de7e03f..405cd887 100644 --- a/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/sonarqube.sw.multi.approved.txt @@ -149,6 +149,12 @@ at AssertionHandler.tests.cpp: + + + + + + @@ -188,6 +194,10 @@ at AssertionHandler.tests.cpp: + + + + diff --git a/tests/SelfTest/Baselines/tap.sw.approved.txt b/tests/SelfTest/Baselines/tap.sw.approved.txt index 5261a4ac..0c303618 100644 --- a/tests/SelfTest/Baselines/tap.sw.approved.txt +++ b/tests/SelfTest/Baselines/tap.sw.approved.txt @@ -1358,6 +1358,26 @@ ok {test-number} - i % 2 == 0 for: 0 == 0 ok {test-number} - i % 2 == 0 for: 0 == 0 # GENERATE can combine literals and generators ok {test-number} - i % 2 == 0 for: 0 == 0 +# Generator adapters properly handle isFinite +ok {test-number} - finite_cat.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_cat.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - take_1.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - take_2.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - finite_chunk.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_chunk.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - finite_map.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_map.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - finite_filter.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_filter.isFinite()) for: !false # Generators -- adapters ok {test-number} - i % 2 == 0 for: 0 == 0 # Generators -- adapters @@ -2592,6 +2612,12 @@ ok {test-number} - Catch::generateRandomSeed(method) ok {test-number} - Catch::generateRandomSeed(method) # Random seed generation reports unknown methods ok {test-number} - Catch::generateRandomSeed(static_cast(77)) +# RandomGenerator reports itself as infinite - float +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +# RandomGenerator reports itself as infinite - int +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +# RandomGenerator reports itself as infinite - long double +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false # Range type with sentinel ok {test-number} - Catch::Detail::stringify(UsesSentinel{}) == "{ }" for: "{ }" == "{ }" # Reconstruction should be based on stringification: #914 @@ -2606,6 +2632,8 @@ not ok {test-number} - testStringForMatching(), Matches( "this string contains ' ok {test-number} - registry.registerReporter( "with::doublecolons", Catch::Detail::make_unique() ), "'::' is not allowed in reporter name: 'with::doublecolons'" for: "'::' is not allowed in reporter name: 'with::doublecolons'" equals: "'::' is not allowed in reporter name: 'with::doublecolons'" # Regression test #1 ok {test-number} - actual, !UnorderedEquals( expected ) for: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +# RepeatGenerator refuses infinite generators +ok {test-number} - RepeatGenerator( 2, random( 1, 100 ) ) # Reporter's write listings to provided stream ok {test-number} - !(factories.empty()) for: !false # Reporter's write listings to provided stream @@ -4743,5 +4771,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0 ok {test-number} - # xmlentitycheck ok {test-number} - -1..2374 +1..2388 diff --git a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt index eeafbc01..611983af 100644 --- a/tests/SelfTest/Baselines/tap.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/tap.sw.multi.approved.txt @@ -1356,6 +1356,26 @@ ok {test-number} - i % 2 == 0 for: 0 == 0 ok {test-number} - i % 2 == 0 for: 0 == 0 # GENERATE can combine literals and generators ok {test-number} - i % 2 == 0 for: 0 == 0 +# Generator adapters properly handle isFinite +ok {test-number} - finite_cat.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_cat.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - take_1.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - take_2.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - finite_chunk.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_chunk.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - finite_map.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_map.isFinite()) for: !false +# Generator adapters properly handle isFinite +ok {test-number} - finite_filter.isFinite() for: true +# Generator adapters properly handle isFinite +ok {test-number} - !(infinite_filter.isFinite()) for: !false # Generators -- adapters ok {test-number} - i % 2 == 0 for: 0 == 0 # Generators -- adapters @@ -2590,6 +2610,12 @@ ok {test-number} - Catch::generateRandomSeed(method) ok {test-number} - Catch::generateRandomSeed(method) # Random seed generation reports unknown methods ok {test-number} - Catch::generateRandomSeed(static_cast(77)) +# RandomGenerator reports itself as infinite - float +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +# RandomGenerator reports itself as infinite - int +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false +# RandomGenerator reports itself as infinite - long double +ok {test-number} - !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) for: !false # Range type with sentinel ok {test-number} - Catch::Detail::stringify(UsesSentinel{}) == "{ }" for: "{ }" == "{ }" # Reconstruction should be based on stringification: #914 @@ -2604,6 +2630,8 @@ not ok {test-number} - testStringForMatching(), Matches( "this string contains ' ok {test-number} - registry.registerReporter( "with::doublecolons", Catch::Detail::make_unique() ), "'::' is not allowed in reporter name: 'with::doublecolons'" for: "'::' is not allowed in reporter name: 'with::doublecolons'" equals: "'::' is not allowed in reporter name: 'with::doublecolons'" # Regression test #1 ok {test-number} - actual, !UnorderedEquals( expected ) for: { 'a', 'b' } not UnorderedEquals: { 'c', 'b' } +# RepeatGenerator refuses infinite generators +ok {test-number} - RepeatGenerator( 2, random( 1, 100 ) ) # Reporter's write listings to provided stream ok {test-number} - !(factories.empty()) for: !false # Reporter's write listings to provided stream @@ -4732,5 +4760,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0 ok {test-number} - # xmlentitycheck ok {test-number} - -1..2374 +1..2388 diff --git a/tests/SelfTest/Baselines/teamcity.sw.approved.txt b/tests/SelfTest/Baselines/teamcity.sw.approved.txt index b7be8d11..e7859ebd 100644 --- a/tests/SelfTest/Baselines/teamcity.sw.approved.txt +++ b/tests/SelfTest/Baselines/teamcity.sw.approved.txt @@ -417,6 +417,8 @@ ##teamcity[testFinished name='Floating point matchers: float' duration="{duration}"] ##teamcity[testStarted name='GENERATE can combine literals and generators'] ##teamcity[testFinished name='GENERATE can combine literals and generators' duration="{duration}"] +##teamcity[testStarted name='Generator adapters properly handle isFinite'] +##teamcity[testFinished name='Generator adapters properly handle isFinite' duration="{duration}"] ##teamcity[testStarted name='Generators -- adapters'] ##teamcity[testFinished name='Generators -- adapters' duration="{duration}"] ##teamcity[testStarted name='Generators -- simple'] @@ -571,6 +573,12 @@ ##teamcity[testFinished name='Random seed generation accepts known methods' duration="{duration}"] ##teamcity[testStarted name='Random seed generation reports unknown methods'] ##teamcity[testFinished name='Random seed generation reports unknown methods' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - float'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - float' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - int'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - int' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - long double'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - long double' duration="{duration}"] ##teamcity[testStarted name='Range type with sentinel'] ##teamcity[testFinished name='Range type with sentinel' duration="{duration}"] ##teamcity[testStarted name='Reconstruction should be based on stringification: #914'] @@ -585,6 +593,8 @@ ##teamcity[testFinished name='Registering reporter with |'::|' in name fails' duration="{duration}"] ##teamcity[testStarted name='Regression test #1'] ##teamcity[testFinished name='Regression test #1' duration="{duration}"] +##teamcity[testStarted name='RepeatGenerator refuses infinite generators'] +##teamcity[testFinished name='RepeatGenerator refuses infinite generators' duration="{duration}"] ##teamcity[testStarted name='Reporter|'s write listings to provided stream'] ##teamcity[testFinished name='Reporter|'s write listings to provided stream' duration="{duration}"] ##teamcity[testStarted name='Reproducer for #2309 - a very long description past 80 chars (default console width) with a late colon : blablabla'] diff --git a/tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt b/tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt index feb5f1d9..4f96fab8 100644 --- a/tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/teamcity.sw.multi.approved.txt @@ -417,6 +417,8 @@ ##teamcity[testFinished name='Floating point matchers: float' duration="{duration}"] ##teamcity[testStarted name='GENERATE can combine literals and generators'] ##teamcity[testFinished name='GENERATE can combine literals and generators' duration="{duration}"] +##teamcity[testStarted name='Generator adapters properly handle isFinite'] +##teamcity[testFinished name='Generator adapters properly handle isFinite' duration="{duration}"] ##teamcity[testStarted name='Generators -- adapters'] ##teamcity[testFinished name='Generators -- adapters' duration="{duration}"] ##teamcity[testStarted name='Generators -- simple'] @@ -571,6 +573,12 @@ ##teamcity[testFinished name='Random seed generation accepts known methods' duration="{duration}"] ##teamcity[testStarted name='Random seed generation reports unknown methods'] ##teamcity[testFinished name='Random seed generation reports unknown methods' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - float'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - float' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - int'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - int' duration="{duration}"] +##teamcity[testStarted name='RandomGenerator reports itself as infinite - long double'] +##teamcity[testFinished name='RandomGenerator reports itself as infinite - long double' duration="{duration}"] ##teamcity[testStarted name='Range type with sentinel'] ##teamcity[testFinished name='Range type with sentinel' duration="{duration}"] ##teamcity[testStarted name='Reconstruction should be based on stringification: #914'] @@ -585,6 +593,8 @@ ##teamcity[testFinished name='Registering reporter with |'::|' in name fails' duration="{duration}"] ##teamcity[testStarted name='Regression test #1'] ##teamcity[testFinished name='Regression test #1' duration="{duration}"] +##teamcity[testStarted name='RepeatGenerator refuses infinite generators'] +##teamcity[testFinished name='RepeatGenerator refuses infinite generators' duration="{duration}"] ##teamcity[testStarted name='Reporter|'s write listings to provided stream'] ##teamcity[testFinished name='Reporter|'s write listings to provided stream' duration="{duration}"] ##teamcity[testStarted name='Reproducer for #2309 - a very long description past 80 chars (default console width) with a late colon : blablabla'] diff --git a/tests/SelfTest/Baselines/xml.sw.approved.txt b/tests/SelfTest/Baselines/xml.sw.approved.txt index 77a45a54..bd5a725c 100644 --- a/tests/SelfTest/Baselines/xml.sw.approved.txt +++ b/tests/SelfTest/Baselines/xml.sw.approved.txt @@ -6119,6 +6119,104 @@ Approx( 1.30000000000000004 ) + +
+ + + finite_cat.isFinite() + + + true + + + + + !(infinite_cat.isFinite()) + + + !false + + + +
+
+ + + take_1.isFinite() + + + true + + + + + take_2.isFinite() + + + true + + + +
+
+ + + finite_chunk.isFinite() + + + true + + + + + !(infinite_chunk.isFinite()) + + + !false + + + +
+
+ + + finite_map.isFinite() + + + true + + + + + !(infinite_map.isFinite()) + + + !false + + + +
+
+ + + finite_filter.isFinite() + + + true + + + + + !(infinite_filter.isFinite()) + + + !false + + + +
+ +
@@ -12492,6 +12590,39 @@ Approx( 0.98999999999999999 ) + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + @@ -12563,6 +12694,17 @@ Approx( 0.98999999999999999 ) + + + + RepeatGenerator<int>( 2, random( 1, 100 ) ) + + + RepeatGenerator<int>( 2, random( 1, 100 ) ) + + + + @@ -22878,6 +23020,6 @@ Approx( -1.95996398454005449 )
- - + + diff --git a/tests/SelfTest/Baselines/xml.sw.multi.approved.txt b/tests/SelfTest/Baselines/xml.sw.multi.approved.txt index dbb3996f..3bdd4518 100644 --- a/tests/SelfTest/Baselines/xml.sw.multi.approved.txt +++ b/tests/SelfTest/Baselines/xml.sw.multi.approved.txt @@ -6119,6 +6119,104 @@ Approx( 1.30000000000000004 ) + +
+ + + finite_cat.isFinite() + + + true + + + + + !(infinite_cat.isFinite()) + + + !false + + + +
+
+ + + take_1.isFinite() + + + true + + + + + take_2.isFinite() + + + true + + + +
+
+ + + finite_chunk.isFinite() + + + true + + + + + !(infinite_chunk.isFinite()) + + + !false + + + +
+
+ + + finite_map.isFinite() + + + true + + + + + !(infinite_map.isFinite()) + + + !false + + + +
+
+ + + finite_filter.isFinite() + + + true + + + + + !(infinite_filter.isFinite()) + + + !false + + + +
+ +
@@ -12492,6 +12590,39 @@ Approx( 0.98999999999999999 ) + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + + + + + !(Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite()) + + + !false + + + + @@ -12563,6 +12694,17 @@ Approx( 0.98999999999999999 ) + + + + RepeatGenerator<int>( 2, random( 1, 100 ) ) + + + RepeatGenerator<int>( 2, random( 1, 100 ) ) + + + + @@ -22877,6 +23019,6 @@ Approx( -1.95996398454005449 )
- - + + diff --git a/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp b/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp index 6c81b160..c415686b 100644 --- a/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp +++ b/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp @@ -13,6 +13,7 @@ #include #include +#include #include #include #include @@ -339,6 +340,7 @@ public: bool next() override { return false; } + bool isFinite() const override { return true; } }; // Avoids -Wweak-vtables @@ -472,6 +474,7 @@ namespace { public: bool const& get() const override; + bool isFinite() const override { return true; } }; // Avoids -Wweak-vtables @@ -509,6 +512,7 @@ namespace { bool const& get() const override; size_t stringificationCalls() const { return m_stringificationCalls; } + bool isFinite() const override { return true; } }; // Avoids -Wweak-vtables @@ -618,6 +622,8 @@ namespace { ++m_idx; return m_idx < m_elements.size(); } + + bool isFinite() const override { return true; } }; } @@ -721,3 +727,66 @@ TEST_CASE("MapGenerator can be skipped forward efficiently", REQUIRE_THROWS( map_generator.skipToNthElement( 7 ) ); REQUIRE( map_calls == map_calls_2 + 1 ); } + +TEST_CASE( "Generator adapters properly handle isFinite", + "[generators][map][take][chunk][filter][concat]" ) { + using namespace Catch::Generators; + SECTION( "concat generator" ) { + ConcatGenerator finite_cat( + value( 1 ), values( { 2, 3, 4 } ), value( 5 ) ); + REQUIRE( finite_cat.isFinite() ); + + ConcatGenerator infinite_cat( + value( 1 ), random( 1, 10 ), value( 3 ) ); + REQUIRE_FALSE( infinite_cat.isFinite() ); + } + SECTION( "take generator" ) { + TakeGenerator take_1( 2, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( take_1.isFinite() ); + TakeGenerator take_2( 3, random( 1, 100 ) ); + REQUIRE( take_2.isFinite() ); + } + SECTION( "chunk generator" ) { + ChunkGenerator finite_chunk( 2, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( finite_chunk.isFinite() ); + ChunkGenerator infinite_chunk( 2, random( 1, 100 ) ); + REQUIRE_FALSE( infinite_chunk.isFinite() ); + } + SECTION( "map" ) { + auto identity = []( int i ) { + return i; + }; + + MapGenerator finite_map( + identity, values( { 1, 2, 3 } ) ); + REQUIRE( finite_map.isFinite() ); + MapGenerator infinite_map( + identity, random( 1, 100 ) ); + REQUIRE_FALSE( infinite_map.isFinite() ); + } + SECTION( "filter" ) { + auto always_true = []( int ) { + return true; + }; + FilterGenerator finite_filter( + always_true, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( finite_filter.isFinite() ); + FilterGenerator infinite_filter( + always_true, random( 1, 100 ) ); + REQUIRE_FALSE( infinite_filter.isFinite() ); + } +} + +TEST_CASE( "RepeatGenerator refuses infinite generators", + "[generators][repeat]" ) { + using namespace Catch::Generators; + REQUIRE_THROWS( RepeatGenerator( 2, random( 1, 100 ) ) ); +} + +TEMPLATE_TEST_CASE( "RandomGenerator reports itself as infinite", + "[generators][random]", + int, + float, + long double) { + REQUIRE_FALSE( Catch::Generators::random( TestType{ 0 }, TestType{ 100 } ).isFinite() ); +} diff --git a/tests/SelfTest/UsageTests/Generators.tests.cpp b/tests/SelfTest/UsageTests/Generators.tests.cpp index b03192cf..3394b4b5 100644 --- a/tests/SelfTest/UsageTests/Generators.tests.cpp +++ b/tests/SelfTest/UsageTests/Generators.tests.cpp @@ -296,6 +296,7 @@ namespace { } auto next() -> bool override { return false; } + auto isFinite() const -> bool override { return true; } }; static auto make_test_generator() diff --git a/tests/SelfTest/UsageTests/Skip.tests.cpp b/tests/SelfTest/UsageTests/Skip.tests.cpp index 661795e1..e6f9a797 100644 --- a/tests/SelfTest/UsageTests/Skip.tests.cpp +++ b/tests/SelfTest/UsageTests/Skip.tests.cpp @@ -83,6 +83,8 @@ namespace { } auto next() -> bool override { return false; } + + auto isFinite() const -> bool override { return true; } }; static auto make_test_skip_generator()