243 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			243 lines
		
	
	
		
			7.8 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
//  (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        : $RCSfile$
 | 
						|
//
 | 
						|
//  Version     : $Revision$
 | 
						|
//
 | 
						|
//  Description : argument factories for different kinds of parameters
 | 
						|
// ***************************************************************************
 | 
						|
 | 
						|
#ifndef BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
 | 
						|
#define BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
 | 
						|
 | 
						|
// Boost.Test Runtime parameters
 | 
						|
#include <boost/test/utils/runtime/errors.hpp>
 | 
						|
#include <boost/test/utils/runtime/argument.hpp>
 | 
						|
 | 
						|
// Boost.Test
 | 
						|
#include <boost/test/utils/basic_cstring/io.hpp>
 | 
						|
#include <boost/test/utils/basic_cstring/compare.hpp>
 | 
						|
#include <boost/test/utils/string_cast.hpp>
 | 
						|
 | 
						|
// Boost
 | 
						|
#include <boost/function/function2.hpp>
 | 
						|
 | 
						|
// STL
 | 
						|
#include <vector>
 | 
						|
 | 
						|
#include <boost/test/detail/suppress_warnings.hpp>
 | 
						|
 | 
						|
namespace boost {
 | 
						|
namespace runtime {
 | 
						|
 | 
						|
// ************************************************************************** //
 | 
						|
// **************          runtime::value_interpreter          ************** //
 | 
						|
// ************************************************************************** //
 | 
						|
 | 
						|
template<typename ValueType, bool is_enum>
 | 
						|
struct value_interpreter;
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<typename ValueType>
 | 
						|
struct value_interpreter<ValueType, false> {
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    value_interpreter( Modifiers const& ) {}
 | 
						|
 | 
						|
    ValueType interpret( cstring param_name, cstring source ) const
 | 
						|
    {
 | 
						|
        ValueType res;
 | 
						|
        if( !unit_test::utils::string_as<ValueType>( source, res ) )
 | 
						|
            BOOST_TEST_I_THROW( format_error( param_name ) << source <<
 | 
						|
                                " can't be interpreted as value of parameter " << param_name << "." );
 | 
						|
        return res;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<>
 | 
						|
struct value_interpreter<std::string, false> {
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    value_interpreter( Modifiers const& ) {}
 | 
						|
 | 
						|
    std::string interpret( cstring, cstring source ) const
 | 
						|
    {
 | 
						|
        return std::string( source.begin(), source.size() );
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<>
 | 
						|
struct value_interpreter<cstring, false> {
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    value_interpreter( Modifiers const& ) {}
 | 
						|
 | 
						|
    cstring interpret( cstring, cstring source ) const
 | 
						|
    {
 | 
						|
        return source;
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<>
 | 
						|
struct value_interpreter<bool, false> {
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    value_interpreter( Modifiers const& ) {}
 | 
						|
 | 
						|
    bool    interpret( cstring param_name, cstring source ) const
 | 
						|
    {
 | 
						|
        static cstring const s_YES( "YES" );
 | 
						|
        static cstring const s_Y( "Y" );
 | 
						|
        static cstring const s_NO( "NO" );
 | 
						|
        static cstring const s_N( "N" );
 | 
						|
        static cstring const s_TRUE( "TRUE" );
 | 
						|
        static cstring const s_FALSE( "FALSE" );
 | 
						|
        static cstring const s_one( "1" );
 | 
						|
        static cstring const s_zero( "0" );
 | 
						|
 | 
						|
        source.trim();
 | 
						|
 | 
						|
        if( source.is_empty() ||
 | 
						|
            case_ins_eq( source, s_YES ) ||
 | 
						|
            case_ins_eq( source, s_Y ) ||
 | 
						|
            case_ins_eq( source, s_one ) ||
 | 
						|
            case_ins_eq( source, s_TRUE ) )
 | 
						|
            return true;
 | 
						|
 | 
						|
        if( case_ins_eq( source, s_NO ) ||
 | 
						|
            case_ins_eq( source, s_N ) ||
 | 
						|
            case_ins_eq( source, s_zero ) ||
 | 
						|
            case_ins_eq( source, s_FALSE ) )
 | 
						|
            return false;
 | 
						|
 | 
						|
        BOOST_TEST_I_THROW( format_error( param_name ) << source << " can't be interpreted as bool value." );
 | 
						|
    }
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<typename EnumType>
 | 
						|
struct value_interpreter<EnumType, true> {
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit        value_interpreter( Modifiers const& m )
 | 
						|
#if defined(BOOST_TEST_CLA_NEW_API)
 | 
						|
    : m_name_to_value( m[enum_values<EnumType>::value] )
 | 
						|
    {
 | 
						|
    }
 | 
						|
#else
 | 
						|
    {
 | 
						|
        std::vector<std::pair<cstring,EnumType> > const& values = m[enum_values<EnumType>::value];
 | 
						|
 | 
						|
        m_name_to_value.insert( values.begin(), values.end() );
 | 
						|
    }
 | 
						|
#endif
 | 
						|
 | 
						|
    EnumType        interpret( cstring param_name, cstring source ) const
 | 
						|
    {
 | 
						|
        typename std::map<cstring,EnumType>::const_iterator found = m_name_to_value.find( source );
 | 
						|
 | 
						|
        BOOST_TEST_I_ASSRT( found != m_name_to_value.end(),
 | 
						|
                            format_error( param_name ) << source <<
 | 
						|
                            " is not a valid enumeration value name for parameter " << param_name << "." );
 | 
						|
 | 
						|
        return found->second;
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    // Data members
 | 
						|
    std::map<cstring,EnumType>  m_name_to_value;
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
// ************************************************************************** //
 | 
						|
// **************           runtime::argument_factory          ************** //
 | 
						|
// ************************************************************************** //
 | 
						|
 | 
						|
template<typename ValueType, bool is_enum, bool repeatable>
 | 
						|
class argument_factory;
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<typename ValueType, bool is_enum>
 | 
						|
class argument_factory<ValueType, is_enum, false> {
 | 
						|
public:
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    argument_factory( Modifiers const& m )
 | 
						|
    : m_interpreter( m )
 | 
						|
    , m_optional_value( nfp::opt_get( m, optional_value, ValueType() ) )
 | 
						|
    , m_default_value( nfp::opt_get( m, default_value, ValueType() ) )
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    void        produce_argument( cstring source, cstring param_name, arguments_store& store ) const
 | 
						|
    {
 | 
						|
        store.set( param_name, source.empty() ? m_optional_value : m_interpreter.interpret( param_name, source ) );
 | 
						|
    }
 | 
						|
 | 
						|
    void        produce_default( cstring param_name, arguments_store& store ) const
 | 
						|
    {
 | 
						|
        store.set( param_name, m_default_value );
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    // Data members
 | 
						|
    typedef value_interpreter<ValueType, is_enum> interp_t;
 | 
						|
    interp_t    m_interpreter;
 | 
						|
    ValueType   m_optional_value;
 | 
						|
    ValueType   m_default_value;
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
template<typename ValueType, bool is_enum>
 | 
						|
class argument_factory<ValueType, is_enum, true> {
 | 
						|
public:
 | 
						|
    template<typename Modifiers>
 | 
						|
    explicit    argument_factory( Modifiers const& m )
 | 
						|
    : m_interpreter( m )
 | 
						|
    {
 | 
						|
    }
 | 
						|
 | 
						|
    void        produce_argument( cstring source, cstring param_name, arguments_store& store ) const
 | 
						|
    {
 | 
						|
        ValueType value = m_interpreter.interpret( param_name, source );
 | 
						|
 | 
						|
        if( store.has( param_name ) ) {
 | 
						|
            std::vector<ValueType>& values = store.get<std::vector<ValueType> >( param_name );
 | 
						|
            values.push_back( value );
 | 
						|
        }
 | 
						|
        else {
 | 
						|
            std::vector<ValueType> values( 1, value );
 | 
						|
 | 
						|
            store.set( param_name, values );
 | 
						|
        }
 | 
						|
 | 
						|
    }
 | 
						|
    void        produce_default( cstring param_name, arguments_store& store ) const
 | 
						|
    {
 | 
						|
        store.set( param_name, std::vector<ValueType>() );
 | 
						|
    }
 | 
						|
 | 
						|
private:
 | 
						|
    // Data members
 | 
						|
    value_interpreter<ValueType, is_enum> m_interpreter;
 | 
						|
};
 | 
						|
 | 
						|
//____________________________________________________________________________//
 | 
						|
 | 
						|
} // namespace runtime
 | 
						|
} // namespace boost
 | 
						|
 | 
						|
#include <boost/test/detail/enable_warnings.hpp>
 | 
						|
 | 
						|
#endif // BOOST_TEST_UTILS_RUNTIME_ARGUMENT_FACTORY_HPP
 |