Imported Upstream version 1.72.0
[platform/upstream/boost.git] / libs / test / doc / html / boost_test / tests_organization / test_cases / test_case_generation / operations.html
1 <html>
2 <head>
3 <meta http-equiv="Content-Type" content="text/html; charset=US-ASCII">
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_idm46279146767520.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_idm46279146806912.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 &#169; 2001-2019 Boost.Test
446       contributors<p>
447         Distributed under the Boost Software License, Version 1.0. (See accompanying
448         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>)
449       </p>
450 </div></td>
451 </tr></table>
452 <hr>
453 <div class="spirit-nav">
454 <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>
455 </div>
456 </body>
457 </html>