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

source code of include/boost/test/impl/decorator.ipp