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 278