custom_command_line_arguments.html 94 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723
  1. <html>
  2. <head>
  3. <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
  4. <title>Custom command line arguments</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="../runtime_config.html" title="Runtime parameters">
  9. <link rel="prev" href="test_unit_filtering.html" title="Test unit filtering">
  10. <link rel="next" href="summary.html" title="Summary of run-time parameters">
  11. </head>
  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>
  20. </tr></table>
  21. <hr>
  22. <div class="spirit-nav">
  23. <a accesskey="p" href="test_unit_filtering.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../runtime_config.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="summary.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  24. </div>
  25. <div class="section">
  26. <div class="titlepage"><div><div><h3 class="title">
  27. <a name="boost_test.runtime_config.custom_command_line_arguments"></a><a class="link" href="custom_command_line_arguments.html" title="Custom command line arguments">Custom
  28. command line arguments</a>
  29. </h3></div></div></div>
  30. <p>
  31. It is possible to pass custom command line arguments to the test module.
  32. The general format for passing custom arguments is the following:
  33. </p>
  34. <pre class="programlisting"><span class="special">&lt;</span><span class="identifier">boost_test_module</span><span class="special">&gt;</span> <span class="special">[&lt;</span><span class="identifier">boost_test_arg1</span><span class="special">&gt;...]</span> <span class="special">[--</span> <span class="special">[&lt;</span><span class="identifier">custom_parameter1</span><span class="special">&gt;...]</span>
  35. </pre>
  36. <p>
  37. This means that everything that is passed after "<code class="computeroutput"><span class="special">--</span></code>"
  38. is considered as a custom parameter and will not be intercepted nor interpreted
  39. by the <span class="emphasis"><em>Unit Test Framework</em></span>. This avoids any troubleshooting
  40. between the <span class="emphasis"><em>Unit Test Framework</em></span> parameters and the custom
  41. ones.
  42. </p>
  43. <p>
  44. There are several use cases for accessing the arguments passed on the command
  45. line:
  46. </p>
  47. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  48. <li class="listitem">
  49. instantiating an object used in test cases and which is dependant on
  50. parameters external to the test-module: the name of the graphic card,
  51. the credentials for a database connection, etc. The rest of the test
  52. module would check that the functions in test are not sensitive to this
  53. type of parametrization. One can also imagine running this same test
  54. module with different parameters (different graphic cards...) in a batched
  55. manner,
  56. </li>
  57. <li class="listitem">
  58. modifying the test tree by adding or parametrizing test cases: the arguments
  59. passed on the command line may contain for instance a set of parameters
  60. that define test cases.
  61. </li>
  62. </ul></div>
  63. <p>
  64. In the first scenario, <a class="link" href="custom_command_line_arguments.html#ref_consuming_cmd_test_case">test cases</a>
  65. or fixtures, including <a class="link" href="custom_command_line_arguments.html#ref_consuming_cmd_global_fixture">global
  66. fixtures</a>, may be used. Since those are part of the test tree, they
  67. can benefit from the <span class="emphasis"><em>Unit Test Framework</em></span> rich set of
  68. assertions and controlled execution environment.
  69. </p>
  70. <p>
  71. In the second scenario, the command line argument interact directly with
  72. the content of the test tree: by passing specific arguments, different set
  73. of tests are created. There are mainly two options for achieving this: using
  74. a dedicated <a class="link" href="custom_command_line_arguments.html#ref_consuming_cmd_init_function">initialization
  75. function</a> or using <a class="link" href="custom_command_line_arguments.html#ref_consuming_cmd_dataset">data driven</a>
  76. test cases. The error handling of the command line parameters needs however
  77. to be adapted.
  78. </p>
  79. <a name="ref_consuming_cmd_test_case"></a><h5>
  80. <a name="boost_test.runtime_config.custom_command_line_arguments.h0"></a>
  81. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.consuming_custom_arguments_from_"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.consuming_custom_arguments_from_">Consuming
  82. custom arguments from a test case</a>
  83. </h5>
  84. <p>
  85. The <a class="link" href="../tests_organization/test_tree/master_test_suite.html" title="Master test suite">master
  86. test suite</a> collects the custom arguments passed to the test module
  87. in the following way:
  88. </p>
  89. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  90. <li class="listitem">
  91. <code class="computeroutput"><span class="identifier">argv</span><span class="special">[</span><span class="number">0</span><span class="special">]</span></code>, usually
  92. set by the operating system as the executable name, remains unchanged
  93. </li>
  94. <li class="listitem">
  95. any argument interpreted by the test module is removed from <code class="computeroutput"><span class="identifier">argv</span></code>
  96. </li>
  97. <li class="listitem">
  98. the empty token <code class="computeroutput"><span class="special">--</span></code> is removed
  99. as well
  100. </li>
  101. <li class="listitem">
  102. any additional argument passed after the empty token is reported in
  103. <code class="computeroutput"><span class="identifier">argv</span></code> starting at index
  104. <code class="computeroutput"><span class="number">1</span></code>
  105. </li>
  106. </ul></div>
  107. <h6>
  108. <a name="boost_test.runtime_config.custom_command_line_arguments.h1"></a>
  109. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.example_descr"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.example_descr">Example:
  110. Basic custom command line</a>
  111. </h6>
  112. <div class="informaltable"><table class="table">
  113. <colgroup><col></colgroup>
  114. <thead><tr><th>
  115. <p>
  116. Code
  117. </p>
  118. </th></tr></thead>
  119. <tbody><tr><td>
  120. <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">runtime_configuration1</span>
  121. <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
  122. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
  123. <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">test_accessing_command_line</span><span class="special">)</span>
  124. <span class="special">{</span>
  125. <span class="identifier">BOOST_TEST_REQUIRE</span><span class="special">(</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span> <span class="special">==</span> <span class="number">3</span> <span class="special">);</span>
  126. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"--specific-param"</span> <span class="special">);</span>
  127. <span class="identifier">BOOST_TEST</span><span class="special">(</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"'additional value with quotes'"</span> <span class="special">);</span>
  128. <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span> <span class="string">"'argv[0]' contains "</span> <span class="special">&lt;&lt;</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">0</span><span class="special">]</span> <span class="special">);</span>
  129. <span class="special">}</span>
  130. </pre>
  131. </td></tr></tbody>
  132. </table></div>
  133. <div class="informaltable"><table class="table">
  134. <colgroup><col></colgroup>
  135. <thead><tr><th>
  136. <p>
  137. Output
  138. </p>
  139. </th></tr></thead>
  140. <tbody><tr><td>
  141. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">&gt;</span> <span class="identifier">runtime_configuration1</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span><span class="identifier">no_color</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">specific</span><span class="special">-</span><span class="identifier">param</span> <span class="string">"'additional value with quotes'"</span>
  142. <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
  143. <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration"</span>
  144. <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">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"test_accessing_command_line"</span>
  145. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">16</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span> <span class="special">==</span> <span class="number">3</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  146. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"--specific-param"</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  147. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">18</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">==</span> <span class="string">"'additional value with quotes'"</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  148. <span class="char">'argv[0]'</span> <span class="identifier">contains</span> <span class="identifier">runtime_configuration1</span>
  149. <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">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"test_accessing_command_line"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">178u</span><span class="identifier">s</span>
  150. <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">220u</span><span class="identifier">s</span>
  151. <span class="special">***</span> <span class="identifier">No</span> <span class="identifier">errors</span> <span class="identifier">detected</span>
  152. </pre>
  153. </td></tr></tbody>
  154. </table></div>
  155. <a name="ref_consuming_cmd_global_fixture"></a><h5>
  156. <a name="boost_test.runtime_config.custom_command_line_arguments.h2"></a>
  157. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.consuming_custom_arguments_from0"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.consuming_custom_arguments_from0">Consuming
  158. custom arguments from a global fixture</a>
  159. </h5>
  160. <p>
  161. Another possibility for consuming the custom command line arguments would
  162. be from within a <a class="link" href="../tests_organization/fixtures/global.html" title="Global fixture">global
  163. fixture</a>. This is especially useful when external parameters are needed
  164. for instantiating global objects used in the test module.
  165. </p>
  166. <p>
  167. The usage is the same as for test cases. The following example runs the test
  168. module twice with different arguments, and illustrate the feature.
  169. </p>
  170. <div class="tip"><table border="0" summary="Tip">
  171. <tr>
  172. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../doc/src/images/tip.png"></td>
  173. <th align="left">Tip</th>
  174. </tr>
  175. <tr><td align="left" valign="top"><p>
  176. The global fixture can check for the correctness of the custom arguments
  177. and may abort the full run of the test module.
  178. </p></td></tr>
  179. </table></div>
  180. <h6>
  181. <a name="boost_test.runtime_config.custom_command_line_arguments.h3"></a>
  182. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.example_descr0"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.example_descr0">Example:
  183. Command line arguments interpreted in a global fixtures</a>
  184. </h6>
  185. <div class="informaltable"><table class="table">
  186. <colgroup><col></colgroup>
  187. <thead><tr><th>
  188. <p>
  189. Code
  190. </p>
  191. </th></tr></thead>
  192. <tbody><tr><td>
  193. <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">runtime_configuration2</span>
  194. <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
  195. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
  196. <span class="comment">/// The interface with the device driver.</span>
  197. <span class="keyword">class</span> <span class="identifier">DeviceInterface</span> <span class="special">{</span>
  198. <span class="keyword">public</span><span class="special">:</span>
  199. <span class="comment">// acquires a specific device based on its name</span>
  200. <span class="keyword">static</span> <span class="identifier">DeviceInterface</span><span class="special">*</span> <span class="identifier">factory</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">device_name</span><span class="special">);</span>
  201. <span class="keyword">virtual</span> <span class="special">~</span><span class="identifier">DeviceInterface</span><span class="special">(){}</span>
  202. <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">setup</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  203. <span class="keyword">virtual</span> <span class="keyword">bool</span> <span class="identifier">teardown</span><span class="special">()</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  204. <span class="keyword">virtual</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">get_device_name</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  205. <span class="special">};</span>
  206. <span class="keyword">class</span> <span class="identifier">MockDevice</span><span class="special">:</span> <span class="keyword">public</span> <span class="identifier">DeviceInterface</span> <span class="special">{</span>
  207. <span class="keyword">bool</span> <span class="identifier">setup</span><span class="special">()</span> <span class="identifier">final</span> <span class="special">{</span>
  208. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  209. <span class="special">}</span>
  210. <span class="keyword">bool</span> <span class="identifier">teardown</span><span class="special">()</span> <span class="identifier">final</span> <span class="special">{</span>
  211. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  212. <span class="special">}</span>
  213. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">get_device_name</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  214. <span class="keyword">return</span> <span class="string">"mock_device"</span><span class="special">;</span>
  215. <span class="special">}</span>
  216. <span class="special">};</span>
  217. <span class="identifier">DeviceInterface</span><span class="special">*</span> <span class="identifier">DeviceInterface</span><span class="special">::</span><span class="identifier">factory</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">device_name</span><span class="special">)</span> <span class="special">{</span>
  218. <span class="keyword">if</span><span class="special">(</span><span class="identifier">device_name</span> <span class="special">==</span> <span class="string">"mock_device"</span><span class="special">)</span> <span class="special">{</span>
  219. <span class="keyword">return</span> <span class="keyword">new</span> <span class="identifier">MockDevice</span><span class="special">();</span>
  220. <span class="special">}</span>
  221. <span class="keyword">return</span> <span class="keyword">nullptr</span><span class="special">;</span>
  222. <span class="special">}</span>
  223. <span class="keyword">struct</span> <span class="identifier">CommandLineDeviceInit</span> <span class="special">{</span>
  224. <span class="identifier">CommandLineDeviceInit</span><span class="special">()</span> <span class="special">{</span>
  225. <span class="identifier">BOOST_TEST_REQUIRE</span><span class="special">(</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span> <span class="special">==</span> <span class="number">3</span> <span class="special">);</span>
  226. <span class="identifier">BOOST_TEST_REQUIRE</span><span class="special">(</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"--device-name"</span> <span class="special">);</span>
  227. <span class="special">}</span>
  228. <span class="keyword">void</span> <span class="identifier">setup</span><span class="special">()</span> <span class="special">{</span>
  229. <span class="identifier">device</span> <span class="special">=</span> <span class="identifier">DeviceInterface</span><span class="special">::</span><span class="identifier">factory</span><span class="special">(</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]);</span>
  230. <span class="identifier">BOOST_TEST_REQUIRE</span><span class="special">(</span>
  231. <span class="identifier">device</span> <span class="special">!=</span> <span class="keyword">nullptr</span><span class="special">,</span>
  232. <span class="string">"Cannot create the device "</span> <span class="special">&lt;&lt;</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">);</span>
  233. <span class="identifier">BOOST_TEST_REQUIRE</span><span class="special">(</span>
  234. <span class="identifier">device</span><span class="special">-&gt;</span><span class="identifier">setup</span><span class="special">(),</span>
  235. <span class="string">"Cannot initialize the device "</span> <span class="special">&lt;&lt;</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]</span> <span class="special">);</span>
  236. <span class="special">}</span>
  237. <span class="keyword">void</span> <span class="identifier">teardown</span><span class="special">()</span> <span class="special">{</span>
  238. <span class="keyword">if</span><span class="special">(</span><span class="identifier">device</span><span class="special">)</span> <span class="special">{</span>
  239. <span class="identifier">BOOST_TEST</span><span class="special">(</span>
  240. <span class="identifier">device</span><span class="special">-&gt;</span><span class="identifier">teardown</span><span class="special">(),</span>
  241. <span class="string">"Cannot tear-down the device "</span> <span class="special">&lt;&lt;</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]);</span>
  242. <span class="special">}</span>
  243. <span class="keyword">delete</span> <span class="identifier">device</span><span class="special">;</span>
  244. <span class="special">}</span>
  245. <span class="keyword">static</span> <span class="identifier">DeviceInterface</span> <span class="special">*</span><span class="identifier">device</span><span class="special">;</span>
  246. <span class="special">};</span>
  247. <span class="identifier">DeviceInterface</span><span class="special">*</span> <span class="identifier">CommandLineDeviceInit</span><span class="special">::</span><span class="identifier">device</span> <span class="special">=</span> <span class="keyword">nullptr</span><span class="special">;</span>
  248. <span class="identifier">BOOST_TEST_GLOBAL_FIXTURE</span><span class="special">(</span> <span class="identifier">CommandLineDeviceInit</span> <span class="special">);</span>
  249. <span class="identifier">BOOST_AUTO_TEST_CASE</span><span class="special">(</span><span class="identifier">check_device_has_meaningful_name</span><span class="special">)</span>
  250. <span class="special">{</span>
  251. <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">CommandLineDeviceInit</span><span class="special">::</span><span class="identifier">device</span><span class="special">-&gt;</span><span class="identifier">get_device_name</span><span class="special">()</span> <span class="special">!=</span> <span class="string">""</span><span class="special">);</span>
  252. <span class="special">}</span>
  253. </pre>
  254. </td></tr></tbody>
  255. </table></div>
  256. <div class="informaltable"><table class="table">
  257. <colgroup><col></colgroup>
  258. <thead><tr><th>
  259. <p>
  260. Output
  261. </p>
  262. </th></tr></thead>
  263. <tbody><tr><td>
  264. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">1</span>
  265. <span class="special">&gt;</span> <span class="identifier">runtime_configuration2</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">some</span><span class="special">-</span><span class="identifier">wrong</span><span class="special">-</span><span class="identifier">random</span><span class="special">-</span><span class="identifier">string</span> <span class="identifier">mock_device</span>
  266. <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
  267. <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration2"</span>
  268. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">46</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span> <span class="special">==</span> <span class="number">3</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  269. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">47</span><span class="special">:</span> <span class="identifier">fatal</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"runtime_configuration2"</span><span class="special">:</span> <span class="identifier">critical</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"--device-name"</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[--</span><span class="identifier">some</span><span class="special">-</span><span class="identifier">wrong</span><span class="special">-</span><span class="identifier">random</span><span class="special">-</span><span class="identifier">string</span> <span class="special">!=</span> <span class="special">--</span><span class="identifier">device</span><span class="special">-</span><span class="identifier">name</span><span class="special">]</span>
  270. <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration2"</span>
  271. <span class="special">***</span> <span class="identifier">The</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration2"</span> <span class="identifier">was</span> <span class="identifier">aborted</span><span class="special">;</span> <span class="identifier">see</span> <span class="identifier">standard</span> <span class="identifier">output</span> <span class="keyword">for</span> <span class="identifier">details</span>
  272. <span class="special">***</span> <span class="number">1</span> <span class="identifier">failure</span> <span class="identifier">is</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">"runtime_configuration2"</span>
  273. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">2</span>
  274. <span class="special">&gt;</span> <span class="identifier">runtime_configuration2</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">device</span><span class="special">-</span><span class="identifier">name</span> <span class="identifier">mock_device</span>
  275. <span class="identifier">Running</span> <span class="number">1</span> <span class="identifier">test</span> <span class="keyword">case</span><span class="special">...</span>
  276. <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration2"</span>
  277. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">46</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span> <span class="special">==</span> <span class="number">3</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  278. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">47</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span> <span class="special">==</span> <span class="string">"--device-name"</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  279. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">53</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="char">'Cannot create the device mock_device'</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  280. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">56</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="char">'Cannot initialize the device mock_device'</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  281. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">72</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"check_device_has_meaningful_name"</span>
  282. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">74</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">CommandLineDeviceInit</span><span class="special">::</span><span class="identifier">device</span><span class="special">-&gt;</span><span class="identifier">get_device_name</span><span class="special">()</span> <span class="special">!=</span> <span class="string">""</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  283. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">72</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"check_device_has_meaningful_name"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">127u</span><span class="identifier">s</span>
  284. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">62</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="char">'Cannot tear-down the device mock_device'</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  285. <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration2"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">177u</span><span class="identifier">s</span>
  286. <span class="special">***</span> <span class="identifier">No</span> <span class="identifier">errors</span> <span class="identifier">detected</span>
  287. </pre>
  288. </td></tr></tbody>
  289. </table></div>
  290. <p>
  291. The above example instantiates a specific device through the <code class="computeroutput"><span class="identifier">DeviceInterface</span><span class="special">::</span><span class="identifier">factory</span></code> member function. The name of the
  292. device to instantiate is passed via the command line argument <code class="computeroutput"><span class="special">--</span><span class="identifier">device</span><span class="special">-</span><span class="identifier">name</span></code>,
  293. and the instantiated device is available through the global object <code class="computeroutput"><span class="identifier">CommandLineDeviceInit</span><span class="special">::</span><span class="identifier">device</span></code>. The module requires <code class="computeroutput"><span class="number">3</span></code> arguments on the command line:
  294. </p>
  295. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  296. <li class="listitem">
  297. <code class="computeroutput"><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">0</span><span class="special">]</span></code> is the
  298. test module name as explained in the previous paragraph
  299. </li>
  300. <li class="listitem">
  301. <code class="computeroutput"><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">]</span></code> should
  302. be equal to <code class="computeroutput"><span class="special">--</span><span class="identifier">device</span><span class="special">-</span><span class="identifier">name</span></code>
  303. </li>
  304. <li class="listitem">
  305. <code class="computeroutput"><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]</span></code> should
  306. be the name of the device to instantiate
  307. </li>
  308. </ul></div>
  309. <p>
  310. As it can be seen in the shell outputs, any command line argument consumed
  311. by the <span class="emphasis"><em>Unit Test Framework</em></span> is removed from <code class="computeroutput"><span class="identifier">argc</span></code> / <code class="computeroutput"><span class="identifier">argv</span></code>.
  312. Since global fixtures are running in the <span class="emphasis"><em>Unit Test Framework</em></span>
  313. controlled environment, any fatal error reported by the fixture (through
  314. the <a class="link" href="../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST_REQUIRE</span></code></a> assertion) aborts
  315. the test execution. Non fatal errors on the other hand do not abort the test-module
  316. and are reported as assertion failure, and would not prevent the execution
  317. of the test case <code class="computeroutput"><span class="identifier">check_device_has_meaningful_name</span></code>.
  318. </p>
  319. <div class="note"><table border="0" summary="Note">
  320. <tr>
  321. <td rowspan="2" align="center" valign="top" width="25"><img alt="[Note]" src="../../../../../../doc/src/images/note.png"></td>
  322. <th align="left">Note</th>
  323. </tr>
  324. <tr><td align="left" valign="top"><p>
  325. It is possible to have several global fixtures in a test module, spread
  326. over several compilation units. Each of those fixture may in turn be accessing
  327. a specific part of the command line.
  328. </p></td></tr>
  329. </table></div>
  330. <a name="ref_consuming_cmd_init_function"></a><h5>
  331. <a name="boost_test.runtime_config.custom_command_line_arguments.h4"></a>
  332. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.parametrizing_the_test_tree_from"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.parametrizing_the_test_tree_from">Parametrizing
  333. the test tree from command line in the initialization function</a>
  334. </h5>
  335. <p>
  336. The initialization function are described in details in this <a class="link" href="../adv_scenarios/test_module_init_overview.html" title="Test module's initialization">section</a>.
  337. The initialization function is called before any other test or fixture, and
  338. before entering the master test suite. The initialization function is not
  339. considered as a test-case, although it is called under the controlled execution
  340. environment of the <span class="emphasis"><em>Unit Test Framework</em></span>. This means that:
  341. </p>
  342. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  343. <li class="listitem">
  344. the errors will be properly handled,
  345. </li>
  346. <li class="listitem">
  347. loggers are not fully operational,
  348. </li>
  349. <li class="listitem">
  350. it is not possible to use the <span class="emphasis"><em>Unit Test Framework</em></span>
  351. assertion macros like <a class="link" href="../utf_reference/testing_tool_ref/assertion_boost_test_universal_macro.html" title="BOOST_TEST"><code class="computeroutput"><span class="identifier">BOOST_TEST</span></code></a> as it is not a test-case.
  352. </li>
  353. </ul></div>
  354. <p>
  355. The following example shows how to use the command line arguments parsing
  356. described above to create/add new test cases to the test tree. It also shows
  357. very limited support to messages (does not work for all loggers), and error
  358. handling.
  359. </p>
  360. <h6>
  361. <a name="boost_test.runtime_config.custom_command_line_arguments.h5"></a>
  362. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.example_descr1"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.example_descr1">Example:
  363. Init function parametrized from the command line</a>
  364. </h6>
  365. <div class="informaltable"><table class="table">
  366. <colgroup><col></colgroup>
  367. <thead><tr><th>
  368. <p>
  369. Code
  370. </p>
  371. </th></tr></thead>
  372. <tbody><tr><td>
  373. <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_ALTERNATIVE_INIT_API</span>
  374. <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
  375. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
  376. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>
  377. <span class="keyword">using</span> <span class="keyword">namespace</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">;</span>
  378. <span class="keyword">void</span> <span class="identifier">test_function</span><span class="special">(</span><span class="keyword">int</span> <span class="identifier">i</span><span class="special">)</span> <span class="special">{</span>
  379. <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">i</span> <span class="special">&gt;=</span> <span class="number">1</span><span class="special">);</span>
  380. <span class="special">}</span>
  381. <span class="comment">// helper</span>
  382. <span class="keyword">int</span> <span class="identifier">read_integer</span><span class="special">(</span><span class="keyword">const</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="special">&amp;</span><span class="identifier">str</span><span class="special">)</span> <span class="special">{</span>
  383. <span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">buff</span><span class="special">(</span> <span class="identifier">str</span> <span class="special">);</span>
  384. <span class="keyword">int</span> <span class="identifier">number</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  385. <span class="identifier">buff</span> <span class="special">&gt;&gt;</span> <span class="identifier">number</span><span class="special">;</span>
  386. <span class="keyword">if</span><span class="special">(</span><span class="identifier">buff</span><span class="special">.</span><span class="identifier">fail</span><span class="special">())</span> <span class="special">{</span>
  387. <span class="comment">// it is also possible to raise a boost.test specific exception.</span>
  388. <span class="keyword">throw</span> <span class="identifier">framework</span><span class="special">::</span><span class="identifier">setup_error</span><span class="special">(</span><span class="string">"Argument '"</span> <span class="special">+</span> <span class="identifier">str</span> <span class="special">+</span> <span class="string">"' not integer"</span><span class="special">);</span>
  389. <span class="special">}</span>
  390. <span class="keyword">return</span> <span class="identifier">number</span><span class="special">;</span>
  391. <span class="special">}</span>
  392. <span class="keyword">bool</span> <span class="identifier">init_unit_test</span><span class="special">()</span>
  393. <span class="special">{</span>
  394. <span class="keyword">int</span> <span class="identifier">argc</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span><span class="special">;</span>
  395. <span class="keyword">char</span><span class="special">**</span> <span class="identifier">argv</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">;</span>
  396. <span class="keyword">if</span><span class="special">(</span> <span class="identifier">argc</span> <span class="special">&lt;=</span> <span class="number">1</span><span class="special">)</span> <span class="special">{</span>
  397. <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span> <span class="comment">// returning false to indicate an error</span>
  398. <span class="special">}</span>
  399. <span class="keyword">if</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">])</span> <span class="special">==</span> <span class="string">"--create-parametrized"</span> <span class="special">)</span> <span class="special">{</span>
  400. <span class="keyword">if</span><span class="special">(</span><span class="identifier">argc</span> <span class="special">&lt;</span> <span class="number">3</span><span class="special">)</span> <span class="special">{</span>
  401. <span class="comment">// the logging availability depends on the logger type</span>
  402. <span class="identifier">BOOST_TEST_MESSAGE</span><span class="special">(</span><span class="string">"Not enough parameters"</span><span class="special">);</span>
  403. <span class="keyword">return</span> <span class="keyword">false</span><span class="special">;</span>
  404. <span class="special">}</span>
  405. <span class="keyword">int</span> <span class="identifier">number_tests</span> <span class="special">=</span> <span class="identifier">read_integer</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">]);</span>
  406. <span class="keyword">int</span> <span class="identifier">test_start</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span>
  407. <span class="keyword">if</span><span class="special">(</span><span class="identifier">argc</span> <span class="special">&gt;</span> <span class="number">3</span><span class="special">)</span> <span class="special">{</span>
  408. <span class="identifier">test_start</span> <span class="special">=</span> <span class="identifier">read_integer</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">3</span><span class="special">]);</span>
  409. <span class="special">}</span>
  410. <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="identifier">test_start</span><span class="special">;</span> <span class="identifier">i</span> <span class="special">&lt;</span> <span class="identifier">number_tests</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span> <span class="special">{</span>
  411. <span class="identifier">std</span><span class="special">::</span><span class="identifier">ostringstream</span> <span class="identifier">ostr</span><span class="special">;</span>
  412. <span class="identifier">ostr</span> <span class="special">&lt;&lt;</span> <span class="string">"name "</span> <span class="special">&lt;&lt;</span> <span class="identifier">i</span><span class="special">;</span>
  413. <span class="comment">// create test-cases, avoiding duplicate names</span>
  414. <span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span>
  415. <span class="identifier">add</span><span class="special">(</span> <span class="identifier">BOOST_TEST_CASE_NAME</span><span class="special">(</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">bind</span><span class="special">(&amp;</span><span class="identifier">test_function</span><span class="special">,</span> <span class="identifier">i</span><span class="special">),</span> <span class="identifier">ostr</span><span class="special">.</span><span class="identifier">str</span><span class="special">().</span><span class="identifier">c_str</span><span class="special">()</span> <span class="special">)</span> <span class="special">);</span>
  416. <span class="special">}</span>
  417. <span class="special">}</span>
  418. <span class="keyword">return</span> <span class="keyword">true</span><span class="special">;</span>
  419. <span class="special">}</span>
  420. </pre>
  421. </td></tr></tbody>
  422. </table></div>
  423. <div class="informaltable"><table class="table">
  424. <colgroup><col></colgroup>
  425. <thead><tr><th>
  426. <p>
  427. Output
  428. </p>
  429. </th></tr></thead>
  430. <tbody><tr><td>
  431. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">1</span>
  432. <span class="special">&gt;</span> <span class="identifier">runtime_configuration3</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">create</span><span class="special">-</span><span class="identifier">parametrized</span> <span class="number">3</span>
  433. <span class="identifier">Running</span> <span class="number">3</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span>
  434. <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"Master Test Suite"</span>
  435. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 0"</span>
  436. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span><span class="special">:</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"name 0"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">i</span> <span class="special">&gt;=</span> <span class="number">1</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">0</span> <span class="special">&lt;</span> <span class="number">1</span><span class="special">]</span>
  437. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 0"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">179u</span><span class="identifier">s</span>
  438. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 1"</span>
  439. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">i</span> <span class="special">&gt;=</span> <span class="number">1</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  440. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 1"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">45u</span><span class="identifier">s</span>
  441. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 2"</span>
  442. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">17</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">i</span> <span class="special">&gt;=</span> <span class="number">1</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  443. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">59</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"name 2"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">34u</span><span class="identifier">s</span>
  444. <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"Master Test Suite"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">443u</span><span class="identifier">s</span>
  445. <span class="special">***</span> <span class="number">1</span> <span class="identifier">failure</span> <span class="identifier">is</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">"Master Test Suite"</span>
  446. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">2</span>
  447. <span class="special">&gt;</span> <span class="identifier">runtime_configuration3</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">create</span><span class="special">-</span><span class="identifier">parametrized</span>
  448. <span class="identifier">Not</span> <span class="identifier">enough</span> <span class="identifier">parameters</span>
  449. <span class="identifier">Test</span> <span class="identifier">setup</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">:</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="identifier">initialization</span> <span class="identifier">failed</span>
  450. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">3</span>
  451. <span class="special">&gt;</span> <span class="identifier">runtime_configuration3</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">create</span><span class="special">-</span><span class="identifier">parametrized</span> <span class="identifier">dummy</span>
  452. <span class="identifier">Test</span> <span class="identifier">setup</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">setup_error</span><span class="special">:</span> <span class="identifier">Argument</span> <span class="char">'dummy'</span> <span class="keyword">not</span> <span class="identifier">integer</span>
  453. </pre>
  454. </td></tr></tbody>
  455. </table></div>
  456. <p>
  457. As seen in this example, the error handling is quite different than a regular
  458. test-case:
  459. </p>
  460. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  461. <li class="listitem">
  462. For the <span class="emphasis"><em>alternative</em></span> initialization API (see <a class="link" href="../utf_reference/link_references/link_boost_test_alternative_init_macro.html" title="BOOST_TEST_ALTERNATIVE_INIT_API"><code class="computeroutput"><span class="identifier">BOOST_TEST_ALTERNATIVE_INIT_API</span></code></a>),
  463. the easiest way to indicate an error would be to return <code class="computeroutput"><span class="keyword">false</span></code> in case of failure.
  464. </li>
  465. <li class="listitem">
  466. For the <span class="emphasis"><em>obsolete</em></span> and <span class="emphasis"><em>alternative</em></span>,
  467. raising an exception such as <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span></code>
  468. or <code class="computeroutput"><a class="link" href="../../boost/unit_test/framework/setup_error.html" title="Struct setup_error">boost::unit_test::framework::setup_error</a></code>
  469. as above works as well.
  470. </li>
  471. </ul></div>
  472. <a name="ref_consuming_cmd_dataset"></a><h5>
  473. <a name="boost_test.runtime_config.custom_command_line_arguments.h6"></a>
  474. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.data_driven_test_cases_parametri"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.data_driven_test_cases_parametri">Data-driven
  475. test cases parametrized from the command line</a>
  476. </h5>
  477. <p>
  478. It is possible to use the command line arguments to manipulate the dataset
  479. generated by a data-drive test case.
  480. </p>
  481. <p>
  482. By default, datasets are created before entering the <code class="computeroutput"><span class="identifier">main</span></code>
  483. of the test module, and try to be efficient in the number of copies of their
  484. arguments. It is however possible to indicate a delay for the evaluation
  485. of the dataset by constructing the dataset with the <code class="computeroutput"><span class="identifier">make_delayed</span></code>
  486. function.
  487. </p>
  488. <p>
  489. With the <code class="computeroutput"><span class="identifier">make_delayed</span></code>, the
  490. construction of the dataset will happen at the same time as the construction
  491. of the test tree during the test module initialization, and not before. It
  492. is this way possible to access the <a class="link" href="../tests_organization/test_tree/master_test_suite.html" title="Master test suite">master
  493. test suite</a> and its command line arguments.
  494. </p>
  495. <p>
  496. The example below shows a complex dataset generation from the content of
  497. an external file. The data contained in the file participates to the definition
  498. of the test case.
  499. </p>
  500. <h6>
  501. <a name="boost_test.runtime_config.custom_command_line_arguments.h7"></a>
  502. <span class="phrase"><a name="boost_test.runtime_config.custom_command_line_arguments.example_descr2"></a></span><a class="link" href="custom_command_line_arguments.html#boost_test.runtime_config.custom_command_line_arguments.example_descr2">Example:
  503. Dataset test case parametrized from the command line</a>
  504. </h6>
  505. <div class="informaltable"><table class="table">
  506. <colgroup><col></colgroup>
  507. <thead><tr><th>
  508. <p>
  509. Code
  510. </p>
  511. </th></tr></thead>
  512. <tbody><tr><td>
  513. <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">runtime_configuration4</span>
  514. <span class="preprocessor">#include</span> <span class="special">&lt;</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">&gt;</span>
  515. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">test_case</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</span>
  516. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">iostream</span><span class="special">&gt;</span>
  517. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">functional</span><span class="special">&gt;</span>
  518. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">sstream</span><span class="special">&gt;</span>
  519. <span class="preprocessor">#include</span> <span class="special">&lt;</span><span class="identifier">fstream</span><span class="special">&gt;</span>
  520. <span class="comment">// this dataset loads a file that contains a list of strings</span>
  521. <span class="comment">// this list is used to create a dataset test case.</span>
  522. <span class="keyword">class</span> <span class="identifier">file_dataset</span>
  523. <span class="special">{</span>
  524. <span class="keyword">private</span><span class="special">:</span>
  525. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">m_filename</span><span class="special">;</span>
  526. <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">m_line_start</span><span class="special">;</span>
  527. <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">m_line_end</span><span class="special">;</span>
  528. <span class="keyword">public</span><span class="special">:</span>
  529. <span class="keyword">enum</span> <span class="special">{</span> <span class="identifier">arity</span> <span class="special">=</span> <span class="number">2</span> <span class="special">};</span>
  530. <span class="keyword">public</span><span class="special">:</span>
  531. <span class="identifier">file_dataset</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">line_start</span> <span class="special">=</span> <span class="number">0</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">line_end</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">(-</span><span class="number">1</span><span class="special">))</span>
  532. <span class="special">:</span> <span class="identifier">m_line_start</span><span class="special">(</span><span class="identifier">line_start</span><span class="special">)</span>
  533. <span class="special">,</span> <span class="identifier">m_line_end</span><span class="special">(</span><span class="identifier">line_end</span><span class="special">)</span>
  534. <span class="special">{</span>
  535. <span class="keyword">int</span> <span class="identifier">argc</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argc</span><span class="special">;</span>
  536. <span class="keyword">char</span><span class="special">**</span> <span class="identifier">argv</span> <span class="special">=</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">framework</span><span class="special">::</span><span class="identifier">master_test_suite</span><span class="special">().</span><span class="identifier">argv</span><span class="special">;</span>
  537. <span class="keyword">if</span><span class="special">(</span><span class="identifier">argc</span> <span class="special">!=</span> <span class="number">3</span><span class="special">)</span>
  538. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Incorrect number of arguments"</span><span class="special">);</span>
  539. <span class="keyword">if</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span><span class="special">(</span><span class="identifier">argv</span><span class="special">[</span><span class="number">1</span><span class="special">])</span> <span class="special">!=</span> <span class="string">"--test-file"</span><span class="special">)</span>
  540. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"First argument != '--test-file'"</span><span class="special">);</span>
  541. <span class="keyword">if</span><span class="special">(!(</span><span class="identifier">m_line_start</span> <span class="special">&lt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span><span class="special">(-</span><span class="number">1</span><span class="special">)))</span>
  542. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Incorrect line start/end"</span><span class="special">);</span>
  543. <span class="identifier">m_filename</span> <span class="special">=</span> <span class="identifier">argv</span><span class="special">[</span><span class="number">2</span><span class="special">];</span>
  544. <span class="identifier">std</span><span class="special">::</span><span class="identifier">ifstream</span> <span class="identifier">file</span><span class="special">(</span><span class="identifier">m_filename</span><span class="special">);</span>
  545. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">())</span>
  546. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Cannot open the file '"</span> <span class="special">+</span> <span class="identifier">m_filename</span> <span class="special">+</span> <span class="string">"'"</span><span class="special">);</span>
  547. <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">nb_lines</span> <span class="special">=</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">count_if</span><span class="special">(</span>
  548. <span class="identifier">std</span><span class="special">::</span><span class="identifier">istreambuf_iterator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;(</span><span class="identifier">file</span><span class="special">),</span>
  549. <span class="identifier">std</span><span class="special">::</span><span class="identifier">istreambuf_iterator</span><span class="special">&lt;</span><span class="keyword">char</span><span class="special">&gt;(),</span>
  550. <span class="special">[](</span><span class="keyword">char</span> <span class="identifier">c</span><span class="special">){</span> <span class="keyword">return</span> <span class="identifier">c</span> <span class="special">==</span> <span class="char">'\n'</span><span class="special">;});</span>
  551. <span class="identifier">m_line_end</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">min</span><span class="special">)(</span><span class="identifier">nb_lines</span><span class="special">,</span> <span class="identifier">m_line_end</span><span class="special">);</span>
  552. <span class="keyword">if</span><span class="special">(!(</span><span class="identifier">m_line_start</span> <span class="special">&lt;=</span> <span class="identifier">m_line_end</span><span class="special">))</span>
  553. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span><span class="special">(</span><span class="string">"Incorrect line start/end"</span><span class="special">);</span>
  554. <span class="special">}</span>
  555. <span class="keyword">struct</span> <span class="identifier">iterator</span> <span class="special">{</span>
  556. <span class="identifier">iterator</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="keyword">const</span><span class="special">&amp;</span> <span class="identifier">filename</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">line_start</span><span class="special">)</span>
  557. <span class="special">:</span> <span class="identifier">file</span><span class="special">(</span><span class="identifier">filename</span><span class="special">,</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">ios</span><span class="special">::</span><span class="identifier">binary</span><span class="special">)</span> <span class="special">{</span>
  558. <span class="keyword">if</span><span class="special">(!</span><span class="identifier">file</span><span class="special">.</span><span class="identifier">is_open</span><span class="special">())</span>
  559. <span class="keyword">throw</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">runtime_error</span><span class="special">(</span><span class="string">"Cannot open the file"</span><span class="special">);</span>
  560. <span class="keyword">for</span><span class="special">(</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">size_t</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">&lt;</span> <span class="identifier">line_start</span><span class="special">;</span> <span class="identifier">i</span><span class="special">++)</span> <span class="special">{</span>
  561. <span class="identifier">getline</span><span class="special">(</span><span class="identifier">file</span><span class="special">,</span> <span class="identifier">m_current_line</span><span class="special">);</span>
  562. <span class="special">}</span>
  563. <span class="special">}</span>
  564. <span class="keyword">auto</span> <span class="keyword">operator</span><span class="special">*()</span> <span class="keyword">const</span> <span class="special">-&gt;</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">float</span><span class="special">&gt;</span> <span class="special">{</span>
  565. <span class="keyword">float</span> <span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">;</span>
  566. <span class="identifier">std</span><span class="special">::</span><span class="identifier">istringstream</span> <span class="identifier">istr</span><span class="special">(</span><span class="identifier">m_current_line</span><span class="special">);</span>
  567. <span class="identifier">istr</span> <span class="special">&gt;&gt;</span> <span class="identifier">a</span> <span class="special">&gt;&gt;</span> <span class="identifier">b</span><span class="special">;</span>
  568. <span class="keyword">return</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">tuple</span><span class="special">&lt;</span><span class="keyword">float</span><span class="special">,</span> <span class="keyword">float</span><span class="special">&gt;(</span><span class="identifier">a</span><span class="special">,</span> <span class="identifier">b</span><span class="special">);</span>
  569. <span class="special">}</span>
  570. <span class="keyword">void</span> <span class="keyword">operator</span><span class="special">++()</span> <span class="special">{</span>
  571. <span class="identifier">getline</span><span class="special">(</span><span class="identifier">file</span><span class="special">,</span> <span class="identifier">m_current_line</span><span class="special">);</span>
  572. <span class="special">}</span>
  573. <span class="keyword">private</span><span class="special">:</span>
  574. <span class="identifier">std</span><span class="special">::</span><span class="identifier">ifstream</span> <span class="identifier">file</span><span class="special">;</span>
  575. <span class="identifier">std</span><span class="special">::</span><span class="identifier">string</span> <span class="identifier">m_current_line</span><span class="special">;</span>
  576. <span class="special">};</span>
  577. <span class="comment">// size of the DS</span>
  578. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">data</span><span class="special">::</span><span class="identifier">size_t</span> <span class="identifier">size</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  579. <span class="keyword">return</span> <span class="identifier">m_line_end</span> <span class="special">-</span> <span class="identifier">m_line_start</span><span class="special">;</span>
  580. <span class="special">}</span>
  581. <span class="comment">// iterator over the lines of the file</span>
  582. <span class="identifier">iterator</span> <span class="identifier">begin</span><span class="special">()</span> <span class="keyword">const</span> <span class="special">{</span>
  583. <span class="keyword">return</span> <span class="identifier">iterator</span><span class="special">(</span><span class="identifier">m_filename</span><span class="special">,</span> <span class="identifier">m_line_start</span><span class="special">);</span>
  584. <span class="special">}</span>
  585. <span class="special">};</span>
  586. <span class="keyword">namespace</span> <span class="identifier">boost</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">unit_test</span> <span class="special">{</span> <span class="keyword">namespace</span> <span class="identifier">data</span> <span class="special">{</span>
  587. <span class="keyword">namespace</span> <span class="identifier">monomorphic</span> <span class="special">{</span>
  588. <span class="keyword">template</span> <span class="special">&lt;&gt;</span>
  589. <span class="keyword">struct</span> <span class="identifier">is_dataset</span><span class="special">&lt;</span><span class="identifier">file_dataset</span><span class="special">&gt;</span> <span class="special">:</span> <span class="identifier">boost</span><span class="special">::</span><span class="identifier">mpl</span><span class="special">::</span><span class="identifier">true_</span> <span class="special">{};</span>
  590. <span class="special">}</span>
  591. <span class="special">}}}</span>
  592. <span class="identifier">BOOST_DATA_TEST_CASE</span><span class="special">(</span><span class="identifier">command_line_test_file</span><span class="special">,</span>
  593. <span class="identifier">boost</span><span class="special">::</span><span class="identifier">unit_test</span><span class="special">::</span><span class="identifier">data</span><span class="special">::</span><span class="identifier">make_delayed</span><span class="special">&lt;</span><span class="identifier">file_dataset</span><span class="special">&gt;(</span> <span class="number">3</span><span class="special">,</span> <span class="number">10</span> <span class="special">),</span>
  594. <span class="identifier">input</span><span class="special">,</span> <span class="identifier">expected</span><span class="special">)</span> <span class="special">{</span>
  595. <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">input</span> <span class="special">&lt;=</span> <span class="identifier">expected</span><span class="special">);</span>
  596. <span class="special">}</span>
  597. </pre>
  598. </td></tr></tbody>
  599. </table></div>
  600. <div class="informaltable"><table class="table">
  601. <colgroup><col></colgroup>
  602. <thead><tr><th>
  603. <p>
  604. Output
  605. </p>
  606. </th></tr></thead>
  607. <tbody><tr><td>
  608. <pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="preprocessor"># content</span> <span class="identifier">of</span> <span class="identifier">the</span> <span class="identifier">file</span>
  609. <span class="special">&gt;</span> <span class="identifier">more</span> <span class="identifier">test_file</span><span class="special">.</span><span class="identifier">txt</span>
  610. <span class="number">10.2</span> <span class="number">30.4</span>
  611. <span class="number">10.3</span> <span class="number">30.2</span>
  612. <span class="number">15.987984</span> <span class="number">15.9992</span>
  613. <span class="number">15.997984</span> <span class="number">15.9962</span>
  614. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">1</span>
  615. <span class="special">&gt;</span> <span class="identifier">runtime_configuration4</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">test</span><span class="special">-</span><span class="identifier">file</span> <span class="identifier">test_file</span><span class="special">.</span><span class="identifier">txt</span>
  616. <span class="identifier">Running</span> <span class="number">2</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span>
  617. <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration4"</span>
  618. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="identifier">suite</span> <span class="string">"command_line_test_file"</span>
  619. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"_0"</span>
  620. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">108</span><span class="special">:</span> <span class="identifier">info</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">input</span> <span class="special">&lt;=</span> <span class="identifier">expected</span> <span class="identifier">has</span> <span class="identifier">passed</span>
  621. <span class="identifier">Assertion</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>
  622. <span class="identifier">input</span> <span class="special">=</span> <span class="number">15.9879837</span><span class="special">;</span> <span class="identifier">expected</span> <span class="special">=</span> <span class="number">15.9991999</span><span class="special">;</span>
  623. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"_0"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">433u</span><span class="identifier">s</span>
  624. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Entering</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"_1"</span>
  625. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">108</span><span class="special">:</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"command_line_test_file/_1"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">input</span> <span class="special">&lt;=</span> <span class="identifier">expected</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">15.9979839</span> <span class="special">&gt;</span> <span class="number">15.9961996</span><span class="special">]</span>
  626. <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>
  627. <span class="identifier">input</span> <span class="special">=</span> <span class="number">15.9979839</span><span class="special">;</span> <span class="identifier">expected</span> <span class="special">=</span> <span class="number">15.9961996</span><span class="special">;</span>
  628. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="keyword">case</span> <span class="string">"_1"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">114u</span><span class="identifier">s</span>
  629. <span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">:</span><span class="number">107</span><span class="special">:</span> <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">suite</span> <span class="string">"command_line_test_file"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">616u</span><span class="identifier">s</span>
  630. <span class="identifier">Leaving</span> <span class="identifier">test</span> <span class="identifier">module</span> <span class="string">"runtime_configuration4"</span><span class="special">;</span> <span class="identifier">testing</span> <span class="identifier">time</span><span class="special">:</span> <span class="number">881u</span><span class="identifier">s</span>
  631. <span class="special">***</span> <span class="number">1</span> <span class="identifier">failure</span> <span class="identifier">is</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">"runtime_configuration4"</span>
  632. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">2</span>
  633. <span class="special">&gt;</span> <span class="identifier">runtime_configuration4</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span> <span class="special">--</span> <span class="special">--</span><span class="identifier">test</span><span class="special">-</span><span class="identifier">file</span> <span class="identifier">non</span><span class="special">-</span><span class="identifier">existant</span><span class="special">.</span><span class="identifier">txt</span>
  634. <span class="identifier">Test</span> <span class="identifier">setup</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">Cannot</span> <span class="identifier">open</span> <span class="identifier">the</span> <span class="identifier">file</span> <span class="char">'non-existant.txt'</span>
  635. <span class="preprocessor"># Example</span> <span class="identifier">run</span> <span class="number">3</span>
  636. <span class="special">&gt;</span> <span class="identifier">runtime_configuration4</span> <span class="special">--</span><span class="identifier">log_level</span><span class="special">=</span><span class="identifier">all</span>
  637. <span class="identifier">Test</span> <span class="identifier">setup</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">Incorrect</span> <span class="identifier">number</span> <span class="identifier">of</span> <span class="identifier">arguments</span>
  638. </pre>
  639. </td></tr></tbody>
  640. </table></div>
  641. <div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; ">
  642. <li class="listitem">
  643. Using <code class="computeroutput"><span class="identifier">make_delayed</span></code>, the
  644. tests generated from a dataset are instantiated during the framework
  645. setup. This let the dataset generator access the <code class="computeroutput"><span class="identifier">argc</span></code>
  646. and <code class="computeroutput"><span class="identifier">argv</span></code> of the master
  647. test suite.
  648. </li>
  649. <li class="listitem">
  650. The generation of the test-cases out of this dataset happens before the
  651. global fixture are reached (and before any test cases), and after the
  652. initialization function.
  653. </li>
  654. <li class="listitem">
  655. The generator of the dataset is <span class="bold"><strong>not</strong></span>
  656. considered being a test case and the <span class="emphasis"><em>Unit Test Framework</em></span>
  657. assertions are not accessible. However, the <span class="emphasis"><em>Unit Test Framework</em></span>
  658. will catch the exceptions raised during the generation of the test-cases
  659. by the dataset. To report an error, a <code class="computeroutput"><span class="identifier">std</span><span class="special">::</span><span class="identifier">logic_error</span></code>
  660. or <code class="computeroutput"><a class="link" href="../../boost/unit_test/framework/setup_error.html" title="Struct setup_error">boost::unit_test::framework::setup_error</a></code>
  661. can be raised and will be reported by the <span class="emphasis"><em>Unit Test Framework</em></span>.
  662. </li>
  663. </ul></div>
  664. </div>
  665. <table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr>
  666. <td align="left"></td>
  667. <td align="right"><div class="copyright-footer">Copyright &#169; 2001-2019 Boost.Test
  668. contributors<p>
  669. Distributed under the Boost Software License, Version 1.0. (See accompanying
  670. 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>)
  671. </p>
  672. </div></td>
  673. </tr></table>
  674. <hr>
  675. <div class="spirit-nav">
  676. <a accesskey="p" href="test_unit_filtering.html"><img src="../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../runtime_config.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="summary.html"><img src="../../../../../../doc/src/images/next.png" alt="Next"></a>
  677. </div>
  678. </body>
  679. </html>