diff options
Diffstat (limited to 'boost/test/impl/progress_monitor.ipp')
-rw-r--r-- | boost/test/impl/progress_monitor.ipp | 89 |
1 files changed, 77 insertions, 12 deletions
diff --git a/boost/test/impl/progress_monitor.ipp b/boost/test/impl/progress_monitor.ipp index 5175755c3a..ebdd7e9320 100644 --- a/boost/test/impl/progress_monitor.ipp +++ b/boost/test/impl/progress_monitor.ipp @@ -1,4 +1,4 @@ -// (C) Copyright Gennadiy Rozental 2005-2008. +// (C) Copyright Gennadiy Rozental 2005-2014. // 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) @@ -17,12 +17,15 @@ // Boost.Test #include <boost/test/progress_monitor.hpp> -#include <boost/test/unit_test_suite_impl.hpp> -#include <boost/test/detail/unit_test_parameters.hpp> +#include <boost/test/unit_test_parameters.hpp> +#include <boost/test/utils/setcolor.hpp> + +#include <boost/test/tree/test_unit.hpp> +#include <boost/test/tree/test_case_counter.hpp> +#include <boost/test/tree/traverse.hpp> // Boost -#include <boost/progress.hpp> #include <boost/scoped_ptr.hpp> #include <boost/test/detail/suppress_warnings.hpp> @@ -30,13 +33,70 @@ //____________________________________________________________________________// namespace boost { - namespace unit_test { // ************************************************************************** // // ************** progress_monitor ************** // // ************************************************************************** // +struct progress_display { + progress_display( counter_t expected_count, std::ostream& os ) + : m_os(os) + , m_count( 0 ) + , m_expected_count( expected_count ) + , m_next_tic_count( 0 ) + , m_tic( 0 ) + { + + m_os << "\n0% 10 20 30 40 50 60 70 80 90 100%" + << "\n|----|----|----|----|----|----|----|----|----|----|" + << std::endl; + + if( !m_expected_count ) + m_expected_count = 1; // prevent divide by zero + } + + unsigned long operator+=( unsigned long increment ) + { + if( (m_count += increment) < m_next_tic_count ) + return m_count; + + // use of floating point ensures that both large and small counts + // work correctly. static_cast<>() is also used several places + // to suppress spurious compiler warnings. + unsigned int tics_needed = static_cast<unsigned int>( + (static_cast<double>(m_count)/m_expected_count)*50.0 ); + + do { + m_os << '*' << std::flush; + } while( ++m_tic < tics_needed ); + + m_next_tic_count = static_cast<unsigned long>((m_tic/50.0) * m_expected_count); + + if( m_count == m_expected_count ) { + if( m_tic < 51 ) + m_os << '*'; + + m_os << std::endl; + } + + return m_count; + } + unsigned long operator++() { return operator+=( 1 ); } + unsigned long count() const { return m_count; } + +private: + BOOST_DELETED_FUNCTION(progress_display(progress_display const&)) + BOOST_DELETED_FUNCTION(progress_display& operator=(progress_display const&)) + + std::ostream& m_os; // may not be present in all imps + + unsigned long m_count; + unsigned long m_expected_count; + unsigned long m_next_tic_count; + unsigned int m_tic; +}; + namespace { struct progress_monitor_impl { @@ -58,6 +118,8 @@ progress_monitor_impl& s_pm_impl() { static progress_monitor_impl the_inst; retu void progress_monitor_t::test_start( counter_t test_cases_amount ) { + BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA ); + s_pm_impl().m_progress_display.reset( new progress_display( test_cases_amount, *s_pm_impl().m_stream ) ); } @@ -66,6 +128,8 @@ progress_monitor_t::test_start( counter_t test_cases_amount ) void progress_monitor_t::test_aborted() { + BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA ); + (*s_pm_impl().m_progress_display) += s_pm_impl().m_progress_display->count(); } @@ -74,18 +138,22 @@ progress_monitor_t::test_aborted() void progress_monitor_t::test_unit_finish( test_unit const& tu, unsigned long ) { - if( tu.p_type == tut_case ) + BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA ); + + if( tu.p_type == TUT_CASE ) ++(*s_pm_impl().m_progress_display); } //____________________________________________________________________________// void -progress_monitor_t::test_unit_skipped( test_unit const& tu ) +progress_monitor_t::test_unit_skipped( test_unit const& tu, const_string /*reason*/ ) { + BOOST_TEST_SCOPE_SETCOLOR( *s_pm_impl().m_stream, term_attr::BRIGHT, term_color::MAGENTA ); + test_case_counter tcc; traverse_test_tree( tu, tcc ); - + (*s_pm_impl().m_progress_display) += tcc.p_count; } @@ -98,13 +166,10 @@ progress_monitor_t::set_stream( std::ostream& ostr ) } //____________________________________________________________________________// - -} // namespace unit_test +} // namespace unit_test } // namespace boost -//____________________________________________________________________________// - #include <boost/test/detail/enable_warnings.hpp> #endif // BOOST_TEST_PROGRESS_MONITOR_IPP_020105GER |