diff options
| author | Martin Hořeňovský | 2025-10-06 11:47:38 +0200 |
|---|---|---|
| committer | Martin Hořeňovský | 2026-01-12 16:58:15 +0100 |
| commit | 9eca713a1f4555b3095564781d77654958ee3dc1 (patch) | |
| tree | e500e9b38c705f7f08ca412af16cb843cb80088e /tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp | |
| parent | 44c597f0742b491399994afa00070b99d3ef2885 (diff) | |
| download | catch3-9eca713a1f4555b3095564781d77654958ee3dc1.tar.gz | |
Add option to skip forward to the generator interface
Diffstat (limited to 'tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp')
| -rw-r--r-- | tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp | 39 |
1 files changed, 39 insertions, 0 deletions
diff --git a/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp b/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp index 0ba4ab43..0a2b17ea 100644 --- a/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp +++ b/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp @@ -604,3 +604,42 @@ TEST_CASE( "ConcatGenerator", "[generators][concat]" ) { REQUIRE_FALSE( c.next() ); } } + +namespace { + // Test the default behaviour of skipping generators forward. We do + // not want to use pre-existing generator, because they will get + // specialized forward skip implementation. + class SkipTestGenerator : public Catch::Generators::IGenerator<int> { + std::vector<int> m_elements{ 0, 1, 2, 3, 4, 5 }; + size_t m_idx = 0; + public: + int const& get() const override { return m_elements[m_idx]; } + bool next() override { + ++m_idx; + return m_idx < m_elements.size(); + } + }; +} + +TEST_CASE( "Generators can be skipped forward", "[generators]" ) { + SkipTestGenerator generator; + REQUIRE( generator.currentElementIndex() == 0 ); + + generator.skipToNthElement( 3 ); + REQUIRE( generator.currentElementIndex() == 3 ); + REQUIRE( generator.get() == 3 ); + + // Try "skipping" to the same element. + generator.skipToNthElement( 3 ); + REQUIRE( generator.currentElementIndex() == 3 ); + REQUIRE( generator.get() == 3 ); + + generator.skipToNthElement( 5 ); + REQUIRE( generator.currentElementIndex() == 5 ); + REQUIRE( generator.get() == 5 ); + + // Backwards + REQUIRE_THROWS( generator.skipToNthElement( 3 ) ); + // Past the end + REQUIRE_THROWS( generator.skipToNthElement( 6 ) ); +} |