mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-30 19:57:10 +01:00 
			
		
		
		
	Improved generator tracking
* Successive executions of the same `GENERATE` macro (e.g. because of a for loop) no longer lead to multiple nested generators. * The same line can now contain multiple `GENERATE` macros without issues. Fixes #1913
This commit is contained in:
		| @@ -29,7 +29,7 @@ TEST_CASE("Generate random doubles across different ranges", | |||||||
|     // This will take r1 by reference and r2 by value. |     // This will take r1 by reference and r2 by value. | ||||||
|     // Note that there are no advantages for doing so in this example, |     // Note that there are no advantages for doing so in this example, | ||||||
|     // it is done only for expository purposes. |     // it is done only for expository purposes. | ||||||
|     auto number = Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, |     auto number = Catch::Generators::generate( "custom capture generator", CATCH_INTERNAL_LINEINFO, | ||||||
|         [&r1, r2]{ |         [&r1, r2]{ | ||||||
|             using namespace Catch::Generators; |             using namespace Catch::Generators; | ||||||
|             return makeGenerators(take(50, random(std::get<0>(r1), std::get<1>(r2)))); |             return makeGenerators(take(50, random(std::get<0>(r1), std::get<1>(r2)))); | ||||||
|   | |||||||
| @@ -9,6 +9,7 @@ | |||||||
|  |  | ||||||
| #include <catch2/interfaces/catch_interfaces_generatortracker.hpp> | #include <catch2/interfaces/catch_interfaces_generatortracker.hpp> | ||||||
| #include <catch2/internal/catch_common.hpp> | #include <catch2/internal/catch_common.hpp> | ||||||
|  | #include <catch2/internal/catch_stringref.hpp> | ||||||
|  |  | ||||||
| #include <vector> | #include <vector> | ||||||
| #include <tuple> | #include <tuple> | ||||||
| @@ -179,16 +180,16 @@ namespace Detail { | |||||||
|         return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... ); |         return makeGenerators( value( T( std::forward<U>( val ) ) ), std::forward<Gs>( moreGenerators )... ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
|     auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; |     auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker&; | ||||||
|  |  | ||||||
|     template<typename L> |     template<typename L> | ||||||
|     // Note: The type after -> is weird, because VS2015 cannot parse |     // Note: The type after -> is weird, because VS2015 cannot parse | ||||||
|     //       the expression used in the typedef inside, when it is in |     //       the expression used in the typedef inside, when it is in | ||||||
|     //       return type. Yeah. |     //       return type. Yeah. | ||||||
|     auto generate( SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { |     auto generate( StringRef generatorName, SourceLineInfo const& lineInfo, L const& generatorExpression ) -> decltype(std::declval<decltype(generatorExpression())>().get()) { | ||||||
|         using UnderlyingType = typename decltype(generatorExpression())::type; |         using UnderlyingType = typename decltype(generatorExpression())::type; | ||||||
|  |  | ||||||
|         IGeneratorTracker& tracker = acquireGeneratorTracker( lineInfo ); |         IGeneratorTracker& tracker = acquireGeneratorTracker( generatorName, lineInfo ); | ||||||
|         if (!tracker.hasGenerator()) { |         if (!tracker.hasGenerator()) { | ||||||
|             tracker.setGenerator(Catch::Detail::make_unique<Generators<UnderlyingType>>(generatorExpression())); |             tracker.setGenerator(Catch::Detail::make_unique<Generators<UnderlyingType>>(generatorExpression())); | ||||||
|         } |         } | ||||||
| @@ -201,10 +202,16 @@ namespace Detail { | |||||||
| } // namespace Catch | } // namespace Catch | ||||||
|  |  | ||||||
| #define GENERATE( ... ) \ | #define GENERATE( ... ) \ | ||||||
|     Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) |     Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ | ||||||
|  |                                  CATCH_INTERNAL_LINEINFO, \ | ||||||
|  |                                  [ ]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) | ||||||
| #define GENERATE_COPY( ... ) \ | #define GENERATE_COPY( ... ) \ | ||||||
|     Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) |     Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ | ||||||
|  |                                  CATCH_INTERNAL_LINEINFO, \ | ||||||
|  |                                  [=]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) | ||||||
| #define GENERATE_REF( ... ) \ | #define GENERATE_REF( ... ) \ | ||||||
|     Catch::Generators::generate( CATCH_INTERNAL_LINEINFO, [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) |     Catch::Generators::generate( INTERNAL_CATCH_STRINGIZE(INTERNAL_CATCH_UNIQUE_NAME(generator)), \ | ||||||
|  |                                  CATCH_INTERNAL_LINEINFO, \ | ||||||
|  |                                  [&]{ using namespace Catch::Generators; return makeGenerators( __VA_ARGS__ ); } ) //NOLINT(google-build-using-namespace) | ||||||
|  |  | ||||||
| #endif // TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED | #endif // TWOBLUECUBES_CATCH_GENERATORS_HPP_INCLUDED | ||||||
|   | |||||||
| @@ -50,8 +50,8 @@ namespace Detail { | |||||||
|  |  | ||||||
|     GeneratorUntypedBase::~GeneratorUntypedBase() = default; |     GeneratorUntypedBase::~GeneratorUntypedBase() = default; | ||||||
|  |  | ||||||
|     auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { |     auto acquireGeneratorTracker(StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { | ||||||
|         return getResultCapture().acquireGeneratorTracker( lineInfo ); |         return getResultCapture().acquireGeneratorTracker( generatorName, lineInfo ); | ||||||
|     } |     } | ||||||
|  |  | ||||||
| } // namespace Generators | } // namespace Generators | ||||||
|   | |||||||
| @@ -42,7 +42,7 @@ namespace Catch { | |||||||
|         virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; |         virtual void sectionEnded( SectionEndInfo const& endInfo ) = 0; | ||||||
|         virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; |         virtual void sectionEndedEarly( SectionEndInfo const& endInfo ) = 0; | ||||||
|  |  | ||||||
|         virtual auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; |         virtual auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& = 0; | ||||||
|  |  | ||||||
|         virtual void benchmarkPreparing( std::string const& name ) = 0; |         virtual void benchmarkPreparing( std::string const& name ) = 0; | ||||||
|         virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; |         virtual void benchmarkStarting( BenchmarkInfo const& info ) = 0; | ||||||
|   | |||||||
| @@ -27,12 +27,27 @@ namespace Catch { | |||||||
|                 std::shared_ptr<GeneratorTracker> tracker; |                 std::shared_ptr<GeneratorTracker> tracker; | ||||||
|  |  | ||||||
|                 ITracker& currentTracker = ctx.currentTracker(); |                 ITracker& currentTracker = ctx.currentTracker(); | ||||||
|                 if( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { |                 // Under specific circumstances, the generator we want | ||||||
|  |                 // to acquire is also the current tracker. If this is | ||||||
|  |                 // the case, we have to avoid looking through current | ||||||
|  |                 // tracker's children, and instead return the current | ||||||
|  |                 // tracker. | ||||||
|  |                 // A case where this check is important is e.g. | ||||||
|  |                 //     for (int i = 0; i < 5; ++i) { | ||||||
|  |                 //         int n = GENERATE(1, 2); | ||||||
|  |                 //     } | ||||||
|  |                 // | ||||||
|  |                 // without it, the code above creates 5 nested generators. | ||||||
|  |                 if (currentTracker.nameAndLocation() == nameAndLocation) { | ||||||
|  |                     auto thisTracker = currentTracker.parent().findChild(nameAndLocation); | ||||||
|  |                     assert(thisTracker); | ||||||
|  |                     assert(thisTracker->isGeneratorTracker()); | ||||||
|  |                     tracker = std::static_pointer_cast<GeneratorTracker>(thisTracker); | ||||||
|  |                 } else if ( TestCaseTracking::ITrackerPtr childTracker = currentTracker.findChild( nameAndLocation ) ) { | ||||||
|                     assert( childTracker ); |                     assert( childTracker ); | ||||||
|                     assert( childTracker->isGeneratorTracker() ); |                     assert( childTracker->isGeneratorTracker() ); | ||||||
|                     tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); |                     tracker = std::static_pointer_cast<GeneratorTracker>( childTracker ); | ||||||
|                 } |                 } else { | ||||||
|                 else { |  | ||||||
|                     tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); |                     tracker = std::make_shared<GeneratorTracker>( nameAndLocation, ctx, ¤tTracker ); | ||||||
|                     currentTracker.addChild( tracker ); |                     currentTracker.addChild( tracker ); | ||||||
|                 } |                 } | ||||||
| @@ -181,9 +196,10 @@ namespace Catch { | |||||||
|  |  | ||||||
|         return true; |         return true; | ||||||
|     } |     } | ||||||
|     auto RunContext::acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { |     auto RunContext::acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& { | ||||||
|         using namespace Generators; |         using namespace Generators; | ||||||
|         GeneratorTracker& tracker = GeneratorTracker::acquire( m_trackerContext, TestCaseTracking::NameAndLocation( "generator", lineInfo ) ); |         GeneratorTracker& tracker = GeneratorTracker::acquire(m_trackerContext, | ||||||
|  |                                                               TestCaseTracking::NameAndLocation( static_cast<std::string>(generatorName), lineInfo ) ); | ||||||
|         assert( tracker.isOpen() ); |         assert( tracker.isOpen() ); | ||||||
|         m_lastAssertionInfo.lineInfo = lineInfo; |         m_lastAssertionInfo.lineInfo = lineInfo; | ||||||
|         return tracker; |         return tracker; | ||||||
|   | |||||||
| @@ -76,7 +76,7 @@ namespace Catch { | |||||||
|         void sectionEnded( SectionEndInfo const& endInfo ) override; |         void sectionEnded( SectionEndInfo const& endInfo ) override; | ||||||
|         void sectionEndedEarly( SectionEndInfo const& endInfo ) override; |         void sectionEndedEarly( SectionEndInfo const& endInfo ) override; | ||||||
|  |  | ||||||
|         auto acquireGeneratorTracker( SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; |         auto acquireGeneratorTracker( StringRef generatorName, SourceLineInfo const& lineInfo ) -> IGeneratorTracker& override; | ||||||
|  |  | ||||||
|         void benchmarkPreparing( std::string const& name ) override; |         void benchmarkPreparing( std::string const& name ) override; | ||||||
|         void benchmarkStarting( BenchmarkInfo const& info ) override; |         void benchmarkStarting( BenchmarkInfo const& info ) override; | ||||||
|   | |||||||
| @@ -23,6 +23,10 @@ namespace TestCaseTracking { | |||||||
|         SourceLineInfo location; |         SourceLineInfo location; | ||||||
|  |  | ||||||
|         NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); |         NameAndLocation( std::string const& _name, SourceLineInfo const& _location ); | ||||||
|  |         friend bool operator==(NameAndLocation const& lhs, NameAndLocation const& rhs) { | ||||||
|  |             return lhs.name == rhs.name | ||||||
|  |                 && lhs.location == rhs.location; | ||||||
|  |         } | ||||||
|     }; |     }; | ||||||
|  |  | ||||||
|     struct ITracker; |     struct ITracker; | ||||||
|   | |||||||
| @@ -14,6 +14,8 @@ Nor would this | |||||||
| :test-result: PASS #1548 | :test-result: PASS #1548 | ||||||
| :test-result: PASS #1905 -- test spec parser properly clears internal state between compound tests | :test-result: PASS #1905 -- test spec parser properly clears internal state between compound tests | ||||||
| :test-result: PASS #1912 -- test spec parser handles escaping | :test-result: PASS #1912 -- test spec parser handles escaping | ||||||
|  | :test-result: PASS #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | :test-result: PASS #1913 - GENERATEs can share a line | ||||||
| :test-result: XFAIL #748 - captures with unexpected exceptions | :test-result: XFAIL #748 - captures with unexpected exceptions | ||||||
| :test-result: PASS #809 | :test-result: PASS #809 | ||||||
| :test-result: PASS #833 | :test-result: PASS #833 | ||||||
|   | |||||||
| @@ -29,6 +29,12 @@ CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase(R"(spec {a} | |||||||
| CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase(R"(spec [a] char)")) for: true | CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase(R"(spec [a] char)")) for: true | ||||||
| CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("differs but has similar tag", "[a]"))) for: !false | CmdLine.tests.cpp:<line number>: passed: !(spec.matches(*fakeTestCase("differs but has similar tag", "[a]"))) for: !false | ||||||
| CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase(R"(spec \ char)")) for: true | CmdLine.tests.cpp:<line number>: passed: spec.matches(*fakeTestCase(R"(spec \ char)")) for: true | ||||||
|  | Generators.tests.cpp:<line number>: passed: counter < 7 for: 3 < 7 | ||||||
|  | Generators.tests.cpp:<line number>: passed: counter < 7 for: 6 < 7 | ||||||
|  | Generators.tests.cpp:<line number>: passed: i != j for: 1 != 3 | ||||||
|  | Generators.tests.cpp:<line number>: passed: i != j for: 1 != 4 | ||||||
|  | Generators.tests.cpp:<line number>: passed: i != j for: 2 != 3 | ||||||
|  | Generators.tests.cpp:<line number>: passed: i != j for: 2 != 4 | ||||||
| Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception' | Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42' with 1 message: 'expected exception' | ||||||
| Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception' | Exception.tests.cpp:<line number>: failed: unexpected exception with message: 'answer := 42'; expression was: thisThrows() with 1 message: 'expected exception' | ||||||
| Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42' | Exception.tests.cpp:<line number>: passed: thisThrows() with 1 message: 'answer := 42' | ||||||
|   | |||||||
| @@ -1380,6 +1380,6 @@ due to unexpected exception with message: | |||||||
|   Why would you throw a std::string? |   Why would you throw a std::string? | ||||||
|  |  | ||||||
| =============================================================================== | =============================================================================== | ||||||
| test cases:  337 |  263 passed |  70 failed |  4 failed as expected | test cases:  339 |  265 passed |  70 failed |  4 failed as expected | ||||||
| assertions: 1926 | 1774 passed | 131 failed | 21 failed as expected | assertions: 1932 | 1780 passed | 131 failed | 21 failed as expected | ||||||
|  |  | ||||||
|   | |||||||
| @@ -236,6 +236,72 @@ CmdLine.tests.cpp:<line number>: PASSED: | |||||||
| with expansion: | with expansion: | ||||||
|   true |   true | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( counter < 7 ) | ||||||
|  | with expansion: | ||||||
|  |   3 < 7 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( counter < 7 ) | ||||||
|  | with expansion: | ||||||
|  |   6 < 7 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   1 != 3 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   1 != 4 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   2 != 3 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   2 != 4 | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||||||
| #748 - captures with unexpected exceptions | #748 - captures with unexpected exceptions | ||||||
|   outside assertions |   outside assertions | ||||||
| @@ -15058,6 +15124,6 @@ Misc.tests.cpp:<line number> | |||||||
| Misc.tests.cpp:<line number>: PASSED: | Misc.tests.cpp:<line number>: PASSED: | ||||||
|  |  | ||||||
| =============================================================================== | =============================================================================== | ||||||
| test cases:  337 |  247 passed |  86 failed |  4 failed as expected | test cases:  339 |  249 passed |  86 failed |  4 failed as expected | ||||||
| assertions: 1943 | 1774 passed | 148 failed | 21 failed as expected | assertions: 1949 | 1780 passed | 148 failed | 21 failed as expected | ||||||
|  |  | ||||||
|   | |||||||
| @@ -236,6 +236,72 @@ CmdLine.tests.cpp:<line number>: PASSED: | |||||||
| with expansion: | with expansion: | ||||||
|   true |   true | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( counter < 7 ) | ||||||
|  | with expansion: | ||||||
|  |   3 < 7 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( counter < 7 ) | ||||||
|  | with expansion: | ||||||
|  |   6 < 7 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   1 != 3 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   1 != 4 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   2 != 3 | ||||||
|  |  | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | #1913 - GENERATEs can share a line | ||||||
|  | ------------------------------------------------------------------------------- | ||||||
|  | Generators.tests.cpp:<line number> | ||||||
|  | ............................................................................... | ||||||
|  |  | ||||||
|  | Generators.tests.cpp:<line number>: PASSED: | ||||||
|  |   REQUIRE( i != j ) | ||||||
|  | with expansion: | ||||||
|  |   2 != 4 | ||||||
|  |  | ||||||
| ------------------------------------------------------------------------------- | ------------------------------------------------------------------------------- | ||||||
| #748 - captures with unexpected exceptions | #748 - captures with unexpected exceptions | ||||||
|   outside assertions |   outside assertions | ||||||
| @@ -416,6 +482,6 @@ Condition.tests.cpp:<line number>: FAILED: | |||||||
|   CHECK( true != true ) |   CHECK( true != true ) | ||||||
|  |  | ||||||
| =============================================================================== | =============================================================================== | ||||||
| test cases: 21 | 16 passed | 3 failed | 2 failed as expected | test cases: 23 | 18 passed | 3 failed | 2 failed as expected | ||||||
| assertions: 48 | 41 passed | 4 failed | 3 failed as expected | assertions: 54 | 47 passed | 4 failed | 3 failed as expected | ||||||
|  |  | ||||||
|   | |||||||
| @@ -1,7 +1,7 @@ | |||||||
| <?xml version="1.0" encoding="UTF-8"?> | <?xml version="1.0" encoding="UTF-8"?> | ||||||
| <testsuitesloose text artifact | <testsuitesloose text artifact | ||||||
| > | > | ||||||
|   <testsuite name="<exe-name>" errors="17" failures="132" tests="1944" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> |   <testsuite name="<exe-name>" errors="17" failures="132" tests="1950" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||||
|     <properties> |     <properties> | ||||||
|       <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/> |       <property name="filters" value="~[!nonportable]~[!benchmark]~[approvals] *"/> | ||||||
|       <property name="random-seed" value="1"/> |       <property name="random-seed" value="1"/> | ||||||
| @@ -33,6 +33,8 @@ Nor would this | |||||||
|     <testcase classname="<exe-name>.global" name="#1905 -- test spec parser properly clears internal state between compound tests" time="{duration}" status="run"/> |     <testcase classname="<exe-name>.global" name="#1905 -- test spec parser properly clears internal state between compound tests" time="{duration}" status="run"/> | ||||||
|     <testcase classname="<exe-name>.global" name="#1912 -- test spec parser handles escaping/Various parentheses" time="{duration}" status="run"/> |     <testcase classname="<exe-name>.global" name="#1912 -- test spec parser handles escaping/Various parentheses" time="{duration}" status="run"/> | ||||||
|     <testcase classname="<exe-name>.global" name="#1912 -- test spec parser handles escaping/backslash in test name" time="{duration}" status="run"/> |     <testcase classname="<exe-name>.global" name="#1912 -- test spec parser handles escaping/backslash in test name" time="{duration}" status="run"/> | ||||||
|  |     <testcase classname="<exe-name>.global" name="#1913 - GENERATE inside a for loop should not keep recreating the generator" time="{duration}" status="run"/> | ||||||
|  |     <testcase classname="<exe-name>.global" name="#1913 - GENERATEs can share a line" time="{duration}" status="run"/> | ||||||
|     <testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}" status="run"> |     <testcase classname="<exe-name>.global" name="#748 - captures with unexpected exceptions/outside assertions" time="{duration}" status="run"> | ||||||
|       <error type="TEST_CASE"> |       <error type="TEST_CASE"> | ||||||
| FAILED: | FAILED: | ||||||
|   | |||||||
| @@ -915,6 +915,8 @@ Exception.tests.cpp:<line number> | |||||||
|     </testCase> |     </testCase> | ||||||
|   </file> |   </file> | ||||||
|   <file path="tests/<exe-name>/UsageTests/Generators.tests.cpp"> |   <file path="tests/<exe-name>/UsageTests/Generators.tests.cpp"> | ||||||
|  |     <testCase name="#1913 - GENERATE inside a for loop should not keep recreating the generator" duration="{duration}"/> | ||||||
|  |     <testCase name="#1913 - GENERATEs can share a line" duration="{duration}"/> | ||||||
|     <testCase name="3x3x3 ints" duration="{duration}"/> |     <testCase name="3x3x3 ints" duration="{duration}"/> | ||||||
|     <testCase name="Copy and then generate a range/from var and iterators" duration="{duration}"/> |     <testCase name="Copy and then generate a range/from var and iterators" duration="{duration}"/> | ||||||
|     <testCase name="Copy and then generate a range/From a temporary container" duration="{duration}"/> |     <testCase name="Copy and then generate a range/From a temporary container" duration="{duration}"/> | ||||||
|   | |||||||
| @@ -56,6 +56,18 @@ ok {test-number} - spec.matches(*fakeTestCase(R"(spec [a] char)")) for: true | |||||||
| ok {test-number} - !(spec.matches(*fakeTestCase("differs but has similar tag", "[a]"))) for: !false | ok {test-number} - !(spec.matches(*fakeTestCase("differs but has similar tag", "[a]"))) for: !false | ||||||
| # #1912 -- test spec parser handles escaping | # #1912 -- test spec parser handles escaping | ||||||
| ok {test-number} - spec.matches(*fakeTestCase(R"(spec \ char)")) for: true | ok {test-number} - spec.matches(*fakeTestCase(R"(spec \ char)")) for: true | ||||||
|  | # #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ok {test-number} - counter < 7 for: 3 < 7 | ||||||
|  | # #1913 - GENERATE inside a for loop should not keep recreating the generator | ||||||
|  | ok {test-number} - counter < 7 for: 6 < 7 | ||||||
|  | # #1913 - GENERATEs can share a line | ||||||
|  | ok {test-number} - i != j for: 1 != 3 | ||||||
|  | # #1913 - GENERATEs can share a line | ||||||
|  | ok {test-number} - i != j for: 1 != 4 | ||||||
|  | # #1913 - GENERATEs can share a line | ||||||
|  | ok {test-number} - i != j for: 2 != 3 | ||||||
|  | # #1913 - GENERATEs can share a line | ||||||
|  | ok {test-number} - i != j for: 2 != 4 | ||||||
| # #748 - captures with unexpected exceptions | # #748 - captures with unexpected exceptions | ||||||
| not ok {test-number} - unexpected exception with message: 'answer := 42' with 1 message: 'expected exception' | not ok {test-number} - unexpected exception with message: 'answer := 42' with 1 message: 'expected exception' | ||||||
| # #748 - captures with unexpected exceptions | # #748 - captures with unexpected exceptions | ||||||
| @@ -3878,5 +3890,5 @@ ok {test-number} - q3 == 23. for: 23.0 == 23.0 | |||||||
| ok {test-number} - | ok {test-number} - | ||||||
| # xmlentitycheck | # xmlentitycheck | ||||||
| ok {test-number} - | ok {test-number} - | ||||||
| 1..1935 | 1..1941 | ||||||
|  |  | ||||||
|   | |||||||
| @@ -30,6 +30,10 @@ Tricky.tests.cpp:<line number>|nexplicit failure with message:|n  "1514"'] | |||||||
| ##teamcity[testFinished name='#1905 -- test spec parser properly clears internal state between compound tests' duration="{duration}"] | ##teamcity[testFinished name='#1905 -- test spec parser properly clears internal state between compound tests' duration="{duration}"] | ||||||
| ##teamcity[testStarted name='#1912 -- test spec parser handles escaping'] | ##teamcity[testStarted name='#1912 -- test spec parser handles escaping'] | ||||||
| ##teamcity[testFinished name='#1912 -- test spec parser handles escaping' duration="{duration}"] | ##teamcity[testFinished name='#1912 -- test spec parser handles escaping' duration="{duration}"] | ||||||
|  | ##teamcity[testStarted name='#1913 - GENERATE inside a for loop should not keep recreating the generator'] | ||||||
|  | ##teamcity[testFinished name='#1913 - GENERATE inside a for loop should not keep recreating the generator' duration="{duration}"] | ||||||
|  | ##teamcity[testStarted name='#1913 - GENERATEs can share a line'] | ||||||
|  | ##teamcity[testFinished name='#1913 - GENERATEs can share a line' duration="{duration}"] | ||||||
| ##teamcity[testStarted name='#748 - captures with unexpected exceptions'] | ##teamcity[testStarted name='#748 - captures with unexpected exceptions'] | ||||||
| Exception.tests.cpp:<line number>|nunexpected exception with messages:|n  "answer := 42"|n  "expected exception"- failure ignore as test marked as |'ok to fail|'|n'] | Exception.tests.cpp:<line number>|nunexpected exception with messages:|n  "answer := 42"|n  "expected exception"- failure ignore as test marked as |'ok to fail|'|n'] | ||||||
| Exception.tests.cpp:<line number>|nunexpected exception with messages:|n  "answer := 42"|n  "expected exception"|n  REQUIRE_NOTHROW( thisThrows() )|nwith expansion:|n  thisThrows()|n- failure ignore as test marked as |'ok to fail|'|n'] | Exception.tests.cpp:<line number>|nunexpected exception with messages:|n  "answer := 42"|n  "expected exception"|n  REQUIRE_NOTHROW( thisThrows() )|nwith expansion:|n  thisThrows()|n- failure ignore as test marked as |'ok to fail|'|n'] | ||||||
|   | |||||||
| @@ -251,6 +251,60 @@ Nor would this | |||||||
|       </Section> |       </Section> | ||||||
|       <OverallResult success="true"/> |       <OverallResult success="true"/> | ||||||
|     </TestCase> |     </TestCase> | ||||||
|  |     <TestCase name="#1913 - GENERATE inside a for loop should not keep recreating the generator" tags="[generators][regression]" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           counter < 7 | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           3 < 7 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           counter < 7 | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           6 < 7 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <OverallResult success="true"/> | ||||||
|  |     </TestCase> | ||||||
|  |     <TestCase name="#1913 - GENERATEs can share a line" tags="[generators][regression]" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           i != j | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           1 != 3 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           i != j | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           1 != 4 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           i != j | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           2 != 3 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <Expression success="true" type="REQUIRE" filename="tests/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||||
|  |         <Original> | ||||||
|  |           i != j | ||||||
|  |         </Original> | ||||||
|  |         <Expanded> | ||||||
|  |           2 != 4 | ||||||
|  |         </Expanded> | ||||||
|  |       </Expression> | ||||||
|  |       <OverallResult success="true"/> | ||||||
|  |     </TestCase> | ||||||
|     <TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="tests/<exe-name>/UsageTests/Exception.tests.cpp" > |     <TestCase name="#748 - captures with unexpected exceptions" tags="[!shouldfail][!throws][.][failing]" filename="tests/<exe-name>/UsageTests/Exception.tests.cpp" > | ||||||
|       <Section name="outside assertions" filename="tests/<exe-name>/UsageTests/Exception.tests.cpp" > |       <Section name="outside assertions" filename="tests/<exe-name>/UsageTests/Exception.tests.cpp" > | ||||||
|         <Info> |         <Info> | ||||||
| @@ -18055,7 +18109,7 @@ loose text artifact | |||||||
|       </Section> |       </Section> | ||||||
|       <OverallResult success="true"/> |       <OverallResult success="true"/> | ||||||
|     </TestCase> |     </TestCase> | ||||||
|     <OverallResults successes="1774" failures="149" expectedFailures="21"/> |     <OverallResults successes="1780" failures="149" expectedFailures="21"/> | ||||||
|   </Group> |   </Group> | ||||||
|   <OverallResults successes="1774" failures="148" expectedFailures="21"/> |   <OverallResults successes="1780" failures="148" expectedFailures="21"/> | ||||||
| </Catch> | </Catch> | ||||||
|   | |||||||
| @@ -255,6 +255,22 @@ TEST_CASE("Copy and then generate a range", "[generators]") { | |||||||
|     } |     } | ||||||
| } | } | ||||||
|  |  | ||||||
|  | TEST_CASE("#1913 - GENERATE inside a for loop should not keep recreating the generator", "[regression][generators]") { | ||||||
|  |     static int counter = 0; | ||||||
|  |     for (int i = 0; i < 3; ++i) { | ||||||
|  |         int _ = GENERATE(1, 2); | ||||||
|  |         (void)_; | ||||||
|  |         ++counter; | ||||||
|  |     } | ||||||
|  |     // There should be at most 6 (3 * 2) counter increments | ||||||
|  |     REQUIRE(counter < 7); | ||||||
|  | } | ||||||
|  |  | ||||||
|  | TEST_CASE("#1913 - GENERATEs can share a line", "[regression][generators]") { | ||||||
|  |     int i = GENERATE(1, 2); int j = GENERATE(3, 4); | ||||||
|  |     REQUIRE(i != j); | ||||||
|  | } | ||||||
|  |  | ||||||
| #if defined(__clang__) | #if defined(__clang__) | ||||||
| #pragma clang diagnostic pop | #pragma clang diagnostic pop | ||||||
| #endif | #endif | ||||||
|   | |||||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský