762 lines
		
	
	
		
			32 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
		
		
			
		
	
	
			762 lines
		
	
	
		
			32 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 : simple implementation for Unit Test Framework parameter | ||
|  | //  handling routines. May be rewritten in future to use some kind of | ||
|  | //  command-line arguments parsing facility and environment variable handling | ||
|  | //  facility | ||
|  | // *************************************************************************** | ||
|  | 
 | ||
|  | #ifndef BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER | ||
|  | #define BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER | ||
|  | 
 | ||
|  | // Boost.Test | ||
|  | #include <boost/test/unit_test_parameters.hpp> | ||
|  | 
 | ||
|  | #include <boost/test/utils/basic_cstring/basic_cstring.hpp> | ||
|  | #include <boost/test/utils/basic_cstring/compare.hpp> | ||
|  | #include <boost/test/utils/basic_cstring/io.hpp> | ||
|  | #include <boost/test/utils/iterator/token_iterator.hpp> | ||
|  | 
 | ||
|  | #include <boost/test/debug.hpp> | ||
|  | #include <boost/test/framework.hpp> | ||
|  | 
 | ||
|  | #include <boost/test/detail/log_level.hpp> | ||
|  | #include <boost/test/detail/throw_exception.hpp> | ||
|  | 
 | ||
|  | // Boost.Runtime.Param | ||
|  | #include <boost/test/utils/runtime/parameter.hpp> | ||
|  | #include <boost/test/utils/runtime/argument.hpp> | ||
|  | #include <boost/test/utils/runtime/finalize.hpp> | ||
|  | #include <boost/test/utils/runtime/cla/parser.hpp> | ||
|  | #include <boost/test/utils/runtime/env/fetch.hpp> | ||
|  | 
 | ||
|  | // Boost | ||
|  | #include <boost/config.hpp> | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | #include <boost/optional.hpp> | ||
|  | #include <boost/cstdlib.hpp> | ||
|  | 
 | ||
|  | // STL | ||
|  | #include <cstdlib> | ||
|  | #include <iostream> | ||
|  | #include <fstream> | ||
|  | 
 | ||
|  | #include <boost/test/detail/suppress_warnings.hpp> | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | # ifdef BOOST_NO_STDC_NAMESPACE | ||
|  | namespace std { using ::getenv; using ::strncmp; using ::strcmp; } | ||
|  | # endif | ||
|  | 
 | ||
|  | namespace boost { | ||
|  | namespace unit_test { | ||
|  | 
 | ||
|  | namespace rt = boost::runtime; | ||
|  | 
 | ||
|  | // ************************************************************************** // | ||
|  | // **************                 runtime_config               ************** // | ||
|  | // ************************************************************************** // | ||
|  | 
 | ||
|  | namespace runtime_config { | ||
|  | 
 | ||
|  | // UTF parameters | ||
|  | std::string AUTO_START_DBG    = "auto_start_dbg"; | ||
|  | std::string BREAK_EXEC_PATH   = "break_exec_path"; | ||
|  | std::string BUILD_INFO        = "build_info"; | ||
|  | std::string CATCH_SYS_ERRORS  = "catch_system_errors"; | ||
|  | std::string COLOR_OUTPUT      = "color_output"; | ||
|  | std::string DETECT_FP_EXCEPT  = "detect_fp_exceptions"; | ||
|  | std::string DETECT_MEM_LEAKS  = "detect_memory_leaks"; | ||
|  | std::string LIST_CONTENT      = "list_content"; | ||
|  | std::string LIST_LABELS       = "list_labels"; | ||
|  | std::string LOG_FORMAT        = "log_format"; | ||
|  | std::string LOG_LEVEL         = "log_level"; | ||
|  | std::string LOG_SINK          = "log_sink"; | ||
|  | std::string COMBINED_LOGGER   = "logger"; | ||
|  | std::string OUTPUT_FORMAT     = "output_format"; | ||
|  | std::string RANDOM_SEED       = "random"; | ||
|  | std::string REPORT_FORMAT     = "report_format"; | ||
|  | std::string REPORT_LEVEL      = "report_level"; | ||
|  | std::string REPORT_MEM_LEAKS  = "report_memory_leaks_to"; | ||
|  | std::string REPORT_SINK       = "report_sink"; | ||
|  | std::string RESULT_CODE       = "result_code"; | ||
|  | std::string RUN_FILTERS       = "run_test"; | ||
|  | std::string SAVE_TEST_PATTERN = "save_pattern"; | ||
|  | std::string SHOW_PROGRESS     = "show_progress"; | ||
|  | std::string USE_ALT_STACK     = "use_alt_stack"; | ||
|  | std::string WAIT_FOR_DEBUGGER = "wait_for_debugger"; | ||
|  | 
 | ||
|  | std::string HELP              = "help"; | ||
|  | std::string USAGE             = "usage"; | ||
|  | std::string VERSION           = "version"; | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | namespace { | ||
|  | 
 | ||
|  | void | ||
|  | register_parameters( rt::parameters_store& store ) | ||
|  | { | ||
|  |     rt::option auto_start_dbg( AUTO_START_DBG, ( | ||
|  |         rt::description = "Automatically attaches debugger in case of system level failure (signal).", | ||
|  |         rt::env_var = "BOOST_TEST_AUTO_START_DBG", | ||
|  | 
 | ||
|  |         rt::help = "Option " + AUTO_START_DBG + " specifies whether Boost.Test should attempt " | ||
|  |                    "to attach a debugger when fatal system error occurs. At the moment this feature " | ||
|  |                    "is only available on a few selected platforms: Win32 and *nix. There is a " | ||
|  |                    "default debugger configured for these platforms. You can manually configure " | ||
|  |                    "different debugger. For more details on how to configure the debugger see the " | ||
|  |                    "Boost.Test debug API, specifically the function boost::debug::set_debugger." | ||
|  |     )); | ||
|  | 
 | ||
|  |     auto_start_dbg.add_cla_id( "--", AUTO_START_DBG, "=" ); | ||
|  |     auto_start_dbg.add_cla_id( "-", "d", " " ); | ||
|  |     store.add( auto_start_dbg ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string> break_exec_path( BREAK_EXEC_PATH, ( | ||
|  |         rt::description = "For the exception safety testing allows to break at specific execution path.", | ||
|  |         rt::env_var = "BOOST_TEST_BREAK_EXEC_PATH" | ||
|  | #ifndef BOOST_NO_CXX11_LAMBDAS | ||
|  |         , | ||
|  |         rt::callback = [](rt::cstring) { | ||
|  |             BOOST_TEST_SETUP_ASSERT( false, "parameter break_exec_path is disabled in this release" ); | ||
|  |         } | ||
|  | #endif | ||
|  |     )); | ||
|  | 
 | ||
|  |     break_exec_path.add_cla_id( "--", BREAK_EXEC_PATH, "=" ); | ||
|  |     store.add( break_exec_path ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option build_info( BUILD_INFO, ( | ||
|  |         rt::description = "Displays library build information.", | ||
|  |         rt::env_var = "BOOST_TEST_BUILD_INFO", | ||
|  |         rt::help = "Option " + BUILD_INFO + " displays library build information, including: platform, " | ||
|  |                    "compiler, STL version and Boost version." | ||
|  |     )); | ||
|  | 
 | ||
|  |     build_info.add_cla_id( "--", BUILD_INFO, "=" ); | ||
|  |     build_info.add_cla_id( "-", "i", " " ); | ||
|  |     store.add( build_info ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option catch_sys_errors( CATCH_SYS_ERRORS, ( | ||
|  |         rt::description = "Allows to switch between catching and ignoring system errors (signals).", | ||
|  |         rt::env_var = "BOOST_TEST_CATCH_SYSTEM_ERRORS", | ||
|  |         rt::default_value = | ||
|  | #ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP | ||
|  |             false, | ||
|  | #else | ||
|  |             true, | ||
|  | #endif | ||
|  |         rt::help = "If option " + CATCH_SYS_ERRORS + " has value no the frameworks does not attempt to catch " | ||
|  |                    "asynchronous system failure events (signals on *NIX platforms or structured exceptions on Windows). " | ||
|  |                    " Default value is " | ||
|  | #ifdef BOOST_TEST_DEFAULTS_TO_CORE_DUMP | ||
|  |                     "no." | ||
|  | #else | ||
|  |                     "true." | ||
|  | #endif | ||
|  |     )); | ||
|  | 
 | ||
|  |     catch_sys_errors.add_cla_id( "--", CATCH_SYS_ERRORS, "=", true ); | ||
|  |     catch_sys_errors.add_cla_id( "-", "s", " " ); | ||
|  |     store.add( catch_sys_errors ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option color_output( COLOR_OUTPUT, ( | ||
|  |         rt::description = "Enables color output of the framework log and report messages.", | ||
|  |         rt::env_var = "BOOST_TEST_COLOR_OUTPUT", | ||
|  |         rt::help = "The framework is able to produce color output on systems which supports it. " | ||
|  |                    "To enable this behavior set this option to yes. By default the framework " | ||
|  |                    "does not produces color output." | ||
|  |     )); | ||
|  | 
 | ||
|  |     color_output.add_cla_id( "--", COLOR_OUTPUT, "=", true ); | ||
|  |     color_output.add_cla_id( "-", "x", " " ); | ||
|  |     store.add( color_output ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option detect_fp_except( DETECT_FP_EXCEPT, ( | ||
|  |         rt::description = "Enables/disables floating point exceptions traps.", | ||
|  |         rt::env_var = "BOOST_TEST_DETECT_FP_EXCEPTIONS", | ||
|  |         rt::help = "Option " + DETECT_FP_EXCEPT + " enables/disables hardware traps for the floating " | ||
|  |                    "point exceptions (if supported on your platfrom)." | ||
|  |     )); | ||
|  | 
 | ||
|  |     detect_fp_except.add_cla_id( "--", DETECT_FP_EXCEPT, "=", true ); | ||
|  |     store.add( detect_fp_except ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<unsigned long> detect_mem_leaks( DETECT_MEM_LEAKS, ( | ||
|  |         rt::description = "Turns on/off memory leaks detection (optionally breaking on specified alloc order number).", | ||
|  |         rt::env_var = "BOOST_TEST_DETECT_MEMORY_LEAK", | ||
|  |         rt::default_value = 1L, | ||
|  |         rt::optional_value = 1L, | ||
|  |         rt::value_hint = "<alloc order number>", | ||
|  |         rt::help = "Parameter " + DETECT_MEM_LEAKS + " enables/disables memory leaks detection. " | ||
|  |                    "This parameter has optional long integer value. The default value is 1, which " | ||
|  |                    "enables the memory leak detection. The value 0 disables memory leak detection. " | ||
|  |                    "Any value N greater than 1 is treated as leak allocation number and tells the " | ||
|  |                    "framework to setup runtime breakpoint at Nth heap allocation. If value is " | ||
|  |                    "omitted the default value is assumed." | ||
|  |     )); | ||
|  | 
 | ||
|  |     detect_mem_leaks.add_cla_id( "--", DETECT_MEM_LEAKS, "=" ); | ||
|  |     store.add( detect_mem_leaks ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::output_format> list_content( LIST_CONTENT, ( | ||
|  |         rt::description = "Lists the content of test tree - names of all test suites and test cases.", | ||
|  |         rt::env_var = "BOOST_TEST_LIST_CONTENT", | ||
|  |         rt::default_value = OF_INVALID, | ||
|  |         rt::optional_value = OF_CLF, | ||
|  |         rt::enum_values<unit_test::output_format>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "HRF", OF_CLF }, | ||
|  |             { "DOT", OF_DOT } | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::output_format>() | ||
|  |             ( "HRF", OF_CLF ) | ||
|  |             ( "DOT", OF_DOT ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + LIST_CONTENT + " instructs the framework to list the content " | ||
|  |                    "of the test module instead of executing the test cases. Parameter accepts " | ||
|  |                    "optional string value indicating the format of the output. Currently the " | ||
|  |                    "framework supports two formats: human readable format (HRF) and dot graph " | ||
|  |                    "format (DOT). If value is omitted HRF value is assumed." | ||
|  |     )); | ||
|  |     list_content.add_cla_id( "--", LIST_CONTENT, "=" ); | ||
|  |     store.add( list_content ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option list_labels( LIST_LABELS, ( | ||
|  |         rt::description = "Lists all available labels.", | ||
|  |         rt::env_var = "BOOST_TEST_LIST_LABELS", | ||
|  |         rt::help = "Option " + LIST_LABELS + " instructs the framework to list all the the labels " | ||
|  |                    "defined in the test module instead of executing the test cases." | ||
|  |     )); | ||
|  | 
 | ||
|  |     list_labels.add_cla_id( "--", LIST_LABELS, "=" ); | ||
|  |     store.add( list_labels ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::output_format> log_format( LOG_FORMAT, ( | ||
|  |         rt::description = "Specifies log format.", | ||
|  |         rt::env_var = "BOOST_TEST_LOG_FORMAT", | ||
|  |         rt::default_value = OF_CLF, | ||
|  |         rt::enum_values<unit_test::output_format>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "HRF", OF_CLF }, | ||
|  |             { "CLF", OF_CLF }, | ||
|  |             { "XML", OF_XML }, | ||
|  |             { "JUNIT", OF_JUNIT }, | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::output_format>() | ||
|  |             ( "HRF", OF_CLF ) | ||
|  |             ( "CLF", OF_CLF ) | ||
|  |             ( "XML", OF_XML ) | ||
|  |             ( "JUNIT", OF_JUNIT ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + LOG_FORMAT + " allows to set the frameowrk's log format to one " | ||
|  |                    "of the formats supplied by the framework. The only acceptable values for this " | ||
|  |                    "parameter are the names of the output formats supplied by the framework. By " | ||
|  |                    "default the framework uses human readable format (HRF) for testing log. This " | ||
|  |                    "format is similar to compiler error format. Alternatively you can specify XML " | ||
|  |                    "or JUNIT as log format, which are easier to process by testing automation tools." | ||
|  |     )); | ||
|  | 
 | ||
|  |     log_format.add_cla_id( "--", LOG_FORMAT, "=" ); | ||
|  |     log_format.add_cla_id( "-", "f", " " ); | ||
|  |     store.add( log_format ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::log_level> log_level( LOG_LEVEL, ( | ||
|  |         rt::description = "Specifies log level.", | ||
|  |         rt::env_var = "BOOST_TEST_LOG_LEVEL", | ||
|  |         rt::default_value = log_all_errors, | ||
|  |         rt::enum_values<unit_test::log_level>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "all"           , log_successful_tests }, | ||
|  |             { "success"       , log_successful_tests }, | ||
|  |             { "test_suite"    , log_test_units }, | ||
|  |             { "unit_scope"    , log_test_units }, | ||
|  |             { "message"       , log_messages }, | ||
|  |             { "warning"       , log_warnings }, | ||
|  |             { "error"         , log_all_errors }, | ||
|  |             { "cpp_exception" , log_cpp_exception_errors }, | ||
|  |             { "system_error"  , log_system_errors }, | ||
|  |             { "fatal_error"   , log_fatal_errors }, | ||
|  |             { "nothing"       , log_nothing } | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::log_level>() | ||
|  |             ( "all"           , log_successful_tests ) | ||
|  |             ( "success"       , log_successful_tests ) | ||
|  |             ( "test_suite"    , log_test_units ) | ||
|  |             ( "unit_scope"    , log_test_units ) | ||
|  |             ( "message"       , log_messages ) | ||
|  |             ( "warning"       , log_warnings ) | ||
|  |             ( "error"         , log_all_errors ) | ||
|  |             ( "cpp_exception" , log_cpp_exception_errors ) | ||
|  |             ( "system_error"  , log_system_errors ) | ||
|  |             ( "fatal_error"   , log_fatal_errors ) | ||
|  |             ( "nothing"       , log_nothing ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + LOG_LEVEL + " allows to set the framework's log level. " | ||
|  |                    "Log level defines the verbosity of testing log produced by a testing " | ||
|  |                    "module. The verbosity ranges from a complete log, when all assertions " | ||
|  |                    "(both successful and failing) are reported, all notifications about " | ||
|  |                    "test units start and finish are included, to an empty log when nothing " | ||
|  |                    "is reported to a testing log stream." | ||
|  |     )); | ||
|  | 
 | ||
|  |     log_level.add_cla_id( "--", LOG_LEVEL, "=" ); | ||
|  |     log_level.add_cla_id( "-", "l", " " ); | ||
|  |     store.add( log_level ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string> log_sink( LOG_SINK, ( | ||
|  |         rt::description = "Specifies log sink: stdout(default), stderr or file name.", | ||
|  |         rt::env_var = "BOOST_TEST_LOG_SINK", | ||
|  |         rt::value_hint = "<stderr|stdout|file name>", | ||
|  |         rt::help = "Parameter " + LOG_SINK + " allows to set the log sink - location " | ||
|  |                    "where we report the log to, thus it allows to easily redirect the " | ||
|  |                    "test logs to file or standard streams. By default testing log is " | ||
|  |                    "directed to standard output." | ||
|  |     )); | ||
|  | 
 | ||
|  |     log_sink.add_cla_id( "--", LOG_SINK, "=" ); | ||
|  |     log_sink.add_cla_id( "-", "k", " " ); | ||
|  |     store.add( log_sink ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::output_format> output_format( OUTPUT_FORMAT, ( | ||
|  |         rt::description = "Specifies output format (both log and report).", | ||
|  |         rt::env_var = "BOOST_TEST_OUTPUT_FORMAT", | ||
|  |         rt::enum_values<unit_test::output_format>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "HRF", OF_CLF }, | ||
|  |             { "CLF", OF_CLF }, | ||
|  |             { "XML", OF_XML } | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::output_format>() | ||
|  |             ( "HRF", OF_CLF ) | ||
|  |             ( "CLF", OF_CLF ) | ||
|  |             ( "XML", OF_XML ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + OUTPUT_FORMAT + " combines an effect of " + REPORT_FORMAT + | ||
|  |                    " and " + LOG_FORMAT + " parameters. This parameter has higher priority " | ||
|  |                    "than either one of them. In other words if this parameter is specified " | ||
|  |                    "it overrides the value of other two parameters. This parameter does not " | ||
|  |                    "have a default value. The only acceptable values are string names of " | ||
|  |                    "output formats: HRF - human readable format and XML - XML formats for " | ||
|  |                    "automation tools processing." | ||
|  |     )); | ||
|  | 
 | ||
|  |     output_format.add_cla_id( "--", OUTPUT_FORMAT, "=" ); | ||
|  |     output_format.add_cla_id( "-", "o", " " ); | ||
|  |     store.add( output_format ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// combined logger option | ||
|  | 
 | ||
|  |     rt::parameter<std::string,rt::REPEATABLE_PARAM> combined_logger( COMBINED_LOGGER, ( | ||
|  |         rt::description = "Specifies log level and sink for one or several log format", | ||
|  |         rt::env_var = "BOOST_TEST_LOGGER", | ||
|  |         rt::value_hint = "log_format:log_level:log_sink", | ||
|  |         rt::help = "Parameter " + COMBINED_LOGGER + " allows to specify the logger type, level and sink\n" | ||
|  |                    "in one command." | ||
|  |     )); | ||
|  | 
 | ||
|  |     combined_logger.add_cla_id( "--", COMBINED_LOGGER, "=" ); | ||
|  |     store.add( combined_logger ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<unsigned> random_seed( RANDOM_SEED, ( | ||
|  |         rt::description = "Allows to switch between sequential and random order of test units execution." | ||
|  |                           " Optionally allows to specify concrete seed for random number generator.", | ||
|  |         rt::env_var = "BOOST_TEST_RANDOM", | ||
|  |         rt::default_value = 0U, | ||
|  |         rt::optional_value = 1U, | ||
|  |         rt::value_hint = "<seed>", | ||
|  |         rt::help = "Parameter " + RANDOM_SEED + " instructs the framework to execute the " | ||
|  |                    "test cases in random order. This parameter accepts optional unsigned " | ||
|  |                    "integer argument. By default test cases are executed in some specific " | ||
|  |                    "order defined by order of test units in test files and dependency between " | ||
|  |                    "test units. If parameter is specified without the argument value testing " | ||
|  |                    "order is randomized based on current time. Alternatively you can specify " | ||
|  |                    "any positive value greater than 1 and it will be used as random seed for " | ||
|  |                    "the run." | ||
|  |     )); | ||
|  | 
 | ||
|  |     random_seed.add_cla_id( "--", RANDOM_SEED, "=" ); | ||
|  |     store.add( random_seed ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::output_format> report_format( REPORT_FORMAT, ( | ||
|  |         rt::description = "Specifies report format.", | ||
|  |         rt::env_var = "BOOST_TEST_REPORT_FORMAT", | ||
|  |         rt::default_value = OF_CLF, | ||
|  |         rt::enum_values<unit_test::output_format>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "HRF", OF_CLF }, | ||
|  |             { "CLF", OF_CLF }, | ||
|  |             { "XML", OF_XML } | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::output_format>() | ||
|  |             ( "HRF", OF_CLF ) | ||
|  |             ( "CLF", OF_CLF ) | ||
|  |             ( "XML", OF_XML ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + REPORT_FORMAT + " allows to set the framework's report format " | ||
|  |                    "to one of the formats supplied by the framework. The only acceptable values " | ||
|  |                    "for this parameter are the names of the output formats. By default the framework " | ||
|  |                    "uses human readable format (HRF) for results reporting. Alternatively you can " | ||
|  |                    "specify XML as report format. This format is easier to process by testing " | ||
|  |                    "automation tools." | ||
|  |     )); | ||
|  | 
 | ||
|  |     report_format.add_cla_id( "--", REPORT_FORMAT, "=" ); | ||
|  |     report_format.add_cla_id( "-", "m", " " ); | ||
|  |     store.add( report_format ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::enum_parameter<unit_test::report_level> report_level( REPORT_LEVEL, ( | ||
|  |         rt::description = "Specifies report level.", | ||
|  |         rt::env_var = "BOOST_TEST_REPORT_LEVEL", | ||
|  |         rt::default_value = CONFIRMATION_REPORT, | ||
|  |         rt::enum_values<unit_test::report_level>::value = | ||
|  | #if defined(BOOST_TEST_CLA_NEW_API) | ||
|  |         { | ||
|  |             { "confirm",  CONFIRMATION_REPORT }, | ||
|  |             { "short",    SHORT_REPORT }, | ||
|  |             { "detailed", DETAILED_REPORT }, | ||
|  |             { "no",       NO_REPORT } | ||
|  |         }, | ||
|  | #else | ||
|  |         rt::enum_values_list<unit_test::report_level>() | ||
|  |             ( "confirm",  CONFIRMATION_REPORT ) | ||
|  |             ( "short",    SHORT_REPORT ) | ||
|  |             ( "detailed", DETAILED_REPORT ) | ||
|  |             ( "no",       NO_REPORT ) | ||
|  |         , | ||
|  | #endif | ||
|  |         rt::help = "Parameter " + REPORT_LEVEL + " allows to set the verbosity level of the " | ||
|  |                    "testing result report generated by the framework. Use value 'no' to " | ||
|  |                    "eliminate the results report completely." | ||
|  |     )); | ||
|  | 
 | ||
|  |     report_level.add_cla_id( "--", REPORT_LEVEL, "=" ); | ||
|  |     report_level.add_cla_id( "-", "r", " " ); | ||
|  |     store.add( report_level ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string> report_mem_leaks( REPORT_MEM_LEAKS, ( | ||
|  |         rt::description = "File where to report memory leaks to.", | ||
|  |         rt::env_var = "BOOST_TEST_REPORT_MEMORY_LEAKS_TO", | ||
|  |         rt::default_value = std::string(), | ||
|  |         rt::value_hint = "<file name>", | ||
|  |         rt::help = "Parameter " + REPORT_MEM_LEAKS + " allows to specify a file where to report " | ||
|  |                    "memory leaks to. The parameter does not have default value. If it is not specified, " | ||
|  |                    "memory leaks (if any) are reported to the standard error stream." | ||
|  |     )); | ||
|  | 
 | ||
|  |     report_mem_leaks.add_cla_id( "--", REPORT_MEM_LEAKS, "=" ); | ||
|  |     store.add( report_mem_leaks ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string> report_sink( REPORT_SINK, ( | ||
|  |         rt::description = "Specifies report sink: stderr(default), stdout or file name.", | ||
|  |         rt::env_var = "BOOST_TEST_REPORT_SINK", | ||
|  |         rt::value_hint = "<stderr|stdout|file name>", | ||
|  |         rt::help = "Parameter " + REPORT_SINK + " allows to set the result report sink - " | ||
|  |                    "the location where the framework writes the result report to, thus it " | ||
|  |                    "allows to easily redirect the result report to a file or a standard " | ||
|  |                    "stream. By default the testing result report is directed to the " | ||
|  |                    "standard error stream." | ||
|  |     )); | ||
|  | 
 | ||
|  |     report_sink.add_cla_id( "--", REPORT_SINK, "=" ); | ||
|  |     report_sink.add_cla_id( "-", "e", " " ); | ||
|  |     store.add( report_sink ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option result_code( RESULT_CODE, ( | ||
|  |         rt::description = "Disables test modules's result code generation.", | ||
|  |         rt::env_var = "BOOST_TEST_RESULT_CODE", | ||
|  |         rt::default_value = true, | ||
|  |         rt::help = "The 'no' argument value for the parameter " + RESULT_CODE + " instructs the " | ||
|  |                    "framework to always return zero result code. This can be used for test programs " | ||
|  |                    "executed within IDE. By default this parameter has value 'yes'." | ||
|  |     )); | ||
|  | 
 | ||
|  |     result_code.add_cla_id( "--", RESULT_CODE, "=", true ); | ||
|  |     result_code.add_cla_id( "-", "c", " " ); | ||
|  |     store.add( result_code ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string,rt::REPEATABLE_PARAM> tests_to_run( RUN_FILTERS, ( | ||
|  |         rt::description = "Filters, which test units to include or exclude from test module execution.", | ||
|  |         rt::env_var = "BOOST_TEST_RUN_FILTERS", | ||
|  |         rt::value_hint = "<test unit filter>", | ||
|  |         rt::help = "Parameter " + RUN_FILTERS + " allows to filter which test units to execute during " | ||
|  |                    "testing. The framework supports both 'selection filters', which allow to select " | ||
|  |                    "which test units to enable from the set of available test units, and 'disabler " | ||
|  |                    "filters', which allow to disable some test units. The __UTF__ also supports " | ||
|  |                    "enabling/disabling test units at compile time. These settings identify the default " | ||
|  |                    "set of test units to run. Parameter " + RUN_FILTERS + " is used to change this default. " | ||
|  |                    "This parameter is repeatable, so you can specify more than one filter if necessary." | ||
|  |     )); | ||
|  | 
 | ||
|  |     tests_to_run.add_cla_id( "--", RUN_FILTERS, "=" ); | ||
|  |     tests_to_run.add_cla_id( "-", "t", " " ); | ||
|  |     store.add( tests_to_run ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option save_test_pattern( SAVE_TEST_PATTERN, ( | ||
|  |         rt::description = "Allows to switch between saving or matching test pattern file.", | ||
|  |         rt::env_var = "BOOST_TEST_SAVE_PATTERN", | ||
|  |         rt::help = "Parameter " + SAVE_TEST_PATTERN + " facilitates switching mode of operation for " | ||
|  |                    "testing output streams.\n\nThis parameter serves no particular purpose within the " | ||
|  |                    "framework itself. It can be used by test modules relying on output_test_stream to " | ||
|  |                    "implement testing logic. Default mode is 'match' (false)." | ||
|  |     )); | ||
|  | 
 | ||
|  |     save_test_pattern.add_cla_id( "--", SAVE_TEST_PATTERN, "=" ); | ||
|  |     store.add( save_test_pattern ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option show_progress( SHOW_PROGRESS, ( | ||
|  |         rt::description = "Turns on progress display.", | ||
|  |         rt::env_var = "BOOST_TEST_SHOW_PROGRESS", | ||
|  |         rt::help = "Parameter " + SHOW_PROGRESS + " instructs the framework to display test progress " | ||
|  |                    "information. By default the test progress is not shown." | ||
|  |     )); | ||
|  | 
 | ||
|  |     show_progress.add_cla_id( "--", SHOW_PROGRESS, "=" ); | ||
|  |     show_progress.add_cla_id( "-", "p", " " ); | ||
|  |     store.add( show_progress ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option use_alt_stack( USE_ALT_STACK, ( | ||
|  |         rt::description = "Turns on/off usage of an alternative stack for signal handling.", | ||
|  |         rt::env_var = "BOOST_TEST_USE_ALT_STACK", | ||
|  |         rt::default_value = true, | ||
|  |         rt::help = "Parameter " + USE_ALT_STACK + " instructs the framework to use alternative " | ||
|  |                    "stack for signals processing, on platforms where they are supported. The feature " | ||
|  |                    "is enabled by default, but can be disabled using this parameter." | ||
|  |     )); | ||
|  | 
 | ||
|  |     use_alt_stack.add_cla_id( "--", USE_ALT_STACK, "=", true ); | ||
|  |     store.add( use_alt_stack ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option wait_for_debugger( WAIT_FOR_DEBUGGER, ( | ||
|  |         rt::description = "Forces test module to wait for button to be pressed before starting test run.", | ||
|  |         rt::env_var = "BOOST_TEST_WAIT_FOR_DEBUGGER", | ||
|  |         rt::help = "Parameter " + WAIT_FOR_DEBUGGER + " instructs the framework to pause before starting " | ||
|  |                    "test units execution, so that you can attach a debugger to running test module. By " | ||
|  |                    "default this parameters turned off." | ||
|  |     )); | ||
|  | 
 | ||
|  |     wait_for_debugger.add_cla_id( "--", WAIT_FOR_DEBUGGER, "=" ); | ||
|  |     wait_for_debugger.add_cla_id( "-", "w", " " ); | ||
|  |     store.add( wait_for_debugger ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::parameter<std::string> help( HELP, ( | ||
|  |         rt::description = "Help for framework parameters.", | ||
|  |         rt::optional_value = std::string(), | ||
|  |         rt::value_hint = "<parameter name>", | ||
|  |         rt::help = "Parameter " + HELP + " displays help on the framework's parameters. " | ||
|  |                    "The parameter accepts an optional argument value. If present, an argument value is " | ||
|  |                    "interpreted as a parameter name (name guessing works as well, so for example " | ||
|  |                    "--help=rand displays help on the parameter random). If the parameter name is unknown " | ||
|  |                    "or ambiguous error is reported. If argument value is absent, a summary of all " | ||
|  |                    "framework's parameter is displayed." | ||
|  |     )); | ||
|  |     help.add_cla_id( "--", HELP, "=" ); | ||
|  |     store.add( help ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option usage( USAGE, ( | ||
|  |         rt::description = "Short message explaining usage of Boost.Test parameters." | ||
|  |     )); | ||
|  |     usage.add_cla_id( "-", "?", " " ); | ||
|  |     store.add( usage ); | ||
|  | 
 | ||
|  |     /////////////////////////////////////////////// | ||
|  | 
 | ||
|  |     rt::option version( VERSION, ( | ||
|  |         rt::description = "Prints Boost.Test version and exits." | ||
|  |     )); | ||
|  |     version.add_cla_id( "--", VERSION, " " ); | ||
|  |     store.add( version ); | ||
|  | } | ||
|  | 
 | ||
|  | static rt::arguments_store  s_arguments_store; | ||
|  | static rt::parameters_store s_parameters_store; | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | } // local namespace | ||
|  | 
 | ||
|  | void | ||
|  | init( int& argc, char** argv ) | ||
|  | { | ||
|  |     shared_ptr<rt::cla::parser> parser; | ||
|  | 
 | ||
|  |     BOOST_TEST_I_TRY { | ||
|  |         // Initialize parameters list | ||
|  |         if( s_parameters_store.is_empty() ) | ||
|  |             register_parameters( s_parameters_store ); | ||
|  | 
 | ||
|  |         // Clear up arguments store just in case (of multiple init invocations) | ||
|  |         s_arguments_store.clear(); | ||
|  | 
 | ||
|  |         // Parse CLA they take precedence over  environment | ||
|  |         parser.reset( new rt::cla::parser( s_parameters_store, (rt::end_of_params = "--", rt::negation_prefix = "no_") ) ); | ||
|  |         argc = parser->parse( argc, argv, s_arguments_store ); | ||
|  | 
 | ||
|  |         // Try to fetch missing arguments from environment | ||
|  |         rt::env::fetch_absent( s_parameters_store, s_arguments_store ); | ||
|  | 
 | ||
|  |         // Set arguments to default values if defined and perform all the validations | ||
|  |         rt::finalize_arguments( s_parameters_store, s_arguments_store ); | ||
|  | 
 | ||
|  |         // Report help if requested | ||
|  |         if( runtime_config::get<bool>( VERSION ) ) { | ||
|  |             parser->version( std::cerr ); | ||
|  |             BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); | ||
|  |         } | ||
|  |         else if( runtime_config::get<bool>( USAGE ) ) { | ||
|  |             parser->usage( std::cerr ); | ||
|  |             BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); | ||
|  |         } | ||
|  |         else if( s_arguments_store.has( HELP ) ) { | ||
|  |             parser->help( std::cerr, s_parameters_store, runtime_config::get<std::string>( HELP ) ); | ||
|  |             BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_success ) ); | ||
|  |         } | ||
|  | 
 | ||
|  |         // A bit of business logic: output_format takes precedence over log/report formats | ||
|  |         if( s_arguments_store.has( OUTPUT_FORMAT ) ) { | ||
|  |             unit_test::output_format of = s_arguments_store.get<unit_test::output_format>( OUTPUT_FORMAT ); | ||
|  |             s_arguments_store.set( REPORT_FORMAT, of ); | ||
|  |             s_arguments_store.set( LOG_FORMAT, of ); | ||
|  |         } | ||
|  | 
 | ||
|  |     } | ||
|  |     BOOST_TEST_I_CATCH( rt::init_error, ex ) { | ||
|  |         BOOST_TEST_SETUP_ASSERT( false, ex.msg ); | ||
|  |     } | ||
|  |     BOOST_TEST_I_CATCH( rt::ambiguous_param, ex ) { | ||
|  |         std::cerr << ex.msg << "\n Did you mean one of these?\n"; | ||
|  | 
 | ||
|  |         BOOST_TEST_FOREACH( rt::cstring, name, ex.m_amb_candidates ) | ||
|  |             std::cerr << "   " << name << "\n"; | ||
|  | 
 | ||
|  |         BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); | ||
|  |     } | ||
|  |     BOOST_TEST_I_CATCH( rt::unrecognized_param, ex ) { | ||
|  |         std::cerr << ex.msg << "\n"; | ||
|  | 
 | ||
|  |         if( !ex.m_typo_candidates.empty() ) { | ||
|  |             std::cerr << " Did you mean one of these?\n"; | ||
|  | 
 | ||
|  |             BOOST_TEST_FOREACH( rt::cstring, name, ex.m_typo_candidates ) | ||
|  |                 std::cerr << "   " << name << "\n"; | ||
|  |         } | ||
|  |         else if( parser ) { | ||
|  |             std::cerr << "\n"; | ||
|  |             parser->usage( std::cerr ); | ||
|  |         } | ||
|  | 
 | ||
|  |         BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); | ||
|  |     } | ||
|  |     BOOST_TEST_I_CATCH( rt::input_error, ex ) { | ||
|  |         std::cerr << ex.msg << "\n\n"; | ||
|  | 
 | ||
|  |         if( parser ) | ||
|  |             parser->usage( std::cerr, ex.param_name ); | ||
|  | 
 | ||
|  |         BOOST_TEST_I_THROW( framework::nothing_to_test( boost::exit_exception_failure ) ); | ||
|  |     } | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | rt::arguments_store const& | ||
|  | argument_store() | ||
|  | { | ||
|  |     return s_arguments_store; | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | bool | ||
|  | save_pattern() | ||
|  | { | ||
|  |     return runtime_config::get<bool>( SAVE_TEST_PATTERN ); | ||
|  | } | ||
|  | 
 | ||
|  | //____________________________________________________________________________// | ||
|  | 
 | ||
|  | } // namespace runtime_config | ||
|  | } // namespace unit_test | ||
|  | } // namespace boost | ||
|  | 
 | ||
|  | #include <boost/test/detail/enable_warnings.hpp> | ||
|  | 
 | ||
|  | #endif // BOOST_TEST_UNIT_TEST_PARAMETERS_IPP_012205GER |