mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 20:27:11 +01:00 
			
		
		
		
	Add ChunkGenerator
This generator collects values from the underlying generator until it has a specified amount of them, and then returns them in one "chunk". In case the underlying generator does not have enough elements for a specific chunk, the left-over elements are discarded. Closes #1538
This commit is contained in:
		| @@ -417,6 +417,19 @@ Generators.tests.cpp:<line number>: passed: j > 0 for: 3 > 0 | ||||
| Generators.tests.cpp:<line number>: passed: j > 0 for: 1 > 0 | ||||
| Generators.tests.cpp:<line number>: passed: j > 0 for: 2 > 0 | ||||
| Generators.tests.cpp:<line number>: passed: j > 0 for: 3 > 0 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.size() == 2 for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() == chunk2.back() for: 1 == 1 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.size() == 2 for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() == chunk2.back() for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.size() == 2 for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() == chunk2.back() for: 3 == 3 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.size() == 2 for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() == chunk2.back() for: 1 == 1 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() < 3 for: 1 < 3 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.size() == 2 for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() == chunk2.back() for: 2 == 2 | ||||
| Generators.tests.cpp:<line number>: passed: chunk2.front() < 3 for: 2 < 3 | ||||
| Generators.tests.cpp:<line number>: passed: chunk(2, value(1)), Catch::GeneratorException | ||||
| Generators.tests.cpp:<line number>: passed: j < i for: -3 < 1 | ||||
| Generators.tests.cpp:<line number>: passed: j < i for: -2 < 1 | ||||
| Generators.tests.cpp:<line number>: passed: j < i for: -1 < 1 | ||||
|   | ||||
| @@ -1175,5 +1175,5 @@ due to unexpected exception with message: | ||||
|  | ||||
| =============================================================================== | ||||
| test cases:  245 |  185 passed |  56 failed |  4 failed as expected | ||||
| assertions: 1365 | 1229 passed | 115 failed | 21 failed as expected | ||||
| assertions: 1378 | 1242 passed | 115 failed | 21 failed as expected | ||||
|  | ||||
|   | ||||
| @@ -3080,6 +3080,117 @@ Generators.tests.cpp:<line number>: PASSED: | ||||
| with expansion: | ||||
|   3 > 0 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Number of elements in source is divisible by chunk size | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.size() == 2 ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() == chunk2.back() ) | ||||
| with expansion: | ||||
|   1 == 1 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Number of elements in source is divisible by chunk size | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.size() == 2 ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() == chunk2.back() ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Number of elements in source is divisible by chunk size | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.size() == 2 ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() == chunk2.back() ) | ||||
| with expansion: | ||||
|   3 == 3 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Number of elements in source is not divisible by chunk size | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.size() == 2 ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() == chunk2.back() ) | ||||
| with expansion: | ||||
|   1 == 1 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() < 3 ) | ||||
| with expansion: | ||||
|   1 < 3 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Number of elements in source is not divisible by chunk size | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.size() == 2 ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() == chunk2.back() ) | ||||
| with expansion: | ||||
|   2 == 2 | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE( chunk2.front() < 3 ) | ||||
| with expansion: | ||||
|   2 < 3 | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- adapters | ||||
|   Chunking a generator into sized pieces | ||||
|   Throws on too small generators | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators.tests.cpp:<line number> | ||||
| ............................................................................... | ||||
|  | ||||
| Generators.tests.cpp:<line number>: PASSED: | ||||
|   REQUIRE_THROWS_AS( chunk(2, value(1)), Catch::GeneratorException ) | ||||
|  | ||||
| ------------------------------------------------------------------------------- | ||||
| Generators -- simple | ||||
|   one | ||||
| @@ -10574,5 +10685,5 @@ Misc.tests.cpp:<line number>: PASSED: | ||||
|  | ||||
| =============================================================================== | ||||
| test cases:  245 |  172 passed |  69 failed |  4 failed as expected | ||||
| assertions: 1379 | 1229 passed | 129 failed | 21 failed as expected | ||||
| assertions: 1392 | 1242 passed | 129 failed | 21 failed as expected | ||||
|  | ||||
|   | ||||
| @@ -4,7 +4,7 @@ | ||||
|     <property name="random-seed" value="1"/> | ||||
|   </properties> | ||||
| loose text artifact | ||||
|   <testsuite name="<exe-name>" errors="17" failures="113" tests="1380" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||
|   <testsuite name="<exe-name>" errors="17" failures="113" tests="1393" hostname="tbd" time="{duration}" timestamp="{iso8601-timestamp}"> | ||||
|     <testcase classname="<exe-name>.global" name="# A test name that starts with a #" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="#1005: Comparing pointer to int and long (NULL can be either on various systems)" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="#1027" time="{duration}"/> | ||||
| @@ -347,6 +347,9 @@ Message.tests.cpp:<line number> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Transforming elements/Same type" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Transforming elements/Different type" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Repeating a generator" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Chunking a generator into sized pieces/Number of elements in source is divisible by chunk size" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Chunking a generator into sized pieces/Number of elements in source is not divisible by chunk size" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- adapters/Chunking a generator into sized pieces/Throws on too small generators" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- simple/one" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators -- simple/two" time="{duration}"/> | ||||
|     <testcase classname="<exe-name>.global" name="Generators internals/Single value" time="{duration}"/> | ||||
|   | ||||
| @@ -3538,7 +3538,7 @@ | ||||
|       </Section> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Generators -- adapters" tags="[generators]" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|     <TestCase name="Generators -- adapters" tags="[generators][generic]" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|       <Section name="Filtering by predicate" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Original> | ||||
| @@ -3755,6 +3755,146 @@ | ||||
|         </Expression> | ||||
|         <OverallResults successes="1" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Number of elements in source is divisible by chunk size" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.size() == 2 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() == chunk2.back() | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               1 == 1 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Number of elements in source is divisible by chunk size" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.size() == 2 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() == chunk2.back() | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Number of elements in source is divisible by chunk size" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.size() == 2 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() == chunk2.back() | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               3 == 3 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="2" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Number of elements in source is not divisible by chunk size" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.size() == 2 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() == chunk2.back() | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               1 == 1 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() < 3 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               1 < 3 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="3" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="3" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Number of elements in source is not divisible by chunk size" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.size() == 2 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() == chunk2.back() | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 == 2 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <Expression success="true" type="REQUIRE" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk2.front() < 3 | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               2 < 3 | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="3" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="3" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <Section name="Chunking a generator into sized pieces" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|         <Section name="Throws on too small generators" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|           <Expression success="true" type="REQUIRE_THROWS_AS" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
|             <Original> | ||||
|               chunk(2, value(1)), Catch::GeneratorException | ||||
|             </Original> | ||||
|             <Expanded> | ||||
|               chunk(2, value(1)), Catch::GeneratorException | ||||
|             </Expanded> | ||||
|           </Expression> | ||||
|           <OverallResults successes="1" failures="0" expectedFailures="0"/> | ||||
|         </Section> | ||||
|         <OverallResults successes="1" failures="0" expectedFailures="0"/> | ||||
|       </Section> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <TestCase name="Generators -- simple" tags="[generators]" filename="projects/<exe-name>/UsageTests/Generators.tests.cpp" > | ||||
| @@ -12785,7 +12925,7 @@ loose text artifact | ||||
|       </Section> | ||||
|       <OverallResult success="true"/> | ||||
|     </TestCase> | ||||
|     <OverallResults successes="1229" failures="130" expectedFailures="21"/> | ||||
|     <OverallResults successes="1242" failures="130" expectedFailures="21"/> | ||||
|   </Group> | ||||
|   <OverallResults successes="1229" failures="129" expectedFailures="21"/> | ||||
|   <OverallResults successes="1242" failures="129" expectedFailures="21"/> | ||||
| </Catch> | ||||
|   | ||||
| @@ -114,7 +114,7 @@ SCENARIO("Eating cucumbers", "[generators][approvals]") { | ||||
| #endif | ||||
|  | ||||
| // There are also some generic generator manipulators | ||||
| TEST_CASE("Generators -- adapters", "[generators]") { | ||||
| TEST_CASE("Generators -- adapters", "[generators][generic]") { | ||||
|     // TODO: This won't work yet, introduce GENERATE_VAR? | ||||
|     //auto numbers = Catch::Generators::values({ 1, 2, 3, 4, 5, 6 }); | ||||
|     SECTION("Filtering by predicate") { | ||||
| @@ -144,6 +144,23 @@ TEST_CASE("Generators -- adapters", "[generators]") { | ||||
|         auto j = GENERATE(repeat(2, values({ 1, 2, 3 }))); | ||||
|         REQUIRE(j > 0); | ||||
|     } | ||||
|     SECTION("Chunking a generator into sized pieces") { | ||||
|         SECTION("Number of elements in source is divisible by chunk size") { | ||||
|             auto chunk2 = GENERATE(chunk(2, values({ 1, 1, 2, 2, 3, 3 }))); | ||||
|             REQUIRE(chunk2.size() == 2); | ||||
|             REQUIRE(chunk2.front() == chunk2.back()); | ||||
|         } | ||||
|         SECTION("Number of elements in source is not divisible by chunk size") { | ||||
|             auto chunk2 = GENERATE(chunk(2, values({ 1, 1, 2, 2, 3 }))); | ||||
|             REQUIRE(chunk2.size() == 2); | ||||
|             REQUIRE(chunk2.front() == chunk2.back()); | ||||
|             REQUIRE(chunk2.front() < 3); | ||||
|         } | ||||
|         SECTION("Throws on too small generators") { | ||||
|             using namespace Catch::Generators; | ||||
|             REQUIRE_THROWS_AS(chunk(2, value(1)), Catch::GeneratorException); | ||||
|         } | ||||
|     } | ||||
| } | ||||
|  | ||||
| // Note that because of the non-reproducibility of distributions, | ||||
|   | ||||
		Reference in New Issue
	
	Block a user
	 Martin Hořeňovský
					Martin Hořeňovský