199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
			
		
		
	
	
			199 lines
		
	
	
		
			6.5 KiB
		
	
	
	
		
			Plaintext
		
	
	
	
	
	
| #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
 | |
| #define BOOST_CORE_LIGHTWEIGHT_TEST_HPP
 | |
| 
 | |
| // MS compatible compilers support #pragma once
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| # pragma once
 | |
| #endif
 | |
| 
 | |
| //
 | |
| //  boost/core/lightweight_test.hpp - lightweight test library
 | |
| //
 | |
| //  Copyright (c) 2002, 2009, 2014 Peter Dimov
 | |
| //  Copyright (2) Beman Dawes 2010, 2011
 | |
| //  Copyright (3) Ion Gaztanaga 2013
 | |
| //
 | |
| //  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
 | |
| //
 | |
| 
 | |
| #include <boost/assert.hpp>
 | |
| #include <boost/current_function.hpp>
 | |
| #include <boost/core/no_exceptions_support.hpp>
 | |
| #include <iostream>
 | |
| 
 | |
| //  IDE's like Visual Studio perform better if output goes to std::cout or
 | |
| //  some other stream, so allow user to configure output stream:
 | |
| #ifndef BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
| # define BOOST_LIGHTWEIGHT_TEST_OSTREAM std::cerr
 | |
| #endif
 | |
| 
 | |
| namespace boost
 | |
| {
 | |
| 
 | |
| namespace detail
 | |
| {
 | |
| 
 | |
| struct report_errors_reminder
 | |
| {
 | |
|     bool called_report_errors_function;
 | |
| 
 | |
|     report_errors_reminder() : called_report_errors_function(false) {}
 | |
| 
 | |
|     ~report_errors_reminder()
 | |
|     {
 | |
|         BOOST_ASSERT(called_report_errors_function);  // verify report_errors() was called  
 | |
|     }
 | |
| };
 | |
| 
 | |
| inline report_errors_reminder& report_errors_remind()
 | |
| {
 | |
|     static report_errors_reminder r;
 | |
|     return r;
 | |
| }
 | |
| 
 | |
| inline int & test_errors()
 | |
| {
 | |
|     static int x = 0;
 | |
|     report_errors_remind();
 | |
|     return x;
 | |
| }
 | |
| 
 | |
| inline void test_failed_impl(char const * expr, char const * file, int line, char const * function)
 | |
| {
 | |
|     BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|       << file << "(" << line << "): test '" << expr << "' failed in function '"
 | |
|       << function << "'" << std::endl;
 | |
|     ++test_errors();
 | |
| }
 | |
| 
 | |
| inline void error_impl(char const * msg, char const * file, int line, char const * function)
 | |
| {
 | |
|     BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|       << file << "(" << line << "): " << msg << " in function '"
 | |
|       << function << "'" << std::endl;
 | |
|     ++test_errors();
 | |
| }
 | |
| 
 | |
| inline void throw_failed_impl(char const * excep, char const * file, int line, char const * function)
 | |
| {
 | |
|    BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|     << file << "(" << line << "): Exception '" << excep << "' not thrown in function '"
 | |
|     << function << "'" << std::endl;
 | |
|    ++test_errors();
 | |
| }
 | |
| 
 | |
| // In the comparisons below, it is possible that T and U are signed and unsigned integer types, which generates warnings in some compilers.
 | |
| // A cleaner fix would require common_type trait or some meta-programming, which would introduce a dependency on Boost.TypeTraits. To avoid
 | |
| // the dependency we just disable the warnings.
 | |
| #if defined(_MSC_VER)
 | |
| # pragma warning(push)
 | |
| # pragma warning(disable: 4389)
 | |
| #elif defined(__clang__) && defined(__has_warning)
 | |
| # if __has_warning("-Wsign-compare")
 | |
| #  pragma clang diagnostic push
 | |
| #  pragma clang diagnostic ignored "-Wsign-compare"
 | |
| # endif
 | |
| #elif defined(__GNUC__) && !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
 | |
| # pragma GCC diagnostic push
 | |
| # pragma GCC diagnostic ignored "-Wsign-compare"
 | |
| #endif
 | |
| 
 | |
| template<class T, class U> inline void test_eq_impl( char const * expr1, char const * expr2,
 | |
|   char const * file, int line, char const * function, T const & t, U const & u )
 | |
| {
 | |
|     if( t == u )
 | |
|     {
 | |
|         report_errors_remind();
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|             << file << "(" << line << "): test '" << expr1 << " == " << expr2
 | |
|             << "' failed in function '" << function << "': "
 | |
|             << "'" << t << "' != '" << u << "'" << std::endl;
 | |
|         ++test_errors();
 | |
|     }
 | |
| }
 | |
| 
 | |
| template<class T, class U> inline void test_ne_impl( char const * expr1, char const * expr2,
 | |
|   char const * file, int line, char const * function, T const & t, U const & u )
 | |
| {
 | |
|     if( t != u )
 | |
|     {
 | |
|         report_errors_remind();
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|             << file << "(" << line << "): test '" << expr1 << " != " << expr2
 | |
|             << "' failed in function '" << function << "': "
 | |
|             << "'" << t << "' == '" << u << "'" << std::endl;
 | |
|         ++test_errors();
 | |
|     }
 | |
| }
 | |
| 
 | |
| #if defined(_MSC_VER)
 | |
| # pragma warning(pop)
 | |
| #elif defined(__clang__) && defined(__has_warning)
 | |
| # if __has_warning("-Wsign-compare")
 | |
| #  pragma clang diagnostic pop
 | |
| # endif
 | |
| #elif defined(__GNUC__) && !(defined(__INTEL_COMPILER) || defined(__ICL) || defined(__ICC) || defined(__ECC)) && (__GNUC__ * 100 + __GNUC_MINOR__) >= 406
 | |
| # pragma GCC diagnostic pop
 | |
| #endif
 | |
| 
 | |
| } // namespace detail
 | |
| 
 | |
| inline int report_errors()
 | |
| {
 | |
|     boost::detail::report_errors_remind().called_report_errors_function = true;
 | |
| 
 | |
|     int errors = boost::detail::test_errors();
 | |
| 
 | |
|     if( errors == 0 )
 | |
|     {
 | |
|         BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|           << "No errors detected." << std::endl;
 | |
|         return 0;
 | |
|     }
 | |
|     else
 | |
|     {
 | |
|         BOOST_LIGHTWEIGHT_TEST_OSTREAM
 | |
|           << errors << " error" << (errors == 1? "": "s") << " detected." << std::endl;
 | |
|         return 1;
 | |
|     }
 | |
| }
 | |
| 
 | |
| } // namespace boost
 | |
| 
 | |
| #define BOOST_TEST(expr) ((expr)? (void)0: ::boost::detail::test_failed_impl(#expr, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION))
 | |
| #define BOOST_TEST_NOT(expr) BOOST_TEST(!(expr))
 | |
| 
 | |
| #define BOOST_ERROR(msg) ( ::boost::detail::error_impl(msg, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION) )
 | |
| 
 | |
| #define BOOST_TEST_EQ(expr1,expr2) ( ::boost::detail::test_eq_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
 | |
| #define BOOST_TEST_NE(expr1,expr2) ( ::boost::detail::test_ne_impl(#expr1, #expr2, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION, expr1, expr2) )
 | |
| 
 | |
| #ifndef BOOST_NO_EXCEPTIONS
 | |
|    #define BOOST_TEST_THROWS( EXPR, EXCEP )                    \
 | |
|       try {                                                    \
 | |
|          EXPR;                                                 \
 | |
|          ::boost::detail::throw_failed_impl                    \
 | |
|          (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
 | |
|       }                                                        \
 | |
|       catch(EXCEP const&) {                                    \
 | |
|       }                                                        \
 | |
|       catch(...) {                                             \
 | |
|          ::boost::detail::throw_failed_impl                    \
 | |
|          (#EXCEP, __FILE__, __LINE__, BOOST_CURRENT_FUNCTION); \
 | |
|       }                                                        \
 | |
|    //
 | |
| #else
 | |
|    #define BOOST_TEST_THROWS( EXPR, EXCEP )
 | |
| #endif
 | |
| 
 | |
| #endif // #ifndef BOOST_CORE_LIGHTWEIGHT_TEST_HPP
 | 
