Read-only mirrors. Development, issues and pull requests are on GitHub.

summaryrefslogtreecommitdiffhomepage
path: root/tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp
diff options
context:
space:
mode:
authorMartin Hořeňovský2025-10-06 11:47:38 +0200
committerMartin Hořeňovský2026-01-12 16:58:15 +0100
commit9eca713a1f4555b3095564781d77654958ee3dc1 (patch)
treee500e9b38c705f7f08ca412af16cb843cb80088e /tests/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp
parent44c597f0742b491399994afa00070b99d3ef2885 (diff)
downloadcatch3-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.cpp39
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 ) );
+}