LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/test/tree - decorator.hpp (source / functions) Hit Total Coverage
Test: test_dash_coverage.info Lines: 1 19 5.3 %
Date: 2026-06-25 07:23:51 Functions: 2 56 3.6 %

          Line data    Source code
       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             : #include <boost/test/utils/basic_cstring/basic_cstring.hpp>
      26             : 
      27             : // Boost
      28             : #include <boost/shared_ptr.hpp>
      29             : #include <boost/function/function0.hpp>
      30             : #include <boost/function/function1.hpp>
      31             : 
      32             : #include <boost/test/detail/suppress_warnings.hpp>
      33             : 
      34             : // STL
      35             : #include <vector>
      36             : 
      37             : //____________________________________________________________________________//
      38             : 
      39             : namespace boost {
      40             : namespace unit_test {
      41             : 
      42             : class test_unit;
      43             : 
      44             : namespace decorator {
      45             : 
      46             : // ************************************************************************** //
      47             : // **************             decorator::collector_t             ************** //
      48             : // ************************************************************************** //
      49             : 
      50             : class base;
      51             : typedef boost::shared_ptr<base> base_ptr;
      52             : 
      53             : class BOOST_TEST_DECL collector_t {
      54             : 
      55             : public:
      56             :     collector_t&            operator*( base const& d );
      57             : 
      58             :     void                    store_in( test_unit& tu );
      59             : 
      60             :     void                    reset();
      61             : 
      62             :     void                    stack();
      63             : 
      64             :     std::vector<base_ptr>   get_lazy_decorators() const;
      65             : 
      66             :     // singleton pattern without ctor
      67           0 :     BOOST_TEST_SINGLETON_CONS_NO_CTOR( collector_t )
      68             : 
      69             : private:
      70             :     // Class invariant: minimal size is 1.
      71         292 :     collector_t() : m_tu_decorators_stack(1) {}
      72             : 
      73             :     // Data members
      74             :     std::vector< std::vector<base_ptr> >   m_tu_decorators_stack;
      75             : };
      76             : 
      77             : 
      78             : // ************************************************************************** //
      79             : // **************              decorator::base                 ************** //
      80             : // ************************************************************************** //
      81             : 
      82             : class BOOST_TEST_DECL base {
      83             : public:
      84             :     // composition interface
      85             :     virtual collector_t&    operator*() const;
      86             : 
      87             :     // application interface
      88             :     virtual void            apply( test_unit& tu ) = 0;
      89             : 
      90             :     // deep cloning interface
      91             :     virtual base_ptr        clone() const = 0;
      92             : 
      93             : protected:
      94           0 :     virtual ~base() {}
      95             : };
      96             : 
      97             : // ************************************************************************** //
      98             : // **************         decorator::stack_decorator           ************** //
      99             : // ************************************************************************** //
     100             : 
     101             : //!@ A decorator that creates a new stack in the collector
     102             : //!
     103             : //! This decorator may be used in places where the currently accumulated decorators
     104             : //! in the collector should be applied to lower levels of the hierarchy rather
     105             : //! than the current one. This is for instance for dataset test cases, where the
     106             : //! macro does not let the user specify decorators for the underlying generated tests
     107             : //! (but rather on the main generator function), applying the stack_decorator at the
     108             : //! parent level lets us consume the decorator at the underlying test cases level.
     109             : class BOOST_TEST_DECL stack_decorator : public decorator::base {
     110             : public:
     111           0 :     explicit                stack_decorator() {}
     112             : 
     113             :     collector_t&    operator*() const BOOST_OVERRIDE;
     114             : 
     115             : private:
     116             :     // decorator::base interface
     117             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     118           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new stack_decorator()); }
     119             : };
     120             : 
     121             : // ************************************************************************** //
     122             : // **************               decorator::label               ************** //
     123             : // ************************************************************************** //
     124             : 
     125             : class BOOST_TEST_DECL label : public decorator::base {
     126             : public:
     127           0 :     explicit                label( const_string l ) : m_label( l ) {}
     128             : 
     129             : private:
     130             :     // decorator::base interface
     131             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     132           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new label( m_label )); }
     133             : 
     134             :     // Data members
     135             :     const_string            m_label;
     136             : };
     137             : 
     138             : // ************************************************************************** //
     139             : // **************         decorator::expected_failures         ************** //
     140             : // ************************************************************************** //
     141             : 
     142             : class BOOST_TEST_DECL expected_failures : public decorator::base {
     143             : public:
     144           0 :     explicit                expected_failures( counter_t ef ) : m_exp_fail( ef ) {}
     145             : 
     146             : private:
     147             :     // decorator::base interface
     148             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     149           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new expected_failures( m_exp_fail )); }
     150             : 
     151             :     // Data members
     152             :     counter_t               m_exp_fail;
     153             : };
     154             : 
     155             : // ************************************************************************** //
     156             : // **************              decorator::timeout              ************** //
     157             : // ************************************************************************** //
     158             : 
     159             : class BOOST_TEST_DECL timeout : public decorator::base {
     160             : public:
     161           0 :     explicit                timeout( unsigned t ) : m_timeout( t ) {}
     162             : 
     163             : private:
     164             :     // decorator::base interface
     165             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     166           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new timeout( m_timeout )); }
     167             : 
     168             :     // Data members
     169             :     unsigned                m_timeout;
     170             : };
     171             : 
     172             : // ************************************************************************** //
     173             : // **************            decorator::description            ************** //
     174             : // ************************************************************************** //
     175             : 
     176             : class BOOST_TEST_DECL description : public decorator::base {
     177             : public:
     178           0 :     explicit                description( const_string descr ) : m_description( descr ) {}
     179             : 
     180             : private:
     181             :     // decorator::base interface
     182             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     183           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new description( m_description )); }
     184             : 
     185             :     // Data members
     186             :     const_string            m_description;
     187             : };
     188             : 
     189             : // ************************************************************************** //
     190             : // **************            decorator::depends_on             ************** //
     191             : // ************************************************************************** //
     192             : 
     193             : class BOOST_TEST_DECL depends_on : public decorator::base {
     194             : public:
     195           0 :     explicit                depends_on( const_string dependency ) : m_dependency( dependency ) {}
     196             : 
     197             : private:
     198             :     // decorator::base interface
     199             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     200           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new depends_on( m_dependency )); }
     201             : 
     202             :     // Data members
     203             :     const_string            m_dependency;
     204             : };
     205             : 
     206             : // ************************************************************************** //
     207             : // **************    decorator::enable_if/enabled/disabled     ************** //
     208             : // ************************************************************************** //
     209             : 
     210             : class BOOST_TEST_DECL enable_if_impl : public decorator::base {
     211             : protected:
     212             :     void                    apply_impl( test_unit& tu, bool condition );
     213             : };
     214             : 
     215             : template<bool condition>
     216             : class enable_if : public enable_if_impl {
     217             : private:
     218             :     // decorator::base interface
     219             :     void            apply( test_unit& tu ) BOOST_OVERRIDE   { this->apply_impl( tu, condition ); }
     220             :     base_ptr        clone() const BOOST_OVERRIDE            { return base_ptr(new enable_if<condition>()); }
     221             : };
     222             : 
     223             : typedef enable_if<true> enabled;
     224             : typedef enable_if<false> disabled;
     225             : 
     226             : // ************************************************************************** //
     227             : // **************              decorator::fixture              ************** //
     228             : // ************************************************************************** //
     229             : 
     230             : class BOOST_TEST_DECL fixture_t : public decorator::base {
     231             : public:
     232             :     // Constructor
     233           0 :     explicit                fixture_t( test_unit_fixture_ptr impl ) : m_impl( impl ) {}
     234             : 
     235             : private:
     236             :     // decorator::base interface
     237             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     238           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new fixture_t( m_impl )); }
     239             : 
     240             :     // Data members
     241             :     test_unit_fixture_ptr m_impl;
     242             : };
     243             : 
     244             : //____________________________________________________________________________//
     245             : 
     246             : template<typename F>
     247             : inline fixture_t
     248             : fixture()
     249             : {
     250             :     return fixture_t( test_unit_fixture_ptr( new unit_test::class_based_fixture<F>() ) );
     251             : }
     252             : 
     253             : //____________________________________________________________________________//
     254             : 
     255             : template<typename F, typename Arg>
     256             : inline fixture_t
     257             : fixture( Arg const& arg )
     258             : {
     259             :     return fixture_t( test_unit_fixture_ptr( new unit_test::class_based_fixture<F,Arg>( arg ) ) );
     260             : }
     261             : 
     262             : //____________________________________________________________________________//
     263             : 
     264             : inline fixture_t
     265             : fixture( boost::function<void()> const& setup, boost::function<void()> const& teardown = boost::function<void()>() )
     266             : {
     267             :     return fixture_t( test_unit_fixture_ptr( new unit_test::function_based_fixture( setup, teardown ) ) );
     268             : }
     269             : 
     270             : //____________________________________________________________________________//
     271             : 
     272             : // ************************************************************************** //
     273             : // **************            decorator::depends_on             ************** //
     274             : // ************************************************************************** //
     275             : 
     276             : class BOOST_TEST_DECL precondition : public decorator::base {
     277             : public:
     278             :     typedef boost::function<test_tools::assertion_result (test_unit_id)>   predicate_t;
     279             : 
     280           0 :     explicit                precondition( predicate_t p ) : m_precondition( p ) {}
     281             : 
     282             : private:
     283             :     // decorator::base interface
     284             :     void            apply( test_unit& tu ) BOOST_OVERRIDE;
     285           0 :     base_ptr        clone() const BOOST_OVERRIDE { return base_ptr(new precondition( m_precondition )); }
     286             : 
     287             :     // Data members
     288             :     predicate_t             m_precondition;
     289             : };
     290             : 
     291             : } // namespace decorator
     292             : 
     293             : using decorator::label;
     294             : using decorator::expected_failures;
     295             : using decorator::timeout;
     296             : using decorator::description;
     297             : using decorator::depends_on;
     298             : using decorator::enable_if;
     299             : using decorator::enabled;
     300             : using decorator::disabled;
     301             : using decorator::fixture;
     302             : using decorator::precondition;
     303             : 
     304             : } // namespace unit_test
     305             : } // namespace boost
     306             : 
     307             : #include <boost/test/detail/enable_warnings.hpp>
     308             : 
     309             : #endif // BOOST_TEST_TREE_DECORATOR_HPP_091911GER

Generated by: LCOV version 1.16