• Home
  • Line#
  • Scopes#
  • Navigate#
  • Raw
  • Download
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">&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>
130<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>
131<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">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;&lt;</span> <span class="identifier">var</span> <span class="special">&lt;&lt;</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">&gt;</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">&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>
256<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>
257<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">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;&lt;</span> <span class="identifier">integer_values</span> <span class="special">&lt;&lt;</span> <span class="string">", "</span> <span class="special">&lt;&lt;</span> <span class="identifier">string_value</span> <span class="special">&lt;&lt;</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">&gt;</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">&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>
371<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>
372<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">monomorphic</span><span class="special">.</span><span class="identifier">hpp</span><span class="special">&gt;</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">&lt;&lt;</span> <span class="string">"test 1: "</span> <span class="special">&lt;&lt;</span> <span class="identifier">xr1</span> <span class="special">&lt;&lt;</span> <span class="string">", "</span> <span class="special">&lt;&lt;</span> <span class="identifier">xr2</span> <span class="special">&lt;&lt;</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">&lt;=</span> <span class="number">2</span> <span class="special">&amp;&amp;</span> <span class="identifier">xr2</span> <span class="special">&lt;=</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">&lt;</span><span class="keyword">float</span><span class="special">&gt;(</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">&lt;&lt;</span> <span class="string">"test 2: "</span>
397    <span class="special">&lt;&lt;</span> <span class="identifier">xr</span> <span class="special">&lt;&lt;</span> <span class="string">" / "</span>
398    <span class="special">&lt;&lt;</span> <span class="identifier">random_sample</span> <span class="special">&lt;&lt;</span> <span class="string">", "</span> <span class="special">&lt;&lt;</span> <span class="identifier">index</span>
399    <span class="special">&lt;&lt;</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">&lt;</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">&gt;</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">&lt;</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">&gt;=</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