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