12ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  (C) Copyright Gennadiy Rozental 2001-2008.
22ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  Distributed under the Boost Software License, Version 1.0.
32ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  (See accompanying file LICENSE_1_0.txt or copy at
42ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  http://www.boost.org/LICENSE_1_0.txt)
52ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
62ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  See http://www.boost.org/libs/test for the library home page.
72ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//
82ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  File        : $RCSfile$
92ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//
102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  Version     : $Revision: 54633 $
112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//
122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//  Description : defines test_unit, test_case, test_case_results, test_suite and test_tree_visitor
132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ***************************************************************************
142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#ifndef BOOST_TEST_UNIT_TEST_SUITE_IMPL_HPP_071894GER
162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#define BOOST_TEST_UNIT_TEST_SUITE_IMPL_HPP_071894GER
172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Boost.Test
192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/config.hpp>
202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/global_typedef.hpp>
212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/utils/class_properties.hpp>
222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/utils/callback.hpp>
232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/fwd_decl.hpp>
242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/workaround.hpp>
252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/test_observer.hpp>
262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// Boost
282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/shared_ptr.hpp>
292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/for_each.hpp>
302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/mpl/identity.hpp>
312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/type.hpp>
322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/type_traits/is_const.hpp>
332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// STL
352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <typeinfo> // for typeid
362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <string>   // for std::string
372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <list>     // for std::list
382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <vector>   // for std::vector
392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/suppress_warnings.hpp>
412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace boost {
452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace unit_test {
472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************                   test_unit                  ************** //
502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL test_unit {
532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    enum { type = tut_any };
552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    test_unit( const_string tu_name, test_unit_type t );
582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // dependencies management
602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void    depends_on( test_unit* tu );
612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    bool    check_dependencies() const;
622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Public r/o properties
642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    typedef BOOST_READONLY_PROPERTY(test_unit_id,(framework_impl))  id_t;
652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    typedef BOOST_READONLY_PROPERTY(test_unit_id,(test_suite))      parent_id_t;
662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    readonly_property<test_unit_type>   p_type;                 // type for this test unit
672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    readonly_property<const_string>     p_type_name;            // "case"/"suite"
682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    id_t                                p_id;                   // unique id for this test unit
692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    parent_id_t                         p_parent_id;            // parent test suite id
702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Public r/w properties
722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    readwrite_property<std::string>     p_name;                 // name for this test unit
732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    readwrite_property<unsigned>        p_timeout;              // timeout for the test unit execution
742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    readwrite_property<counter_t>       p_expected_failures;    // number of expected failures in this test unit
752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    mutable readwrite_property<bool>    p_enabled;              // enabled status for this unit
762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void                                increase_exp_fail( unsigned num );
782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprotected:
802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    ~test_unit();
812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    std::list<test_unit_id>             m_dependencies;
852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************              test_case_generator             ************** //
892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL test_unit_generator {
922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual test_unit*  next() const = 0;
942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprotected:
962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    BOOST_TEST_PROTECTED_VIRTUAL ~test_unit_generator() {}
972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************                   test_case                  ************** //
1012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL test_case : public test_unit {
1042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
1052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    enum { type = tut_case };
1062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
1082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    test_case( const_string tc_name, callback0<> const& test_func );
1092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Access methods
1112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    callback0<> const&  test_func() const { return m_test_func; }
1122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
1142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    friend class framework_impl;
1152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    ~test_case() {}
1162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // BOOST_MSVC <= 1200 have problems with callback as property
1182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
1192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    callback0<> m_test_func;
1202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
1212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************                  test_suite                  ************** //
1242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL test_suite : public test_unit {
1272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
1282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    enum { type = tut_suite };
1292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
1312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit        test_suite( const_string ts_name );
1322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // test unit list management
1342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void            add( test_unit* tu, counter_t expected_failures = 0, unsigned timeout = 0 );
1352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void            add( test_unit_generator const& gen, unsigned timeout = 0 );
1362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void            remove( test_unit_id id );
1372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // access methods
1392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    test_unit_id    get( const_string tu_name ) const;
1402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    std::size_t     size() const { return m_members.size(); }
1412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprotected:
1432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    friend BOOST_TEST_DECL
1442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void        traverse_test_tree( test_suite const&, test_tree_visitor& );
1452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    friend class framework_impl;
1462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual     ~test_suite() {}
1472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
1492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    std::vector<test_unit_id> m_members;
1502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
1512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************               master_test_suite              ************** //
1542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL master_test_suite_t : public test_suite {
1572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
1582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    master_test_suite_t() : test_suite( "Master Test Suite" )
1592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    , argc( 0 )
1602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    , argv( 0 )
1612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {}
1622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
1642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    int      argc;
1652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    char**   argv;
1662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
1672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************               test_tree_visitor              ************** //
1712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL test_tree_visitor {
1742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
1752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // test tree visitor interface
1762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    visit( test_case const& )               {}
1772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual bool    test_suite_start( test_suite const& )   { return true; }
1782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    test_suite_finish( test_suite const& )  {}
1792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprotected:
1812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    BOOST_TEST_PROTECTED_VIRTUAL ~test_tree_visitor() {}
1822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
1832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************               traverse_test_tree             ************** //
1862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
1872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_TEST_DECL void    traverse_test_tree( test_case const&, test_tree_visitor& );
1892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_TEST_DECL void    traverse_test_tree( test_suite const&, test_tree_visitor& );
1902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_TEST_DECL void    traverse_test_tree( test_unit_id     , test_tree_visitor& );
1912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
1932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
1942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline void
1952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtraverse_test_tree( test_unit const& tu, test_tree_visitor& V )
1962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{
1972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    if( tu.p_type == tut_case )
1982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        traverse_test_tree( static_cast<test_case const&>( tu ), V );
1992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    else
2002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        traverse_test_tree( static_cast<test_suite const&>( tu ), V );
2012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}
2022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
2042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************                test_case_counter             ************** //
2072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass test_case_counter : public test_tree_visitor {
2102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
2112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
2122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    test_case_counter() : p_count( 0 ) {}
2132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    BOOST_READONLY_PROPERTY( counter_t, (test_case_counter)) p_count;
2152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
2162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // test tree visitor interface
2172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    visit( test_case const& );
2182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual bool    test_suite_start( test_suite const& ts )    { return ts.p_enabled; }
2192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
2202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************               test_being_aborted             ************** //
2232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_TEST_DECL test_being_aborted {};
2262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************               object generators              ************** //
2292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace ut_detail {
2322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew HsiehBOOST_TEST_DECL std::string normalize_test_case_name( const_string tu_name );
2342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename InstanceType,typename UserTestCase>
2362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct user_tc_method_invoker {
2372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    typedef void (UserTestCase::*TestMethod )();
2382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    user_tc_method_invoker( shared_ptr<InstanceType> inst, TestMethod test_method )
2402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    : m_inst( inst ), m_test_method( test_method ) {}
2412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void operator()() { ((*m_inst).*m_test_method)(); }
2432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    shared_ptr<InstanceType> m_inst;
2452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    TestMethod               m_test_method;
2462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
2472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace ut_detail
2492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
2512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline test_case*
2532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehmake_test_case( callback0<> const& test_func, const_string tc_name )
2542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{
2552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    return new test_case( ut_detail::normalize_test_case_name( tc_name ), test_func );
2562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}
2572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
2592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename UserTestCase, typename InstanceType>
2612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehinline test_case*
2622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehmake_test_case( void (UserTestCase::*           test_method )(),
2632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh                const_string                    tc_name,
2642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh                boost::shared_ptr<InstanceType> user_test_case )
2652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{
2662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    return new test_case( ut_detail::normalize_test_case_name( tc_name ),
2672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh                          ut_detail::user_tc_method_invoker<InstanceType,UserTestCase>( user_test_case, test_method ) );
2682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh}
2692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
2712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************           auto_test_unit_registrar           ************** //
2742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
2752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace ut_detail {
2772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct BOOST_TEST_DECL auto_test_unit_registrar
2792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh{
2802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructors
2812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh                auto_test_unit_registrar( test_case* tc, counter_t exp_fail );
2822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit    auto_test_unit_registrar( const_string ts_name );
2832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit    auto_test_unit_registrar( test_unit_generator const& tc_gen );
2842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit    auto_test_unit_registrar( int );
2852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
2872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    static std::list<test_suite*>& curr_ts_store();
2882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
2892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
2912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename T>
2932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct auto_tc_exp_fail {
2942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    auto_tc_exp_fail() : m_value( 0 ) {}
2952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
2962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit    auto_tc_exp_fail( unsigned v )
2972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    : m_value( v )
2982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {
2992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        instance() = this;
3002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    }
3012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    static auto_tc_exp_fail*& instance()
3032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {
3042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        static auto_tc_exp_fail     inst;
3052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        static auto_tc_exp_fail*    inst_ptr = &inst;
3062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        return inst_ptr;
3082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    }
3092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    unsigned    value() const { return m_value; }
3112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
3132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
3142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    unsigned    m_value;
3152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
3162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
3182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace ut_detail
3202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************                global_fixture                ************** //
3232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass BOOST_TEST_DECL global_fixture : public test_observer {
3262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
3272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
3282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    global_fixture();
3292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
3302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
3322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehnamespace ut_detail {
3342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3352ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename F>
3362ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct global_fixture_impl : public global_fixture {
3372ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
3382ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    global_fixture_impl(): m_fixure( 0 )    {}
3392ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3402ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // test observer interface
3412ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    test_start( counter_t ) { m_fixure = new F; }
3422ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    test_finish()           { delete m_fixure; m_fixure = 0; }
3432ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual void    test_aborted()          { delete m_fixure; m_fixure = 0; }
3442ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3452ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
3462ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
3472ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    F*  m_fixure;
3482ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
3492ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3502ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3512ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************          test_case_template_invoker          ************** //
3522ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3532ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3542ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename TestCaseTemplate,typename TestType>
3552ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass test_case_template_invoker {
3562ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
3572ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void    operator()()    { TestCaseTemplate::run( (boost::type<TestType>*)0 ); }
3582ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
3592ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3602ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3612ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************           generate_test_case_4_type          ************** //
3622ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3632ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3642ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename Generator,typename TestCaseTemplate>
3652ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehstruct generate_test_case_4_type {
3662ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    explicit    generate_test_case_4_type( const_string tc_name, Generator& G )
3672ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    : m_test_case_name( tc_name )
3682ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    , m_holder( G )
3692ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {}
3702ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3712ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    template<typename TestType>
3722ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    void        operator()( mpl::identity<TestType> )
3732ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {
3742ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        std::string full_name;
3752ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        assign_op( full_name, m_test_case_name, 0 );
3762ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        full_name += '<';
3772ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        full_name += typeid(TestType).name();
3782ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        if( boost::is_const<TestType>::value )
3792ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh            full_name += " const";
3802ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        full_name += '>';
3812ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3822ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        m_holder.m_test_cases.push_back(
3832ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh            new test_case( full_name, test_case_template_invoker<TestCaseTemplate,TestType>() ) );
3842ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    }
3852ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3862ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehprivate:
3872ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
3882ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    const_string    m_test_case_name;
3892ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    Generator&      m_holder;
3902ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
3912ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3922ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3932ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// **************              test_case_template              ************** //
3942ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh// ************************************************************************** //
3952ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
3962ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehtemplate<typename TestCaseTemplate,typename TestTypesList>
3972ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehclass template_test_case_gen : public test_unit_generator {
3982ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsiehpublic:
3992ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Constructor
4002ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    template_test_case_gen( const_string tc_name )
4012ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {
4022ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        typedef generate_test_case_4_type<template_test_case_gen<TestCaseTemplate,TestTypesList>,
4032ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh                                          TestCaseTemplate
4042ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        > single_test_gen;
4052ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        mpl::for_each<TestTypesList,mpl::make_identity<mpl::_> >( single_test_gen( tc_name, *this ) );
4062ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    }
4072ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4082ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    virtual test_unit* next() const
4092ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    {
4102ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        if( m_test_cases.empty() )
4112ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh            return 0;
4122ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4132ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        test_unit* res = m_test_cases.front();
4142ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        m_test_cases.pop_front();
4152ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4162ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh        return res;
4172ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    }
4182ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4192ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    // Data members
4202ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh    mutable std::list<test_unit*> m_test_cases;
4212ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh};
4222ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4232ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh//____________________________________________________________________________//
4242ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4252ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace ut_detail
4262ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4272ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // unit_test
4282ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4292ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh} // namespace boost
4302ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4312ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#include <boost/test/detail/enable_warnings.hpp>
4322ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
4332ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh#endif // BOOST_TEST_UNIT_TEST_SUITE_IMPL_HPP_071894GER
4342ca0e41376e99ad53c02fdb5333339ad3dcad19fAndrew Hsieh
435