diff --git a/build/build.xml b/build/build.xml index 6f58f35..ee72d47 100644 --- a/build/build.xml +++ b/build/build.xml @@ -62,6 +62,7 @@ + diff --git a/src/libraries/turtle/child.hpp b/src/libraries/turtle/child.hpp index 15d67be..c330165 100644 --- a/src/libraries/turtle/child.hpp +++ b/src/libraries/turtle/child.hpp @@ -30,7 +30,7 @@ namespace detail const boost::optional< type_name >& type, boost::unit_test::const_string name ) { - if( instance != "?" || name_.empty() ) + if( instance != "?." || name_.empty() ) p = parent( instance, type ); parent_ = &p; name_ = name; diff --git a/src/libraries/turtle/function.hpp b/src/libraries/turtle/function.hpp index 5e052a3..daabbb2 100644 --- a/src/libraries/turtle/function.hpp +++ b/src/libraries/turtle/function.hpp @@ -98,7 +98,7 @@ namespace mock return s << *e.impl_; } - function& _configure( detail::context& c, + function& operator()( detail::context& c, boost::unit_test::const_string instance ) { if( ! impl_->context_ ) diff --git a/src/libraries/turtle/mock.hpp b/src/libraries/turtle/mock.hpp index bc1c6a0..7a4f355 100644 --- a/src/libraries/turtle/mock.hpp +++ b/src/libraries/turtle/mock.hpp @@ -88,43 +88,63 @@ namespace detail { typedef T base_type; }; + + template< typename S > + struct functor : mock::function< S > + { + functor() + { + static functor* f = 0; + if( f ) + { + *this = *f; + f = 0; + } + else + f = this; + } + }; } + // if an error is generated by the line below it probably means either the + // method does not exist or it is ambiguous : use MOCK_METHOD_EXT instead template< typename T > - T& invalid_pointer_to_member( const T& t ); + T& invalid_pointer_to_member( const T& ); } #define MOCK_BASE_CLASS(T, I) \ struct T : I, mock::object, mock::detail::base< I > #define MOCK_CLASS(T) \ struct T : mock::object -#define MOCK_FUNCTOR(S) \ - mock::function< S > +#define MOCK_FUNCTOR(f, S) \ + mock::detail::functor< S > f, f##configure -#define MOCK_MOCKER(o, t) \ - mock::detail::deref( o ).t##configure( mock::detail::root, \ - BOOST_PP_STRINGIZE(o) ) -#define MOCK_ANONYMOUS_MOCKER(o, t) \ - mock::detail::deref( o ).t##configure( mock::detail::root, "?" ) +#define MOCK_MOCKER(t) \ + t##configure( mock::detail::root, BOOST_PP_STRINGIZE(t) ) +#define MOCK_ANONYMOUS_MOCKER(t) \ + t##configure( mock::detail::root, "?." ) #define MOCK_METHOD_EXPECTATION(S, t) \ mutable mock::function< S > t##expectation; \ mock::function< S >& t##configure( const mock::detail::context&, \ boost::unit_test::const_string instance ) const \ { \ - mock::detail::configure( *this, t##expectation, instance, \ + mock::detail::configure( *this, t##expectation, \ + instance.substr( 0, instance.rfind( BOOST_PP_STRINGIZE(t) ) ), \ mock::detail::type_name( typeid( *this ) ), \ BOOST_PP_STRINGIZE(t) ); \ return t##expectation; \ } #define MOCK_SIGNATURE(M) \ - mock::detail::signature< BOOST_TYPEOF( mock::invalid_pointer_to_member( &base_type::M ) ) >::type + mock::detail::signature< \ + BOOST_TYPEOF( mock::invalid_pointer_to_member( &base_type::M ) ) \ + >::type #define MOCK_METHOD_STUB(M, n, S, t, c, tpn) \ MOCK_DECL(M, n, S, c, tpn) \ { \ - return MOCK_ANONYMOUS_MOCKER(this, t)( \ + return MOCK_ANONYMOUS_MOCKER(t)( \ BOOST_PP_ENUM_PARAMS(n, p) ); \ } @@ -153,22 +173,38 @@ namespace detail MOCK_METHOD_EXPECTATION(S, t) #define MOCK_DESTRUCTOR(T, t) \ - ~T() { MOCK_ANONYMOUS_MOCKER(this, t).test(); } \ + ~T() { MOCK_ANONYMOUS_MOCKER(t).test(); } \ MOCK_METHOD_EXPECTATION(void(), t) #define MOCK_CONST_CONVERSION_OPERATOR(T, t) \ - operator T() const { return MOCK_ANONYMOUS_MOCKER(this, t)(); } \ + operator T() const { return MOCK_ANONYMOUS_MOCKER(t)(); } \ MOCK_METHOD_EXPECTATION(T(), t) #define MOCK_NON_CONST_CONVERSION_OPERATOR(T, t) \ - operator T() { return MOCK_ANONYMOUS_MOCKER(this, t)(); } \ + operator T() { return MOCK_ANONYMOUS_MOCKER(t)(); } \ MOCK_METHOD_EXPECTATION(T(), t) #define MOCK_CONVERSION_OPERATOR(T, t) \ - operator T() const { return MOCK_ANONYMOUS_MOCKER(this, t)(); } \ - operator T() { return MOCK_ANONYMOUS_MOCKER(this, t)(); } \ + operator T() const { return MOCK_ANONYMOUS_MOCKER(t)(); } \ + operator T() { return MOCK_ANONYMOUS_MOCKER(t)(); } \ MOCK_METHOD_EXPECTATION(T(), t) -#define MOCK_EXPECT(o,t) MOCK_MOCKER(o,t).expect( __FILE__, __LINE__ ) -#define MOCK_RESET(o,t) MOCK_MOCKER(o,t).reset() -#define MOCK_VERIFY(o,t) MOCK_MOCKER(o,t).verify() +#define MOCK_FUNCTION_STUB(F, n, S, t, s) \ + s mock::function< S >& t##configure( mock::detail::context& context, \ + boost::unit_test::const_string instance ) \ + { \ + static mock::function< S > f; \ + return f( context, instance ); \ + } \ + s MOCK_DECL(F, n, S,,) \ + { \ + return MOCK_MOCKER(t)( BOOST_PP_ENUM_PARAMS(n, p) ); \ + } +#define MOCK_FUNCTION(F, n, S, t) \ + MOCK_FUNCTION_STUB(F, n, S, t,) +#define MOCK_STATIC_FUNCTION(F, n, S, t) \ + MOCK_FUNCTION_STUB(F, n, S, t, static) + +#define MOCK_EXPECT(t) MOCK_MOCKER(t).expect( __FILE__, __LINE__ ) +#define MOCK_RESET(t) MOCK_MOCKER(t).reset() +#define MOCK_VERIFY(t) MOCK_MOCKER(t).verify() #endif // MOCK_MOCK_HPP_INCLUDED diff --git a/src/libraries/turtle/parent.hpp b/src/libraries/turtle/parent.hpp index 93b0224..802a745 100644 --- a/src/libraries/turtle/parent.hpp +++ b/src/libraries/turtle/parent.hpp @@ -32,7 +32,7 @@ namespace detail { s << p.instance_; if( p.type_ ) - s << " " << *p.type_ << "::"; + s << *p.type_ << "::"; return s; } private: diff --git a/src/tests/errors_test/constraint_functor_not_compatible.cpp b/src/tests/errors_test/constraint_functor_not_compatible.cpp index 65a714f..a05e29f 100644 --- a/src/tests/errors_test/constraint_functor_not_compatible.cpp +++ b/src/tests/errors_test/constraint_functor_not_compatible.cpp @@ -19,6 +19,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).with( &constraint ); + MOCK_EXPECT( c.my_method ).with( &constraint ); } } diff --git a/src/tests/errors_test/constraint_value_not_comparable.cpp b/src/tests/errors_test/constraint_value_not_comparable.cpp index 34a6af7..48b4f98 100644 --- a/src/tests/errors_test/constraint_value_not_comparable.cpp +++ b/src/tests/errors_test/constraint_value_not_comparable.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).with( "42" ); + MOCK_EXPECT( c.my_method ).with( "42" ); } } diff --git a/src/tests/errors_test/constraint_value_of_wrong_type_in_builtin_constraint.cpp b/src/tests/errors_test/constraint_value_of_wrong_type_in_builtin_constraint.cpp index 9328d53..b879b14 100644 --- a/src/tests/errors_test/constraint_value_of_wrong_type_in_builtin_constraint.cpp +++ b/src/tests/errors_test/constraint_value_of_wrong_type_in_builtin_constraint.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).with( mock::equal( "42" ) ); + MOCK_EXPECT( c.my_method ).with( mock::equal( "42" ) ); } } diff --git a/src/tests/errors_test/mismatch_type_in_returns_int_action.cpp b/src/tests/errors_test/mismatch_type_in_returns_int_action.cpp index 0522a31..e6bb980 100644 --- a/src/tests/errors_test/mismatch_type_in_returns_int_action.cpp +++ b/src/tests/errors_test/mismatch_type_in_returns_int_action.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).returns( "42" ); + MOCK_EXPECT( c.my_method ).returns( "42" ); } } diff --git a/src/tests/errors_test/mismatch_type_in_returns_string_action.cpp b/src/tests/errors_test/mismatch_type_in_returns_string_action.cpp index f82f232..7c6f9e1 100644 --- a/src/tests/errors_test/mismatch_type_in_returns_string_action.cpp +++ b/src/tests/errors_test/mismatch_type_in_returns_string_action.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).returns( 42 ); + MOCK_EXPECT( c.my_method ).returns( 42 ); } } diff --git a/src/tests/errors_test/mismatch_type_in_returns_void_action.cpp b/src/tests/errors_test/mismatch_type_in_returns_void_action.cpp index 9168c14..cfda839 100644 --- a/src/tests/errors_test/mismatch_type_in_returns_void_action.cpp +++ b/src/tests/errors_test/mismatch_type_in_returns_void_action.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).returns( "42" ); + MOCK_EXPECT( c.my_method ).returns( "42" ); } } diff --git a/src/tests/errors_test/wrong_number_of_arguments_in_with.cpp b/src/tests/errors_test/wrong_number_of_arguments_in_with.cpp index 503340e..2c9c4de 100644 --- a/src/tests/errors_test/wrong_number_of_arguments_in_with.cpp +++ b/src/tests/errors_test/wrong_number_of_arguments_in_with.cpp @@ -17,6 +17,6 @@ namespace void test_case() { my_class c; - MOCK_EXPECT( c, my_method ).with( 42, 42 ); + MOCK_EXPECT( c.my_method ).with( 42, 42 ); } } diff --git a/src/tests/turtle_test/integration_test.cpp b/src/tests/turtle_test/integration_test.cpp index 7183008..3fc4a48 100644 --- a/src/tests/turtle_test/integration_test.cpp +++ b/src/tests/turtle_test/integration_test.cpp @@ -25,7 +25,7 @@ namespace BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_and_without_inheriting_from_object ) { my_custom_mock m; - MOCK_EXPECT( m, my_method ).once(); + MOCK_EXPECT( m.my_method ).once(); m.my_method(); } @@ -40,7 +40,7 @@ namespace BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros ) { my_custom_mock_object m; - MOCK_EXPECT( m, my_method ).once(); + MOCK_EXPECT( m.my_method ).once(); m.my_method(); } @@ -56,19 +56,19 @@ BOOST_AUTO_TEST_CASE( basic_mock_object_usage ) { my_mock m; { - MOCK_EXPECT( m, my_method ).once().returns( 0 ); + MOCK_EXPECT( m.my_method ).once().returns( 0 ); BOOST_CHECK_EQUAL( 0, m.my_method( 13 ) ); } mock::verify(); mock::reset(); { - MOCK_EXPECT( m, my_method ).once().with( 42 ).returns( 7 ); + MOCK_EXPECT( m.my_method ).once().with( 42 ).returns( 7 ); BOOST_CHECK_EQUAL( 7, m.my_method( 42 ) ); } mock::verify(); mock::reset(); { - MOCK_EXPECT( m, my_method ).once().returns( 51 ); + MOCK_EXPECT( m.my_method ).once().returns( 51 ); BOOST_CHECK_EQUAL( 51, m.my_method( 27 ) ); } } @@ -93,10 +93,10 @@ namespace BOOST_AUTO_TEST_CASE( mock_object_method_disambiguation ) { - my_ambiguited_mock mock; - MOCK_EXPECT( mock, tag1 ); - BOOST_CHECK_NO_THROW( mock.my_method() ); - BOOST_CHECK_THROW( mock.my_method( 12 ), std::exception ); + my_ambiguited_mock m; + MOCK_EXPECT( m.tag1 ); + BOOST_CHECK_NO_THROW( m.my_method() ); + BOOST_CHECK_THROW( m.my_method( 12 ), std::exception ); } namespace @@ -120,7 +120,7 @@ namespace BOOST_AUTO_TEST_CASE( mock_object_method_const_disambiguation ) { my_const_ambiguited_mock mock; - MOCK_EXPECT( mock, tag1 ); + MOCK_EXPECT( mock.tag1 ); BOOST_CHECK_NO_THROW( mock.my_method() ); const my_const_ambiguited_mock const_mock; BOOST_CHECK_THROW( const_mock.my_method(), std::exception ); @@ -139,15 +139,15 @@ namespace BOOST_AUTO_TEST_CASE( mock_object_method_with_declared_but_not_defined_parameter_is_valid ) { my_declared_but_undefined_mock mock; - MOCK_EXPECT( mock, m ); + MOCK_EXPECT( mock.m ); } BOOST_AUTO_TEST_CASE( mock_functor_in_function_is_supported ) { boost::function< int( float, const std::string& ) > func; { - MOCK_FUNCTOR( int( float, const std::string& ) ) f; - MOCK_EXPECT( f, _ ).once().with( 3, "op" ).returns( 42 ); + MOCK_FUNCTOR( f, int( float, const std::string& ) ); + MOCK_EXPECT( f ).once().with( 3, "op" ).returns( 42 ); func = f; } BOOST_CHECK_EQUAL( 42, func( 3, "op" ) ); @@ -157,13 +157,13 @@ namespace { struct functor_fixture { - MOCK_FUNCTOR( int( float, const std::string& ) ) f; + MOCK_FUNCTOR( f, int( float, const std::string& ) ); }; } BOOST_FIXTURE_TEST_CASE( mock_functor_in_fixture_is_supported, functor_fixture ) { - MOCK_EXPECT( f, _ ).once().with( 3, "op" ).returns( 42 ); + MOCK_EXPECT( f ).once().with( 3, "op" ).returns( 42 ); BOOST_CHECK_EQUAL( 42, f( 3.f, "op" ) ); } @@ -181,7 +181,7 @@ namespace BOOST_AUTO_TEST_CASE( mocking_a_template_class_method_is_supported ) { my_template_mock< int > m; - MOCK_EXPECT( m, my_method_t ).with( 3, "" ); + MOCK_EXPECT( m.my_method_t ).with( 3, "" ); m.my_method( 3, "" ); } @@ -206,7 +206,7 @@ namespace BOOST_AUTO_TEST_CASE( mocking_a_template_base_class_method_is_supported ) { my_template_base_class_mock< int > m; - MOCK_EXPECT( m, my_method ).once().with( 3 ); + MOCK_EXPECT( m.my_method ).once().with( 3 ); m.my_method( 3 ); } @@ -263,13 +263,13 @@ namespace BOOST_FIXTURE_TEST_CASE( basic_mock_object_collaboration_usage, fixture ) { - MOCK_EXPECT( manager, get_observer ).returns( boost::ref( observer ) ); + MOCK_EXPECT( manager.get_observer ).returns( boost::ref( observer ) ); my_subject subject( manager ); - MOCK_EXPECT( observer, notify ).once().with( 1 ); + MOCK_EXPECT( observer.notify ).once().with( 1 ); subject.increment(); - MOCK_EXPECT( observer, notify ).once().with( 2 ); + MOCK_EXPECT( observer.notify ).once().with( 2 ); subject.increment(); - MOCK_EXPECT( observer, notify ).once().with( 3 ); + MOCK_EXPECT( observer.notify ).once().with( 3 ); subject.increment(); } @@ -284,7 +284,7 @@ namespace BOOST_AUTO_TEST_CASE( mocking_a_destructor ) { my_destroyed_class c; - MOCK_EXPECT( c, destructor ).once(); + MOCK_EXPECT( c.destructor ).once(); } BOOST_AUTO_TEST_CASE( failed_expectation_in_mocked_destructor_does_not_throw ) @@ -305,8 +305,8 @@ BOOST_AUTO_TEST_CASE( failed_sequence_in_mocked_destructor_does_not_throw ) my_custom_mock m; { my_destroyed_class c; - MOCK_EXPECT( c, destructor ).once().in( s ); - MOCK_EXPECT( m, my_method ).once().in( s ); + MOCK_EXPECT( c.destructor ).once().in( s ); + MOCK_EXPECT( m.my_method ).once().in( s ); m.my_method(); } } @@ -323,7 +323,7 @@ BOOST_AUTO_TEST_CASE( boost_optional_on_base_class_reference_as_return_type_is_s { boost_optional b; my_mock_observer o; - MOCK_EXPECT( b, method ).once().returns( boost::ref( o ) ); + MOCK_EXPECT( b.method ).once().returns( boost::ref( o ) ); b.method(); } @@ -356,8 +356,8 @@ namespace BOOST_AUTO_TEST_CASE( constraints_and_arguments_are_serialized_lazily ) { - MOCK_FUNCTOR( void( custom_argument ) ) f; - MOCK_EXPECT( f, _ ).with( custom_constraint() ); + MOCK_FUNCTOR( f, void( custom_argument ) ); + MOCK_EXPECT( f ).with( custom_constraint() ); f( custom_argument() ); BOOST_CHECK( ! serialized ); } @@ -385,12 +385,6 @@ namespace << ", " << mock::format( c.threshold_ ) << " )"; } - //template< typename Actual > - //void explain( std::ostream& s, Actual actual ) const - //{ - // s << std::abs( actual - expected_ ) << " >= " << threshold_; - //} - Expected expected_; Expected threshold_; }; @@ -403,8 +397,8 @@ namespace BOOST_AUTO_TEST_CASE( using_custom_constraint ) { - MOCK_FUNCTOR( void( float ) ) f; - MOCK_EXPECT( f, _ ).with( near( 3.f, 0.01f ) ); + MOCK_FUNCTOR( f, void( float ) ); + MOCK_EXPECT( f ).with( near( 3.f, 0.01f ) ); f( 3.f ); const std::string expected = "f\n" ". unlimited().with( near( 3, 0.01 ) )"; @@ -427,16 +421,16 @@ namespace BOOST_AUTO_TEST_CASE( custom_constraint_function_operator_does_not_need_to_be_const ) { - MOCK_FUNCTOR( void( float ) ) f; - MOCK_EXPECT( f, _ ).with( mock::constraint< custom_constraint_with_non_const_operator >( custom_constraint_with_non_const_operator() ) ); + MOCK_FUNCTOR( f, void( float ) ); + MOCK_EXPECT( f ).with( mock::constraint< custom_constraint_with_non_const_operator >( custom_constraint_with_non_const_operator() ) ); f( 42 ); } BOOST_AUTO_TEST_CASE( boost_reference_wrapper_is_supported_in_value_constraint ) { - MOCK_FUNCTOR( void( const std::string& ) ) f; + MOCK_FUNCTOR( f, void( const std::string& ) ); std::string s; - MOCK_EXPECT( f, _ ).once().with( boost::cref( s ) ); + MOCK_EXPECT( f ).once().with( boost::cref( s ) ); s = "string"; f( "string" ); } @@ -457,3 +451,30 @@ BOOST_AUTO_TEST_CASE( member_pointer_on_mock_method_is_valid ) { nothing( &member_pointer_mock_class::my_method ); } + +namespace +{ + MOCK_FUNCTION( free_function, 1, float( int ), free_function ) +} + +BOOST_AUTO_TEST_CASE( a_free_function_can_be_mocked ) +{ + MOCK_EXPECT( free_function ).once(); + BOOST_CHECK( ! MOCK_VERIFY( free_function ) ); +} + +namespace +{ + struct some_class + { + MOCK_STATIC_FUNCTION( some_static_method, 1, float( int ), some_static_method ) + }; +} + +BOOST_AUTO_TEST_CASE( a_static_method_can_be_mocked ) +{ + MOCK_EXPECT( some_class::some_static_method ).once(); + BOOST_CHECK( ! MOCK_VERIFY( some_class::some_static_method ) ); + MOCK_RESET( some_class::some_static_method ); + BOOST_CHECK( MOCK_VERIFY( some_class::some_static_method ) ); +} diff --git a/src/tests/turtle_test/max_args_test.cpp b/src/tests/turtle_test/max_args_test.cpp index 907d4d4..be01f68 100644 --- a/src/tests/turtle_test/max_args_test.cpp +++ b/src/tests/turtle_test/max_args_test.cpp @@ -25,13 +25,13 @@ namespace BOOST_AUTO_TEST_CASE( call_mock_method_with_max_number_of_args ) { my_custom_mock m; - MOCK_EXPECT( m, method ).once().with( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ); + MOCK_EXPECT( m.method ).once().with( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ); m.method( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ); } BOOST_AUTO_TEST_CASE( call_mock_method_with_max_number_of_args_and_returning_something ) { my_custom_mock m; - MOCK_EXPECT( m, method2 ).once().with( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ).returns( 42 ); + MOCK_EXPECT( m.method2 ).once().with( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ).returns( 42 ); BOOST_CHECK_EQUAL( 42, m.method2( BOOST_PP_ENUM(MOCK_MAX_ARGS, IDENTITY, 0) ) ); } diff --git a/src/tests/turtle_test/mock_test.cpp b/src/tests/turtle_test/mock_test.cpp index 2393ad8..bc6c226 100644 --- a/src/tests/turtle_test/mock_test.cpp +++ b/src/tests/turtle_test/mock_test.cpp @@ -47,9 +47,9 @@ namespace BOOST_AUTO_TEST_CASE( mock_object_for_static_polymorphism ) { - const mock_class mock; - MOCK_EXPECT( mock, my_method ).once().with( "some parameter" ); - my_function( mock ); + const mock_class m; + MOCK_EXPECT( m.my_method ).once().with( "some parameter" ); + my_function( m ); } namespace @@ -62,9 +62,9 @@ namespace BOOST_AUTO_TEST_CASE( mock_addition_operator ) { - mock_class_with_operator mock; - MOCK_EXPECT( mock, addition ).once().returns( boost::ref( mock ) ); - mock += 1; + mock_class_with_operator m; + MOCK_EXPECT( m.addition ).once().returns( boost::ref( m ) ); + m += 1; } namespace @@ -77,9 +77,9 @@ namespace BOOST_AUTO_TEST_CASE( mock_conversion_operator ) { - mock_class_with_conversion_operator mock; - MOCK_EXPECT( mock, conversion ).once().returns( 42 ); - int i = mock; + mock_class_with_conversion_operator m; + MOCK_EXPECT( m.conversion ).once().returns( 42 ); + int i = m; BOOST_CHECK_EQUAL( 42, i ); } @@ -93,9 +93,9 @@ namespace BOOST_AUTO_TEST_CASE( mock_const_conversion_operator ) { - mock_class_with_const_conversion_operator mock; - MOCK_EXPECT( mock, conversion ).once().returns( 42 ); - int i = mock; + mock_class_with_const_conversion_operator m; + MOCK_EXPECT( m.conversion ).once().returns( 42 ); + int i = m; BOOST_CHECK_EQUAL( 42, i ); } @@ -109,9 +109,9 @@ namespace BOOST_AUTO_TEST_CASE( mock_non_const_conversion_operator ) { - mock_class_with_non_const_conversion_operator mock; - MOCK_EXPECT( mock, conversion ).once().returns( 42 ); - int i = mock; + mock_class_with_non_const_conversion_operator m; + MOCK_EXPECT( m.conversion ).once().returns( 42 ); + int i = m; BOOST_CHECK_EQUAL( 42, i ); } @@ -133,19 +133,19 @@ BOOST_AUTO_TEST_CASE( MOCK_CONST_METHOD_EXT_macro_defines_a_bindable_method ) BOOST_AUTO_TEST_CASE( MOCK_VERIFY_macro ) { my_mock m; - MOCK_VERIFY( m, my_method ); + MOCK_VERIFY( m.my_method ); } BOOST_AUTO_TEST_CASE( MOCK_RESET_macro ) { my_mock m; - MOCK_RESET( m, my_method ); + MOCK_RESET( m.my_method ); } BOOST_AUTO_TEST_CASE( MOCK_EXPECT_macro ) { my_mock m; - MOCK_EXPECT( m, my_method ).once().with( 42 ); + MOCK_EXPECT( m.my_method ).once().with( 42 ); m.my_method( 42 ); } @@ -163,48 +163,48 @@ namespace BOOST_AUTO_TEST_CASE( mock_object_is_named ) { my_mock m; - BOOST_CHECK_EQUAL( "? my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "? my_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_mock::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); } BOOST_AUTO_TEST_CASE( mock_object_auto_pointer_is_named ) { std::auto_ptr< my_mock > m( new my_mock ); - BOOST_CHECK_EQUAL( "? my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); } BOOST_AUTO_TEST_CASE( mock_object_const_auto_pointer_is_named ) { const std::auto_ptr< my_mock > m( new my_mock ); - BOOST_CHECK_EQUAL( "? my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); } BOOST_AUTO_TEST_CASE( mock_object_shared_pointer_is_named ) { boost::shared_ptr< my_mock > m( new my_mock ); - BOOST_CHECK_EQUAL( "? my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); } BOOST_AUTO_TEST_CASE( mock_object_const_shared_pointer_is_named ) { const boost::shared_ptr< my_mock > m( new my_mock ); - BOOST_CHECK_EQUAL( "? my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m->my_method ) ) ); + BOOST_CHECK_EQUAL( "m->my_mock::my_method", to_string( MOCK_MOCKER( m->my_method ) ) ); } namespace @@ -219,12 +219,12 @@ namespace BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_and_without_inheriting_from_object_is_named ) { my_custom_mock m; - BOOST_CHECK_EQUAL( "? my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "? my_custom_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_custom_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); } namespace @@ -239,18 +239,47 @@ namespace BOOST_AUTO_TEST_CASE( custom_mock_object_without_macros_is_named ) { my_custom_mock_object m; - BOOST_CHECK_EQUAL( "? my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "? my_custom_mock_object::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock_object::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method_2 ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m, my_method ) ) ); - BOOST_CHECK_EQUAL( "m my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m, my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "?.my_custom_mock_object::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method_2", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method_2 ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_ANONYMOUS_MOCKER( m.my_method ) ) ); + BOOST_CHECK_EQUAL( "m.my_custom_mock_object::my_method", to_string( MOCK_MOCKER( m.my_method ) ) ); +} + +BOOST_AUTO_TEST_CASE( mock_functor ) +{ + MOCK_FUNCTOR( f1, void() ); + MOCK_FUNCTOR( f2, int( const std::string& ) ); } BOOST_AUTO_TEST_CASE( mock_functor_is_named ) { - MOCK_FUNCTOR( void() ) f; - BOOST_CHECK_EQUAL( "f", to_string( MOCK_MOCKER( f, _ ) ) ); + MOCK_FUNCTOR( f, void() ); + BOOST_CHECK_EQUAL( "f", to_string( MOCK_MOCKER( f ) ) ); +} + +namespace +{ + MOCK_FUNCTION( mock_function, 1, float( int ), mock_function ) +} + +BOOST_AUTO_TEST_CASE( mock_function_is_named ) +{ + BOOST_CHECK_EQUAL( "mock_function", to_string( MOCK_MOCKER( mock_function ) ) ); +} + +namespace +{ + MOCK_CLASS( static_function_class ) + { + MOCK_STATIC_FUNCTION( mock_static_function, 1, float( int ), mock_static_function ) + }; +} + +BOOST_AUTO_TEST_CASE( mock_static_function_is_named ) +{ + BOOST_CHECK_EQUAL( "static_function_class::mock_static_function", to_string( MOCK_MOCKER( static_function_class::mock_static_function ) ) ); } BOOST_MPL_ASSERT(( boost::is_same< float, mock::detail::arg< void( float ), 1, 1 >::type > ));