| 
									
										
										
										
											2018-09-17 10:51:44 +02:00
										 |  |  | <a id="top"></a> | 
					
						
							|  |  |  | # Other macros
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | This page serves as a reference for macros that are not documented | 
					
						
							|  |  |  | elsewhere. For now, these macros are separated into 2 rough categories, | 
					
						
							|  |  |  | "assertion related macros" and "test case related macros". | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Assertion related macros
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `CHECKED_IF` and `CHECKED_ELSE` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `CHECKED_IF( expr )` is an `if` replacement, that also applies Catch2's | 
					
						
							|  |  |  | stringification machinery to the _expr_ and records the result. As with | 
					
						
							|  |  |  | `if`, the block after a `CHECKED_IF` is entered only if the expression | 
					
						
							|  |  |  | evaluates to `true`. `CHECKED_ELSE( expr )` work similarly, but the block | 
					
						
							|  |  |  | is entered only if the _expr_ evaluated to `false`. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | int a = ...; | 
					
						
							|  |  |  | int b = ...; | 
					
						
							|  |  |  | CHECKED_IF( a == b ) { | 
					
						
							|  |  |  |     // This block is entered when a == b | 
					
						
							|  |  |  | } CHECKED_ELSE ( a == b ) { | 
					
						
							|  |  |  |     // This block is entered when a != b | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `CHECK_NOFAIL` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `CHECK_NOFAIL( expr )` is a variant of `CHECK` that does not fail the test | 
					
						
							|  |  |  | case if _expr_ evaluates to `false`. This can be useful for checking some | 
					
						
							| 
									
										
										
										
											2019-04-08 16:30:28 -05:00
										 |  |  | assumption, that might be violated without the test necessarily failing. | 
					
						
							| 
									
										
										
										
											2018-09-17 10:51:44 +02:00
										 |  |  | 
 | 
					
						
							|  |  |  | Example output: | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | main.cpp:6: | 
					
						
							|  |  |  | FAILED - but was ok: | 
					
						
							|  |  |  |   CHECK_NOFAIL( 1 == 2 ) | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | main.cpp:7: | 
					
						
							|  |  |  | PASSED: | 
					
						
							|  |  |  |   CHECK( 2 == 2 ) | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `SUCCEED` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `SUCCEED( msg )` is mostly equivalent with `INFO( msg ); REQUIRE( true );`. | 
					
						
							|  |  |  | In other words, `SUCCEED` is for cases where just reaching a certain line | 
					
						
							|  |  |  | means that the test has been a success. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example usage: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | TEST_CASE( "SUCCEED showcase" ) { | 
					
						
							|  |  |  |     int I = 1; | 
					
						
							|  |  |  |     SUCCEED( "I is " << I ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `STATIC_REQUIRE` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `STATIC_REQUIRE( expr )` is a macro that can be used the same way as a | 
					
						
							|  |  |  | `static_assert`, but also registers the success with Catch2, so it is | 
					
						
							|  |  |  | reported as a success at runtime. The whole check can also be deferred | 
					
						
							|  |  |  | to the runtime, by defining `CATCH_CONFIG_RUNTIME_STATIC_REQUIRE` before | 
					
						
							|  |  |  | including the Catch2 header. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | TEST_CASE("STATIC_REQUIRE showcase", "[traits]") { | 
					
						
							|  |  |  |     STATIC_REQUIRE( std::is_void<void>::value ); | 
					
						
							|  |  |  |     STATIC_REQUIRE_FALSE( std::is_void<int>::value ); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ## Test case related macros
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `METHOD_AS_TEST_CASE` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `METHOD_AS_TEST_CASE( member-function-pointer, description )` lets you | 
					
						
							|  |  |  | register a member function of a class as a Catch2 test case. The class | 
					
						
							|  |  |  | will be separately instantiated for each method registered in this way. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | class TestClass { | 
					
						
							|  |  |  |     std::string s; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | public: | 
					
						
							|  |  |  |     TestClass() | 
					
						
							|  |  |  |         :s( "hello" ) | 
					
						
							|  |  |  |     {} | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     void testCase() { | 
					
						
							|  |  |  |         REQUIRE( s == "hello" ); | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | }; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | METHOD_AS_TEST_CASE( TestClass::testCase, "Use class's method as a test case", "[class]" ) | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `REGISTER_TEST_CASE` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `REGISTER_TEST_CASE( function, description )` let's you register | 
					
						
							|  |  |  | a `function` as a test case. The function has to have `void()` signature, | 
					
						
							|  |  |  | the description can contain both name and tags. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | REGISTER_TEST_CASE( someFunction, "ManuallyRegistered", "[tags]" ); | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | _Note that the registration still has to happen before Catch2's session | 
					
						
							|  |  |  | is initiated. This means that it either needs to be done in a global | 
					
						
							|  |  |  | constructor, or before Catch2's session is created in user's own main._ | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `ANON_TEST_CASE` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `ANON_TEST_CASE` is a `TEST_CASE` replacement that will autogenerate | 
					
						
							|  |  |  | unique name. The advantage of this is that you do not have to think | 
					
						
							|  |  |  | of a name for the test case,`the disadvantage is that the name doesn't | 
					
						
							| 
									
										
										
										
											2019-04-08 16:30:28 -05:00
										 |  |  | necessarily remain stable across different links, and thus it might be | 
					
						
							| 
									
										
										
										
											2018-09-17 10:51:44 +02:00
										 |  |  | hard to run directly. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | ANON_TEST_CASE() { | 
					
						
							|  |  |  |     SUCCEED("Hello from anonymous test case"); | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | * `DYNAMIC_SECTION` | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | `DYNAMIC_SECTION` is a `SECTION` where the user can use `operator<<` to | 
					
						
							|  |  |  | create the final name for that section. This can be useful with e.g. | 
					
						
							|  |  |  | generators, or when creating a `SECTION` dynamically, within a loop. | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  | Example: | 
					
						
							|  |  |  | ```cpp | 
					
						
							|  |  |  | TEST_CASE( "looped SECTION tests" ) { | 
					
						
							|  |  |  |     int a = 1; | 
					
						
							|  |  |  | 
 | 
					
						
							|  |  |  |     for( int b = 0; b < 10; ++b ) { | 
					
						
							|  |  |  |         DYNAMIC_SECTION( "b is currently: " << b ) { | 
					
						
							|  |  |  |             CHECK( b > a ); | 
					
						
							|  |  |  |         } | 
					
						
							|  |  |  |     } | 
					
						
							|  |  |  | } | 
					
						
							|  |  |  | ``` |