| <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) |