| 123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291 | //  (C) Copyright Gennadiy Rozental 2001.//  Distributed under the Boost Software License, Version 1.0.//  (See accompanying file LICENSE_1_0.txt or copy at//  http://www.boost.org/LICENSE_1_0.txt)//  See http://www.boost.org/libs/test for the library home page.///// @file/// Defines @ref boost::unit_test::test_unit "test_unit", @ref boost::unit_test::test_case "test_case",/// @ref boost::unit_test::test_suite "test_suite" and @ref boost::unit_test::master_test_suite_t "master_test_suite_t"// ***************************************************************************#ifndef BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER#define BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER// Boost.Test#include <boost/test/detail/config.hpp>#include <boost/test/detail/global_typedef.hpp>#include <boost/test/detail/fwd_decl.hpp>#include <boost/test/tree/decorator.hpp>#include <boost/test/tree/fixture.hpp>#include <boost/test/framework.hpp>#include <boost/test/tools/assertion_result.hpp>#include <boost/test/utils/class_properties.hpp>// Boost#include <boost/function/function0.hpp>#include <boost/function/function1.hpp>// STL#include <vector>#include <string>#include <map>#include <boost/test/detail/suppress_warnings.hpp>//____________________________________________________________________________//namespace boost {namespace unit_test {namespace framework {  class state;}// ************************************************************************** //// **************                   test_unit                  ************** //// ************************************************************************** //typedef std::vector<test_unit_id> test_unit_id_list;class BOOST_TEST_DECL test_unit {public:    enum { type = TUT_ANY };    enum run_status { RS_DISABLED, RS_ENABLED, RS_INHERIT, RS_INVALID };    typedef std::vector<test_unit_id>                                       id_list;    typedef std::vector<test_unit_fixture_ptr>                              fixture_list_t;    typedef BOOST_READONLY_PROPERTY(test_unit_id,(framework::state))        id_t;    typedef BOOST_READONLY_PROPERTY(test_unit_id,(test_suite))              parent_id_t;    typedef BOOST_READONLY_PROPERTY(id_list,(test_unit))                    id_list_t;    typedef std::vector<decorator::base_ptr>                                decor_list_t;    typedef BOOST_READONLY_PROPERTY(std::vector<std::string>,(test_unit))   label_list_t;    typedef boost::function<test_tools::assertion_result (test_unit_id)>    precondition_t;    typedef BOOST_READONLY_PROPERTY(std::vector<precondition_t>,(test_unit)) precond_list_t;    // preconditions management    void                                depends_on( test_unit* tu );    void                                add_precondition( precondition_t const& );    test_tools::assertion_result        check_preconditions() const;    // labels management    void                                add_label( const_string l );    bool                                has_label( const_string l ) const;    // helper access methods    void                                increase_exp_fail( counter_t num );    bool                                is_enabled() const    { return p_run_status == RS_ENABLED; }    std::string                         full_name() const;    // Public r/o properties    test_unit_type const                p_type;                 ///< type for this test unit    const_string const                  p_type_name;            ///< "case"/"suite"/"module"    const_string const                  p_file_name;    std::size_t const                   p_line_num;    id_t                                p_id;                   ///< unique id for this test unit    parent_id_t                         p_parent_id;            ///< parent test suite id    label_list_t                        p_labels;               ///< list of labels associated with this test unit    id_list_t                           p_dependencies;         ///< list of test units this one depends on    precond_list_t                      p_preconditions;        ///< user supplied preconditions for this test unit;    // Public r/w properties    readwrite_property<std::string>     p_name;                 ///< name for this test unit    readwrite_property<std::string>     p_description;          ///< description for this test unit    readwrite_property<unsigned>        p_timeout;              ///< timeout for the test unit execution in seconds    readwrite_property<counter_t>       p_expected_failures;    ///< number of expected failures in this test unit    readwrite_property<run_status>      p_default_status;       ///< run status obtained by this unit during setup phase    readwrite_property<run_status>      p_run_status;           ///< run status assigned to this unit before execution phase after applying all filters    readwrite_property<counter_t>       p_sibling_rank;         ///< rank of this test unit amoung siblings of the same parent    readwrite_property<decor_list_t>    p_decorators;           ///< automatically assigned decorators; execution is delayed till framework::finalize_setup_phase function    readwrite_property<fixture_list_t>  p_fixtures;             ///< fixtures associated with this test unitprotected:    ~test_unit();    // Constructor    test_unit( const_string tu_name, const_string tc_file, std::size_t tc_line, test_unit_type t );    // Master test suite constructor    explicit                            test_unit( const_string module_name );};// ************************************************************************** //// **************              test_unit_generator             ************** //// ************************************************************************** //class BOOST_TEST_DECL test_unit_generator {public:    virtual test_unit*  next() const = 0;protected:    BOOST_TEST_PROTECTED_VIRTUAL ~test_unit_generator() {}};// ************************************************************************** //// **************                   test_case                  ************** //// ************************************************************************** //class BOOST_TEST_DECL test_case : public test_unit {public:    enum { type = TUT_CASE };    // Constructor    test_case( const_string tc_name, boost::function<void ()> const& test_func );    test_case( const_string tc_name, const_string tc_file, std::size_t tc_line, boost::function<void ()> const& test_func );    // Public property    typedef BOOST_READONLY_PROPERTY(boost::function<void ()>,(test_case))  test_func;    test_func   p_test_func;private:    friend class framework::state;    ~test_case() {}};// ************************************************************************** //// **************                  test_suite                  ************** //// ************************************************************************** ////! Class representing test suitesclass BOOST_TEST_DECL test_suite : public test_unit {public:    enum { type = TUT_SUITE };    // Constructor    explicit        test_suite( const_string ts_name, const_string ts_file, std::size_t ts_line );    // test unit list management    /*!@brief Adds a test unit to a test suite.     *     * It is possible to specify the timeout and the expected failures.     */    void            add( test_unit* tu, counter_t expected_failures = 0, unsigned timeout = 0 );    /// @overload    void            add( test_unit_generator const& gen, unsigned timeout = 0 );    /// @overload    void            add( test_unit_generator const& gen, decorator::collector_t& decorators );      /// @overload    void            add( boost::shared_ptr<test_unit_generator> gen_ptr, decorator::collector_t& decorators );    //! Removes a test from the test suite.    void            remove( test_unit_id id );      //! Generates all the delayed test_units from the generators    void            generate( );    //! Check for duplicates name in test cases    //!    //! Raises a setup_error if there are duplicates    void            check_for_duplicate_test_cases();    // access methods    test_unit_id    get( const_string tu_name ) const;    std::size_t     size() const { return m_children.size(); }protected:    // Master test suite constructor    explicit        test_suite( const_string module_name );    friend BOOST_TEST_DECL    void            traverse_test_tree( test_suite const&, test_tree_visitor&, bool );    friend class    framework::state;    virtual         ~test_suite() {}    typedef std::multimap<counter_t,test_unit_id> children_per_rank;    // Data members    test_unit_id_list   m_children;    children_per_rank   m_ranked_children; ///< maps child sibling rank to list of children with that rank      std::vector< std::pair<boost::shared_ptr<test_unit_generator>, std::vector<decorator::base_ptr> > > m_generators; /// lazy evaluation};// ************************************************************************** //// **************               master_test_suite              ************** //// ************************************************************************** //class BOOST_TEST_DECL master_test_suite_t : public test_suite {private:    master_test_suite_t();    master_test_suite_t(const master_test_suite_t&); // undefined    master_test_suite_t& operator=(master_test_suite_t const &); // undefined  public:    // Data members    int      argc;    char**   argv;      friend BOOST_TEST_DECL master_test_suite_t& boost::unit_test::framework::master_test_suite();};// ************************************************************************** //// **************            user_tc_method_invoker            ************** //// ************************************************************************** //namespace ut_detail {BOOST_TEST_DECL std::string normalize_test_case_name( const_string tu_name );//____________________________________________________________________________//template<typename InstanceType,typename UserTestCase>struct user_tc_method_invoker {    typedef void (UserTestCase::*TestMethod )();    user_tc_method_invoker( shared_ptr<InstanceType> inst, TestMethod test_method )    : m_inst( inst ), m_test_method( test_method ) {}    void operator()() { ((*m_inst).*m_test_method)(); }    shared_ptr<InstanceType> m_inst;    TestMethod               m_test_method;};} // namespace ut_detail// ************************************************************************** //// **************                make_test_case                ************** //// ************************************************************************** //inline test_case*make_test_case( boost::function<void ()> const& test_func, const_string tc_name, const_string tc_file, std::size_t tc_line ){    return new test_case( ut_detail::normalize_test_case_name( tc_name ), tc_file, tc_line, test_func );}//____________________________________________________________________________//template<typename UserTestCase, typename InstanceType>inline test_case*make_test_case( void (UserTestCase::*           test_method )(),                const_string                    tc_name,                const_string                    tc_file,                std::size_t                     tc_line,                boost::shared_ptr<InstanceType> user_test_case ){    return new test_case( ut_detail::normalize_test_case_name( tc_name ),                          tc_file,                          tc_line,                          ut_detail::user_tc_method_invoker<InstanceType,UserTestCase>( user_test_case, test_method ) );}//____________________________________________________________________________//} // namespace unit_test} // namespace boost#include <boost/test/detail/enable_warnings.hpp>#endif // BOOST_TEST_TREE_TEST_UNIT_HPP_100211GER
 |