Home | History | Annotate | Download | only in docs
      1 <a id="top"></a>
      2 # Logging macros
      3 
      4 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:
      5 
      6 ```cpp
      7 TEST_CASE("Foo") {
      8     INFO("Test case start");
      9     for (int i = 0; i < 2; ++i) {
     10         INFO("The number is " << i);
     11         CHECK(i == 0);
     12     }
     13 }
     14 
     15 TEST_CASE("Bar") {
     16     INFO("Test case start");
     17     for (int i = 0; i < 2; ++i) {
     18         INFO("The number is " << i);
     19         CHECK(i == i);
     20     }
     21     CHECK(false);
     22 }
     23 ```
     24 When the `CHECK` fails in the "Foo" test case, then two messages will be printed.
     25 ```
     26 Test case start
     27 The number is 1
     28 ```
     29 When the last `CHECK` fails in the "Bar" test case, then only one message will be printed: `Test case start`.
     30 
     31 ## Logging without local scope
     32 
     33 `UNSCOPED_INFO` is similar to `INFO` with two key differences:
     34 
     35 - Lifetime of an unscoped message is not tied to its own scope.
     36 - An unscoped message can be reported by the first following assertion only, regardless of the result of that assertion.
     37 
     38 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.
     39 
     40 These differences make this macro useful for reporting information from helper functions or inner scopes. An example:
     41 
     42 ```cpp
     43 void print_some_info() {
     44     UNSCOPED_INFO("Info from helper");
     45 }
     46 
     47 TEST_CASE("Baz") {
     48     print_some_info();
     49     for (int i = 0; i < 2; ++i) {
     50         UNSCOPED_INFO("The number is " << i);
     51     }
     52     CHECK(false);
     53 }
     54 
     55 TEST_CASE("Qux") {
     56     INFO("First info");
     57     UNSCOPED_INFO("First unscoped info");
     58     CHECK(false);
     59 
     60     INFO("Second info");
     61     UNSCOPED_INFO("Second unscoped info");
     62     CHECK(false);
     63 }
     64 ```
     65 
     66 "Baz" test case prints:
     67 ```
     68 Info from helper
     69 The number is 0
     70 The number is 1
     71 ```
     72 
     73 With "Qux" test case, two messages will be printed when the first `CHECK` fails:
     74 ```
     75 First info
     76 First unscoped info
     77 ```
     78 
     79 "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:
     80 ```
     81 First info
     82 Second info
     83 Second unscoped info
     84 ```
     85 
     86 ## Streaming macros
     87 
     88 All these macros allow heterogenous sequences of values to be streaming using the insertion operator (```<<```) in the same way that std::ostream, std::cout, etc support it.
     89 
     90 E.g.:
     91 ```c++
     92 INFO( "The number is " << i );
     93 ```
     94 
     95 (Note that there is no initial ```<<``` - instead the insertion sequence is placed in parentheses.)
     96 These macros come in three forms:
     97 
     98 **INFO(** _message expression_ **)**
     99 
    100 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.
    101 
    102 _Note that in Catch2 2.x.x `INFO` can be used without a trailing semicolon as there is a trailing semicolon inside macro.
    103 This semicolon will be removed with next major version. It is highly advised to use a trailing semicolon after `INFO` macro._
    104 
    105 **UNSCOPED_INFO(** _message expression_ **)**
    106 
    107 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.
    108 
    109 **WARN(** _message expression_ **)**
    110 
    111 The message is always reported but does not fail the test.
    112 
    113 **FAIL(** _message expression_ **)**
    114 
    115 The message is reported and the test case fails.
    116 
    117 **FAIL_CHECK(** _message expression_ **)**
    118 
    119 AS `FAIL`, but does not abort the test
    120 
    121 ## Quickly capture value of variables or expressions
    122 
    123 **CAPTURE(** _expression1_, _expression2_, ... **)**
    124 
    125 Sometimes you just want to log a value of variable, or expression. For
    126 convenience, we provide the `CAPTURE` macro, that can take a variable,
    127 or an expression, and prints out that variable/expression and its value
    128 at the time of capture.
    129 
    130 e.g. `CAPTURE( theAnswer );` will log message "theAnswer := 42", while
    131 ```cpp
    132 int a = 1, b = 2, c = 3;
    133 CAPTURE( a, b, c, a + b, c > b, a == 1);
    134 ```
    135 will log a total of 6 messages:
    136 ```
    137 a := 1
    138 b := 2
    139 c := 3
    140 a + b := 3
    141 c > b := true
    142 a == 1 := true
    143 ```
    144 
    145 You can also capture expressions that use commas inside parentheses
    146 (e.g. function calls), brackets, or braces (e.g. initializers). To
    147 properly capture expression that contains template parameters list
    148 (in other words, it contains commas between angle brackets), you need
    149 to enclose the expression inside parentheses:
    150 `CAPTURE( (std::pair<int, int>{1, 2}) );`
    151 
    152 
    153 ---
    154 
    155 [Home](Readme.md#top)
    156