diff --git a/.gitignore b/.gitignore index 132530c..17f91c4 100644 --- a/.gitignore +++ b/.gitignore @@ -1,2 +1,3 @@ bin out +build/xsl diff --git a/build/vc100/turtle.vcxproj b/build/vc100/turtle.vcxproj index 2fc8585..cf3d8da 100644 --- a/build/vc100/turtle.vcxproj +++ b/build/vc100/turtle.vcxproj @@ -19,13 +19,13 @@ + - diff --git a/build/vc100/turtle.vcxproj.filters b/build/vc100/turtle.vcxproj.filters index db9e20b..f3f1f04 100644 --- a/build/vc100/turtle.vcxproj.filters +++ b/build/vc100/turtle.vcxproj.filters @@ -115,9 +115,6 @@ Source Files\detail - - Source Files\detail - Source Files\detail @@ -127,5 +124,8 @@ Source Files\detail + + Source Files + \ No newline at end of file diff --git a/doc/example/patterns_static_objects.cpp b/doc/example/patterns_static_objects.cpp new file mode 100644 index 0000000..c385fbc --- /dev/null +++ b/doc/example/patterns_static_objects.cpp @@ -0,0 +1,67 @@ +// http://turtle.sourceforge.net +// +// Copyright Mathieu Champlon 2015 +// +// 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) + +//[ static_objects_problem +#define BOOST_AUTO_TEST_MAIN +#include +#include +#include + +namespace +{ + struct my_class + { + my_class( int i ) + : i_( i ) + {} + + int i_; + }; + + std::ostream& operator<<( std::ostream& os, const my_class* c ) + { + return os << "my_class " << c->i_; // the 'c' pointer must be valid when logging + } + + MOCK_FUNCTION( f, 1, void( my_class* ) ) // being static 'f' outlive the test case +} + +BOOST_AUTO_TEST_CASE( static_objects_problem ) +{ + my_class c( 42 ); + MOCK_EXPECT( f ).once().with( &c ); // the set expectation will also outlive the test case and leak into other test cases using 'f' +} // the 'c' instance goes out of scope and the '&c' pointer becomes dangling +//] + +//[ static_objects_partial_solution +struct fixture +{ + ~fixture() + { + mock::reset(); // the use of a fixture ensures the reset will prevent the expectations from leaking into other test cases + } +}; + +BOOST_FIXTURE_TEST_CASE( static_object_partial_solution, fixture ) +{ + my_class c( 42 ); + MOCK_EXPECT( f ).once().with( &c ); + f( &c ); + mock::verify(); // verify the expectations before local objects are destroyed and before the fixture resets them +} +//] + +//[ static_objects_solution +BOOST_FIXTURE_TEST_CASE( static_objects_solution, mock::cleanup ) // actually the library includes a ready to use fixture just like the one described +{ + my_class c( 42 ); + MOCK_EXPECT( f ).once().with( &c ); + f( &c ); + mock::verify(); +} +//] diff --git a/doc/patterns.qbk b/doc/patterns.qbk index 9322966..7cdfd84 100644 --- a/doc/patterns.qbk +++ b/doc/patterns.qbk @@ -6,6 +6,7 @@ /] [section Patterns] +[import example/patterns_static_objects.cpp] [import example/patterns_async_call.cpp] [import example/patterns_retrieve_cref.cpp] [import example/patterns_invoke_functor.cpp] @@ -13,6 +14,22 @@ This section highlights not-so-obvious features of the library gathered from real use cases. +[section Managing static mock objects] + +Problem : + +[static_objects_problem] + +Partial solution : + +[static_objects_partial_solution] + +Solution : + +[static_objects_solution] + +[endsect] + [section Waiting for an asynchronous call] Problem : diff --git a/include/turtle/detail/cleanup.hpp b/include/turtle/cleanup.hpp similarity index 72% rename from include/turtle/detail/cleanup.hpp rename to include/turtle/cleanup.hpp index 87cc5fb..47f8038 100644 --- a/include/turtle/detail/cleanup.hpp +++ b/include/turtle/cleanup.hpp @@ -9,29 +9,28 @@ #ifndef MOCK_CLEANUP_HPP_INCLUDED #define MOCK_CLEANUP_HPP_INCLUDED -#include "../config.hpp" +#include "config.hpp" +#include "verify.hpp" +#include "reset.hpp" #ifdef MOCK_USE_BOOST_TEST -#include "../verify.hpp" -#include "../reset.hpp" #include +#endif namespace mock -{ -namespace detail { struct cleanup { ~cleanup() { - // see https://svn.boost.org/trac/boost/ticket/5563 - //mock::verify(); mock::reset(); } }; + +#ifdef MOCK_USE_BOOST_TEST BOOST_GLOBAL_FIXTURE( cleanup ); -} +#endif + } // mock -#endif // MOCK_USE_BOOST_TEST #endif // MOCK_CLEANUP_HPP_INCLUDED diff --git a/include/turtle/mock.hpp b/include/turtle/mock.hpp index b7c9f65..a560800 100644 --- a/include/turtle/mock.hpp +++ b/include/turtle/mock.hpp @@ -13,12 +13,12 @@ #include "object.hpp" #include "reset.hpp" #include "verify.hpp" +#include "cleanup.hpp" #include "detail/functor.hpp" #include "detail/function.hpp" #include "detail/type_name.hpp" #include "detail/signature.hpp" #include "detail/parameter.hpp" -#include "detail/cleanup.hpp" #include #include #include