Chris@16: // (C) Copyright Gennadiy Rozental 2001-2008. Chris@16: // Distributed under the Boost Software License, Version 1.0. Chris@16: // (See accompanying file LICENSE_1_0.txt or copy at Chris@16: // http://www.boost.org/LICENSE_1_0.txt) Chris@16: Chris@16: // See http://www.boost.org/libs/test for the library home page. Chris@16: // Chris@16: // File : $RCSfile$ Chris@16: // Chris@101: // Version : $Revision$ Chris@16: // Chris@16: // Description : defines Unit Test Framework public API Chris@16: // *************************************************************************** Chris@16: Chris@16: #ifndef BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER Chris@16: #define BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER Chris@16: Chris@16: // Boost.Test Chris@16: #include Chris@16: #include Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** Non-auto (explicit) test case interface ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_CASE( test_function ) \ Chris@16: boost::unit_test::make_test_case( boost::unit_test::callback0<>(test_function), BOOST_TEST_STRINGIZE( test_function ) ) Chris@16: #define BOOST_CLASS_TEST_CASE( test_function, tc_instance ) \ Chris@16: boost::unit_test::make_test_case((test_function), BOOST_TEST_STRINGIZE( test_function ), tc_instance ) Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_TEST_SUITE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_SUITE( testsuite_name ) \ Chris@16: ( new boost::unit_test::test_suite( testsuite_name ) ) Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_SUITE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TEST_SUITE( suite_name ) \ Chris@16: namespace suite_name { \ Chris@16: BOOST_AUTO_TU_REGISTRAR( suite_name )( BOOST_STRINGIZE( suite_name ) ); \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_FIXTURE_TEST_SUITE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_FIXTURE_TEST_SUITE( suite_name, F ) \ Chris@16: BOOST_AUTO_TEST_SUITE( suite_name ) \ Chris@16: typedef F BOOST_AUTO_TEST_CASE_FIXTURE; \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_SUITE_END ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TEST_SUITE_END() \ Chris@16: BOOST_AUTO_TU_REGISTRAR( BOOST_JOIN( end_suite, __LINE__ ) )( 1 ); \ Chris@16: } \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TEST_CASE_EXPECTED_FAILURES( test_name, n ) \ Chris@16: struct BOOST_AUTO_TC_UNIQUE_ID( test_name ); \ Chris@16: \ Chris@16: static struct BOOST_JOIN( test_name, _exp_fail_num_spec ) \ Chris@16: : boost::unit_test::ut_detail:: \ Chris@16: auto_tc_exp_fail \ Chris@16: { \ Chris@16: BOOST_JOIN( test_name, _exp_fail_num_spec )() \ Chris@16: : boost::unit_test::ut_detail:: \ Chris@16: auto_tc_exp_fail( n ) \ Chris@16: {} \ Chris@16: } BOOST_JOIN( test_name, _exp_fail_num_spec_inst ); \ Chris@16: \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_FIXTURE_TEST_CASE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_FIXTURE_TEST_CASE( test_name, F ) \ Chris@16: struct test_name : public F { void test_method(); }; \ Chris@16: \ Chris@16: static void BOOST_AUTO_TC_INVOKER( test_name )() \ Chris@16: { \ Chris@16: test_name t; \ Chris@16: t.test_method(); \ Chris@16: } \ Chris@16: \ Chris@16: struct BOOST_AUTO_TC_UNIQUE_ID( test_name ) {}; \ Chris@16: \ Chris@16: BOOST_AUTO_TU_REGISTRAR( test_name )( \ Chris@16: boost::unit_test::make_test_case( \ Chris@16: &BOOST_AUTO_TC_INVOKER( test_name ), #test_name ), \ Chris@16: boost::unit_test::ut_detail::auto_tc_exp_fail< \ Chris@16: BOOST_AUTO_TC_UNIQUE_ID( test_name )>::instance()->value() ); \ Chris@16: \ Chris@16: void test_name::test_method() \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_CASE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TEST_CASE( test_name ) \ Chris@16: BOOST_FIXTURE_TEST_CASE( test_name, BOOST_AUTO_TEST_CASE_FIXTURE ) Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_FIXTURE_TEST_CASE_TEMPLATE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, F ) \ Chris@16: template \ Chris@16: struct test_name : public F \ Chris@16: { void test_method(); }; \ Chris@16: \ Chris@16: struct BOOST_AUTO_TC_INVOKER( test_name ) { \ Chris@16: template \ Chris@16: static void run( boost::type* = 0 ) \ Chris@16: { \ Chris@16: test_name t; \ Chris@16: t.test_method(); \ Chris@16: } \ Chris@16: }; \ Chris@16: \ Chris@16: BOOST_AUTO_TU_REGISTRAR( test_name )( \ Chris@16: boost::unit_test::ut_detail::template_test_case_gen< \ Chris@16: BOOST_AUTO_TC_INVOKER( test_name ),TL >( \ Chris@16: BOOST_STRINGIZE( test_name ) ) ); \ Chris@16: \ Chris@16: template \ Chris@16: void test_name::test_method() \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_CASE_TEMPLATE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TEST_CASE_TEMPLATE( test_name, type_name, TL ) \ Chris@16: BOOST_FIXTURE_TEST_CASE_TEMPLATE( test_name, type_name, TL, BOOST_AUTO_TEST_CASE_FIXTURE ) Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_TEST_CASE_TEMPLATE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_CASE_TEMPLATE( name, typelist ) \ Chris@16: boost::unit_test::ut_detail::template_test_case_gen( \ Chris@16: BOOST_TEST_STRINGIZE( name ) ) \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_TEST_CASE_TEMPLATE_FUNCTION ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_TEST_CASE_TEMPLATE_FUNCTION( name, type_name ) \ Chris@16: template \ Chris@16: void BOOST_JOIN( name, _impl )( boost::type* ); \ Chris@16: \ Chris@16: struct name { \ Chris@16: template \ Chris@16: static void run( boost::type* frwrd = 0 ) \ Chris@16: { \ Chris@16: BOOST_JOIN( name, _impl )( frwrd ); \ Chris@16: } \ Chris@16: }; \ Chris@16: \ Chris@16: template \ Chris@16: void BOOST_JOIN( name, _impl )( boost::type* ) \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_GLOBAL_FIXURE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_GLOBAL_FIXTURE( F ) \ Chris@16: static boost::unit_test::ut_detail::global_fixture_impl BOOST_JOIN( gf_, F ) ; \ Chris@16: /**/ Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_AUTO_TEST_CASE_FIXTURE ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: namespace boost { namespace unit_test { namespace ut_detail { Chris@16: Chris@16: struct nil_t {}; Chris@16: Chris@16: } // namespace ut_detail Chris@16: } // unit_test Chris@16: } // namespace boost Chris@16: Chris@16: // Intentionally is in global namespace, so that FIXURE_TEST_SUITE can reset it in user code. Chris@16: typedef ::boost::unit_test::ut_detail::nil_t BOOST_AUTO_TEST_CASE_FIXTURE; Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** Auto registration facility helper macros ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #define BOOST_AUTO_TU_REGISTRAR( test_name ) \ Chris@16: static boost::unit_test::ut_detail::auto_test_unit_registrar BOOST_JOIN( BOOST_JOIN( test_name, _registrar ), __LINE__ ) Chris@16: #define BOOST_AUTO_TC_INVOKER( test_name ) BOOST_JOIN( test_name, _invoker ) Chris@16: #define BOOST_AUTO_TC_UNIQUE_ID( test_name ) BOOST_JOIN( test_name, _id ) Chris@16: Chris@16: // ************************************************************************** // Chris@16: // ************** BOOST_TEST_MAIN ************** // Chris@16: // ************************************************************************** // Chris@16: Chris@16: #if defined(BOOST_TEST_MAIN) Chris@16: Chris@16: #ifdef BOOST_TEST_ALTERNATIVE_INIT_API Chris@16: bool init_unit_test() { Chris@16: #else Chris@16: ::boost::unit_test::test_suite* Chris@16: init_unit_test_suite( int, char* [] ) { Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_TEST_MODULE Chris@16: using namespace ::boost::unit_test; Chris@16: assign_op( framework::master_test_suite().p_name.value, BOOST_TEST_STRINGIZE( BOOST_TEST_MODULE ).trim( "\"" ), 0 ); Chris@16: Chris@16: #endif Chris@16: Chris@16: #ifdef BOOST_TEST_ALTERNATIVE_INIT_API Chris@16: return true; Chris@16: } Chris@16: #else Chris@16: return 0; Chris@16: } Chris@16: #endif Chris@16: Chris@16: #endif Chris@16: Chris@16: //____________________________________________________________________________// Chris@16: Chris@16: #endif // BOOST_TEST_UNIT_TEST_SUITE_HPP_071894GER Chris@16: