| <a id="top"></a> | |
| # Logging macros | |
| Additional messages can be logged during a test case. Note that the messages logged with `INFO` are scoped and thus will not be reported if failure occurs in scope preceding the message declaration. An example: | |
| ```cpp | |
| TEST_CASE("Foo") { | |
| INFO("Test case start"); | |
| for (int i = 0; i < 2; ++i) { | |
| INFO("The number is " << i); | |
| CHECK(i == 0); | |
| } | |
| } | |
| TEST_CASE("Bar") { | |
| INFO("Test case start"); | |
| for (int i = 0; i < 2; ++i) { | |
| INFO("The number is " << i); | |
| CHECK(i == i); | |
| } | |
| CHECK(false); | |
| } | |
| ``` | |
| When the `CHECK` fails in the "Foo" test case, then two messages will be printed. | |
| ``` | |
| Test case start | |
| The number is 1 | |
| ``` | |
| When the last `CHECK` fails in the "Bar" test case, then only one message will be printed: `Test case start`. | |
| ## Logging without local scope | |
| > [Introduced](https://github.com/catchorg/Catch2/issues/1522) in Catch 2.7.0. | |
| `UNSCOPED_INFO` is similar to `INFO` with two key differences: | |
| - Lifetime of an unscoped message is not tied to its own scope. | |
| - An unscoped message can be reported by the first following assertion only, regardless of the result of that assertion. | |
| In other words, lifetime of `UNSCOPED_INFO` is limited by the following assertion (or by the end of test case/section, whichever comes first) whereas lifetime of `INFO` is limited by its own scope. | |
| These differences make this macro useful for reporting information from helper functions or inner scopes. An example: | |
| ```cpp | |
| void print_some_info() { | |
| UNSCOPED_INFO("Info from helper"); | |
| } | |
| TEST_CASE("Baz") { | |
| print_some_info(); | |
| for (int i = 0; i < 2; ++i) { | |
| UNSCOPED_INFO("The number is " << i); | |
| } | |
| CHECK(false); | |
| } | |
| TEST_CASE("Qux") { | |
| INFO("First info"); | |
| UNSCOPED_INFO("First unscoped info"); | |
| CHECK(false); | |
| INFO("Second info"); | |
| UNSCOPED_INFO("Second unscoped info"); | |
| CHECK(false); | |
| } | |
| ``` | |
| "Baz" test case prints: | |
| ``` | |
| Info from helper | |
| The number is 0 | |
| The number is 1 | |
| ``` | |
| With "Qux" test case, two messages will be printed when the first `CHECK` fails: | |
| ``` | |
| First info | |
| First unscoped info | |
| ``` | |
| "First unscoped info" message will be cleared after the first `CHECK`, while "First info" message will persist until the end of the test case. Therefore, when the second `CHECK` fails, three messages will be printed: | |
| ``` | |
| First info | |
| Second info | |
| Second unscoped info | |
| ``` | |
| ## Streaming macros | |
| All these macros allow heterogeneous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it. | |
| E.g.: | |
| ```c++ | |
| INFO( "The number is " << i ); | |
| ``` | |
| (Note that there is no initial ```<<``` - instead the insertion sequence is placed in parentheses.) | |
| These macros come in three forms: | |
| **INFO(** _message expression_ **)** | |
| The message is logged to a buffer, but only reported with next assertions that are logged. This allows you to log contextual information in case of failures which is not shown during a successful test run (for the console reporter, without -s). Messages are removed from the buffer at the end of their scope, so may be used, for example, in loops. | |
| _Note that in Catch2 2.x.x `INFO` can be used without a trailing semicolon as there is a trailing semicolon inside macro. | |
| This semicolon will be removed with next major version. It is highly advised to use a trailing semicolon after `INFO` macro._ | |
| **UNSCOPED_INFO(** _message expression_ **)** | |
| > [Introduced](https://github.com/catchorg/Catch2/issues/1522) in Catch 2.7.0. | |
| Similar to `INFO`, but messages are not limited to their own scope: They are removed from the buffer after each assertion, section or test case, whichever comes first. | |
| **WARN(** _message expression_ **)** | |
| The message is always reported but does not fail the test. | |
| **FAIL(** _message expression_ **)** | |
| The message is reported and the test case fails. | |
| **FAIL_CHECK(** _message expression_ **)** | |
| AS `FAIL`, but does not abort the test | |
| ## Quickly capture value of variables or expressions | |
| **CAPTURE(** _expression1_, _expression2_, ... **)** | |
| Sometimes you just want to log a value of variable, or expression. For | |
| convenience, we provide the `CAPTURE` macro, that can take a variable, | |
| or an expression, and prints out that variable/expression and its value | |
| at the time of capture. | |
| e.g. `CAPTURE( theAnswer );` will log message "theAnswer := 42", while | |
| ```cpp | |
| int a = 1, b = 2, c = 3; | |
| CAPTURE( a, b, c, a + b, c > b, a == 1); | |
| ``` | |
| will log a total of 6 messages: | |
| ``` | |
| a := 1 | |
| b := 2 | |
| c := 3 | |
| a + b := 3 | |
| c > b := true | |
| a == 1 := true | |
| ``` | |
| You can also capture expressions that use commas inside parentheses | |
| (e.g. function calls), brackets, or braces (e.g. initializers). To | |
| properly capture expression that contains template parameters list | |
| (in other words, it contains commas between angle brackets), you need | |
| to enclose the expression inside parentheses: | |
| `CAPTURE( (std::pair<int, int>{1, 2}) );` | |
| --- | |
| [Home](Readme.md#top) | |