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$ 11// 12// Description : unit test decorators implementation 13// *************************************************************************** 14 15#ifndef BOOST_TEST_TREE_DECORATOR_IPP_091911GER 16#define BOOST_TEST_TREE_DECORATOR_IPP_091911GER 17 18// Boost.Test 19#include <boost/test/tree/decorator.hpp> 20#include <boost/test/tree/test_unit.hpp> 21 22#include <boost/test/framework.hpp> 23#if BOOST_TEST_SUPPORT_TOKEN_ITERATOR 24#include <boost/test/utils/iterator/token_iterator.hpp> 25#endif 26 27#include <boost/test/detail/throw_exception.hpp> 28 29#include <boost/test/detail/suppress_warnings.hpp> 30 31//____________________________________________________________________________// 32 33namespace boost { 34namespace unit_test { 35namespace decorator { 36 37// ************************************************************************** // 38// ************** decorator::collector ************** // 39// ************************************************************************** // 40 41collector& 42collector::operator*( base const& d ) 43{ 44 m_tu_decorators.push_back( d.clone() ); 45 46 return *this; 47} 48 49//____________________________________________________________________________// 50 51void 52collector::store_in( test_unit& tu ) 53{ 54 tu.p_decorators.value.insert( tu.p_decorators.value.end(), m_tu_decorators.begin(), m_tu_decorators.end() ); 55} 56 57//____________________________________________________________________________// 58 59void 60collector::reset() 61{ 62 m_tu_decorators.clear(); 63} 64 65//____________________________________________________________________________// 66 67// ************************************************************************** // 68// ************** decorator::base ************** // 69// ************************************************************************** // 70 71collector& 72base::operator*() const 73{ 74 return collector::instance() * *this; 75} 76 77// ************************************************************************** // 78// ************** decorator::label ************** // 79// ************************************************************************** // 80 81void 82label::apply( test_unit& tu ) 83{ 84 tu.add_label( m_label ); 85} 86 87//____________________________________________________________________________// 88 89// ************************************************************************** // 90// ************** decorator::expected_failures ************** // 91// ************************************************************************** // 92 93void 94expected_failures::apply( test_unit& tu ) 95{ 96 tu.increase_exp_fail( m_exp_fail ); 97} 98 99//____________________________________________________________________________// 100 101// ************************************************************************** // 102// ************** decorator::timeout ************** // 103// ************************************************************************** // 104 105void 106timeout::apply( test_unit& tu ) 107{ 108 tu.p_timeout.value = m_timeout; 109} 110 111//____________________________________________________________________________// 112 113// ************************************************************************** // 114// ************** decorator::description ************** // 115// ************************************************************************** // 116 117void 118description::apply( test_unit& tu ) 119{ 120 tu.p_description.value += m_description; 121} 122 123//____________________________________________________________________________// 124 125// ************************************************************************** // 126// ************** decorator::depends_on ************** // 127// ************************************************************************** // 128 129void 130depends_on::apply( test_unit& tu ) 131{ 132#if !BOOST_TEST_SUPPORT_TOKEN_ITERATOR 133 BOOST_TEST_SETUP_ASSERT( false, "depends_on decorator is not supported on this platform" ); 134#else 135 utils::string_token_iterator tit( m_dependency, (utils::dropped_delimeters = "/", utils::kept_delimeters = utils::dt_none) ); 136 137 test_unit* dep = &framework::master_test_suite(); 138 while( tit != utils::string_token_iterator() ) { 139 BOOST_TEST_SETUP_ASSERT( dep->p_type == TUT_SUITE, std::string( "incorrect dependency specification " ) + m_dependency ); 140 141 test_unit_id next_id = static_cast<test_suite*>(dep)->get( *tit ); 142 143 BOOST_TEST_SETUP_ASSERT( next_id != INV_TEST_UNIT_ID, 144 std::string( "incorrect dependency specification " ) + m_dependency ); 145 146 dep = &framework::get( next_id, TUT_ANY ); 147 ++tit; 148 } 149 150 tu.depends_on( dep ); 151#endif 152} 153 154//____________________________________________________________________________// 155 156// ************************************************************************** // 157// ************** decorator::enable_if/enabled/disabled ************** // 158// ************************************************************************** // 159 160void 161enable_if_impl::apply_impl( test_unit& tu, bool condition ) 162{ 163 BOOST_TEST_SETUP_ASSERT(tu.p_default_status == test_unit::RS_INHERIT, 164 "Can't apply multiple enabled/disabled decorators " 165 "to the same test unit " + tu.full_name()); 166 167 tu.p_default_status.value = condition ? test_unit::RS_ENABLED : test_unit::RS_DISABLED; 168} 169 170//____________________________________________________________________________// 171 172// ************************************************************************** // 173// ************** decorator::fixture ************** // 174// ************************************************************************** // 175 176void 177fixture_t::apply( test_unit& tu ) 178{ 179 tu.p_fixtures.value.push_back( m_impl ); 180} 181 182//____________________________________________________________________________// 183 184// ************************************************************************** // 185// ************** decorator::depends_on ************** // 186// ************************************************************************** // 187 188void 189precondition::apply( test_unit& tu ) 190{ 191 tu.add_precondition( m_precondition ); 192} 193 194//____________________________________________________________________________// 195 196} // namespace decorator 197} // namespace unit_test 198} // namespace boost 199 200#include <boost/test/detail/enable_warnings.hpp> 201 202#endif // BOOST_TEST_TREE_DECORATOR_IPP_091911GER 203