3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
4 <title>Contexts</title>
5 <link rel="stylesheet" href="../../../boostbook.css" type="text/css">
6 <meta name="generator" content="DocBook XSL Stylesheets V1.79.1">
7 <link rel="home" href="../../../index.html" title="Boost.Test">
8 <link rel="up" href="../test_tools_support_for_logging.html" title="Tools supports for logging">
9 <link rel="prev" href="checkpoints.html" title="Checkpoints for accurate failure location">
10 <link rel="next" href="log_floating_points.html" title="Logging floating point type numbers">
12 <body bgcolor="white" text="black" link="#0000FF" vlink="#840084" alink="#0000FF">
13 <table cellpadding="2" width="100%"><tr>
14 <td valign="top"><img alt="Boost C++ Libraries" width="277" height="86" src="../../../../../../../boost.png"></td>
15 <td align="center"><a href="../../../../../../../index.html">Home</a></td>
16 <td align="center"><a href="../../../../../../../libs/libraries.htm">Libraries</a></td>
17 <td align="center"><a href="http://www.boost.org/users/people.html">People</a></td>
18 <td align="center"><a href="http://www.boost.org/users/faq.html">FAQ</a></td>
19 <td align="center"><a href="../../../../../../../more/index.htm">More</a></td>
22 <div class="spirit-nav">
23 <a accesskey="p" href="checkpoints.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_tools_support_for_logging.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="log_floating_points.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>
26 <div class="titlepage"><div><div><h4 class="title">
27 <a name="boost_test.test_output.test_tools_support_for_logging.contexts"></a><a class="link" href="contexts.html" title="Contexts">Contexts</a>
28 </h4></div></div></div>
30 Contexts are a facility provided by the <span class="emphasis"><em>Unit Test Framework</em></span>
31 in order to be able to trace the location of assertions better. To grasp
32 the idea, consider the following example:
34 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">Processor</span><span class="special">&</span> <span class="identifier">processor</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">limit</span><span class="special">)</span>
35 <span class="special">{</span>
36 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">limit</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
37 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
38 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
39 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">));</span>
40 <span class="special">}</span>
41 <span class="special">}</span>
42 <span class="special">}</span>
45 In case of failure, in order to see in the logs at which point of the loops
46 the failure occurred, we need some extra information in the assertion,
47 which can be achieved for instance <a class="link" href="../../testing_tools/reports.html#boost_test.testing_tools.reports.custom_messages">the
50 <pre class="programlisting"><span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
55 <pre class="programlisting"><span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span> <span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
58 We see in this trivial example that a context, which is the variable <code class="computeroutput"><span class="identifier">i</span></code> in this case, should be acknowledged
59 by the assertion <code class="computeroutput"><span class="identifier">BOOST_CHECK</span></code>
60 in a particular way. In the approach above, this is done by adding a message
61 to the assertion itself.
64 What if the context is more complex than that? In case the complexity of
65 the context increases, the fact that the assertion and the context is tightly
66 coupled as in the approach above is difficult to maintain:
68 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">Processor</span><span class="special">&</span> <span class="identifier">processor</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">limit</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">)</span>
69 <span class="special">{</span>
70 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">limit</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
71 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">),</span>
72 <span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span> <span class="special"><<</span> <span class="string">", With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
73 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
74 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">),</span>
75 <span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span> <span class="special"><<</span>
76 <span class="string">", With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span> <span class="special"><<</span> <span class="string">", With parameter j = "</span> <span class="special"><<</span> <span class="identifier">j</span><span class="special">);</span>
77 <span class="special">}</span>
78 <span class="special">}</span>
79 <span class="special">}</span>
81 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">)</span>
82 <span class="special">{</span>
83 <span class="identifier">Processor</span> <span class="identifier">processor</span><span class="special">;</span>
85 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">level</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">3</span><span class="special">;</span> <span class="special">++</span><span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
86 <span class="identifier">processor</span><span class="special">.</span><span class="identifier">optimization_level</span><span class="special">(</span><span class="identifier">level</span><span class="special">);</span>
87 <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">processor</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">level</span><span class="special">);</span>
88 <span class="special">}</span>
89 <span class="special">}</span>
92 Note the length of the messages, the repetition, and the fact, that we
93 pass argument <code class="computeroutput"><span class="identifier">level</span></code> to
94 function <code class="computeroutput"><span class="identifier">test_operations</span></code>
95 only for the sake of generating an error message in case of a failure.
98 Therefore, <span class="bold"><strong>loose</strong></span> coupling between the
99 context of an assertion and the assertion point is a property that is desirable.
101 <a name="ref_BOOST_TEST_INFO"></a><h4>
102 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h0"></a>
103 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.assertion_bound_context"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.assertion_bound_context">Assertion-bound
107 <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code> can be
108 used to define an error message to be bound to the first following assertion.
109 If (and only if) the assertion fails, the bound message will be displayed
113 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h1"></a>
114 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.example_descr"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.example_descr">Example:
115 Assertion-bound context</a>
117 <div class="informaltable"><table class="table">
118 <colgroup><col></colgroup>
125 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">example80</span>
126 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
128 <span class="keyword">void</span> <span class="identifier">test</span><span class="special">()</span>
129 <span class="special">{</span>
130 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">false</span><span class="special">);</span>
131 <span class="special">}</span>
133 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test_case1</span><span class="special">)</span>
134 <span class="special">{</span>
135 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"Alpha"</span><span class="special">);</span>
136 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"Beta"</span><span class="special">);</span>
137 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="keyword">true</span><span class="special">);</span>
139 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"Gamma"</span><span class="special">);</span>
140 <span class="keyword">char</span> <span class="identifier">a</span> <span class="special">=</span> <span class="char">'a'</span><span class="special">;</span>
141 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"Delt"</span> <span class="special"><<</span> <span class="identifier">a</span><span class="special">);</span>
142 <span class="identifier">test</span><span class="special">();</span>
143 <span class="special">}</span>
147 <div class="informaltable"><table class="table">
148 <colgroup><col></colgroup>
155 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">example</span>
156 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
157 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">14</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_case1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="keyword">false</span> <span class="identifier">has</span> <span class="identifier">failed</span>
158 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
159 <span class="identifier">Gamma</span>
160 <span class="identifier">Delta</span>
162 <span class="special">***</span> <span class="number">1</span> <span class="identifier">failures</span> <span class="identifier">is</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"example80"</span>
167 The information composed inside <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code>
168 is bound only to the first assertion following the declaration. This information
169 is only displayed if the assertion fails; otherwise the message is discarded.
170 The <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code> declaration
171 does not have to immediately precede the assertion, it is allowed to intertwine
172 them with other instructions, they can even be declared in different scopes.
173 It is also possible to bind more than one information to a given assertion.
176 With <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code>, we
177 can improve our initial example as follows:
179 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">Processor</span><span class="special">&</span> <span class="identifier">processor</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">limit</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">level</span><span class="special">)</span>
180 <span class="special">{</span>
181 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">limit</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
182 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span><span class="special">);</span>
183 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
184 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
185 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
186 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span><span class="special">);</span>
187 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
188 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter j = "</span> <span class="special"><<</span> <span class="identifier">j</span><span class="special">);</span>
189 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">));</span>
190 <span class="special">}</span>
191 <span class="special">}</span>
192 <span class="special">}</span>
194 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">)</span>
195 <span class="special">{</span>
196 <span class="identifier">Processor</span> <span class="identifier">processor</span><span class="special">;</span>
198 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">level</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">3</span><span class="special">;</span> <span class="special">++</span><span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
199 <span class="identifier">processor</span><span class="special">.</span><span class="identifier">optimization_level</span><span class="special">(</span><span class="identifier">level</span><span class="special">);</span>
200 <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">processor</span><span class="special">,</span> <span class="number">2</span><span class="special">,</span> <span class="identifier">level</span><span class="special">);</span>
201 <span class="special">}</span>
202 <span class="special">}</span>
204 <a name="ref_BOOST_TEST_CONTEXT"></a><h4>
205 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h2"></a>
206 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.scope_bound_context"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.scope_bound_context">Scope-bound
210 In the previous example, the information stored inside the calls to <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code> were all consumed by
211 the next assertion. There are cases where we would like this information
212 be persistent for the current scope. <span class="emphasis"><em>Unit Test Framework</em></span>
213 provides two tools to achieve this:
215 <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
216 <li class="listitem">
217 <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code>
218 defines a diagnostic message and a scope. The message is bound to every
219 assertion in that scope, and is displayed along with every failed assertion.
221 <li class="listitem">
222 <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code>
223 acts the same as <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO</span></code>,
224 but the stored context information is bound to all the assertions that
225 follow the call to <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code>
226 within the current scope.
229 <div class="tip"><table border="0" summary="Tip">
231 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../../doc/src/images/tip.png"></td>
232 <th align="left">Tip</th>
234 <tr><td align="left" valign="top"><p>
235 Since Boost <a class="link" href="../../change_log.html#ref_CHANGE_LOG_3_10">Boost 1.70</a>, <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code> can accept multiple
239 <div class="tip"><table border="0" summary="Tip">
241 <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../../doc/src/images/tip.png"></td>
242 <th align="left">Tip</th>
244 <tr><td align="left" valign="top"><p>
245 <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code>
246 has been introduced in <a class="link" href="../../change_log.html#ref_CHANGE_LOG_3_10">Boost 1.70</a>.
250 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h3"></a>
251 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.example_descr0"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.example_descr0">Example:
252 Scope-bound context</a>
254 <div class="informaltable"><table class="table">
255 <colgroup><col></colgroup>
262 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">example81</span>
263 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
265 <span class="keyword">void</span> <span class="identifier">test</span><span class="special">()</span>
266 <span class="special">{</span>
267 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">2</span> <span class="special">!=</span> <span class="number">2</span><span class="special">);</span>
268 <span class="special">}</span>
270 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test_case1</span><span class="special">)</span>
271 <span class="special">{</span>
272 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"Alpha"</span><span class="special">)</span> <span class="special">{</span>
273 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">1</span> <span class="special">!=</span> <span class="number">1</span><span class="special">);</span>
274 <span class="identifier">test</span><span class="special">();</span>
276 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"Be"</span> <span class="special"><<</span> <span class="string">"ta"</span><span class="special">)</span>
277 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">3</span> <span class="special">!=</span> <span class="number">3</span><span class="special">);</span>
279 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">4</span> <span class="special">==</span> <span class="number">4</span><span class="special">);</span>
280 <span class="special">}</span>
282 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="number">5</span> <span class="special">!=</span> <span class="number">5</span><span class="special">);</span>
283 <span class="special">}</span>
287 <div class="informaltable"><table class="table">
288 <colgroup><col></colgroup>
295 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">example</span>
296 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
297 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">20</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_case1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="number">1</span> <span class="special">!=</span> <span class="number">1</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1</span> <span class="special">==</span> <span class="number">1</span><span class="special">]</span>
298 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
299 <span class="identifier">Alpha</span>
300 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">14</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_case1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="number">2</span> <span class="special">!=</span> <span class="number">2</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">2</span> <span class="special">==</span> <span class="number">2</span><span class="special">]</span>
301 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
302 <span class="identifier">Alpha</span>
303 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">24</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_case1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="number">3</span> <span class="special">!=</span> <span class="number">3</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">3</span> <span class="special">==</span> <span class="number">3</span><span class="special">]</span>
304 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
305 <span class="identifier">Alpha</span>
306 <span class="identifier">Beta</span>
307 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">29</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_case1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="number">5</span> <span class="special">!=</span> <span class="number">5</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">5</span> <span class="special">==</span> <span class="number">5</span><span class="special">]</span>
309 <span class="special">***</span> <span class="number">4</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"example81"</span>
314 In the previous example, there is an opening brace right after <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code>: this pair of braces
315 defines the scope in which the diagnostic message is in effect. If there
316 is no braces, the scope applies only to the following statement. <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code> declarations can nest.
319 With <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code>,
320 we can further improve our initial example, by putting variable <code class="computeroutput"><span class="identifier">level</span></code> into a scope-level context and
321 not pass it as function parameter:
323 <pre class="programlisting"><span class="keyword">void</span> <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">Processor</span><span class="special">&</span> <span class="identifier">processor</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">limit</span><span class="special">)</span>
324 <span class="special">{</span>
325 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">limit</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
326 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
327 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
328 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
329 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">);</span>
330 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter j = "</span> <span class="special"><<</span> <span class="identifier">j</span><span class="special">);</span>
331 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">));</span>
332 <span class="special">}</span>
333 <span class="special">}</span>
334 <span class="special">}</span>
336 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">)</span>
337 <span class="special">{</span>
338 <span class="identifier">Processor</span> <span class="identifier">processor</span><span class="special">;</span>
340 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">level</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">3</span><span class="special">;</span> <span class="special">++</span><span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
341 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
342 <span class="identifier">processor</span><span class="special">.</span><span class="identifier">optimization_level</span><span class="special">(</span><span class="identifier">level</span><span class="special">);</span>
343 <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">processor</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
344 <span class="special">}</span>
345 <span class="special">}</span>
346 <span class="special">}</span>
349 If we observe that variable <code class="computeroutput"><span class="identifier">i</span></code>
350 also applies in a certain scope, we can improve our example further still.
353 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h4"></a>
354 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.example_descr1"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.example_descr1">Example:
357 <div class="informaltable"><table class="table">
358 <colgroup><col></colgroup>
365 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">example82</span>
366 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
368 <span class="keyword">struct</span> <span class="identifier">Processor</span>
369 <span class="special">{</span>
370 <span class="keyword">int</span> <span class="identifier">level</span><span class="special">;</span>
371 <span class="keyword">void</span> <span class="identifier">optimization_level</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">l</span><span class="special">)</span> <span class="special">{</span> <span class="identifier">level</span> <span class="special">=</span> <span class="identifier">l</span><span class="special">;</span> <span class="special">}</span>
372 <span class="keyword">bool</span> <span class="identifier">op1</span><span class="special">(</span><span class="keyword">int</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">2</span><span class="special">;</span> <span class="special">}</span>
373 <span class="keyword">bool</span> <span class="identifier">op2</span><span class="special">(</span><span class="keyword">int</span><span class="special">,</span> <span class="keyword">int</span><span class="special">)</span> <span class="special">{</span> <span class="keyword">return</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">1</span><span class="special">;</span> <span class="special">}</span>
374 <span class="special">};</span>
376 <span class="keyword">void</span> <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">Processor</span><span class="special">&</span> <span class="identifier">processor</span><span class="special">,</span> <span class="keyword">int</span> <span class="identifier">limit</span><span class="special">)</span>
377 <span class="special">{</span>
378 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="identifier">limit</span><span class="special">;</span> <span class="special">++</span><span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
379 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"With parameter i = "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
380 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">));</span>
381 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">i</span><span class="special">;</span> <span class="special">++</span><span class="identifier">j</span><span class="special">)</span> <span class="special">{</span>
382 <span class="identifier">BOOST_TEST_INFO</span><span class="special">(</span><span class="string">"With parameter j = "</span> <span class="special"><<</span> <span class="identifier">j</span><span class="special">);</span>
383 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">));</span>
384 <span class="special">}</span>
385 <span class="special">}</span>
386 <span class="special">}</span>
387 <span class="special">}</span>
389 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test1</span><span class="special">)</span>
390 <span class="special">{</span>
391 <span class="identifier">Processor</span> <span class="identifier">processor</span><span class="special">;</span>
393 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">level</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">3</span><span class="special">;</span> <span class="special">++</span><span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
394 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"With optimization level "</span> <span class="special"><<</span> <span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
395 <span class="identifier">processor</span><span class="special">.</span><span class="identifier">optimization_level</span><span class="special">(</span><span class="identifier">level</span><span class="special">);</span>
396 <span class="identifier">test_operations</span><span class="special">(</span><span class="identifier">processor</span><span class="special">,</span> <span class="number">2</span><span class="special">);</span>
397 <span class="special">}</span>
398 <span class="special">}</span>
399 <span class="special">}</span>
403 <div class="informaltable"><table class="table">
404 <colgroup><col></colgroup>
411 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">example</span>
412 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
413 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">27</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span>
414 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
415 <span class="identifier">With</span> <span class="identifier">optimization</span> <span class="identifier">level</span> <span class="number">1</span>
416 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span>
417 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span>
418 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">24</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span>
419 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
420 <span class="identifier">With</span> <span class="identifier">optimization</span> <span class="identifier">level</span> <span class="number">2</span>
421 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span>
422 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">24</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">processor</span><span class="special">.</span><span class="identifier">op1</span><span class="special">(</span><span class="identifier">i</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span>
423 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
424 <span class="identifier">With</span> <span class="identifier">optimization</span> <span class="identifier">level</span> <span class="number">2</span>
425 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span>
426 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">27</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">processor</span><span class="special">.</span><span class="identifier">op2</span><span class="special">(</span><span class="identifier">i</span><span class="special">,</span> <span class="identifier">j</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span>
427 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
428 <span class="identifier">With</span> <span class="identifier">optimization</span> <span class="identifier">level</span> <span class="number">2</span>
429 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">1</span>
430 <span class="identifier">With</span> <span class="identifier">parameter</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">0</span>
432 <span class="special">***</span> <span class="number">4</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"example82"</span>
437 Finally, it is possible to pass several arguments to <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code>,
438 which is more convenient than having several scopes:
441 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h5"></a>
442 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.example_descr2"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.example_descr2">Example:
443 Multiple arguments to <code class="computeroutput"><span class="identifier">BOOST_TEST_CONTEXT</span></code></a>
445 <div class="informaltable"><table class="table">
446 <colgroup><col></colgroup>
453 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">example83</span> <span class="identifier">multicontext</span>
454 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
455 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cmath</span><span class="special">></span>
457 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test_multi_context</span><span class="special">)</span>
458 <span class="special">{</span>
459 <span class="keyword">for</span> <span class="special">(</span><span class="keyword">int</span> <span class="identifier">level</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">level</span> <span class="special"><</span> <span class="number">10</span><span class="special">;</span> <span class="special">++</span><span class="identifier">level</span><span class="special">)</span> <span class="special">{</span>
460 <span class="keyword">int</span> <span class="identifier">rand_value</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">abs</span><span class="special">(</span><span class="identifier">rand</span><span class="special">())</span> <span class="special">%</span> <span class="number">50</span><span class="special">;</span>
461 <span class="identifier">BOOST_TEST_CONTEXT</span><span class="special">(</span><span class="string">"With level "</span> <span class="special"><<</span> <span class="identifier">level</span><span class="special">,</span> <span class="string">"Random value="</span> <span class="special"><<</span> <span class="identifier">rand_value</span><span class="special">){</span>
462 <span class="keyword">for</span><span class="special">(</span> <span class="keyword">int</span> <span class="identifier">j</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">j</span> <span class="special"><</span> <span class="identifier">rand_value</span><span class="special">;</span> <span class="identifier">j</span><span class="special">++)</span> <span class="special">{</span>
463 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">level</span> <span class="special"><</span> <span class="identifier">rand_value</span><span class="special">);</span>
464 <span class="identifier">rand_value</span> <span class="special">/=</span> <span class="number">2</span><span class="special">;</span>
465 <span class="special">}</span>
466 <span class="special">}</span>
467 <span class="special">}</span>
468 <span class="special">}</span>
472 <div class="informaltable"><table class="table">
473 <colgroup><col></colgroup>
480 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">example</span>
481 <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
482 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">19</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_multi_context"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">level</span> <span class="special"><</span> <span class="identifier">rand_value</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">7</span> <span class="special">>=</span> <span class="number">5</span><span class="special">]</span>
483 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
484 <span class="identifier">With</span> <span class="identifier">level</span> <span class="number">7</span>
485 <span class="identifier">Random</span> <span class="identifier">value</span><span class="special">=</span><span class="number">42</span>
486 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">19</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_multi_context"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">level</span> <span class="special"><</span> <span class="identifier">rand_value</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">8</span> <span class="special">>=</span> <span class="number">6</span><span class="special">]</span>
487 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
488 <span class="identifier">With</span> <span class="identifier">level</span> <span class="number">8</span>
489 <span class="identifier">Random</span> <span class="identifier">value</span><span class="special">=</span><span class="number">49</span>
490 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">19</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test_multi_context"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">level</span> <span class="special"><</span> <span class="identifier">rand_value</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">9</span> <span class="special">>=</span> <span class="number">5</span><span class="special">]</span>
491 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
492 <span class="identifier">With</span> <span class="identifier">level</span> <span class="number">9</span>
493 <span class="identifier">Random</span> <span class="identifier">value</span><span class="special">=</span><span class="number">21</span>
495 <span class="special">***</span> <span class="number">3</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"example83 multicontext"</span>
500 <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code> is
501 convenient when you augment the current scope information as new information
502 arrives. The following example calls several time a quadratic polynomial
503 estimation function with random polynomial. As the random values are drawn
504 in a loop, they are placed in the current scope with <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code>,
505 which allows us to easily debug the function.
508 <a name="boost_test.test_output.test_tools_support_for_logging.contexts.h6"></a>
509 <span class="phrase"><a name="boost_test.test_output.test_tools_support_for_logging.contexts.example_descr3"></a></span><a class="link" href="contexts.html#boost_test.test_output.test_tools_support_for_logging.contexts.example_descr3">Example:
510 Sticky context with <code class="computeroutput"><span class="identifier">BOOST_TEST_INFO_SCOPE</span></code></a>
512 <div class="informaltable"><table class="table">
513 <colgroup><col></colgroup>
520 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor">#define</span> <span class="identifier">BOOST_TEST_MODULE</span> <span class="identifier">example84</span>
521 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span>
522 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">random</span><span class="special">></span>
523 <span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">cmath</span><span class="special">></span>
525 <span class="comment">// this function does not compute properly the polynomial root estimation</span>
526 <span class="comment">// in the case of a double root.</span>
527 <span class="keyword">template</span> <span class="special"><</span><span class="keyword">class</span> <span class="identifier">random_generator_t</span><span class="special">></span>
528 <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span> <span class="identifier">estimate_polynomial_roots</span><span class="special">(</span>
529 <span class="identifier">random_generator_t</span><span class="special">&</span> <span class="identifier">gen</span><span class="special">,</span>
530 <span class="identifier">std</span><span class="special">::</span><span class="identifier">function</span><span class="special"><</span><span class="keyword">double</span><span class="special">(</span><span class="keyword">double</span><span class="special">)></span> <span class="identifier">polynomial</span><span class="special">)</span> <span class="special">{</span>
532 <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">std</span><span class="special">;</span>
534 <span class="identifier">std</span><span class="special">::</span><span class="identifier">uniform_real_distribution</span><span class="special"><></span> <span class="identifier">dis</span><span class="special">(-</span><span class="number">10</span><span class="special">,</span> <span class="number">10</span><span class="special">);</span>
535 <span class="keyword">double</span> <span class="identifier">x1</span> <span class="special">=</span> <span class="identifier">dis</span><span class="special">(</span><span class="identifier">gen</span><span class="special">);</span>
536 <span class="keyword">double</span> <span class="identifier">x2</span> <span class="special">=</span> <span class="identifier">dis</span><span class="special">(</span><span class="identifier">gen</span><span class="special">);</span>
537 <span class="keyword">double</span> <span class="identifier">fx1</span> <span class="special">=</span> <span class="identifier">polynomial</span><span class="special">(</span><span class="identifier">x1</span><span class="special">);</span>
538 <span class="keyword">double</span> <span class="identifier">fx2</span> <span class="special">=</span> <span class="identifier">polynomial</span><span class="special">(</span><span class="identifier">x2</span><span class="special">);</span>
540 <span class="identifier">BOOST_TEST_INFO_SCOPE</span><span class="special">(</span><span class="string">"sample1 = "</span> <span class="special"><<</span> <span class="identifier">x1</span><span class="special">);</span>
541 <span class="identifier">BOOST_TEST_INFO_SCOPE</span><span class="special">(</span><span class="string">"sample2 = "</span> <span class="special"><<</span> <span class="identifier">x2</span><span class="special">);</span>
543 <span class="comment">// from Vieta formula</span>
544 <span class="keyword">double</span> <span class="identifier">minus_b</span> <span class="special">=</span> <span class="identifier">x2</span> <span class="special">+</span> <span class="identifier">x1</span> <span class="special">-</span> <span class="special">(</span><span class="identifier">fx2</span> <span class="special">-</span> <span class="identifier">fx1</span><span class="special">)</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x2</span> <span class="special">-</span> <span class="identifier">x1</span><span class="special">);</span>
545 <span class="keyword">double</span> <span class="identifier">c</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">x1</span> <span class="special">*</span> <span class="identifier">fx2</span> <span class="special">-</span> <span class="identifier">x2</span> <span class="special">*</span> <span class="identifier">fx1</span> <span class="special">+</span> <span class="identifier">x2</span> <span class="special">*</span> <span class="identifier">x1</span> <span class="special">*</span> <span class="identifier">x1</span> <span class="special">-</span> <span class="identifier">x1</span> <span class="special">*</span> <span class="identifier">x2</span> <span class="special">*</span> <span class="identifier">x2</span><span class="special">)</span> <span class="special">/</span> <span class="special">(</span><span class="identifier">x1</span> <span class="special">-</span> <span class="identifier">x2</span><span class="special">);</span>
547 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">minus_b</span> <span class="special">*</span> <span class="identifier">minus_b</span> <span class="special">>=</span> <span class="number">4</span><span class="special">*</span><span class="identifier">c</span><span class="special">);</span>
549 <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">make_pair</span><span class="special">(</span>
550 <span class="special">(</span><span class="identifier">minus_b</span> <span class="special">-</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">minus_b</span> <span class="special">*</span> <span class="identifier">minus_b</span> <span class="special">-</span> <span class="number">4</span> <span class="special">*</span> <span class="identifier">c</span><span class="special">))</span> <span class="special">/</span> <span class="number">2</span><span class="special">,</span>
551 <span class="special">(</span><span class="identifier">minus_b</span> <span class="special">+</span> <span class="identifier">sqrt</span><span class="special">(</span><span class="identifier">minus_b</span> <span class="special">*</span> <span class="identifier">minus_b</span> <span class="special">-</span> <span class="number">4</span> <span class="special">*</span> <span class="identifier">c</span><span class="special">))</span> <span class="special">/</span> <span class="number">2</span><span class="special">);</span>
552 <span class="special">}</span>
554 <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">quadratic_estimation</span><span class="special">)</span>
555 <span class="special">{</span>
556 <span class="identifier">std</span><span class="special">::</span><span class="identifier">random_device</span> <span class="identifier">rd</span><span class="special">;</span>
557 <span class="keyword">unsigned</span> <span class="keyword">int</span> <span class="identifier">seed</span> <span class="special">=</span> <span class="identifier">rd</span><span class="special">();</span>
558 <span class="identifier">std</span><span class="special">::</span><span class="identifier">mt19937</span> <span class="identifier">gen</span><span class="special">(</span><span class="identifier">seed</span><span class="special">);</span>
559 <span class="identifier">std</span><span class="special">::</span><span class="identifier">uniform_int_distribution</span><span class="special"><></span> <span class="identifier">dis</span><span class="special">(-</span><span class="number">10</span><span class="special">,</span> <span class="number">10</span><span class="special">);</span>
561 <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"Seed = "</span> <span class="special"><<</span> <span class="identifier">seed</span><span class="special">);</span>
563 <span class="keyword">for</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> <span class="identifier">i</span> <span class="special"><</span> <span class="number">50</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span> <span class="special">{</span>
564 <span class="identifier">BOOST_TEST_INFO_SCOPE</span><span class="special">(</span><span class="string">"trial "</span> <span class="special"><<</span> <span class="identifier">i</span><span class="special">+</span><span class="number">1</span><span class="special">);</span>
565 <span class="keyword">int</span> <span class="identifier">root1</span> <span class="special">=</span> <span class="identifier">dis</span><span class="special">(</span><span class="identifier">gen</span><span class="special">);</span>
566 <span class="keyword">int</span> <span class="identifier">root2</span> <span class="special">=</span> <span class="identifier">dis</span><span class="special">(</span><span class="identifier">gen</span><span class="special">);</span>
567 <span class="keyword">if</span><span class="special">(</span><span class="identifier">root1</span> <span class="special">></span> <span class="identifier">root2</span><span class="special">)</span> <span class="special">{</span>
568 <span class="identifier">std</span><span class="special">::</span><span class="identifier">swap</span><span class="special">(</span><span class="identifier">root1</span><span class="special">,</span> <span class="identifier">root2</span><span class="special">);</span>
569 <span class="special">}</span>
570 <span class="identifier">BOOST_TEST_INFO_SCOPE</span><span class="special">(</span><span class="string">"root1 = "</span> <span class="special"><<</span> <span class="identifier">root1</span><span class="special">);</span>
571 <span class="identifier">BOOST_TEST_INFO_SCOPE</span><span class="special">(</span><span class="string">"root2 = "</span> <span class="special"><<</span> <span class="identifier">root2</span><span class="special">);</span>
573 <span class="identifier">std</span><span class="special">::</span><span class="identifier">pair</span><span class="special"><</span><span class="keyword">double</span><span class="special">,</span> <span class="keyword">double</span><span class="special">></span> <span class="identifier">estimated</span> <span class="special">=</span> <span class="identifier">estimate_polynomial_roots</span><span class="special">(</span>
574 <span class="identifier">gen</span><span class="special">,</span>
575 <span class="special">[</span><span class="identifier">root1</span><span class="special">,</span> <span class="identifier">root2</span><span class="special">](</span><span class="keyword">double</span> <span class="identifier">x</span><span class="special">)</span> <span class="special">-></span> <span class="keyword">double</span> <span class="special">{</span> <span class="keyword">return</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">root1</span><span class="special">)</span> <span class="special">*</span> <span class="special">(</span><span class="identifier">x</span> <span class="special">-</span> <span class="identifier">root2</span><span class="special">);</span> <span class="special">});</span>
577 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">estimated</span><span class="special">.</span><span class="identifier">first</span> <span class="special">==</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">root1</span><span class="special">),</span> <span class="number">10.</span> <span class="special">%</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">());</span>
578 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">estimated</span><span class="special">.</span><span class="identifier">second</span> <span class="special">==</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">root2</span><span class="special">),</span> <span class="number">10.</span> <span class="special">%</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">test_tools</span><span class="special">::</span><span class="identifier">tolerance</span><span class="special">());</span>
579 <span class="special">}</span>
580 <span class="special">}</span>
584 <div class="informaltable"><table class="table">
585 <colgroup><col></colgroup>
592 <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">example</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">message</span>
593 <span class="identifier">Seed</span> <span class="special">=</span> <span class="number">162981956</span>
594 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">34</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"quadratic_estimation"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">minus_b</span> <span class="special">*</span> <span class="identifier">minus_b</span> <span class="special">>=</span> <span class="number">4</span><span class="special">*</span><span class="identifier">c</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[-</span><span class="number">13.999999999999998</span> <span class="special">*</span> <span class="special">-</span><span class="number">13.999999999999998</span> <span class="special"><</span> <span class="number">195.99999999999997</span><span class="special">]</span>
595 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
596 <span class="identifier">trial</span> <span class="number">14</span>
597 <span class="identifier">root1</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
598 <span class="identifier">root2</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
599 <span class="identifier">sample1</span> <span class="special">=</span> <span class="number">4.66289</span>
600 <span class="identifier">sample2</span> <span class="special">=</span> <span class="number">1.70234</span>
601 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">64</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"quadratic_estimation"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">estimated</span><span class="special">.</span><span class="identifier">first</span> <span class="special">==</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">root1</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[-</span><span class="identifier">nan</span> <span class="special">!=</span> <span class="special">-</span><span class="number">7</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[-</span><span class="identifier">nan</span> <span class="special">></span> <span class="number">0.1</span><span class="special">]</span>
602 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
603 <span class="identifier">trial</span> <span class="number">14</span>
604 <span class="identifier">root1</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
605 <span class="identifier">root2</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
606 <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">65</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"quadratic_estimation"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">estimated</span><span class="special">.</span><span class="identifier">second</span> <span class="special">==</span> <span class="keyword">double</span><span class="special">(</span><span class="identifier">root2</span><span class="special">)</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[-</span><span class="identifier">nan</span> <span class="special">!=</span> <span class="special">-</span><span class="number">7</span><span class="special">].</span> <span class="identifier">Relative</span> <span class="identifier">difference</span> <span class="identifier">exceeds</span> <span class="identifier">tolerance</span> <span class="special">[-</span><span class="identifier">nan</span> <span class="special">></span> <span class="number">0.1</span><span class="special">]</span>
607 <span class="identifier">Failure</span> <span class="identifier">occurred</span> <span class="identifier">in</span> <span class="identifier">a</span> <span class="identifier">following</span> <span class="identifier">context</span><span class="special">:</span>
608 <span class="identifier">trial</span> <span class="number">14</span>
609 <span class="identifier">root1</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
610 <span class="identifier">root2</span> <span class="special">=</span> <span class="special">-</span><span class="number">7</span>
612 <span class="special">***</span> <span class="number">3</span> <span class="identifier">failures</span> <span class="identifier">are</span> <span class="identifier">detected</span> <span class="identifier">in</span> <span class="identifier">the</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"example84"</span>
617 <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
618 <td align="left"></td>
619 <td align="right"><div class="copyright-footer">Copyright © 2001-2019 Boost.Test
621 Distributed under the Boost Software License, Version 1.0. (See accompanying
622 file LICENSE_1_0.txt or copy at <a href="http://www.boost.org/LICENSE_1_0.txt" target="_top">http://www.boost.org/LICENSE_1_0.txt</a>)
627 <div class="spirit-nav">
628 <a accesskey="p" href="checkpoints.html"><img src="../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_tools_support_for_logging.html"><img src="../../../../../../../doc/src/images/up.png" alt="Up"></a><a accesskey="h" href="../../../index.html"><img src="../../../../../../../doc/src/images/home.png" alt="Home"></a><a accesskey="n" href="log_floating_points.html"><img src="../../../../../../../doc/src/images/next.png" alt="Next"></a>