1 //  (C) Copyright Gennadiy Rozental 2003-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: 62023 $
11 //
12 //  Description : unit test for class properties facility
13 // ***************************************************************************
14 
15 // Boost.Test
16 #define BOOST_TEST_MODULE Boost.Test run by name/label implementation test
17 #include <boost/test/unit_test.hpp>
18 #include <boost/test/unit_test_parameters.hpp>
19 #include <boost/test/tree/test_case_counter.hpp>
20 #include <boost/test/tree/traverse.hpp>
21 
22 namespace utf = boost::unit_test;
23 
A()24 void A() {}
B()25 void B() {}
C()26 void C() {}
D()27 void D() {}
E()28 void E() {}
F()29 void F() {}
longnameA()30 void longnameA() {}
Blongname()31 void Blongname() {}
32 
33 //____________________________________________________________________________//
34 
35 void
test_count(utf::test_suite * master_ts,char const ** argv,int argc,unsigned expected)36 test_count( utf::test_suite* master_ts, char const** argv, int argc, unsigned expected )
37 {
38     argc /= sizeof(char*);
39 
40     BOOST_TEST_INFO( argv[1] );
41     if( argc > 2 )
42         BOOST_TEST_INFO( argv[2] );
43 
44     utf::runtime_config::init( argc, (char**)argv );
45     utf::framework::impl::setup_for_execution( *master_ts );
46 
47     utf::test_case_counter tcc;
48     utf::traverse_test_tree( master_ts->p_id, tcc );
49     BOOST_TEST( tcc.p_count == expected );
50 }
51 
BOOST_AUTO_TEST_CASE(test_run_by_name)52 BOOST_AUTO_TEST_CASE( test_run_by_name )
53 {
54     utf::test_suite* master_ts = BOOST_TEST_SUITE("local master");
55 
56     utf::test_suite* ts1 = BOOST_TEST_SUITE("ts1");
57     ts1->add( BOOST_TEST_CASE( &C ) );
58     ts1->add( BOOST_TEST_CASE( &D ) );
59 
60     utf::test_suite* ts2 = BOOST_TEST_SUITE("ts2");
61     ts2->add( BOOST_TEST_CASE( &A ) );
62     ts2->add( BOOST_TEST_CASE( &C ) );
63     ts2->add( BOOST_TEST_CASE( &longnameA ) );
64     ts2->add( ts1 );
65 
66     master_ts->add( BOOST_TEST_CASE( &A ) );
67     master_ts->add( BOOST_TEST_CASE( &B ) );
68     master_ts->add( BOOST_TEST_CASE( &longnameA ) );
69     master_ts->add( BOOST_TEST_CASE( &Blongname ) );
70     master_ts->add( ts2 );
71 
72     master_ts->p_default_status.value = utf::test_unit::RS_ENABLED;
73     utf::framework::finalize_setup_phase( master_ts->p_id );
74     {
75         utf::framework::impl::setup_for_execution( *master_ts );
76         utf::test_case_counter tcc;
77         utf::traverse_test_tree( master_ts->p_id, tcc );
78         BOOST_TEST( tcc.p_count == 9U );
79     }
80 
81     {
82         char const* argv[] = { "a.exe", "--run=*" };
83         test_count( master_ts, argv, sizeof(argv), 9 );
84     }
85 
86     {
87         char const* argv[] = { "a.exe", "--run=!*" };
88         test_count( master_ts, argv, sizeof(argv), 0 );
89     }
90 
91     {
92         char const* argv[] = { "a.exe", "--run=*/*" };
93         test_count( master_ts, argv, sizeof(argv), 5 );
94     }
95 
96     {
97         char const* argv[] = { "a.exe", "--run=!*/*" };
98         test_count( master_ts, argv, sizeof(argv), 4 );
99     }
100 
101     {
102         char const* argv[] = { "a.exe", "--run=*/*/*" };
103         test_count( master_ts, argv, sizeof(argv), 2 );
104     }
105     {
106         char const* argv[] = { "a.exe", "--run=!*/*/*" };
107         test_count( master_ts, argv, sizeof(argv), 7 );
108     }
109 
110     {
111         char const* argv[] = { "a.exe", "--run=klmn" };
112         test_count( master_ts, argv, sizeof(argv), 0 );
113     }
114 
115     {
116         char const* argv[] = { "a.exe", "--run=!klmn" };
117         test_count( master_ts, argv, sizeof(argv), 9 );
118     }
119 
120     {
121         char const* argv[] = { "a.exe", "--run=A" };
122         test_count( master_ts, argv, sizeof(argv), 1 );
123     }
124 
125     {
126         char const* argv[] = { "a.exe", "--run=!A" };
127         test_count( master_ts, argv, sizeof(argv), 8 );
128     }
129 
130     {
131         char const* argv[] = { "a.exe", "--run=*A" };
132         test_count( master_ts, argv, sizeof(argv), 2 );
133     }
134 
135     {
136         char const* argv[] = { "a.exe", "--run=!*A" };
137         test_count( master_ts, argv, sizeof(argv), 7 );
138     }
139 
140     {
141         char const* argv[] = { "a.exe", "--run=B*" };
142         test_count( master_ts, argv, sizeof(argv), 2 );
143     }
144 
145     {
146         char const* argv[] = { "a.exe", "--run=!B*" };
147         test_count( master_ts, argv, sizeof(argv), 7 );
148     }
149 
150     {
151         char const* argv[] = { "a.exe", "--run=*ngn*" };
152         test_count( master_ts, argv, sizeof(argv), 2 );
153     }
154 
155     {
156         char const* argv[] = { "a.exe", "--run=ts2" };
157         test_count( master_ts, argv, sizeof(argv), 5 );
158     }
159 
160     {
161         char const* argv[] = { "a.exe", "--run=!ts2" };
162         test_count( master_ts, argv, sizeof(argv), 4 );
163     }
164 
165     {
166         char const* argv[] = { "a.exe", "--run=ts2/*" };
167         test_count( master_ts, argv, sizeof(argv), 5 );
168     }
169 
170     {
171         char const* argv[] = { "a.exe", "--run=!ts2/*" };
172         test_count( master_ts, argv, sizeof(argv), 4 );
173     }
174 
175     {
176         char const* argv[] = { "a.exe", "--run=ts2/C" };
177         test_count( master_ts, argv, sizeof(argv), 1 );
178     }
179 
180     {
181         char const* argv[] = { "a.exe", "--run=!ts2/C" };
182         test_count( master_ts, argv, sizeof(argv), 8 );
183     }
184 
185     {
186         char const* argv[] = { "a.exe", "--run=ts2/*A" };
187         test_count( master_ts, argv, sizeof(argv), 2 );
188     }
189 
190     {
191         char const* argv[] = { "a.exe", "--run=!ts2/*A" };
192         test_count( master_ts, argv, sizeof(argv), 7 );
193     }
194 
195     {
196         char const* argv[] = { "a.exe", "--run=ts2/ts1" };
197         test_count( master_ts, argv, sizeof(argv), 2 );
198     }
199 
200     {
201         char const* argv[] = { "a.exe", "--run=!ts2/ts1" };
202         test_count( master_ts, argv, sizeof(argv), 7 );
203     }
204 
205     {
206         char const* argv[] = { "a.exe", "--run=ts2/ts1/C" };
207         test_count( master_ts, argv, sizeof(argv), 1 );
208     }
209 
210     {
211         char const* argv[] = { "a.exe", "--run=!ts2/ts1/C" };
212         test_count( master_ts, argv, sizeof(argv), 8 );
213     }
214 
215     {
216         char const* argv[] = { "a.exe", "--run=ts2/ts1/*D*" };
217         test_count( master_ts, argv, sizeof(argv), 1 );
218     }
219 
220     {
221         char const* argv[] = { "a.exe", "--run=!ts2/ts1/*D*" };
222         test_count( master_ts, argv, sizeof(argv), 8 );
223     }
224 
225     {
226         char const* argv[] = { "a.exe", "--run=A,B" };
227         test_count( master_ts, argv, sizeof(argv), 2 );
228     }
229 
230     {
231         char const* argv[] = { "a.exe", "--run=!A,B" };
232         test_count( master_ts, argv, sizeof(argv), 7 );
233     }
234 
235     {
236         char const* argv[] = { "a.exe", "--run=*A,B" };
237         test_count( master_ts, argv, sizeof(argv), 3 );
238     }
239 
240     {
241         char const* argv[] = { "a.exe", "--run=!*A,B" };
242         test_count( master_ts, argv, sizeof(argv), 6 );
243     }
244 
245     {
246         char const* argv[] = { "a.exe", "--run=ts2/C,ts1" };
247         test_count( master_ts, argv, sizeof(argv), 3 );
248     }
249 
250     {
251         char const* argv[] = { "a.exe", "--run=!ts2/C,ts1" };
252         test_count( master_ts, argv, sizeof(argv), 6 );
253     }
254 
255     {
256         char const* argv[] = { "a.exe", "--run=ts2/C,ts1/D" };
257         test_count( master_ts, argv, sizeof(argv), 1 );
258     }
259 
260     {
261         char const* argv[] = { "a.exe", "--run=!ts2/C,ts1/D" };
262         test_count( master_ts, argv, sizeof(argv), 8 );
263     }
264 
265     {
266         char const* argv[] = { "a.exe", "--run=A", "--run=B" };
267         test_count( master_ts, argv, sizeof(argv), 2 );
268     }
269 
270     {
271         char const* argv[] = { "a.exe", "--run=!A", "--run=!B" };
272         test_count( master_ts, argv, sizeof(argv), 7 );
273     }
274 
275     {
276         char const* argv[] = { "a.exe", "--run=A", "--run=ts2/ts1/C" };
277         test_count( master_ts, argv, sizeof(argv), 2 );
278     }
279 
280     {
281         char const* argv[] = { "a.exe", "--run=ts2", "--run=!ts2/*A" };
282         test_count( master_ts, argv, sizeof(argv), 3 );
283     }
284 }
285 
286 //____________________________________________________________________________//
287 
BOOST_AUTO_TEST_CASE(test_run_by_label)288 BOOST_AUTO_TEST_CASE( test_run_by_label )
289 {
290     utf::test_case* tc;
291 
292     utf::test_suite* master_ts = BOOST_TEST_SUITE("local master");
293 
294     utf::test_suite* ts1 = BOOST_TEST_SUITE("ts1");
295     ts1->add_label( "f2" );
296     ts1->add( tc=BOOST_TEST_CASE( &C ) );
297     tc->add_label( "L1" );
298     ts1->add( tc=BOOST_TEST_CASE( &D ) );
299     tc->add_label( "L1" );
300     tc->add_label( "l2" );
301 
302     utf::test_suite* ts2 = BOOST_TEST_SUITE("ts2");
303     ts2->add_label( "FAST" );
304     ts2->add( tc=BOOST_TEST_CASE( &A ) );
305     tc->add_label( "L1" );
306     ts2->add( BOOST_TEST_CASE( &C ) );
307     ts2->add( BOOST_TEST_CASE( &longnameA ) );
308     ts2->add( ts1 );
309 
310     master_ts->add( BOOST_TEST_CASE( &A ) );
311     master_ts->add( BOOST_TEST_CASE( &B ) );
312     master_ts->add( tc=BOOST_TEST_CASE( &longnameA ) );
313     tc->add_label( "f2" );
314     master_ts->add( BOOST_TEST_CASE( &Blongname ) );
315     master_ts->add( ts2 );
316 
317 
318     master_ts->p_default_status.value = utf::test_unit::RS_ENABLED;
319     utf::framework::finalize_setup_phase( master_ts->p_id );
320 
321     {
322         char const* argv[] = { "a.exe", "--run=@L1" };
323         test_count( master_ts, argv, sizeof(argv), 3 );
324     }
325 
326     {
327         char const* argv[] = { "a.exe", "--run=!@INV" };
328         test_count( master_ts, argv, sizeof(argv), 9 );
329     }
330 
331     {
332         char const* argv[] = { "a.exe", "--run=!@L1" };
333         test_count( master_ts, argv, sizeof(argv), 6 );
334     }
335 
336     {
337         char const* argv[] = { "a.exe", "--run=@l2" };
338         test_count( master_ts, argv, sizeof(argv), 1 );
339     }
340 
341     {
342         char const* argv[] = { "a.exe", "--run=@inval" };
343         test_count( master_ts, argv, sizeof(argv), 0 );
344     }
345 
346     {
347         char const* argv[] = { "a.exe", "--run=@FAST" };
348         test_count( master_ts, argv, sizeof(argv), 5 );
349     }
350 
351     {
352         char const* argv[] = { "a.exe", "--run=@f2" };
353         test_count( master_ts, argv, sizeof(argv), 3 );
354     }
355 
356     {
357         char const* argv[] = { "a.exe", "--run=@L1", "--run=@l2" };
358         test_count( master_ts, argv, sizeof(argv), 3 );
359     }
360 
361     {
362         char const* argv[] = { "a.exe", "--run=@L1", "--run=!@l2" };
363         test_count( master_ts, argv, sizeof(argv), 2 );
364     }
365 }
366 
367 //____________________________________________________________________________//
368 
BOOST_AUTO_TEST_CASE(test_dependency_handling)369 BOOST_AUTO_TEST_CASE( test_dependency_handling )
370 {
371     utf::test_case* tc;
372     utf::test_case* tcB;
373 
374     //            M             |
375     //         /  |  \          |
376     //        /   |   \         |
377     //     TS2   TS4  TS3       |
378     //     / \    |   / \       |
379     //    C   D  TS1 E   F      |
380     //           / \            |
381     //          A   B           |
382     //
383     //  D => TS1
384     //  B => F
385 
386     utf::test_suite* master_ts = BOOST_TEST_SUITE("local master");
387 
388     utf::test_suite* ts1 = BOOST_TEST_SUITE("ts1");
389     ts1->add( BOOST_TEST_CASE( &A ) );
390     ts1->add( tcB=BOOST_TEST_CASE( &B ) );
391 
392     utf::test_suite* ts2 = BOOST_TEST_SUITE("ts2");
393     ts2->add( BOOST_TEST_CASE( &C ) );
394     ts2->add( tc=BOOST_TEST_CASE( &D ) );
395     tc->depends_on( ts1 );
396 
397     utf::test_suite* ts3 = BOOST_TEST_SUITE("ts3");
398     ts3->add( BOOST_TEST_CASE( &E ) );
399     ts3->add( tc=BOOST_TEST_CASE( &F ) );
400     tcB->depends_on( tc );
401 
402     utf::test_suite* ts4 = BOOST_TEST_SUITE("ts4");
403     ts4->add( ts1 );
404 
405     master_ts->add( ts2 );
406     master_ts->add( ts3 );
407     master_ts->add( ts4 );
408 
409     master_ts->p_default_status.value = utf::test_unit::RS_ENABLED;
410     utf::framework::finalize_setup_phase( master_ts->p_id );
411 
412     {
413         char const* argv[] = { "a.exe", "--run=ts2/C" };
414         test_count( master_ts, argv, sizeof(argv), 1 );
415     }
416 
417     {
418         char const* argv[] = { "a.exe", "--run=ts3" };
419         test_count( master_ts, argv, sizeof(argv), 2 );
420     }
421 
422     {
423         char const* argv[] = { "a.exe", "--run=ts2/C" };
424         test_count( master_ts, argv, sizeof(argv), 1 );
425     }
426 
427     {
428         char const* argv[] = { "a.exe", "--run=ts4/ts1/B" };
429         test_count( master_ts, argv, sizeof(argv), 2 );
430     }
431 
432     {
433         char const* argv[] = { "a.exe", "--run=ts4/ts1" };
434         test_count( master_ts, argv, sizeof(argv), 3 );
435     }
436 
437     {
438         char const* argv[] = { "a.exe", "--run=ts2" };
439         test_count( master_ts, argv, sizeof(argv), 5 );
440     }
441 
442     {
443         char const* argv[] = { "a.exe", "--run=!ts3/F" };
444         test_count( master_ts, argv, sizeof(argv), 5 );
445     }
446 
447     {
448         char const* argv[] = { "a.exe", "--run=!*/ts1" };
449         test_count( master_ts, argv, sizeof(argv), 4 );
450     }
451 }
452 
453 //____________________________________________________________________________//
454 
455 // EOF
456 
457