diff --git a/include/internal/catch_generators.hpp b/include/internal/catch_generators.hpp index c9ef7799..d0fbe8bf 100644 --- a/include/internal/catch_generators.hpp +++ b/include/internal/catch_generators.hpp @@ -57,7 +57,6 @@ namespace Generators { class SingleValueGenerator final : public IGenerator { T m_value; public: - SingleValueGenerator(T const& value) : m_value( value ) {} SingleValueGenerator(T&& value) : m_value(std::move(value)) {} T const& get() const override { @@ -120,21 +119,21 @@ namespace Generators { m_generators.emplace_back(std::move(generator)); } void populate(T&& val) { - m_generators.emplace_back(value(std::move(val))); + m_generators.emplace_back(value(std::forward(val))); } template void populate(U&& val) { - populate(T(std::move(val))); + populate(T(std::forward(val))); } template - void populate(U&& valueOrGenerator, Gs... moreGenerators) { + void populate(U&& valueOrGenerator, Gs &&... moreGenerators) { populate(std::forward(valueOrGenerator)); populate(std::forward(moreGenerators)...); } public: template - Generators(Gs... moreGenerators) { + Generators(Gs &&... moreGenerators) { m_generators.reserve(sizeof...(Gs)); populate(std::forward(moreGenerators)...); } @@ -166,7 +165,7 @@ namespace Generators { struct as {}; template - auto makeGenerators( GeneratorWrapper&& generator, Gs... moreGenerators ) -> Generators { + auto makeGenerators( GeneratorWrapper&& generator, Gs &&... moreGenerators ) -> Generators { return Generators(std::move(generator), std::forward(moreGenerators)...); } template @@ -174,11 +173,11 @@ namespace Generators { return Generators(std::move(generator)); } template - auto makeGenerators( T&& val, Gs... moreGenerators ) -> Generators { + auto makeGenerators( T&& val, Gs &&... moreGenerators ) -> Generators { return makeGenerators( value( std::forward( val ) ), std::forward( moreGenerators )... ); } template - auto makeGenerators( as, U&& val, Gs... moreGenerators ) -> Generators { + auto makeGenerators( as, U&& val, Gs &&... moreGenerators ) -> Generators { return makeGenerators( value( T( std::forward( val ) ) ), std::forward( moreGenerators )... ); } diff --git a/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp b/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp index 9cbe8931..549f3559 100644 --- a/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp +++ b/projects/SelfTest/IntrospectiveTests/GeneratorsImpl.tests.cpp @@ -181,7 +181,7 @@ TEST_CASE("Generators internals", "[generators][internals]") { const auto step = .1; auto gen = range(rangeStart, rangeEnd, step); - auto expected = rangeStart; + auto expected = rangeStart; while( (rangeEnd - expected) > step ) { INFO( "Current expected value is " << expected ) REQUIRE(gen.get() == Approx(expected)); @@ -198,7 +198,7 @@ TEST_CASE("Generators internals", "[generators][internals]") { const auto step = .3; auto gen = range(rangeStart, rangeEnd, step); - auto expected = rangeStart; + auto expected = rangeStart; while( (rangeEnd - expected) > step ) { INFO( "Current expected value is " << expected ) REQUIRE(gen.get() == Approx(expected)); @@ -214,7 +214,7 @@ TEST_CASE("Generators internals", "[generators][internals]") { const auto step = .3; auto gen = range(rangeStart, rangeEnd, step); - auto expected = rangeStart; + auto expected = rangeStart; while( (rangeEnd - expected) > step ) { INFO( "Current expected value is " << expected ) REQUIRE(gen.get() == Approx(expected)); @@ -223,7 +223,7 @@ TEST_CASE("Generators internals", "[generators][internals]") { expected += step; } REQUIRE_FALSE(gen.next()); - } + } } } SECTION("Negative manual step") { @@ -311,6 +311,21 @@ TEST_CASE("GENERATE capture macros", "[generators][internals][approvals]") { REQUIRE(value == value2); } +TEST_CASE("#1809 - GENERATE_COPY and SingleValueGenerator does not compile", "[generators][compilation][approvals]") { + // Verify Issue #1809 fix, only needs to compile. + auto a = GENERATE_COPY(1, 2); + (void)a; + auto b = GENERATE_COPY(as{}, 1, 2); + (void)b; + int i = 1; + int j = 2; + auto c = GENERATE_COPY(i, j); + (void)c; + auto d = GENERATE_COPY(as{}, i, j); + (void)d; + SUCCEED(); +} + TEST_CASE("Multiple random generators in one test case output different values", "[generators][internals][approvals]") { SECTION("Integer") { auto random1 = Catch::Generators::random(0, 1000);