]>
Commit | Line | Data |
---|---|---|
7c673cae FG |
1 | // (C) Copyright Gennadiy Rozental 2001. |
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: 62016 $ | |
11 | // | |
12 | // Description : defines decorators to be using with auto registered test units | |
13 | // *************************************************************************** | |
14 | ||
15 | #ifndef BOOST_TEST_TREE_DECORATOR_HPP_091911GER | |
16 | #define BOOST_TEST_TREE_DECORATOR_HPP_091911GER | |
17 | ||
18 | // Boost.Test | |
19 | #include <boost/test/detail/config.hpp> | |
20 | #include <boost/test/detail/global_typedef.hpp> | |
21 | ||
22 | #include <boost/test/tree/fixture.hpp> | |
23 | ||
24 | #include <boost/test/tools/assertion_result.hpp> | |
25 | ||
26 | #include <boost/test/utils/basic_cstring/basic_cstring.hpp> | |
27 | #include <boost/test/utils/trivial_singleton.hpp> | |
28 | ||
29 | // Boost | |
30 | #include <boost/shared_ptr.hpp> | |
31 | #include <boost/function/function0.hpp> | |
32 | #include <boost/function/function1.hpp> | |
33 | ||
34 | #include <boost/test/detail/suppress_warnings.hpp> | |
35 | ||
36 | // STL | |
37 | #include <vector> | |
38 | ||
39 | //____________________________________________________________________________// | |
40 | ||
41 | namespace boost { | |
42 | namespace unit_test { | |
43 | ||
44 | class test_unit; | |
45 | ||
46 | namespace decorator { | |
47 | ||
48 | // ************************************************************************** // | |
49 | // ************** decorator::collector ************** // | |
50 | // ************************************************************************** // | |
51 | ||
52 | class base; | |
53 | typedef boost::shared_ptr<base> base_ptr; | |
54 | ||
55 | class BOOST_TEST_DECL collector : public singleton<collector> { | |
56 | public: | |
57 | collector& operator*( base const& d ); | |
58 | ||
59 | void store_in( test_unit& tu ); | |
60 | ||
61 | void reset(); | |
62 | ||
63 | private: | |
64 | BOOST_TEST_SINGLETON_CONS( collector ) | |
65 | ||
66 | // Data members | |
67 | std::vector<base_ptr> m_tu_decorators; | |
68 | }; | |
69 | ||
70 | // ************************************************************************** // | |
71 | // ************** decorator::base ************** // | |
72 | // ************************************************************************** // | |
73 | ||
74 | class BOOST_TEST_DECL base { | |
75 | public: | |
76 | // composition interface | |
77 | collector& operator*() const; | |
78 | ||
79 | // application interface | |
80 | virtual void apply( test_unit& tu ) = 0; | |
81 | ||
82 | // deep cloning interface | |
83 | virtual base_ptr clone() const = 0; | |
84 | ||
85 | protected: | |
86 | virtual ~base() {} | |
87 | }; | |
88 | ||
89 | // ************************************************************************** // | |
90 | // ************** decorator::label ************** // | |
91 | // ************************************************************************** // | |
92 | ||
93 | class BOOST_TEST_DECL label : public decorator::base { | |
94 | public: | |
95 | explicit label( const_string l ) : m_label( l ) {} | |
96 | ||
97 | private: | |
98 | // decorator::base interface | |
99 | virtual void apply( test_unit& tu ); | |
100 | virtual base_ptr clone() const { return base_ptr(new label( m_label )); } | |
101 | ||
102 | // Data members | |
103 | const_string m_label; | |
104 | }; | |
105 | ||
106 | // ************************************************************************** // | |
107 | // ************** decorator::expected_failures ************** // | |
108 | // ************************************************************************** // | |
109 | ||
110 | class BOOST_TEST_DECL expected_failures : public decorator::base { | |
111 | public: | |
112 | explicit expected_failures( counter_t ef ) : m_exp_fail( ef ) {} | |
113 | ||
114 | private: | |
115 | // decorator::base interface | |
116 | virtual void apply( test_unit& tu ); | |
117 | virtual base_ptr clone() const { return base_ptr(new expected_failures( m_exp_fail )); } | |
118 | ||
119 | // Data members | |
120 | counter_t m_exp_fail; | |
121 | }; | |
122 | ||
123 | // ************************************************************************** // | |
124 | // ************** decorator::timeout ************** // | |
125 | // ************************************************************************** // | |
126 | ||
127 | class BOOST_TEST_DECL timeout : public decorator::base { | |
128 | public: | |
129 | explicit timeout( unsigned t ) : m_timeout( t ) {} | |
130 | ||
131 | private: | |
132 | // decorator::base interface | |
133 | virtual void apply( test_unit& tu ); | |
134 | virtual base_ptr clone() const { return base_ptr(new timeout( m_timeout )); } | |
135 | ||
136 | // Data members | |
137 | unsigned m_timeout; | |
138 | }; | |
139 | ||
140 | // ************************************************************************** // | |
141 | // ************** decorator::description ************** // | |
142 | // ************************************************************************** // | |
143 | ||
144 | class BOOST_TEST_DECL description : public decorator::base { | |
145 | public: | |
146 | explicit description( const_string descr ) : m_description( descr ) {} | |
147 | ||
148 | private: | |
149 | // decorator::base interface | |
150 | virtual void apply( test_unit& tu ); | |
151 | virtual base_ptr clone() const { return base_ptr(new description( m_description )); } | |
152 | ||
153 | // Data members | |
154 | const_string m_description; | |
155 | }; | |
156 | ||
157 | // ************************************************************************** // | |
158 | // ************** decorator::depends_on ************** // | |
159 | // ************************************************************************** // | |
160 | ||
161 | class BOOST_TEST_DECL depends_on : public decorator::base { | |
162 | public: | |
163 | explicit depends_on( const_string dependency ) : m_dependency( dependency ) {} | |
164 | ||
165 | private: | |
166 | // decorator::base interface | |
167 | virtual void apply( test_unit& tu ); | |
168 | virtual base_ptr clone() const { return base_ptr(new depends_on( m_dependency )); } | |
169 | ||
170 | // Data members | |
171 | const_string m_dependency; | |
172 | }; | |
173 | ||
174 | // ************************************************************************** // | |
175 | // ************** decorator::enable_if/enabled/disabled ************** // | |
176 | // ************************************************************************** // | |
177 | ||
178 | class BOOST_TEST_DECL enable_if_impl : public decorator::base { | |
179 | protected: | |
180 | void apply_impl( test_unit& tu, bool condition ); | |
181 | }; | |
182 | ||
183 | template<bool condition> | |
184 | class enable_if : public enable_if_impl { | |
185 | private: | |
186 | // decorator::base interface | |
187 | virtual void apply( test_unit& tu ) { this->apply_impl( tu, condition ); } | |
188 | virtual base_ptr clone() const { return base_ptr(new enable_if<condition>()); } | |
189 | }; | |
190 | ||
191 | typedef enable_if<true> enabled; | |
192 | typedef enable_if<false> disabled; | |
193 | ||
194 | // ************************************************************************** // | |
195 | // ************** decorator::fixture ************** // | |
196 | // ************************************************************************** // | |
197 | ||
198 | class BOOST_TEST_DECL fixture_t : public decorator::base { | |
199 | public: | |
200 | // Constructor | |
201 | explicit fixture_t( test_unit_fixture_ptr impl ) : m_impl( impl ) {} | |
202 | ||
203 | private: | |
204 | // decorator::base interface | |
205 | virtual void apply( test_unit& tu ); | |
206 | virtual base_ptr clone() const { return base_ptr(new fixture_t( m_impl )); } | |
207 | ||
208 | // Data members | |
209 | test_unit_fixture_ptr m_impl; | |
210 | }; | |
211 | ||
212 | //____________________________________________________________________________// | |
213 | ||
214 | template<typename F> | |
215 | inline fixture_t | |
216 | fixture() | |
217 | { | |
218 | return fixture_t( test_unit_fixture_ptr( new unit_test::class_based_fixture<F>() ) ); | |
219 | } | |
220 | ||
221 | //____________________________________________________________________________// | |
222 | ||
223 | template<typename F, typename Arg> | |
224 | inline fixture_t | |
225 | fixture( Arg const& arg ) | |
226 | { | |
227 | return fixture_t( test_unit_fixture_ptr( new unit_test::class_based_fixture<F,Arg>( arg ) ) ); | |
228 | } | |
229 | ||
230 | //____________________________________________________________________________// | |
231 | ||
232 | inline fixture_t | |
233 | fixture( boost::function<void()> const& setup, boost::function<void()> const& teardown = boost::function<void()>() ) | |
234 | { | |
235 | return fixture_t( test_unit_fixture_ptr( new unit_test::function_based_fixture( setup, teardown ) ) ); | |
236 | } | |
237 | ||
238 | //____________________________________________________________________________// | |
239 | ||
240 | // ************************************************************************** // | |
241 | // ************** decorator::depends_on ************** // | |
242 | // ************************************************************************** // | |
243 | ||
244 | class BOOST_TEST_DECL precondition : public decorator::base { | |
245 | public: | |
246 | typedef boost::function<test_tools::assertion_result (test_unit_id)> predicate_t; | |
247 | ||
248 | explicit precondition( predicate_t p ) : m_precondition( p ) {} | |
249 | ||
250 | private: | |
251 | // decorator::base interface | |
252 | virtual void apply( test_unit& tu ); | |
253 | virtual base_ptr clone() const { return base_ptr(new precondition( m_precondition )); } | |
254 | ||
255 | // Data members | |
256 | predicate_t m_precondition; | |
257 | }; | |
258 | ||
259 | } // namespace decorator | |
260 | ||
261 | using decorator::label; | |
262 | using decorator::expected_failures; | |
263 | using decorator::timeout; | |
264 | using decorator::description; | |
265 | using decorator::depends_on; | |
266 | using decorator::enable_if; | |
267 | using decorator::enabled; | |
268 | using decorator::disabled; | |
269 | using decorator::fixture; | |
270 | using decorator::precondition; | |
271 | ||
272 | } // namespace unit_test | |
273 | } // namespace boost | |
274 | ||
275 | #include <boost/test/detail/enable_warnings.hpp> | |
276 | ||
277 | #endif // BOOST_TEST_TREE_DECORATOR_HPP_091911GER |