1<html> 2<head> 3<meta http-equiv="Content-Type" content="text/html; charset=UTF-8"> 4<title>Operations on dataset</title> 5<link rel="stylesheet" href="../../../../boostbook.css" type="text/css"> 6<meta name="generator" content="DocBook XSL Stylesheets V1.79.1"> 7<link rel="home" href="../../../../index.html" title="Boost.Test"> 8<link rel="up" href="../test_case_generation.html" title="Data-driven test cases"> 9<link rel="prev" href="datasets_auto_registration.html" title="Declaring and registering test cases with datasets"> 10<link rel="next" href="generators.html" title="Datasets generators"> 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="datasets_auto_registration.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_case_generation.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="generators.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 24</div> 25<div class="section"> 26<div class="titlepage"><div><div><h5 class="title"> 27<a name="boost_test.tests_organization.test_cases.test_case_generation.operations"></a><a class="link" href="operations.html" title="Operations on dataset">Operations 28 on dataset</a> 29</h5></div></div></div> 30<p> 31 As mentioned earlier, one of the major aspects of using the <span class="emphasis"><em>Unit 32 Test Framework</em></span> datasets lies in the number of operations provided 33 for their combination. 34 </p> 35<p> 36 For that purpose, three operators are provided: 37 </p> 38<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 39<li class="listitem"> 40 joins with <code class="computeroutput"><span class="keyword">operator</span><span class="special">+</span></code> 41 </li> 42<li class="listitem"> 43 zips with <code class="computeroutput"><span class="keyword">operator</span><span class="special">^</span></code> 44 on datasets 45 </li> 46<li class="listitem"> 47 and grids or Cartesian products with <code class="computeroutput"><span class="keyword">operator</span><span class="special">*</span></code> 48 </li> 49</ul></div> 50<div class="tip"><table border="0" summary="Tip"> 51<tr> 52<td rowspan="2" align="center" valign="top" width="25"><img alt="[Tip]" src="../../../../../../../../doc/src/images/tip.png"></td> 53<th align="left">Tip</th> 54</tr> 55<tr><td align="left" valign="top"><p> 56 All these operators are associative, which enables their combination 57 without parenthesis. However, the precedence rule on the operators 58 for the language still apply. 59 </p></td></tr> 60</table></div> 61<div class="section"> 62<div class="titlepage"><div><div><h6 class="title"> 63<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.joins"></a><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.joins" title="Joins">Joins</a> 64</h6></div></div></div> 65<p> 66 A <span class="emphasis"><em>join</em></span>, denoted <code class="computeroutput"><span class="special">+</span></code>, 67 is an operation on two datasets <code class="computeroutput"><span class="identifier">dsa</span></code> 68 and <code class="computeroutput"><span class="identifier">dsb</span></code> of same arity 69 and compatible types, resulting in the <span class="bold"><strong>concatenation</strong></span> 70 of these two datasets <code class="computeroutput"><span class="identifier">dsa</span></code> 71 and <code class="computeroutput"><span class="identifier">dsb</span></code> from the left 72 to the right order of the symbol <code class="computeroutput"><span class="special">+</span></code>: 73 </p> 74<pre class="programlisting"><span class="identifier">dsa</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">a_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">a_i</span><span class="special">)</span> 75<span class="identifier">dsb</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">b_1</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">b_j</span><span class="special">)</span> 76<span class="identifier">dsa</span> <span class="special">+</span> <span class="identifier">dsb</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">a_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">a_i</span><span class="special">,</span> <span class="identifier">b_1</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">b_j</span><span class="special">)</span> 77</pre> 78<p> 79 The following properties hold: 80 </p> 81<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 82<li class="listitem"> 83 the resulting dataset is of same arity as the operand datasets, 84 </li> 85<li class="listitem"> 86 the size of the returned dataset is the sum of the size of the 87 joined datasets, 88 </li> 89<li class="listitem"> 90<p class="simpara"> 91 the operation is associative, and it is possible to combine more 92 than two datasets in one expression. The following joins are equivalent 93 for any datasets <code class="computeroutput"><span class="identifier">dsa</span></code>, 94 <code class="computeroutput"><span class="identifier">dsb</span></code> and <code class="computeroutput"><span class="identifier">dsc</span></code>: 95 </p> 96<pre class="programlisting"><span class="special">(</span> <span class="identifier">dsa</span> <span class="special">+</span> <span class="identifier">dsb</span> <span class="special">)</span> <span class="special">+</span> <span class="identifier">dsc</span> 97<span class="special">==</span> <span class="identifier">dsa</span> <span class="special">+</span> <span class="special">(</span> <span class="identifier">dsb</span> <span class="special">+</span> <span class="identifier">dsc</span> <span class="special">)</span> 98<span class="special">==</span> <span class="identifier">dsa</span> <span class="special">+</span> <span class="identifier">dsb</span> <span class="special">+</span> <span class="identifier">dsc</span> 99</pre> 100</li> 101</ul></div> 102<div class="warning"><table border="0" summary="Warning"> 103<tr> 104<td rowspan="2" align="center" valign="top" width="25"><img alt="[Warning]" src="../../../../../../../../doc/src/images/warning.png"></td> 105<th align="left">Warning</th> 106</tr> 107<tr><td align="left" valign="top"><p> 108 In the expression <code class="computeroutput"><span class="identifier">dsa</span> <span class="special">+</span> <span class="identifier">dsb</span></code>, 109 <code class="computeroutput"><span class="identifier">dsa</span></code> and/or <code class="computeroutput"><span class="identifier">dsb</span></code> can be of infinite size. The 110 resulting dataset will have an infinite size as well. If <code class="computeroutput"><span class="identifier">dsa</span></code> is infinite, the content of 111 <code class="computeroutput"><span class="identifier">dsb</span></code> will never be 112 reached. 113 </p></td></tr> 114</table></div> 115<h6> 116<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.joins.h0"></a> 117 <span class="phrase"><a name="boost_test.tests_organization.test_cases.test_case_generation.operations.joins.example_descr"></a></span><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.joins.example_descr">Example: 118 Example of join on datasets</a> 119 </h6> 120<div class="informaltable"><table class="table"> 121<colgroup><col></colgroup> 122<thead><tr><th> 123 <p> 124 Code 125 </p> 126 </th></tr></thead> 127<tbody><tr><td> 128<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">dataset_example62</span> 129<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 130<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">test_case</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 131<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 132 133<span class="keyword">namespace</span> <span class="identifier">data</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">data</span><span class="special">;</span> 134 135<span class="keyword">int</span> <span class="identifier">samples1</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">};</span> 136<span class="keyword">int</span> <span class="identifier">samples2</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">8</span><span class="special">,</span> <span class="number">9</span><span class="special">,</span> <span class="number">10</span><span class="special">};</span> 137 138<span class="identifier">BOOST_DATA_TEST_CASE</span><span class="special">(</span> 139 <span class="identifier">test1</span><span class="special">,</span> 140 <span class="identifier">data</span><span class="special">::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">samples1</span><span class="special">)</span> <span class="special">+</span> <span class="identifier">samples2</span><span class="special">,</span> 141 <span class="identifier">var</span><span class="special">)</span> 142<span class="special">{</span> 143 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">var</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 144<span class="special">}</span> 145</pre> 146 </td></tr></tbody> 147</table></div> 148<div class="informaltable"><table class="table"> 149<colgroup><col></colgroup> 150<thead><tr><th> 151 <p> 152 Output 153 </p> 154 </th></tr></thead> 155<tbody><tr><td> 156<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">dataset_example62</span> 157<span class="identifier">Running</span> <span class="number">5</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span> 158<span class="number">1</span> 159<span class="number">2</span> 160<span class="number">8</span> 161<span class="number">9</span> 162<span class="number">10</span> 163 164<span class="special">***</span> <span class="identifier">No</span> <span class="identifier">errors</span> <span class="identifier">detected</span> 165</pre> 166 </td></tr></tbody> 167</table></div> 168</div> 169<div class="section"> 170<div class="titlepage"><div><div><h6 class="title"> 171<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.zips"></a><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.zips" title="Zips">Zips</a> 172</h6></div></div></div> 173<p> 174 A <span class="emphasis"><em>zip</em></span>, denoted <code class="computeroutput"><span class="special">^</span></code> 175 , is an operation on two datasets <code class="computeroutput"><span class="identifier">dsa</span></code> 176 and <code class="computeroutput"><span class="identifier">dsb</span></code> of same arity 177 and same size, resulting in a dataset where the <code class="computeroutput"><span class="identifier">k</span></code>-th 178 sample of <code class="computeroutput"><span class="identifier">dsa</span></code> is paired 179 with the corresponding <code class="computeroutput"><span class="identifier">k</span></code>-th 180 sample of <code class="computeroutput"><span class="identifier">dsb</span></code>. The 181 resulting dataset samples order follows the left to right order against 182 the symbol <code class="computeroutput"><span class="special">^</span></code>. 183 </p> 184<pre class="programlisting"><span class="identifier">dsa</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">a_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">a_i</span><span class="special">)</span> 185<span class="identifier">dsb</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">b_1</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">b_i</span><span class="special">)</span> 186<span class="identifier">dsa</span> <span class="special">^</span> <span class="identifier">dsb</span> <span class="special">=</span> <span class="special">(</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">b_1</span><span class="special">),</span> <span class="special">(</span><span class="identifier">a_2</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">)</span> <span class="special">...</span> <span class="special">(</span><span class="identifier">a_i</span><span class="special">,</span> <span class="identifier">b_i</span><span class="special">)</span> <span class="special">)</span> 187</pre> 188<p> 189 The following properties hold: 190 </p> 191<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 192<li class="listitem"> 193 the arity of the resulting dataset is the sum of the arities of 194 the operand datasets, 195 </li> 196<li class="listitem"> 197 the size of the resulting dataset is equal to the size of the datasets 198 (since they are supposed to be of the same size), exception made 199 for the case the operand datasets size mismatch (see below), 200 </li> 201<li class="listitem"> 202<p class="simpara"> 203 the operation is associative, and it is possible to combine more 204 than two datasets in one expression, 205 </p> 206<pre class="programlisting"><span class="special">(</span> <span class="identifier">dsa</span> <span class="special">^</span> <span class="identifier">dsb</span> <span class="special">)</span> <span class="special">^</span> <span class="identifier">dsc</span> 207<span class="special">==</span> <span class="identifier">dsa</span> <span class="special">^</span> <span class="special">(</span> <span class="identifier">dsb</span> <span class="special">^</span> <span class="identifier">dsc</span> <span class="special">)</span> 208<span class="special">==</span> <span class="identifier">dsa</span> <span class="special">^</span> <span class="identifier">dsb</span> <span class="special">^</span> <span class="identifier">dsc</span> 209</pre> 210</li> 211</ul></div> 212<p> 213 A particular handling is performed if <code class="computeroutput"><span class="identifier">dsa</span></code> 214 and <code class="computeroutput"><span class="identifier">dsb</span></code> are of different 215 size. The rule is as follow: 216 </p> 217<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 218<li class="listitem"> 219 if the both zipped datasets have the same size, this is the size 220 of the resulting dataset (this size can then be infinite). 221 </li> 222<li class="listitem"> 223 otherwise if one of the dataset is of size 1 (singleton) or of 224 infinite size, the resulting size is governed by the other dataset. 225 </li> 226<li class="listitem"> 227 otherwise an exception is thrown at runtime 228 </li> 229</ul></div> 230<div class="caution"><table border="0" summary="Caution"> 231<tr> 232<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../../doc/src/images/caution.png"></td> 233<th align="left">Caution</th> 234</tr> 235<tr><td align="left" valign="top"><p> 236 If the <span class="emphasis"><em>zip</em></span> operation is not supported for your 237 compiler, the macro <code class="computeroutput"><a class="link" href="../../../../BOOST_TE_idm45267320807984.html" title="Macro BOOST_TEST_NO_ZIP_COMPOSITION_AVAILABLE">BOOST_TEST_NO_ZIP_COMPOSITION_AVAILABLE</a></code> 238 will be automatically set by the <span class="emphasis"><em>Unit Test Framework</em></span> 239 </p></td></tr> 240</table></div> 241<h6> 242<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.zips.h0"></a> 243 <span class="phrase"><a name="boost_test.tests_organization.test_cases.test_case_generation.operations.zips.example_descr"></a></span><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.zips.example_descr">Example: 244 Example of zip on datasets</a> 245 </h6> 246<div class="informaltable"><table class="table"> 247<colgroup><col></colgroup> 248<thead><tr><th> 249 <p> 250 Code 251 </p> 252 </th></tr></thead> 253<tbody><tr><td> 254<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">dataset_example61</span> 255<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 256<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">test_case</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 257<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 258 259<span class="keyword">namespace</span> <span class="identifier">data</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">data</span><span class="special">;</span> 260 261<span class="keyword">int</span> <span class="identifier">samples1</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="number">1</span><span class="special">,</span><span class="number">2</span><span class="special">};</span> 262<span class="keyword">char</span> <span class="keyword">const</span><span class="special">*</span> <span class="identifier">samples2</span><span class="special">[]</span> <span class="special">=</span> <span class="special">{</span><span class="string">"qwerty"</span><span class="special">,</span> <span class="string">"asdfg"</span><span class="special">};</span> 263 264<span class="identifier">BOOST_DATA_TEST_CASE</span><span class="special">(</span> 265 <span class="identifier">test1</span><span class="special">,</span> 266 <span class="identifier">data</span><span class="special">::</span><span class="identifier">make</span><span class="special">(</span><span class="identifier">samples1</span><span class="special">)^</span><span class="identifier">samples2</span><span class="special">,</span> 267 <span class="identifier">integer_values</span><span class="special">,</span> 268 <span class="identifier">string_value</span><span class="special">)</span> 269<span class="special">{</span> 270 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="identifier">integer_values</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">string_value</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 271<span class="special">}</span> 272</pre> 273 </td></tr></tbody> 274</table></div> 275<div class="informaltable"><table class="table"> 276<colgroup><col></colgroup> 277<thead><tr><th> 278 <p> 279 Output 280 </p> 281 </th></tr></thead> 282<tbody><tr><td> 283<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">dataset_example61</span> 284<span class="identifier">Running</span> <span class="number">2</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span> 285<span class="number">1</span><span class="special">,</span> <span class="identifier">qwerty</span> 286<span class="number">2</span><span class="special">,</span> <span class="identifier">asdfg</span> 287 288<span class="special">***</span> <span class="identifier">No</span> <span class="identifier">errors</span> <span class="identifier">detected</span> 289</pre> 290 </td></tr></tbody> 291</table></div> 292</div> 293<div class="section"> 294<div class="titlepage"><div><div><h6 class="title"> 295<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products"></a><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products" title="Grid (Cartesian products)">Grid 296 (Cartesian products)</a> 297</h6></div></div></div> 298<p> 299 A <span class="emphasis"><em>grid</em></span>, denoted <code class="computeroutput"><span class="special">*</span></code> 300 , is an operation on two any datasets <code class="computeroutput"><span class="identifier">dsa</span></code> 301 and <code class="computeroutput"><span class="identifier">dsb</span></code> resulting in 302 a dataset where each sample of <code class="computeroutput"><span class="identifier">dsa</span></code> 303 is paired with each sample of <code class="computeroutput"><span class="identifier">dsb</span></code> 304 exactly once. The resulting dataset samples order follows the left 305 to right order against the symbol <code class="computeroutput"><span class="special">*</span></code>. 306 The rightmost dataset samples are iterated first. 307 </p> 308<pre class="programlisting"><span class="identifier">dsa</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">a_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">a_i</span><span class="special">)</span> 309<span class="identifier">dsb</span> <span class="special">=</span> <span class="special">(</span><span class="identifier">b_1</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">,</span> <span class="special">...</span> <span class="identifier">b_j</span><span class="special">)</span> 310<span class="identifier">dsa</span> <span class="special">*</span> <span class="identifier">dsb</span> <span class="special">=</span> <span class="special">((</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">b_1</span><span class="special">),</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">b_2</span><span class="special">)</span> <span class="special">...</span> <span class="special">(</span><span class="identifier">a_1</span><span class="special">,</span> <span class="identifier">b_j</span><span class="special">),</span> <span class="special">(</span><span class="identifier">a_2</span><span class="special">,</span> <span class="identifier">b_1</span><span class="special">),</span> <span class="special">...</span> <span class="special">(</span><span class="identifier">a_2</span><span class="special">,</span> <span class="identifier">b_j</span><span class="special">)</span> <span class="special">...</span> <span class="special">(</span><span class="identifier">a_i</span><span class="special">,</span> <span class="identifier">b_1</span><span class="special">),</span> <span class="special">...</span> <span class="special">(</span><span class="identifier">a_i</span><span class="special">,</span> <span class="identifier">b_j</span><span class="special">))</span> 311</pre> 312<p> 313 The grid hence is similar to the mathematical notion of Cartesian product 314 <a href="#ftn.boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.f0" class="footnote" name="boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.f0"><sup class="footnote">[3]</sup></a>. 315 </p> 316<p> 317 The following properties hold: 318 </p> 319<div class="itemizedlist"><ul class="itemizedlist" style="list-style-type: disc; "> 320<li class="listitem"> 321 the arity of the resulting dataset is the sum of the arities of 322 the operand datasets, 323 </li> 324<li class="listitem"> 325 the size of the resulting dataset is the product of the sizes of 326 the datasets, 327 </li> 328<li class="listitem"> 329 the operation is associative, and it is possible to combine more 330 than two datasets in one expression, 331 </li> 332<li class="listitem"> 333 as for <span class="emphasis"><em>zip</em></span>, there is no need the dataset to 334 have the same type of samples. 335 </li> 336</ul></div> 337<div class="caution"><table border="0" summary="Caution"> 338<tr> 339<td rowspan="2" align="center" valign="top" width="25"><img alt="[Caution]" src="../../../../../../../../doc/src/images/caution.png"></td> 340<th align="left">Caution</th> 341</tr> 342<tr><td align="left" valign="top"><p> 343 If the <span class="emphasis"><em>grid</em></span> operation is not supported for your 344 compiler, the macro <code class="computeroutput"><a class="link" href="../../../../BOOST_TE_idm45267320847280.html" title="Macro BOOST_TEST_NO_GRID_COMPOSITION_AVAILABLE">BOOST_TEST_NO_GRID_COMPOSITION_AVAILABLE</a></code> 345 will be automatically set by the <span class="emphasis"><em>Unit Test Framework</em></span> 346 </p></td></tr> 347</table></div> 348<p> 349 In the following example, the random number generator is the second 350 dataset. Its state is evaluated 6 times (3 times for the first <code class="computeroutput"><span class="identifier">xrange</span></code> - first dimension - and twice 351 for the second <code class="computeroutput"><span class="identifier">xrange</span></code> 352 - second dimension - to which it is zipped). Note that the state of 353 the random engine is not copied between two successive evaluations 354 of the first dimension. 355 </p> 356<h6> 357<a name="boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.h0"></a> 358 <span class="phrase"><a name="boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.example_descr"></a></span><a class="link" href="operations.html#boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.example_descr">Example: 359 Example of Cartesian product</a> 360 </h6> 361<div class="informaltable"><table class="table"> 362<colgroup><col></colgroup> 363<thead><tr><th> 364 <p> 365 Code 366 </p> 367 </th></tr></thead> 368<tbody><tr><td> 369<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">dataset_example64</span> 370<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">included</span><span class="special">/</span><span class="identifier">unit_test</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 371<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">test_case</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 372<span class="preprocessor">#include</span> <span class="special"><</span><span class="identifier">boost</span><span class="special">/</span><span class="identifier">test</span><span class="special">/</span><span class="identifier">data</span><span class="special">/</span><span class="identifier">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">></span> 373 374<span class="keyword">namespace</span> <span class="identifier">bdata</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">data</span><span class="special">;</span> 375 376 377<span class="identifier">BOOST_DATA_TEST_CASE</span><span class="special">(</span> 378 <span class="identifier">test1</span><span class="special">,</span> 379 <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">xrange</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> <span class="special">*</span> <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">xrange</span><span class="special">(</span><span class="number">3</span><span class="special">),</span> 380 <span class="identifier">xr1</span><span class="special">,</span> <span class="identifier">xr2</span><span class="special">)</span> 381<span class="special">{</span> 382 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"test 1: "</span> <span class="special"><<</span> <span class="identifier">xr1</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">xr2</span> <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 383 <span class="identifier">BOOST_TEST</span><span class="special">((</span><span class="identifier">xr1</span> <span class="special"><=</span> <span class="number">2</span> <span class="special">&&</span> <span class="identifier">xr2</span> <span class="special"><=</span> <span class="number">3</span><span class="special">));</span> 384<span class="special">}</span> 385 386<span class="identifier">BOOST_DATA_TEST_CASE</span><span class="special">(</span> 387 <span class="identifier">test2</span><span class="special">,</span> 388 <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">xrange</span><span class="special">(</span><span class="number">3</span><span class="special">)</span> 389 <span class="special">*</span> 390 <span class="special">(</span> <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">random</span><span class="special">(</span> 391 <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">distribution</span><span class="special">=</span><span class="identifier">std</span><span class="special">::</span><span class="identifier">uniform_real_distribution</span><span class="special"><</span><span class="keyword">float</span><span class="special">>(</span><span class="number">1</span><span class="special">,</span> <span class="number">2</span><span class="special">))</span> 392 <span class="special">^</span> <span class="identifier">bdata</span><span class="special">::</span><span class="identifier">xrange</span><span class="special">(</span><span class="number">2</span><span class="special">)</span> 393 <span class="special">),</span> 394 <span class="identifier">xr</span><span class="special">,</span> <span class="identifier">random_sample</span><span class="special">,</span> <span class="identifier">index</span><span class="special">)</span> 395<span class="special">{</span> 396 <span class="identifier">std</span><span class="special">::</span><span class="identifier">cout</span> <span class="special"><<</span> <span class="string">"test 2: "</span> 397 <span class="special"><<</span> <span class="identifier">xr</span> <span class="special"><<</span> <span class="string">" / "</span> 398 <span class="special"><<</span> <span class="identifier">random_sample</span> <span class="special"><<</span> <span class="string">", "</span> <span class="special"><<</span> <span class="identifier">index</span> 399 <span class="special"><<</span> <span class="identifier">std</span><span class="special">::</span><span class="identifier">endl</span><span class="special">;</span> 400 <span class="identifier">BOOST_TEST</span><span class="special">(</span><span class="identifier">random_sample</span> <span class="special"><</span> <span class="number">1.7</span><span class="special">);</span> <span class="comment">// 30% chance of failure</span> 401<span class="special">}</span> 402</pre> 403 </td></tr></tbody> 404</table></div> 405<div class="informaltable"><table class="table"> 406<colgroup><col></colgroup> 407<thead><tr><th> 408 <p> 409 Output 410 </p> 411 </th></tr></thead> 412<tbody><tr><td> 413<pre xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" class="table-programlisting"><span class="special">></span> <span class="identifier">dataset_example64</span> 414<span class="identifier">Running</span> <span class="number">12</span> <span class="identifier">test</span> <span class="identifier">cases</span><span class="special">...</span> 415<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">0</span><span class="special">,</span> <span class="number">0</span> 416<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">0</span><span class="special">,</span> <span class="number">1</span> 417<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">0</span><span class="special">,</span> <span class="number">2</span> 418<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">1</span><span class="special">,</span> <span class="number">0</span> 419<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">1</span><span class="special">,</span> <span class="number">1</span> 420<span class="identifier">test</span> <span class="number">1</span><span class="special">:</span> <span class="number">1</span><span class="special">,</span> <span class="number">2</span> 421<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">0</span> <span class="special">/</span> <span class="number">1.00001</span><span class="special">,</span> <span class="number">0</span> 422<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">0</span> <span class="special">/</span> <span class="number">1.13154</span><span class="special">,</span> <span class="number">1</span> 423<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">1</span> <span class="special">/</span> <span class="number">1.75561</span><span class="special">,</span> <span class="number">0</span> 424<span class="identifier">test</span><span class="special">.</span><span class="identifier">cpp</span><span class="special">(</span><span class="number">40</span><span class="special">):</span> <span class="identifier">error</span><span class="special">:</span> <span class="identifier">in</span> <span class="string">"test2/_2"</span><span class="special">:</span> <span class="identifier">check</span> <span class="identifier">random_sample</span> <span class="special"><</span> <span class="number">1.7</span> <span class="identifier">has</span> <span class="identifier">failed</span> <span class="special">[</span><span class="number">1.75560534</span> <span class="special">>=</span> <span class="number">1.7</span><span class="special">]</span> 425<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> 426 <span class="identifier">xr</span> <span class="special">=</span> <span class="number">1</span><span class="special">;</span> <span class="identifier">random_sample</span> <span class="special">=</span> <span class="number">1.75560534</span><span class="special">;</span> <span class="identifier">index</span> <span class="special">=</span> <span class="number">0</span><span class="special">;</span> 427<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">1</span> <span class="special">/</span> <span class="number">1.45865</span><span class="special">,</span> <span class="number">1</span> 428<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">2</span> <span class="special">/</span> <span class="number">1.53277</span><span class="special">,</span> <span class="number">0</span> 429<span class="identifier">test</span> <span class="number">2</span><span class="special">:</span> <span class="number">2</span> <span class="special">/</span> <span class="number">1.21896</span><span class="special">,</span> <span class="number">1</span> 430 431<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">"dataset_example64"</span> 432</pre> 433 </td></tr></tbody> 434</table></div> 435</div> 436<div class="footnotes"> 437<br><hr style="width:100; text-align:left;margin-left: 0"> 438<div id="ftn.boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.f0" class="footnote"><p><a href="#boost_test.tests_organization.test_cases.test_case_generation.operations.grid_cartesian_products.f0" class="para"><sup class="para">[3] </sup></a> 439 if the sequence is viewed as a set 440 </p></div> 441</div> 442</div> 443<table xmlns:rev="http://www.cs.rpi.edu/~gregod/boost/tools/doc/revision" width="100%"><tr> 444<td align="left"></td> 445<td align="right"><div class="copyright-footer">Copyright © 2001-2020 Boost.Test contributors<p> 446 Distributed under the Boost Software License, Version 1.0. (See accompanying 447 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>) 448 </p> 449</div></td> 450</tr></table> 451<hr> 452<div class="spirit-nav"> 453<a accesskey="p" href="datasets_auto_registration.html"><img src="../../../../../../../../doc/src/images/prev.png" alt="Prev"></a><a accesskey="u" href="../test_case_generation.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="generators.html"><img src="../../../../../../../../doc/src/images/next.png" alt="Next"></a> 454</div> 455</body> 456</html> 457