mirror of
				https://github.com/catchorg/Catch2.git
				synced 2025-10-31 12:17:11 +01:00 
			
		
		
		
	Add an example of using GENERATE(table())
There are some examples on issue #850 of using this feature, but they are not easily found from the documentation. Adding them here as an example makes them more findable and ensures they keep working if the API changes.
This commit is contained in:
		 Richard Ash
					Richard Ash
				
			
				
					committed by
					
						 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
			
				
	
			
			
			 Martin Hořeňovský
						Martin Hořeňovský
					
				
			
						parent
						
							ed9be5a00b
						
					
				
				
					commit
					2840ce1e70
				
			
							
								
								
									
										55
									
								
								examples/302-Gen-Table.cpp
									
									
									
									
									
										Normal file
									
								
							
							
						
						
									
										55
									
								
								examples/302-Gen-Table.cpp
									
									
									
									
									
										Normal file
									
								
							| @@ -0,0 +1,55 @@ | ||||
| // 302-Gen-Table.cpp | ||||
| // Shows how to use table to run a test many times with different inputs. Lifted from examples on | ||||
| // issue #850. | ||||
|  | ||||
| #include <catch2/catch_test_macros.hpp> | ||||
| #include <catch2/generators/catch_generators.hpp> | ||||
| #include <string> | ||||
|  | ||||
| struct TestSubject { | ||||
|     // this is the method we are going to test. It returns the length of the | ||||
|     // input string. | ||||
|     size_t GetLength( const std::string& input ) const { return input.size(); } | ||||
| }; | ||||
|  | ||||
|  | ||||
| TEST_CASE("Table allows pre-computed test inputs and outputs", "[example][generator]") { | ||||
|     using std::make_tuple; | ||||
|     // do setup here as normal | ||||
|     TestSubject subj; | ||||
|  | ||||
|     SECTION("This section is run for each row in the table") { | ||||
|         std::string test_input; | ||||
|         size_t expected_output; | ||||
|         std::tie( test_input, expected_output ) = | ||||
|             GENERATE( table<std::string, size_t>( | ||||
|                 { /* In this case one of the parameters to our test case is the | ||||
|                    * expected output, but this is not required. There could be | ||||
|                    * multiple expected values in the table, which can have any | ||||
|                    * (fixed) number of columns. | ||||
|                    */ | ||||
|                   make_tuple( "one", 3 ), | ||||
|                   make_tuple( "two", 3 ), | ||||
|                   make_tuple( "three", 5 ), | ||||
|                   make_tuple( "four", 4 ) } ) ); | ||||
|  | ||||
|         // run the test | ||||
|         auto result = subj.GetLength(test_input); | ||||
|         // capture the input data to go with the outputs. | ||||
|         CAPTURE(test_input); | ||||
|         // check it matches the pre-calculated data | ||||
|         REQUIRE(result == expected_output); | ||||
|     }   // end section | ||||
| } | ||||
|  | ||||
| /* Possible simplifications where less legacy toolchain support is needed: | ||||
|  * | ||||
|  * - With libstdc++6 or newer, the make_tuple() calls can be ommitted | ||||
|  * (technically C++17 but does not require -std in GCC/Clang). See | ||||
|  *   https://stackoverflow.com/questions/12436586/tuple-vector-and-initializer-list | ||||
|  * | ||||
|  * - In C++17 mode std::tie() and the preceeding variable delcarations can be | ||||
|  * replaced by structured bindings: auto [test_input, expected] = GENERATE( | ||||
|  * table<std::string, size_t>({ ... | ||||
|  */ | ||||
| // Compiling and running this file will result in 4 successful assertions | ||||
| @@ -32,6 +32,7 @@ set( SOURCES_IDIOMATIC_EXAMPLES | ||||
|     210-Evt-EventListeners.cpp | ||||
|     300-Gen-OwnGenerator.cpp | ||||
|     301-Gen-MapTypeConversion.cpp | ||||
|     302-Gen-Table.cpp | ||||
|     310-Gen-VariablesInGenerators.cpp | ||||
|     311-Gen-CustomCapture.cpp | ||||
| ) | ||||
|   | ||||
		Reference in New Issue
	
	Block a user