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>
22 typedef boost::onullstream onullstream_type;
23 namespace ut = boost::unit_test;
24 namespace tt = boost::test_tools;
25 
26 #include <iostream>
27 
28 //____________________________________________________________________________//
29 
some_test()30 void some_test() {}
31 #define TC( name )                                                      \
32 boost::unit_test::make_test_case( boost::function<void ()>(some_test),  \
33                                   BOOST_TEST_STRINGIZE( name ),         \
34                                   __FILE__, __LINE__ )
35 
36 //____________________________________________________________________________//
37 
38 struct tu_order_collector : ut::test_observer {
test_unit_starttu_order_collector39     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( tu.p_id );
43     }
44 
45     std::vector<ut::test_unit_id> m_order;
46 };
47 
48 //____________________________________________________________________________//
49 
50 static tu_order_collector
run_tree(ut::test_suite * master)51 run_tree( ut::test_suite* master )
52 {
53     tu_order_collector c;
54     ut::framework::register_observer( c );
55 
56     master->p_default_status.value = ut::test_unit::RS_ENABLED;
57     ut::framework::finalize_setup_phase( 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( master );
66     ut::unit_test_log.set_stream( std::cout );
67 
68     ut::framework::deregister_observer( c );
69 
70     return c;
71 }
72 
73 //____________________________________________________________________________//
74 
75 struct _3cases {
_3cases_3cases76     _3cases() {
77         master = BOOST_TEST_SUITE( "master" );
78 
79         tc1 = TC( test1 );
80         tc2 = TC( test2 );
81         tc3 = TC( test3 );
82 
83         master->add( tc1 );
84         master->add( tc2 );
85         master->add( tc3 );
86     }
87 
test_run_3cases88     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 
BOOST_FIXTURE_TEST_CASE(test_simple_order,_3cases)109 BOOST_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 
BOOST_FIXTURE_TEST_CASE(test_simple_dep1,_3cases)119 BOOST_FIXTURE_TEST_CASE( test_simple_dep1, _3cases )
120 {
121     tc1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_simple_dep2,_3cases)131 BOOST_FIXTURE_TEST_CASE( test_simple_dep2, _3cases )
132 {
133     tc1->depends_on( tc2 );
134     tc2->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_simple_loop1,_3cases)144 BOOST_FIXTURE_TEST_CASE( test_simple_loop1, _3cases )
145 {
146     tc1->depends_on( tc2 );
147     tc2->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_simple_loop2,_3cases)156 BOOST_FIXTURE_TEST_CASE( test_simple_loop2, _3cases )
157 {
158     tc1->depends_on( tc2 );
159     tc2->depends_on( tc3 );
160     tc3->depends_on( 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 
169 struct _2suites_4_cases {
_2suites_4_cases_2suites_4_cases170     _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( tc1 );
182         s1->add( tc2 );
183 
184         s2->add( tc3 );
185         s2->add( tc4 );
186 
187         master->add( s1 );
188         master->add( s2 );
189     }
190 
test_run_2suites_4_cases191     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 
BOOST_FIXTURE_TEST_CASE(test_suite_normal_order,_2suites_4_cases)216 BOOST_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 
BOOST_FIXTURE_TEST_CASE(test_suite_simple_dep,_2suites_4_cases)228 BOOST_FIXTURE_TEST_CASE( test_suite_simple_dep, _2suites_4_cases )
229 {
230     tc1->depends_on( tc2 );
231     tc3->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_cross_dep1,_2suites_4_cases)243 BOOST_FIXTURE_TEST_CASE( test_suite_cross_dep1, _2suites_4_cases )
244 {
245     tc1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_cross_dep2,_2suites_4_cases)257 BOOST_FIXTURE_TEST_CASE( test_suite_cross_dep2, _2suites_4_cases )
258 {
259     tc2->depends_on( tc4 );
260     tc1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_on_suite_dep,_2suites_4_cases)272 BOOST_FIXTURE_TEST_CASE( test_suite_on_suite_dep, _2suites_4_cases )
273 {
274     s1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_on_case_dep,_2suites_4_cases)286 BOOST_FIXTURE_TEST_CASE( test_suite_on_case_dep, _2suites_4_cases )
287 {
288     s1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_case_on_suite_dep,_2suites_4_cases)300 BOOST_FIXTURE_TEST_CASE( test_case_on_suite_dep, _2suites_4_cases )
301 {
302     tc1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop1,_2suites_4_cases)313 BOOST_FIXTURE_TEST_CASE( test_suite_loop1, _2suites_4_cases )
314 {
315     tc1->depends_on( tc3 );
316     tc3->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop2,_2suites_4_cases)325 BOOST_FIXTURE_TEST_CASE( test_suite_loop2, _2suites_4_cases )
326 {
327     tc1->depends_on( tc3 );
328     tc4->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop3,_2suites_4_cases)337 BOOST_FIXTURE_TEST_CASE( test_suite_loop3, _2suites_4_cases )
338 {
339     s1->depends_on( tc3 );
340     s2->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop4,_2suites_4_cases)349 BOOST_FIXTURE_TEST_CASE( test_suite_loop4, _2suites_4_cases )
350 {
351     s1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop5,_2suites_4_cases)360 BOOST_FIXTURE_TEST_CASE( test_suite_loop5, _2suites_4_cases )
361 {
362     tc1->depends_on( 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 
BOOST_FIXTURE_TEST_CASE(test_suite_loop6,_2suites_4_cases)371 BOOST_FIXTURE_TEST_CASE( test_suite_loop6, _2suites_4_cases )
372 {
373     tc1->depends_on( s2 );
374     tc3->depends_on( 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