1// (C) Copyright Gennadiy Rozental 2015.
2// Distributed under the Boost Software License, Version 1.0.
3// (See accompanying file LICENSE_1_0.txt or copy at
4// http://www.boost.org/LICENSE_1_0.txt)
5
6// See http://www.boost.org/libs/test for the library home page.
7//
8// File : $RCSfile$
9//
10// Version : $Revision$
11//
12// Description : tests proper order of test unis in case of various dependencies specifications
13// ***************************************************************************
14
15// Boost.Test
16#define BOOST_TEST_MODULE test unit order test
17#include <boost/test/unit_test.hpp>
18#include <boost/test/unit_test_log.hpp>
19#include <boost/test/tree/visitor.hpp>
20
21#include <boost/test/utils/nullstream.hpp>
22typedef boost::onullstream onullstream_type;
23namespace ut = boost::unit_test;
24namespace tt = boost::test_tools;
25
26#include <iostream>
27
28//____________________________________________________________________________//
29
30void some_test() {}
31#define TC( name ) \
32boost::unit_test::make_test_case( boost::function<void ()>(some_test), \
33 BOOST_TEST_STRINGIZE( name ), \
34 __FILE__, __LINE__ )
35
36//____________________________________________________________________________//
37
38struct tu_order_collector : ut::test_observer {
39 virtual void test_unit_start( ut::test_unit const& tu )
40 {
41 // std::cout << "## TU: " << tu.full_name() << std::endl;
42 m_order.push_back( x: tu.p_id );
43 }
44
45 std::vector<ut::test_unit_id> m_order;
46};
47
48//____________________________________________________________________________//
49
50static tu_order_collector
51run_tree( ut::test_suite* master )
52{
53 tu_order_collector c;
54 ut::framework::register_observer( to&: c );
55
56 master->p_default_status.value = ut::test_unit::RS_ENABLED;
57 ut::framework::finalize_setup_phase( tu: master->p_id );
58
59 onullstream_type null_output;
60 ut::unit_test_log.set_stream( null_output );
61
62 //hrf_content_reporter reporter( std::cout );
63 //ut::traverse_test_tree( *master, reporter, true );
64
65 ut::framework::run( tu: master );
66 ut::unit_test_log.set_stream( std::cout );
67
68 ut::framework::deregister_observer( to&: c );
69
70 return c;
71}
72
73//____________________________________________________________________________//
74
75struct _3cases {
76 _3cases() {
77 master = BOOST_TEST_SUITE( "master" );
78
79 tc1 = TC( test1 );
80 tc2 = TC( test2 );
81 tc3 = TC( test3 );
82
83 master->add( tu: tc1 );
84 master->add( tu: tc2 );
85 master->add( tu: tc3 );
86 }
87
88 void test_run( std::vector<ut::test_unit_id> const& expected_order )
89 {
90 tu_order_collector res = run_tree( master );
91
92#ifndef BOOST_TEST_MACRO_LIMITED_SUPPORT
93 BOOST_TEST( expected_order == res.m_order, tt::per_element() );
94#else
95 BOOST_CHECK_EQUAL_COLLECTIONS(expected_order.begin(), expected_order.end(),
96 res.m_order.begin(), res.m_order.end());
97#endif
98 }
99
100 ut::test_suite* master;
101
102 ut::test_case* tc1;
103 ut::test_case* tc2;
104 ut::test_case* tc3;
105};
106
107//____________________________________________________________________________//
108
109BOOST_FIXTURE_TEST_CASE( test_simple_order, _3cases )
110{
111 ut::test_unit_id order[] = {master->p_id, tc1->p_id, tc2->p_id, tc3->p_id};
112 std::vector<ut::test_unit_id> expected_order(order, order+4);
113
114 test_run( expected_order );
115}
116
117//____________________________________________________________________________//
118
119BOOST_FIXTURE_TEST_CASE( test_simple_dep1, _3cases )
120{
121 tc1->depends_on( tu: tc2 );
122
123 ut::test_unit_id order[] = {master->p_id, tc2->p_id, tc3->p_id, tc1->p_id};
124 std::vector<ut::test_unit_id> expected_order(order, order+4);
125
126 test_run( expected_order );
127}
128
129//____________________________________________________________________________//
130
131BOOST_FIXTURE_TEST_CASE( test_simple_dep2, _3cases )
132{
133 tc1->depends_on( tu: tc2 );
134 tc2->depends_on( tu: tc3 );
135
136 ut::test_unit_id order[] = {master->p_id, tc3->p_id, tc2->p_id, tc1->p_id};
137 std::vector<ut::test_unit_id> expected_order(order, order+4);
138
139 test_run( expected_order );
140}
141
142//____________________________________________________________________________//
143
144BOOST_FIXTURE_TEST_CASE( test_simple_loop1, _3cases )
145{
146 tc1->depends_on( tu: tc2 );
147 tc2->depends_on( tu: tc1 );
148
149 master->p_default_status.value = ut::test_unit::RS_ENABLED;
150 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
151 ut::framework::setup_error );
152}
153
154//____________________________________________________________________________//
155
156BOOST_FIXTURE_TEST_CASE( test_simple_loop2, _3cases )
157{
158 tc1->depends_on( tu: tc2 );
159 tc2->depends_on( tu: tc3 );
160 tc3->depends_on( tu: tc1 );
161
162 master->p_default_status.value = ut::test_unit::RS_ENABLED;
163 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
164 ut::framework::setup_error );
165}
166
167//____________________________________________________________________________//
168
169struct _2suites_4_cases {
170 _2suites_4_cases() {
171 master = BOOST_TEST_SUITE( "master" );
172
173 s1 = BOOST_TEST_SUITE( "s1" );
174 s2 = BOOST_TEST_SUITE( "s2" );
175
176 tc1 = TC( test1 );
177 tc2 = TC( test2 );
178 tc3 = TC( test3 );
179 tc4 = TC( test4 );
180
181 s1->add( tu: tc1 );
182 s1->add( tu: tc2 );
183
184 s2->add( tu: tc3 );
185 s2->add( tu: tc4 );
186
187 master->add( tu: s1 );
188 master->add( tu: s2 );
189 }
190
191 void test_run( std::vector<ut::test_unit_id> const& expected_order )
192 {
193 tu_order_collector res = run_tree( master );
194
195#ifndef BOOST_TEST_MACRO_LIMITED_SUPPORT
196 BOOST_TEST( expected_order == res.m_order, tt::per_element() );
197#else
198 BOOST_CHECK_EQUAL_COLLECTIONS(expected_order.begin(), expected_order.end(),
199 res.m_order.begin(), res.m_order.end());
200#endif
201
202 }
203
204 ut::test_suite* master;
205 ut::test_suite* s1;
206 ut::test_suite* s2;
207
208 ut::test_case* tc1;
209 ut::test_case* tc2;
210 ut::test_case* tc3;
211 ut::test_case* tc4;
212};
213
214//____________________________________________________________________________//
215
216BOOST_FIXTURE_TEST_CASE( test_suite_normal_order, _2suites_4_cases )
217{
218 ut::test_unit_id order[] = { master->p_id,
219 s1->p_id, tc1->p_id, tc2->p_id,
220 s2->p_id, tc3->p_id, tc4->p_id };
221 std::vector<ut::test_unit_id> expected_order(order, order+7);
222
223 test_run( expected_order );
224}
225
226//____________________________________________________________________________//
227
228BOOST_FIXTURE_TEST_CASE( test_suite_simple_dep, _2suites_4_cases )
229{
230 tc1->depends_on( tu: tc2 );
231 tc3->depends_on( tu: tc4 );
232
233 ut::test_unit_id order[] = { master->p_id,
234 s1->p_id, tc2->p_id, tc1->p_id,
235 s2->p_id, tc4->p_id, tc3->p_id };
236 std::vector<ut::test_unit_id> expected_order(order, order+7);
237
238 test_run( expected_order );
239}
240
241//____________________________________________________________________________//
242
243BOOST_FIXTURE_TEST_CASE( test_suite_cross_dep1, _2suites_4_cases )
244{
245 tc1->depends_on( tu: tc3 );
246
247 ut::test_unit_id order[] = { master->p_id,
248 s2->p_id, tc3->p_id, tc4->p_id,
249 s1->p_id, tc1->p_id, tc2->p_id };
250 std::vector<ut::test_unit_id> expected_order(order, order+7);
251
252 test_run( expected_order );
253}
254
255//____________________________________________________________________________//
256
257BOOST_FIXTURE_TEST_CASE( test_suite_cross_dep2, _2suites_4_cases )
258{
259 tc2->depends_on( tu: tc4 );
260 tc1->depends_on( tu: tc2 );
261
262 ut::test_unit_id order[] = { master->p_id,
263 s2->p_id, tc3->p_id, tc4->p_id,
264 s1->p_id, tc2->p_id, tc1->p_id};
265
266 std::vector<ut::test_unit_id> expected_order(order, order+7);
267 test_run( expected_order );
268}
269
270//____________________________________________________________________________//
271
272BOOST_FIXTURE_TEST_CASE( test_suite_on_suite_dep, _2suites_4_cases )
273{
274 s1->depends_on( tu: s2 );
275
276 ut::test_unit_id order[] = { master->p_id,
277 s2->p_id, tc3->p_id, tc4->p_id,
278 s1->p_id, tc1->p_id, tc2->p_id };
279
280 std::vector<ut::test_unit_id> expected_order(order, order+7);
281 test_run( expected_order );
282}
283
284//____________________________________________________________________________//
285
286BOOST_FIXTURE_TEST_CASE( test_suite_on_case_dep, _2suites_4_cases )
287{
288 s1->depends_on( tu: tc3 );
289
290 ut::test_unit_id order[] = { master->p_id,
291 s2->p_id, tc3->p_id, tc4->p_id,
292 s1->p_id, tc1->p_id, tc2->p_id };
293
294 std::vector<ut::test_unit_id> expected_order(order, order+7);
295 test_run( expected_order );
296}
297
298//____________________________________________________________________________//
299
300BOOST_FIXTURE_TEST_CASE( test_case_on_suite_dep, _2suites_4_cases )
301{
302 tc1->depends_on( tu: s2 );
303 ut::test_unit_id order[] = { master->p_id,
304 s2->p_id, tc3->p_id, tc4->p_id,
305 s1->p_id, tc1->p_id, tc2->p_id };
306
307 std::vector<ut::test_unit_id> expected_order(order, order+7);
308 test_run( expected_order );
309}
310
311//____________________________________________________________________________//
312
313BOOST_FIXTURE_TEST_CASE( test_suite_loop1, _2suites_4_cases )
314{
315 tc1->depends_on( tu: tc3 );
316 tc3->depends_on( tu: tc2 );
317
318 master->p_default_status.value = ut::test_unit::RS_ENABLED;
319 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
320 ut::framework::setup_error );
321}
322
323//____________________________________________________________________________//
324
325BOOST_FIXTURE_TEST_CASE( test_suite_loop2, _2suites_4_cases )
326{
327 tc1->depends_on( tu: tc3 );
328 tc4->depends_on( tu: tc2 );
329
330 master->p_default_status.value = ut::test_unit::RS_ENABLED;
331 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
332 ut::framework::setup_error );
333}
334
335//____________________________________________________________________________//
336
337BOOST_FIXTURE_TEST_CASE( test_suite_loop3, _2suites_4_cases )
338{
339 s1->depends_on( tu: tc3 );
340 s2->depends_on( tu: tc2 );
341
342 master->p_default_status.value = ut::test_unit::RS_ENABLED;
343 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
344 ut::framework::setup_error );
345}
346
347//____________________________________________________________________________//
348
349BOOST_FIXTURE_TEST_CASE( test_suite_loop4, _2suites_4_cases )
350{
351 s1->depends_on( tu: tc1 );
352
353 master->p_default_status.value = ut::test_unit::RS_ENABLED;
354 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
355 ut::framework::setup_error );
356}
357
358//____________________________________________________________________________//
359
360BOOST_FIXTURE_TEST_CASE( test_suite_loop5, _2suites_4_cases )
361{
362 tc1->depends_on( tu: s1 );
363
364 master->p_default_status.value = ut::test_unit::RS_ENABLED;
365 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
366 ut::framework::setup_error );
367}
368
369//____________________________________________________________________________//
370
371BOOST_FIXTURE_TEST_CASE( test_suite_loop6, _2suites_4_cases )
372{
373 tc1->depends_on( tu: s2 );
374 tc3->depends_on( tu: s1 );
375
376 master->p_default_status.value = ut::test_unit::RS_ENABLED;
377 BOOST_CHECK_THROW( ut::framework::finalize_setup_phase( master->p_id ),
378 ut::framework::setup_error );
379}
380
381//____________________________________________________________________________//
382
383// EOF
384

source code of boost/libs/test/test/test-organization-ts/test_unit-order-test.cpp