diff options
| author | Martin Hořeňovský | 2026-02-09 19:05:39 +0100 |
|---|---|---|
| committer | Martin Hořeňovský | 2026-02-10 09:37:15 +0100 |
| commit | d079ee13ab137547ab26bd1ed5ca2858d7fbd847 (patch) | |
| tree | 1e73da54d02eecbf095dd07bd4c0183d7a7f107b /tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp | |
| parent | 0056cd4efb01ab65f02af188e137fc65d79e18f8 (diff) | |
| download | catch3-d079ee13ab137547ab26bd1ed5ca2858d7fbd847.tar.gz | |
Allow generators to declare themselves (infinite)
This will be useful later to implement warning on infinitely
running `GENERATE` expressions.
Diffstat (limited to 'tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp')
| -rw-r--r-- | tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp | 69 |
1 files changed, 69 insertions, 0 deletions
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 <helpers/range_test_helpers.hpp> #include <catch2/catch_approx.hpp> +#include <catch2/catch_template_test_macros.hpp> #include <catch2/catch_test_macros.hpp> #include <catch2/generators/catch_generator_exception.hpp> #include <catch2/generators/catch_generators_adapters.hpp> @@ -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<int> finite_cat( + value( 1 ), values( { 2, 3, 4 } ), value( 5 ) ); + REQUIRE( finite_cat.isFinite() ); + + ConcatGenerator<int> infinite_cat( + value( 1 ), random( 1, 10 ), value( 3 ) ); + REQUIRE_FALSE( infinite_cat.isFinite() ); + } + SECTION( "take generator" ) { + TakeGenerator<int> take_1( 2, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( take_1.isFinite() ); + TakeGenerator<int> take_2( 3, random( 1, 100 ) ); + REQUIRE( take_2.isFinite() ); + } + SECTION( "chunk generator" ) { + ChunkGenerator<int> finite_chunk( 2, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( finite_chunk.isFinite() ); + ChunkGenerator<int> infinite_chunk( 2, random( 1, 100 ) ); + REQUIRE_FALSE( infinite_chunk.isFinite() ); + } + SECTION( "map" ) { + auto identity = []( int i ) { + return i; + }; + + MapGenerator<int, int, decltype( identity )> finite_map( + identity, values( { 1, 2, 3 } ) ); + REQUIRE( finite_map.isFinite() ); + MapGenerator<int, int, decltype( identity )> infinite_map( + identity, random( 1, 100 ) ); + REQUIRE_FALSE( infinite_map.isFinite() ); + } + SECTION( "filter" ) { + auto always_true = []( int ) { + return true; + }; + FilterGenerator<int, decltype( always_true )> finite_filter( + always_true, values( { 1, 2, 3, 4, 5 } ) ); + REQUIRE( finite_filter.isFinite() ); + FilterGenerator<int, decltype( always_true )> 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<int>( 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() ); +} |