LCOV - code coverage report
Current view: top level - opt/homebrew/include/boost/test/tree - test_unit.hpp (source / functions) Hit Total Coverage
Test: total_coverage.info Lines: 9 12 75.0 %
Date: 2026-06-25 07:23:43 Functions: 14 30 46.7 %

          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
       9             : /// Defines @ref boost::unit_test::test_unit "test_unit", @ref boost::unit_test::test_case "test_case",
      10             : /// @ref boost::unit_test::test_suite "test_suite" and @ref boost::unit_test::master_test_suite_t "master_test_suite_t"
      11             : // ***************************************************************************
      12             : 
      13             : #ifndef BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER
      14             : #define BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER
      15             : 
      16             : // Boost.Test
      17             : #include <boost/test/detail/config.hpp>
      18             : #include <boost/test/detail/global_typedef.hpp>
      19             : #include <boost/test/detail/fwd_decl.hpp>
      20             : 
      21             : #include <boost/test/tree/decorator.hpp>
      22             : #include <boost/test/tree/fixture.hpp>
      23             : #include <boost/test/framework.hpp>
      24             : 
      25             : #include <boost/test/tools/assertion_result.hpp>
      26             : 
      27             : #include <boost/test/utils/class_properties.hpp>
      28             : 
      29             : // Boost
      30             : #include <boost/function/function0.hpp>
      31             : #include <boost/function/function1.hpp>
      32             : 
      33             : // STL
      34             : #include <vector>
      35             : #include <string>
      36             : #include <map>
      37             : 
      38             : #include <boost/test/detail/suppress_warnings.hpp>
      39             : 
      40             : //____________________________________________________________________________//
      41             : 
      42             : namespace boost {
      43             : namespace unit_test {
      44             : 
      45             : namespace framework {
      46             :   class state;
      47             : }
      48             : 
      49             : // ************************************************************************** //
      50             : // **************                   test_unit                  ************** //
      51             : // ************************************************************************** //
      52             : 
      53             : typedef std::vector<test_unit_id> test_unit_id_list;
      54             : 
      55             : class BOOST_TEST_DECL test_unit {
      56             : public:
      57             :     enum { type = TUT_ANY };
      58             :     enum run_status { RS_DISABLED, RS_ENABLED, RS_INHERIT, RS_INVALID };
      59             : 
      60             :     typedef std::vector<test_unit_id>                                       id_list;
      61             :     typedef std::vector<test_unit_fixture_ptr>                              fixture_list_t;
      62      246156 :     typedef BOOST_READONLY_PROPERTY(test_unit_id,(framework::state))        id_t;
      63      246156 :     typedef BOOST_READONLY_PROPERTY(test_unit_id,(test_suite))              parent_id_t;
      64      246156 :     typedef BOOST_READONLY_PROPERTY(id_list,(test_unit))                    id_list_t;
      65             :     typedef std::vector<decorator::base_ptr>                                decor_list_t;
      66      246156 :     typedef BOOST_READONLY_PROPERTY(std::vector<std::string>,(test_unit))   label_list_t;
      67             : 
      68             :     typedef boost::function<test_tools::assertion_result (test_unit_id)>    precondition_t;
      69      246156 :     typedef BOOST_READONLY_PROPERTY(std::vector<precondition_t>,(test_unit)) precond_list_t;
      70             : 
      71             :     // preconditions management
      72             :     void                                depends_on( test_unit* tu );
      73             :     void                                add_precondition( precondition_t const& );
      74             :     test_tools::assertion_result        check_preconditions() const;
      75             : 
      76             :     // labels management
      77             :     void                                add_label( const_string l );
      78             :     bool                                has_label( const_string l ) const;
      79             : 
      80             :     // helper access methods
      81             :     void                                increase_exp_fail( counter_t num );
      82      496327 :     bool                                is_enabled() const    { return p_run_status == RS_ENABLED; }
      83             :     std::string                         full_name() const;
      84             : 
      85             :     // Public r/o properties
      86             :     test_unit_type const                p_type;                 ///< type for this test unit
      87             :     const_string const                  p_type_name;            ///< "case"/"suite"/"module"
      88             :     const_string const                  p_file_name;
      89             :     std::size_t const                   p_line_num;
      90             :     id_t                                p_id;                   ///< unique id for this test unit
      91             :     parent_id_t                         p_parent_id;            ///< parent test suite id
      92             :     label_list_t                        p_labels;               ///< list of labels associated with this test unit
      93             : 
      94             :     id_list_t                           p_dependencies;         ///< list of test units this one depends on
      95             :     precond_list_t                      p_preconditions;        ///< user supplied preconditions for this test unit;
      96             : 
      97             :     // Public r/w properties
      98             :     readwrite_property<std::string>     p_name;                 ///< name for this test unit
      99             :     readwrite_property<std::string>     p_description;          ///< description for this test unit
     100             :     readwrite_property<unsigned>        p_timeout;              ///< timeout for the test unit execution in seconds
     101             :     readwrite_property<counter_t>       p_expected_failures;    ///< number of expected failures in this test unit
     102             : 
     103             :     readwrite_property<run_status>      p_default_status;       ///< run status obtained by this unit during setup phase
     104             :     readwrite_property<run_status>      p_run_status;           ///< run status assigned to this unit before execution phase after applying all filters
     105             : 
     106             :     readwrite_property<counter_t>       p_sibling_rank;         ///< rank of this test unit amoung siblings of the same parent
     107             : 
     108             :     readwrite_property<decor_list_t>    p_decorators;           ///< automatically assigned decorators; execution is delayed till framework::finalize_setup_phase function
     109             :     readwrite_property<fixture_list_t>  p_fixtures;             ///< fixtures associated with this test unit
     110             : 
     111             : protected:
     112             :     ~test_unit();
     113             :     // Constructor
     114             :     test_unit( const_string tu_name, const_string tc_file, std::size_t tc_line, test_unit_type t );
     115             :     // Master test suite constructor
     116             :     explicit                            test_unit( const_string module_name );
     117             : };
     118             : 
     119             : // ************************************************************************** //
     120             : // **************              test_unit_generator             ************** //
     121             : // ************************************************************************** //
     122             : 
     123             : class BOOST_TEST_DECL test_unit_generator {
     124             : public:
     125             :     virtual test_unit*  next() const = 0;
     126             : 
     127             : protected:
     128             :     BOOST_TEST_PROTECTED_VIRTUAL ~test_unit_generator() {}
     129             : };
     130             : 
     131             : // ************************************************************************** //
     132             : // **************                   test_case                  ************** //
     133             : // ************************************************************************** //
     134             : 
     135             : class BOOST_TEST_DECL test_case : public test_unit {
     136             : public:
     137             :     enum { type = TUT_CASE };
     138             : 
     139             :     // Constructor
     140             :     test_case( const_string tc_name, boost::function<void ()> const& test_func );
     141             :     test_case( const_string tc_name, const_string tc_file, std::size_t tc_line, boost::function<void ()> const& test_func );
     142             : 
     143             :     // Public property
     144      203524 :     typedef BOOST_READONLY_PROPERTY(boost::function<void ()>,(test_case))  test_func;
     145             : 
     146             :     test_func   p_test_func;
     147             : 
     148             : private:
     149             :     friend class framework::state;
     150           0 :     ~test_case() {}
     151             : };
     152             : 
     153             : // ************************************************************************** //
     154             : // **************                  test_suite                  ************** //
     155             : // ************************************************************************** //
     156             : 
     157             : //! Class representing test suites
     158             : class BOOST_TEST_DECL test_suite : public test_unit {
     159             : public:
     160             :     enum { type = TUT_SUITE };
     161             : 
     162             :     // Constructor
     163             :     explicit        test_suite( const_string ts_name, const_string ts_file, std::size_t ts_line );
     164             : 
     165             :     // test unit list management
     166             : 
     167             :     /*!@brief Adds a test unit to a test suite.
     168             :      *
     169             :      * It is possible to specify the timeout and the expected failures.
     170             :      */
     171             :     void            add( test_unit* tu, counter_t expected_failures = 0, unsigned timeout = 0 );
     172             : 
     173             :     /// @overload
     174             :     void            add( test_unit_generator const& gen, unsigned timeout = 0 );
     175             : 
     176             :     /// @overload
     177             :     void            add( test_unit_generator const& gen, decorator::collector_t& decorators );
     178             :   
     179             :     /// @overload
     180             :     void            add( boost::shared_ptr<test_unit_generator> gen_ptr, decorator::collector_t& decorators );
     181             : 
     182             :     //! Removes a test from the test suite.
     183             :     void            remove( test_unit_id id );
     184             :   
     185             :     //! Generates all the delayed test_units from the generators
     186             :     void            generate( );
     187             : 
     188             :     //! Check for duplicates name in test cases
     189             :     //!
     190             :     //! Raises a setup_error if there are duplicates
     191             :     void            check_for_duplicate_test_cases();
     192             : 
     193             :     // access methods
     194             :     test_unit_id    get( const_string tu_name ) const;
     195             :     std::size_t     size() const { return m_children.size(); }
     196             : 
     197             : protected:
     198             :     // Master test suite constructor
     199             :     explicit        test_suite( const_string module_name );
     200             : 
     201             :     friend BOOST_TEST_DECL
     202             :     void            traverse_test_tree( test_suite const&, test_tree_visitor&, bool );
     203             :     friend class    framework::state;
     204           0 :     virtual         ~test_suite() {}
     205             : 
     206             :     typedef std::multimap<counter_t,test_unit_id> children_per_rank;
     207             :     // Data members
     208             : 
     209             :     test_unit_id_list   m_children;
     210             :     children_per_rank   m_ranked_children; ///< maps child sibling rank to list of children with that rank
     211             :   
     212             :     std::vector< std::pair<boost::shared_ptr<test_unit_generator>, std::vector<decorator::base_ptr> > > m_generators; /// lazy evaluation
     213             : };
     214             : 
     215             : // ************************************************************************** //
     216             : // **************               master_test_suite              ************** //
     217             : // ************************************************************************** //
     218             : 
     219             : class BOOST_TEST_DECL master_test_suite_t : public test_suite {
     220             : private:
     221             :     master_test_suite_t();
     222             :     master_test_suite_t(const master_test_suite_t&); // undefined
     223             :     master_test_suite_t& operator=(master_test_suite_t const &); // undefined
     224             :   
     225             : public:
     226             :     // Data members
     227             :     int      argc;
     228             :     char**   argv;
     229             :   
     230             :     friend BOOST_TEST_DECL master_test_suite_t& boost::unit_test::framework::master_test_suite();
     231             : };
     232             : 
     233             : // ************************************************************************** //
     234             : // **************            user_tc_method_invoker            ************** //
     235             : // ************************************************************************** //
     236             : 
     237             : namespace ut_detail {
     238             : 
     239             : BOOST_TEST_DECL std::string normalize_test_case_name( const_string tu_name );
     240             : 
     241             : //____________________________________________________________________________//
     242             : 
     243             : template<typename InstanceType,typename UserTestCase>
     244             : struct user_tc_method_invoker {
     245             :     typedef void (UserTestCase::*TestMethod )();
     246             : 
     247             :     user_tc_method_invoker( shared_ptr<InstanceType> inst, TestMethod test_method )
     248             :     : m_inst( inst ), m_test_method( test_method ) {}
     249             : 
     250             :     void operator()() { ((*m_inst).*m_test_method)(); }
     251             : 
     252             :     shared_ptr<InstanceType> m_inst;
     253             :     TestMethod               m_test_method;
     254             : };
     255             : 
     256             : } // namespace ut_detail
     257             : 
     258             : // ************************************************************************** //
     259             : // **************                make_test_case                ************** //
     260             : // ************************************************************************** //
     261             : 
     262             : inline test_case*
     263      101762 : make_test_case( boost::function<void ()> const& test_func, const_string tc_name, const_string tc_file, std::size_t tc_line )
     264             : {
     265      101762 :     return new test_case( ut_detail::normalize_test_case_name( tc_name ), tc_file, tc_line, test_func );
     266           0 : }
     267             : 
     268             : //____________________________________________________________________________//
     269             : 
     270             : template<typename UserTestCase, typename InstanceType>
     271             : inline test_case*
     272             : make_test_case( void (UserTestCase::*           test_method )(),
     273             :                 const_string                    tc_name,
     274             :                 const_string                    tc_file,
     275             :                 std::size_t                     tc_line,
     276             :                 boost::shared_ptr<InstanceType> user_test_case )
     277             : {
     278             :     return new test_case( ut_detail::normalize_test_case_name( tc_name ),
     279             :                           tc_file,
     280             :                           tc_line,
     281             :                           ut_detail::user_tc_method_invoker<InstanceType,UserTestCase>( user_test_case, test_method ) );
     282             : }
     283             : 
     284             : //____________________________________________________________________________//
     285             : 
     286             : } // namespace unit_test
     287             : } // namespace boost
     288             : 
     289             : #include <boost/test/detail/enable_warnings.hpp>
     290             : 
     291             : #endif // BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER

Generated by: LCOV version 1.16