1 //  (C) Copyright Gennadiy Rozental 2007-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 : test tree management unit test
13 // ***************************************************************************
14 
15 // Boost.Test
16 #define BOOST_TEST_MODULE test tree management test
17 #include <boost/test/unit_test.hpp>
18 using namespace boost::unit_test;
19 
20 #include <boost/mpl/vector.hpp>
21 
22 //____________________________________________________________________________//
23 
24 // some empty test suites/cases
25 
26 BOOST_AUTO_TEST_SUITE( S1 )
27 
28 #if BOOST_PP_VARIADICS
29 BOOST_AUTO_TEST_CASE( tc1, * expected_failures(1) )
30 #else
31 BOOST_TEST_DECORATOR(*boost::unit_test::expected_failures(1)) BOOST_AUTO_TEST_CASE( tc1 ) /* on the same line, otherwise some test below should be updated */
32 #endif
33 { BOOST_ERROR(""); }
34 
BOOST_AUTO_TEST_CASE(tc2)35 BOOST_AUTO_TEST_CASE( tc2 ) {}
36 
37 BOOST_AUTO_TEST_SUITE_END()
38 
BOOST_AUTO_TEST_SUITE(S1)39 BOOST_AUTO_TEST_SUITE( S1 )
40 
41 void tc3() {}
tc4()42 void tc4() {}
43 
44 struct myreg {
myregmyreg45     myreg() {
46         framework::current_auto_test_suite().add( BOOST_TEST_CASE( &tc3 ) );
47         framework::current_auto_test_suite().add( BOOST_TEST_CASE( &tc4 ) );
48     }
49 } myreg_;
50 
51 BOOST_AUTO_TEST_SUITE_END()
52 
BOOST_AUTO_TEST_SUITE(S2)53 BOOST_AUTO_TEST_SUITE( S2 )
54 
55 BOOST_AUTO_TEST_CASE( tc1 ) {}
BOOST_AUTO_TEST_CASE(tc2)56 BOOST_AUTO_TEST_CASE( tc2 ) {}
57 
58 BOOST_AUTO_TEST_SUITE( S21 )
59 
60 #if BOOST_PP_VARIADICS
61 BOOST_AUTO_TEST_CASE( tc1, * expected_failures(1) )
62 #else
63 BOOST_TEST_DECORATOR(*boost::unit_test::expected_failures(1)) BOOST_AUTO_TEST_CASE( tc1 ) /* on the same line, otherwise some test below should be updated (the test is sensitive to line numbers) */
64 #endif
65 { BOOST_ERROR( "" ); }
66 
67 BOOST_AUTO_TEST_SUITE_END()
68 
69 BOOST_AUTO_TEST_SUITE_END()
70 
71 BOOST_AUTO_TEST_SUITE( S3 )
72 
73 BOOST_AUTO_TEST_SUITE_END()
74 
75 struct F1 {
F1F176    F1() { BOOST_TEST_MESSAGE( "In F1" ); }
77 };
78 
79 BOOST_AUTO_TEST_SUITE( S4 )
80 
81 typedef boost::mpl::vector<int,float,char> test_types;
BOOST_FIXTURE_TEST_CASE_TEMPLATE(tctempl,T,test_types,F1)82 BOOST_FIXTURE_TEST_CASE_TEMPLATE( tctempl, T, test_types, F1 )
83 {
84 }
85 
86 BOOST_AUTO_TEST_SUITE_END()
87 
88 struct F2 {
F2F289    F2() { BOOST_TEST_MESSAGE( "In F2" ); }
90 };
91 
92 BOOST_FIXTURE_TEST_SUITE( S5, F2 )
93 
94 typedef boost::mpl::vector<int,float,char,double,int> test_types;
BOOST_AUTO_TEST_CASE_TEMPLATE(tctempl,T,test_types)95 BOOST_AUTO_TEST_CASE_TEMPLATE( tctempl, T, test_types )
96 {
97 }
98 
BOOST_AUTO_TEST_SUITE_END()99 BOOST_AUTO_TEST_SUITE_END()
100 
101 //____________________________________________________________________________//
102 
103 // VC9 defines a function called void empty(); in ivec.h
104 void empty_() {}
105 
BOOST_AUTO_TEST_CASE(manual_test_case_creation_test)106 BOOST_AUTO_TEST_CASE( manual_test_case_creation_test )
107 {
108     test_case* tc1 = BOOST_TEST_CASE( &empty_ );
109 
110     BOOST_TEST( tc1->p_type == TUT_CASE );
111     BOOST_TEST( tc1->p_type_name == const_string( "case" ) );
112     BOOST_TEST( tc1->p_parent_id == INV_TEST_UNIT_ID );
113     BOOST_TEST( tc1->p_id != INV_TEST_UNIT_ID );
114 
115     BOOST_TEST( tc1->p_expected_failures == 0U );
116     BOOST_TEST( tc1->p_timeout == 0 );
117     BOOST_TEST( tc1->p_name == const_string( "empty_" ) );
118     BOOST_TEST( tc1->p_test_func );
119     BOOST_TEST( tc1->p_default_status == test_unit::RS_INHERIT );
120     BOOST_TEST( tc1->p_run_status == test_unit::RS_INVALID );
121     BOOST_TEST( !tc1->is_enabled() );
122 
123     BOOST_TEST( &framework::get<test_case>( tc1->p_id ) == tc1 );
124     BOOST_TEST( &framework::get( tc1->p_id, TUT_CASE ) == tc1 );
125 
126     BOOST_CHECK_THROW( framework::get( tc1->p_id, TUT_SUITE ), framework::internal_error );
127 
128     test_case* tc2 = make_test_case( &empty_, "my test case", "test_file_name", 1 );
129     BOOST_TEST( tc2->p_name == const_string( "my_test_case" ) );
130     BOOST_TEST( tc2->p_file_name == const_string( "test_file_name" ) );
131     BOOST_TEST( tc2->p_line_num == 1U );
132 }
133 
134 //____________________________________________________________________________//
135 
BOOST_AUTO_TEST_CASE(manual_test_suite_creation)136 BOOST_AUTO_TEST_CASE( manual_test_suite_creation )
137 {
138     test_suite* ts1 = BOOST_TEST_SUITE( "TestSuite" );
139 
140     BOOST_TEST( ts1->p_type == TUT_SUITE );
141     BOOST_TEST( ts1->p_type_name == const_string( "suite" ) );
142     BOOST_TEST( ts1->p_parent_id == INV_TEST_UNIT_ID );
143     BOOST_TEST( ts1->p_id != INV_TEST_UNIT_ID );
144     const_string fn(ts1->p_file_name);
145     const_string::size_type pos = fn.rfind( "/" );
146     if( pos != const_string::npos )
147         fn.trim_left( pos+1 );
148     pos = fn.rfind( "\\" );
149     if( pos != const_string::npos )
150         fn.trim_left( pos+1 );
151     BOOST_TEST( fn == const_string( "test-tree-management-test.cpp" ) );
152     BOOST_TEST( ts1->p_line_num == 138U );
153 
154     BOOST_TEST( ts1->p_expected_failures == 0U );
155     BOOST_TEST( ts1->p_timeout == 0 );
156     BOOST_TEST( ts1->p_name == const_string( "TestSuite" ) );
157     BOOST_TEST( ts1->p_default_status == test_unit::RS_INHERIT );
158     BOOST_TEST( ts1->p_run_status == test_unit::RS_INVALID );
159     BOOST_TEST( !ts1->is_enabled() );
160     BOOST_TEST( ts1->size() == 0U );
161 
162     BOOST_TEST( &framework::get<test_suite>( ts1->p_id ) == ts1 );
163     BOOST_TEST( &framework::get( ts1->p_id, TUT_SUITE ) == ts1 );
164 }
165 
166 //____________________________________________________________________________//
167 
BOOST_AUTO_TEST_CASE(manual_test_unit_registration)168 BOOST_AUTO_TEST_CASE( manual_test_unit_registration )
169 {
170     test_suite* ts1 = BOOST_TEST_SUITE( "TestSuite" );
171 
172     std::size_t line_num = 1;
173 
174     test_case* tc1 = make_test_case( &empty_, "empty1", "file_name", line_num );
175 
176     ts1->add( tc1, 1, 10U );
177     BOOST_TEST( ts1->size() == 1U );
178 
179     BOOST_TEST( tc1->p_expected_failures == 1U );
180     BOOST_TEST( tc1->p_timeout == 10 );
181     BOOST_TEST( ts1->p_expected_failures == 1U );
182 
183     test_case* tc2 = make_test_case( &empty_, "empty2", "file_name", line_num );
184 
185     ts1->add( tc2, 2U );
186     BOOST_TEST( ts1->size() == 2U );
187 
188     BOOST_TEST( tc2->p_expected_failures == 2U );
189     BOOST_TEST( tc2->p_timeout == 0 );
190     BOOST_TEST( ts1->p_expected_failures == 3U );
191 
192     test_suite* ts2 = BOOST_TEST_SUITE( "TestSuite2" );
193 
194     ts1->add( ts2 );
195     BOOST_TEST( ts1->size() == 3U );
196 
197     BOOST_TEST( ts2->p_expected_failures == 0U );
198     BOOST_TEST( ts1->p_expected_failures == 3U );
199 
200     BOOST_TEST( ts1->get( "empty1" ) == tc1->p_id );
201     BOOST_TEST( ts1->get( "empty2" ) == tc2->p_id );
202     BOOST_TEST( ts1->get( "TestSuite2" ) == ts2->p_id );
203     BOOST_TEST( ts1->get( "another name" ) == INV_TEST_UNIT_ID );
204 
205     ts1->remove( tc1->p_id );
206     BOOST_TEST( ts1->size() == 2U );
207     BOOST_TEST( ts1->get( "empty1" ) == INV_TEST_UNIT_ID );
208 
209 }
210 
211 //____________________________________________________________________________//
212 
BOOST_AUTO_TEST_CASE(automated_test_units_registration)213 BOOST_AUTO_TEST_CASE( automated_test_units_registration )
214 {
215     test_suite& mts = framework::master_test_suite();
216 
217     BOOST_TEST( mts.size() == 10U );
218     BOOST_TEST( mts.p_expected_failures == 2U );
219 
220     BOOST_TEST( framework::get<test_case>( mts.get( "automated_test_units_registration" ) ).p_expected_failures == 0U );
221 
222     test_suite& S1 = framework::get<test_suite>( mts.get( "S1" ) );
223 
224     BOOST_TEST( S1.size() == 4U );
225     BOOST_TEST( S1.p_expected_failures == 1U );
226 
227     test_suite& S2 = framework::get<test_suite>( mts.get( "S2" ) );
228 
229     BOOST_TEST( S2.size() == 3U );
230     BOOST_TEST( S2.p_expected_failures == 1U );
231 
232     test_suite& S3 = framework::get<test_suite>( mts.get( "S3" ) );
233 
234     BOOST_TEST( S3.size() == 0U );
235     BOOST_TEST( S3.p_expected_failures == 0U );
236 
237     test_suite& S21 = framework::get<test_suite>( S2.get( "S21" ) );
238 
239     BOOST_TEST( S21.size() == 1U );
240     BOOST_TEST( S1.p_expected_failures == 1U );
241 
242     test_suite& S4 = framework::get<test_suite>( mts.get( "S4" ) );
243 
244     BOOST_TEST( S4.size() == 3U );
245 
246     test_suite& S5 = framework::get<test_suite>( mts.get( "S5" ) );
247 
248     BOOST_TEST( S5.size() == 5U );
249 }
250 
251 //____________________________________________________________________________//
252 
253 struct A {
AA254     A() : i(0){}
~AA255     virtual ~A(){}
test_methodA1A256     void test_methodA1() { i++; }
test_methodA2A257     void test_methodA2() { i++; }
258 
259     int i;
260 };
261 
262 struct B : public A {
test_methodBB263     void test_methodB() { i--; }
264 };
265 
266 struct C {
CC267     C() : i( 0 ) {}
~CC268     virtual ~C(){}
269     void virtual test_method() = 0;
270 
271     int i;
272 };
273 
274 struct D : public C {
test_methodD275     void virtual test_method() { i++; }
276 };
277 
278 struct E : public C {
test_methodE279     void virtual test_method() { i+=2; }
280 };
281 
BOOST_AUTO_TEST_CASE(user_class_test_case)282 BOOST_AUTO_TEST_CASE( user_class_test_case )
283 {
284     boost::shared_ptr<A> instA( new A );
285     test_case* tc1 = BOOST_CLASS_TEST_CASE( &A::test_methodA1, instA );
286     test_case* tc2 = BOOST_CLASS_TEST_CASE( &A::test_methodA2, instA );
287 
288     BOOST_TEST( tc1->p_name == const_string( "A::test_methodA1" ) );
289     BOOST_TEST( tc2->p_name == const_string( "A::test_methodA2" ) );
290 
291     BOOST_TEST( instA->i == 0 );
292     tc1->p_test_func.get()();
293     BOOST_TEST( instA->i == 1 );
294     tc2->p_test_func.get()();
295     BOOST_TEST( instA->i == 2 );
296 
297     boost::shared_ptr<B> instB( new B );
298     test_case* tc3 = BOOST_CLASS_TEST_CASE( &A::test_methodA1, instB );
299     test_case* tc4 = BOOST_CLASS_TEST_CASE( &B::test_methodB, instB );
300 
301     BOOST_TEST( tc3->p_name == const_string( "A::test_methodA1" ) );
302     BOOST_TEST( tc4->p_name == const_string( "B::test_methodB" ) );
303 
304     BOOST_TEST( instB->i == 0 );
305     tc3->p_test_func.get()();
306     BOOST_TEST( instB->i == 1 );
307     tc4->p_test_func.get()();
308     BOOST_TEST( instB->i == 0 );
309 
310     boost::shared_ptr<C> instC1( new D );
311     test_case* tc5 = BOOST_CLASS_TEST_CASE( &C::test_method, instC1 );
312 
313     BOOST_TEST( tc5->p_name == const_string( "C::test_method" ) );
314 
315     tc5->p_test_func.get()();
316     BOOST_TEST( instC1->i == 1 );
317 
318     boost::shared_ptr<C> instC2( new E );
319     test_case* tc6 = BOOST_CLASS_TEST_CASE( &C::test_method, instC2 );
320 
321     BOOST_TEST( tc6->p_name == const_string( "C::test_method" ) );
322 
323     tc6->p_test_func.get()();
324     BOOST_TEST( instC2->i == 2 );
325 }
326 
327 //____________________________________________________________________________//
328 
329 // EOF
330