| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,147 @@ | ||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file implements some commonly used cardinalities. More | ||
| // cardinalities can be defined by the user implementing the | ||
| // CardinalityInterface interface if necessary. | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ | ||
|
|
||
| #include <limits.h> | ||
| #include <ostream> // NOLINT | ||
| #include "gmock/internal/gmock-port.h" | ||
| #include "gtest/gtest.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| // To implement a cardinality Foo, define: | ||
| // 1. a class FooCardinality that implements the | ||
| // CardinalityInterface interface, and | ||
| // 2. a factory function that creates a Cardinality object from a | ||
| // const FooCardinality*. | ||
| // | ||
| // The two-level delegation design follows that of Matcher, providing | ||
| // consistency for extension developers. It also eases ownership | ||
| // management as Cardinality objects can now be copied like plain values. | ||
|
|
||
| // The implementation of a cardinality. | ||
| class CardinalityInterface { | ||
| public: | ||
| virtual ~CardinalityInterface() {} | ||
|
|
||
| // Conservative estimate on the lower/upper bound of the number of | ||
| // calls allowed. | ||
| virtual int ConservativeLowerBound() const { return 0; } | ||
| virtual int ConservativeUpperBound() const { return INT_MAX; } | ||
|
|
||
| // Returns true iff call_count calls will satisfy this cardinality. | ||
| virtual bool IsSatisfiedByCallCount(int call_count) const = 0; | ||
|
|
||
| // Returns true iff call_count calls will saturate this cardinality. | ||
| virtual bool IsSaturatedByCallCount(int call_count) const = 0; | ||
|
|
||
| // Describes self to an ostream. | ||
| virtual void DescribeTo(::std::ostream* os) const = 0; | ||
| }; | ||
|
|
||
| // A Cardinality is a copyable and IMMUTABLE (except by assignment) | ||
| // object that specifies how many times a mock function is expected to | ||
| // be called. The implementation of Cardinality is just a linked_ptr | ||
| // to const CardinalityInterface, so copying is fairly cheap. | ||
| // Don't inherit from Cardinality! | ||
| class GTEST_API_ Cardinality { | ||
| public: | ||
| // Constructs a null cardinality. Needed for storing Cardinality | ||
| // objects in STL containers. | ||
| Cardinality() {} | ||
|
|
||
| // Constructs a Cardinality from its implementation. | ||
| explicit Cardinality(const CardinalityInterface* impl) : impl_(impl) {} | ||
|
|
||
| // Conservative estimate on the lower/upper bound of the number of | ||
| // calls allowed. | ||
| int ConservativeLowerBound() const { return impl_->ConservativeLowerBound(); } | ||
| int ConservativeUpperBound() const { return impl_->ConservativeUpperBound(); } | ||
|
|
||
| // Returns true iff call_count calls will satisfy this cardinality. | ||
| bool IsSatisfiedByCallCount(int call_count) const { | ||
| return impl_->IsSatisfiedByCallCount(call_count); | ||
| } | ||
|
|
||
| // Returns true iff call_count calls will saturate this cardinality. | ||
| bool IsSaturatedByCallCount(int call_count) const { | ||
| return impl_->IsSaturatedByCallCount(call_count); | ||
| } | ||
|
|
||
| // Returns true iff call_count calls will over-saturate this | ||
| // cardinality, i.e. exceed the maximum number of allowed calls. | ||
| bool IsOverSaturatedByCallCount(int call_count) const { | ||
| return impl_->IsSaturatedByCallCount(call_count) && | ||
| !impl_->IsSatisfiedByCallCount(call_count); | ||
| } | ||
|
|
||
| // Describes self to an ostream | ||
| void DescribeTo(::std::ostream* os) const { impl_->DescribeTo(os); } | ||
|
|
||
| // Describes the given actual call count to an ostream. | ||
| static void DescribeActualCallCountTo(int actual_call_count, | ||
| ::std::ostream* os); | ||
|
|
||
| private: | ||
| internal::linked_ptr<const CardinalityInterface> impl_; | ||
| }; | ||
|
|
||
| // Creates a cardinality that allows at least n calls. | ||
| GTEST_API_ Cardinality AtLeast(int n); | ||
|
|
||
| // Creates a cardinality that allows at most n calls. | ||
| GTEST_API_ Cardinality AtMost(int n); | ||
|
|
||
| // Creates a cardinality that allows any number of calls. | ||
| GTEST_API_ Cardinality AnyNumber(); | ||
|
|
||
| // Creates a cardinality that allows between min and max calls. | ||
| GTEST_API_ Cardinality Between(int min, int max); | ||
|
|
||
| // Creates a cardinality that allows exactly n calls. | ||
| GTEST_API_ Cardinality Exactly(int n); | ||
|
|
||
| // Creates a cardinality from its implementation. | ||
| inline Cardinality MakeCardinality(const CardinalityInterface* c) { | ||
| return Cardinality(c); | ||
| } | ||
|
|
||
| } // namespace testing | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,246 @@ | ||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file implements some actions that depend on gmock-generated-actions.h. | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ | ||
|
|
||
| #include <algorithm> | ||
|
|
||
| #include "gmock/gmock-generated-actions.h" | ||
|
|
||
| namespace testing { | ||
| namespace internal { | ||
|
|
||
| // Implements the Invoke(f) action. The template argument | ||
| // FunctionImpl is the implementation type of f, which can be either a | ||
| // function pointer or a functor. Invoke(f) can be used as an | ||
| // Action<F> as long as f's type is compatible with F (i.e. f can be | ||
| // assigned to a tr1::function<F>). | ||
| template <typename FunctionImpl> | ||
| class InvokeAction { | ||
| public: | ||
| // The c'tor makes a copy of function_impl (either a function | ||
| // pointer or a functor). | ||
| explicit InvokeAction(FunctionImpl function_impl) | ||
| : function_impl_(function_impl) {} | ||
|
|
||
| template <typename Result, typename ArgumentTuple> | ||
| Result Perform(const ArgumentTuple& args) { | ||
| return InvokeHelper<Result, ArgumentTuple>::Invoke(function_impl_, args); | ||
| } | ||
|
|
||
| private: | ||
| FunctionImpl function_impl_; | ||
|
|
||
| GTEST_DISALLOW_ASSIGN_(InvokeAction); | ||
| }; | ||
|
|
||
| // Implements the Invoke(object_ptr, &Class::Method) action. | ||
| template <class Class, typename MethodPtr> | ||
| class InvokeMethodAction { | ||
| public: | ||
| InvokeMethodAction(Class* obj_ptr, MethodPtr method_ptr) | ||
| : method_ptr_(method_ptr), obj_ptr_(obj_ptr) {} | ||
|
|
||
| template <typename Result, typename ArgumentTuple> | ||
| Result Perform(const ArgumentTuple& args) const { | ||
| return InvokeHelper<Result, ArgumentTuple>::InvokeMethod( | ||
| obj_ptr_, method_ptr_, args); | ||
| } | ||
|
|
||
| private: | ||
| // The order of these members matters. Reversing the order can trigger | ||
| // warning C4121 in MSVC (see | ||
| // http://computer-programming-forum.com/7-vc.net/6fbc30265f860ad1.htm ). | ||
| const MethodPtr method_ptr_; | ||
| Class* const obj_ptr_; | ||
|
|
||
| GTEST_DISALLOW_ASSIGN_(InvokeMethodAction); | ||
| }; | ||
|
|
||
| // An internal replacement for std::copy which mimics its behavior. This is | ||
| // necessary because Visual Studio deprecates ::std::copy, issuing warning 4996. | ||
| // However Visual Studio 2010 and later do not honor #pragmas which disable that | ||
| // warning. | ||
| template<typename InputIterator, typename OutputIterator> | ||
| inline OutputIterator CopyElements(InputIterator first, | ||
| InputIterator last, | ||
| OutputIterator output) { | ||
| for (; first != last; ++first, ++output) { | ||
| *output = *first; | ||
| } | ||
| return output; | ||
| } | ||
|
|
||
| } // namespace internal | ||
|
|
||
| // Various overloads for Invoke(). | ||
|
|
||
| // Creates an action that invokes 'function_impl' with the mock | ||
| // function's arguments. | ||
| template <typename FunctionImpl> | ||
| PolymorphicAction<internal::InvokeAction<FunctionImpl> > Invoke( | ||
| FunctionImpl function_impl) { | ||
| return MakePolymorphicAction( | ||
| internal::InvokeAction<FunctionImpl>(function_impl)); | ||
| } | ||
|
|
||
| // Creates an action that invokes the given method on the given object | ||
| // with the mock function's arguments. | ||
| template <class Class, typename MethodPtr> | ||
| PolymorphicAction<internal::InvokeMethodAction<Class, MethodPtr> > Invoke( | ||
| Class* obj_ptr, MethodPtr method_ptr) { | ||
| return MakePolymorphicAction( | ||
| internal::InvokeMethodAction<Class, MethodPtr>(obj_ptr, method_ptr)); | ||
| } | ||
|
|
||
| // WithoutArgs(inner_action) can be used in a mock function with a | ||
| // non-empty argument list to perform inner_action, which takes no | ||
| // argument. In other words, it adapts an action accepting no | ||
| // argument to one that accepts (and ignores) arguments. | ||
| template <typename InnerAction> | ||
| inline internal::WithArgsAction<InnerAction> | ||
| WithoutArgs(const InnerAction& action) { | ||
| return internal::WithArgsAction<InnerAction>(action); | ||
| } | ||
|
|
||
| // WithArg<k>(an_action) creates an action that passes the k-th | ||
| // (0-based) argument of the mock function to an_action and performs | ||
| // it. It adapts an action accepting one argument to one that accepts | ||
| // multiple arguments. For convenience, we also provide | ||
| // WithArgs<k>(an_action) (defined below) as a synonym. | ||
| template <int k, typename InnerAction> | ||
| inline internal::WithArgsAction<InnerAction, k> | ||
| WithArg(const InnerAction& action) { | ||
| return internal::WithArgsAction<InnerAction, k>(action); | ||
| } | ||
|
|
||
| // The ACTION*() macros trigger warning C4100 (unreferenced formal | ||
| // parameter) in MSVC with -W4. Unfortunately they cannot be fixed in | ||
| // the macro definition, as the warnings are generated when the macro | ||
| // is expanded and macro expansion cannot contain #pragma. Therefore | ||
| // we suppress them here. | ||
| #ifdef _MSC_VER | ||
| # pragma warning(push) | ||
| # pragma warning(disable:4100) | ||
| #endif | ||
|
|
||
| // Action ReturnArg<k>() returns the k-th argument of the mock function. | ||
| ACTION_TEMPLATE(ReturnArg, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_0_VALUE_PARAMS()) { | ||
| return ::testing::get<k>(args); | ||
| } | ||
|
|
||
| // Action SaveArg<k>(pointer) saves the k-th (0-based) argument of the | ||
| // mock function to *pointer. | ||
| ACTION_TEMPLATE(SaveArg, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_1_VALUE_PARAMS(pointer)) { | ||
| *pointer = ::testing::get<k>(args); | ||
| } | ||
|
|
||
| // Action SaveArgPointee<k>(pointer) saves the value pointed to | ||
| // by the k-th (0-based) argument of the mock function to *pointer. | ||
| ACTION_TEMPLATE(SaveArgPointee, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_1_VALUE_PARAMS(pointer)) { | ||
| *pointer = *::testing::get<k>(args); | ||
| } | ||
|
|
||
| // Action SetArgReferee<k>(value) assigns 'value' to the variable | ||
| // referenced by the k-th (0-based) argument of the mock function. | ||
| ACTION_TEMPLATE(SetArgReferee, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_1_VALUE_PARAMS(value)) { | ||
| typedef typename ::testing::tuple_element<k, args_type>::type argk_type; | ||
| // Ensures that argument #k is a reference. If you get a compiler | ||
| // error on the next line, you are using SetArgReferee<k>(value) in | ||
| // a mock function whose k-th (0-based) argument is not a reference. | ||
| GTEST_COMPILE_ASSERT_(internal::is_reference<argk_type>::value, | ||
| SetArgReferee_must_be_used_with_a_reference_argument); | ||
| ::testing::get<k>(args) = value; | ||
| } | ||
|
|
||
| // Action SetArrayArgument<k>(first, last) copies the elements in | ||
| // source range [first, last) to the array pointed to by the k-th | ||
| // (0-based) argument, which can be either a pointer or an | ||
| // iterator. The action does not take ownership of the elements in the | ||
| // source range. | ||
| ACTION_TEMPLATE(SetArrayArgument, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_2_VALUE_PARAMS(first, last)) { | ||
| // Visual Studio deprecates ::std::copy, so we use our own copy in that case. | ||
| #ifdef _MSC_VER | ||
| internal::CopyElements(first, last, ::testing::get<k>(args)); | ||
| #else | ||
| ::std::copy(first, last, ::testing::get<k>(args)); | ||
| #endif | ||
| } | ||
|
|
||
| // Action DeleteArg<k>() deletes the k-th (0-based) argument of the mock | ||
| // function. | ||
| ACTION_TEMPLATE(DeleteArg, | ||
| HAS_1_TEMPLATE_PARAMS(int, k), | ||
| AND_0_VALUE_PARAMS()) { | ||
| delete ::testing::get<k>(args); | ||
| } | ||
|
|
||
| // This action returns the value pointed to by 'pointer'. | ||
| ACTION_P(ReturnPointee, pointer) { return *pointer; } | ||
|
|
||
| // Action Throw(exception) can be used in a mock function of any type | ||
| // to throw the given exception. Any copyable value can be thrown. | ||
| #if GTEST_HAS_EXCEPTIONS | ||
|
|
||
| // Suppresses the 'unreachable code' warning that VC generates in opt modes. | ||
| # ifdef _MSC_VER | ||
| # pragma warning(push) // Saves the current warning state. | ||
| # pragma warning(disable:4702) // Temporarily disables warning 4702. | ||
| # endif | ||
| ACTION_P(Throw, exception) { throw exception; } | ||
| # ifdef _MSC_VER | ||
| # pragma warning(pop) // Restores the warning state. | ||
| # endif | ||
|
|
||
| #endif // GTEST_HAS_EXCEPTIONS | ||
|
|
||
| #ifdef _MSC_VER | ||
| # pragma warning(pop) | ||
| #endif | ||
|
|
||
| } // namespace testing | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_GMOCK_MORE_ACTIONS_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,58 @@ | ||
| // Copyright 2013, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: marcus.boerger@google.com (Marcus Boerger) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file implements some matchers that depend on gmock-generated-matchers.h. | ||
| // | ||
| // Note that tests are implemented in gmock-matchers_test.cc rather than | ||
| // gmock-more-matchers-test.cc. | ||
|
|
||
| #ifndef GMOCK_GMOCK_MORE_MATCHERS_H_ | ||
| #define GMOCK_GMOCK_MORE_MATCHERS_H_ | ||
|
|
||
| #include "gmock/gmock-generated-matchers.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| // Defines a matcher that matches an empty container. The container must | ||
| // support both size() and empty(), which all STL-like containers provide. | ||
| MATCHER(IsEmpty, negation ? "isn't empty" : "is empty") { | ||
| if (arg.empty()) { | ||
| return true; | ||
| } | ||
| *result_listener << "whose size is " << arg.size(); | ||
| return false; | ||
| } | ||
|
|
||
| } // namespace testing | ||
|
|
||
| #endif // GMOCK_GMOCK_MORE_MATCHERS_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,94 @@ | ||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This is the main header file a user should include. | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_GMOCK_H_ | ||
|
|
||
| // This file implements the following syntax: | ||
| // | ||
| // ON_CALL(mock_object.Method(...)) | ||
| // .With(...) ? | ||
| // .WillByDefault(...); | ||
| // | ||
| // where With() is optional and WillByDefault() must appear exactly | ||
| // once. | ||
| // | ||
| // EXPECT_CALL(mock_object.Method(...)) | ||
| // .With(...) ? | ||
| // .Times(...) ? | ||
| // .InSequence(...) * | ||
| // .WillOnce(...) * | ||
| // .WillRepeatedly(...) ? | ||
| // .RetiresOnSaturation() ? ; | ||
| // | ||
| // where all clauses are optional and WillOnce() can be repeated. | ||
|
|
||
| #include "gmock/gmock-actions.h" | ||
| #include "gmock/gmock-cardinalities.h" | ||
| #include "gmock/gmock-generated-actions.h" | ||
| #include "gmock/gmock-generated-function-mockers.h" | ||
| #include "gmock/gmock-generated-nice-strict.h" | ||
| #include "gmock/gmock-generated-matchers.h" | ||
| #include "gmock/gmock-matchers.h" | ||
| #include "gmock/gmock-more-actions.h" | ||
| #include "gmock/gmock-more-matchers.h" | ||
| #include "gmock/internal/gmock-internal-utils.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| // Declares Google Mock flags that we want a user to use programmatically. | ||
| GMOCK_DECLARE_bool_(catch_leaked_mocks); | ||
| GMOCK_DECLARE_string_(verbose); | ||
|
|
||
| // Initializes Google Mock. This must be called before running the | ||
| // tests. In particular, it parses the command line for the flags | ||
| // that Google Mock recognizes. Whenever a Google Mock flag is seen, | ||
| // it is removed from argv, and *argc is decremented. | ||
| // | ||
| // No value is returned. Instead, the Google Mock flag variables are | ||
| // updated. | ||
| // | ||
| // Since Google Test is needed for Google Mock to work, this function | ||
| // also initializes Google Test and parses its flags, if that hasn't | ||
| // been done. | ||
| GTEST_API_ void InitGoogleMock(int* argc, char** argv); | ||
|
|
||
| // This overloaded version can be used in Windows programs compiled in | ||
| // UNICODE mode. | ||
| GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv); | ||
|
|
||
| } // namespace testing | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_GMOCK_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,8 @@ | ||
| // This file was GENERATED by command: | ||
| // pump.py gmock-generated-actions.h.pump | ||
| // DO NOT EDIT BY HAND!!! | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_ | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_GENERATED_ACTIONS_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,39 @@ | ||
| // Copyright 2015, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // ============================================================ | ||
| // An installation-specific extension point for gmock-matchers.h. | ||
| // ============================================================ | ||
| // | ||
| // Adds google3 callback support to CallableTraits. | ||
| // | ||
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_ | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_CALLBACK_MATCHERS_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,46 @@ | ||
| // Copyright 2015, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Injection point for custom user configurations. | ||
| // The following macros can be defined: | ||
| // | ||
| // Flag related macros: | ||
| // GMOCK_DECLARE_bool_(name) | ||
| // GMOCK_DECLARE_int32_(name) | ||
| // GMOCK_DECLARE_string_(name) | ||
| // GMOCK_DEFINE_bool_(name, default_val, doc) | ||
| // GMOCK_DEFINE_int32_(name, default_val, doc) | ||
| // GMOCK_DEFINE_string_(name, default_val, doc) | ||
| // | ||
| // ** Custom implementation starts here ** | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_ | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_CUSTOM_GMOCK_PORT_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,279 @@ | ||
| // This file was GENERATED by command: | ||
| // pump.py gmock-generated-internal-utils.h.pump | ||
| // DO NOT EDIT BY HAND!!! | ||
|
|
||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file contains template meta-programming utility classes needed | ||
| // for implementing Google Mock. | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ | ||
|
|
||
| #include "gmock/internal/gmock-port.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| template <typename T> | ||
| class Matcher; | ||
|
|
||
| namespace internal { | ||
|
|
||
| // An IgnoredValue object can be implicitly constructed from ANY value. | ||
| // This is used in implementing the IgnoreResult(a) action. | ||
| class IgnoredValue { | ||
| public: | ||
| // This constructor template allows any value to be implicitly | ||
| // converted to IgnoredValue. The object has no data member and | ||
| // doesn't try to remember anything about the argument. We | ||
| // deliberately omit the 'explicit' keyword in order to allow the | ||
| // conversion to be implicit. | ||
| template <typename T> | ||
| IgnoredValue(const T& /* ignored */) {} // NOLINT(runtime/explicit) | ||
| }; | ||
|
|
||
| // MatcherTuple<T>::type is a tuple type where each field is a Matcher | ||
| // for the corresponding field in tuple type T. | ||
| template <typename Tuple> | ||
| struct MatcherTuple; | ||
|
|
||
| template <> | ||
| struct MatcherTuple< ::testing::tuple<> > { | ||
| typedef ::testing::tuple< > type; | ||
| }; | ||
|
|
||
| template <typename A1> | ||
| struct MatcherTuple< ::testing::tuple<A1> > { | ||
| typedef ::testing::tuple<Matcher<A1> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, | ||
| Matcher<A4> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5, | ||
| typename A6> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5>, Matcher<A6> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5, | ||
| typename A6, typename A7> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5>, Matcher<A6>, Matcher<A7> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5, | ||
| typename A6, typename A7, typename A8> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5, | ||
| typename A6, typename A7, typename A8, typename A9> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9> > type; | ||
| }; | ||
|
|
||
| template <typename A1, typename A2, typename A3, typename A4, typename A5, | ||
| typename A6, typename A7, typename A8, typename A9, typename A10> | ||
| struct MatcherTuple< ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, | ||
| A10> > { | ||
| typedef ::testing::tuple<Matcher<A1>, Matcher<A2>, Matcher<A3>, Matcher<A4>, | ||
| Matcher<A5>, Matcher<A6>, Matcher<A7>, Matcher<A8>, Matcher<A9>, | ||
| Matcher<A10> > type; | ||
| }; | ||
|
|
||
| // Template struct Function<F>, where F must be a function type, contains | ||
| // the following typedefs: | ||
| // | ||
| // Result: the function's return type. | ||
| // ArgumentN: the type of the N-th argument, where N starts with 1. | ||
| // ArgumentTuple: the tuple type consisting of all parameters of F. | ||
| // ArgumentMatcherTuple: the tuple type consisting of Matchers for all | ||
| // parameters of F. | ||
| // MakeResultVoid: the function type obtained by substituting void | ||
| // for the return type of F. | ||
| // MakeResultIgnoredValue: | ||
| // the function type obtained by substituting Something | ||
| // for the return type of F. | ||
| template <typename F> | ||
| struct Function; | ||
|
|
||
| template <typename R> | ||
| struct Function<R()> { | ||
| typedef R Result; | ||
| typedef ::testing::tuple<> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(); | ||
| typedef IgnoredValue MakeResultIgnoredValue(); | ||
| }; | ||
|
|
||
| template <typename R, typename A1> | ||
| struct Function<R(A1)> | ||
| : Function<R()> { | ||
| typedef A1 Argument1; | ||
| typedef ::testing::tuple<A1> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2> | ||
| struct Function<R(A1, A2)> | ||
| : Function<R(A1)> { | ||
| typedef A2 Argument2; | ||
| typedef ::testing::tuple<A1, A2> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3> | ||
| struct Function<R(A1, A2, A3)> | ||
| : Function<R(A1, A2)> { | ||
| typedef A3 Argument3; | ||
| typedef ::testing::tuple<A1, A2, A3> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4> | ||
| struct Function<R(A1, A2, A3, A4)> | ||
| : Function<R(A1, A2, A3)> { | ||
| typedef A4 Argument4; | ||
| typedef ::testing::tuple<A1, A2, A3, A4> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5> | ||
| struct Function<R(A1, A2, A3, A4, A5)> | ||
| : Function<R(A1, A2, A3, A4)> { | ||
| typedef A5 Argument5; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5, typename A6> | ||
| struct Function<R(A1, A2, A3, A4, A5, A6)> | ||
| : Function<R(A1, A2, A3, A4, A5)> { | ||
| typedef A6 Argument6; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5, A6> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5, typename A6, typename A7> | ||
| struct Function<R(A1, A2, A3, A4, A5, A6, A7)> | ||
| : Function<R(A1, A2, A3, A4, A5, A6)> { | ||
| typedef A7 Argument7; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5, typename A6, typename A7, typename A8> | ||
| struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> | ||
| : Function<R(A1, A2, A3, A4, A5, A6, A7)> { | ||
| typedef A8 Argument8; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5, typename A6, typename A7, typename A8, typename A9> | ||
| struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> | ||
| : Function<R(A1, A2, A3, A4, A5, A6, A7, A8)> { | ||
| typedef A9 Argument9; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, | ||
| A9); | ||
| }; | ||
|
|
||
| template <typename R, typename A1, typename A2, typename A3, typename A4, | ||
| typename A5, typename A6, typename A7, typename A8, typename A9, | ||
| typename A10> | ||
| struct Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10)> | ||
| : Function<R(A1, A2, A3, A4, A5, A6, A7, A8, A9)> { | ||
| typedef A10 Argument10; | ||
| typedef ::testing::tuple<A1, A2, A3, A4, A5, A6, A7, A8, A9, | ||
| A10> ArgumentTuple; | ||
| typedef typename MatcherTuple<ArgumentTuple>::type ArgumentMatcherTuple; | ||
| typedef void MakeResultVoid(A1, A2, A3, A4, A5, A6, A7, A8, A9, A10); | ||
| typedef IgnoredValue MakeResultIgnoredValue(A1, A2, A3, A4, A5, A6, A7, A8, | ||
| A9, A10); | ||
| }; | ||
|
|
||
| } // namespace internal | ||
|
|
||
| } // namespace testing | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_GENERATED_INTERNAL_UTILS_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,91 @@ | ||
| // Copyright 2008, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: vadimb@google.com (Vadim Berman) | ||
| // | ||
| // Low-level types and utilities for porting Google Mock to various | ||
| // platforms. All macros ending with _ and symbols defined in an | ||
| // internal namespace are subject to change without notice. Code | ||
| // outside Google Mock MUST NOT USE THEM DIRECTLY. Macros that don't | ||
| // end with _ are part of Google Mock's public API and can be used by | ||
| // code outside Google Mock. | ||
|
|
||
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ | ||
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ | ||
|
|
||
| #include <assert.h> | ||
| #include <stdlib.h> | ||
| #include <iostream> | ||
|
|
||
| // Most of the utilities needed for porting Google Mock are also | ||
| // required for Google Test and are defined in gtest-port.h. | ||
| // | ||
| // Note to maintainers: to reduce code duplication, prefer adding | ||
| // portability utilities to Google Test's gtest-port.h instead of | ||
| // here, as Google Mock depends on Google Test. Only add a utility | ||
| // here if it's truly specific to Google Mock. | ||
| #include "gtest/internal/gtest-linked_ptr.h" | ||
| #include "gtest/internal/gtest-port.h" | ||
| #include "gmock/internal/custom/gmock-port.h" | ||
|
|
||
| // To avoid conditional compilation everywhere, we make it | ||
| // gmock-port.h's responsibility to #include the header implementing | ||
| // tr1/tuple. gmock-port.h does this via gtest-port.h, which is | ||
| // guaranteed to pull in the tuple header. | ||
|
|
||
| // For MS Visual C++, check the compiler version. At least VS 2003 is | ||
| // required to compile Google Mock. | ||
| #if defined(_MSC_VER) && _MSC_VER < 1310 | ||
| # error "At least Visual C++ 2003 (7.1) is required to compile Google Mock." | ||
| #endif | ||
|
|
||
| // Macro for referencing flags. This is public as we want the user to | ||
| // use this syntax to reference Google Mock flags. | ||
| #define GMOCK_FLAG(name) FLAGS_gmock_##name | ||
|
|
||
| #if !defined(GMOCK_DECLARE_bool_) | ||
|
|
||
| // Macros for declaring flags. | ||
| #define GMOCK_DECLARE_bool_(name) extern GTEST_API_ bool GMOCK_FLAG(name) | ||
| #define GMOCK_DECLARE_int32_(name) \ | ||
| extern GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name) | ||
| #define GMOCK_DECLARE_string_(name) \ | ||
| extern GTEST_API_ ::std::string GMOCK_FLAG(name) | ||
|
|
||
| // Macros for defining flags. | ||
| #define GMOCK_DEFINE_bool_(name, default_val, doc) \ | ||
| GTEST_API_ bool GMOCK_FLAG(name) = (default_val) | ||
| #define GMOCK_DEFINE_int32_(name, default_val, doc) \ | ||
| GTEST_API_ ::testing::internal::Int32 GMOCK_FLAG(name) = (default_val) | ||
| #define GMOCK_DEFINE_string_(name, default_val, doc) \ | ||
| GTEST_API_ ::std::string GMOCK_FLAG(name) = (default_val) | ||
|
|
||
| #endif // !defined(GMOCK_DECLARE_bool_) | ||
|
|
||
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_PORT_H_ |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,47 @@ | ||
| // Copyright 2008, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
| // | ||
| // Google C++ Mocking Framework (Google Mock) | ||
| // | ||
| // This file #includes all Google Mock implementation .cc files. The | ||
| // purpose is to allow a user to build Google Mock by compiling this | ||
| // file alone. | ||
|
|
||
| // This line ensures that gmock.h can be compiled on its own, even | ||
| // when it's fused. | ||
| #include "gmock/gmock.h" | ||
|
|
||
| // The following lines pull in the real gmock *.cc files. | ||
| #include "src/gmock-cardinalities.cc" | ||
| #include "src/gmock-internal-utils.cc" | ||
| #include "src/gmock-matchers.cc" | ||
| #include "src/gmock-spec-builders.cc" | ||
| #include "src/gmock.cc" |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,156 @@ | ||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file implements cardinalities. | ||
|
|
||
| #include "gmock/gmock-cardinalities.h" | ||
|
|
||
| #include <limits.h> | ||
| #include <ostream> // NOLINT | ||
| #include <sstream> | ||
| #include <string> | ||
| #include "gmock/internal/gmock-internal-utils.h" | ||
| #include "gtest/gtest.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| namespace { | ||
|
|
||
| // Implements the Between(m, n) cardinality. | ||
| class BetweenCardinalityImpl : public CardinalityInterface { | ||
| public: | ||
| BetweenCardinalityImpl(int min, int max) | ||
| : min_(min >= 0 ? min : 0), | ||
| max_(max >= min_ ? max : min_) { | ||
| std::stringstream ss; | ||
| if (min < 0) { | ||
| ss << "The invocation lower bound must be >= 0, " | ||
| << "but is actually " << min << "."; | ||
| internal::Expect(false, __FILE__, __LINE__, ss.str()); | ||
| } else if (max < 0) { | ||
| ss << "The invocation upper bound must be >= 0, " | ||
| << "but is actually " << max << "."; | ||
| internal::Expect(false, __FILE__, __LINE__, ss.str()); | ||
| } else if (min > max) { | ||
| ss << "The invocation upper bound (" << max | ||
| << ") must be >= the invocation lower bound (" << min | ||
| << ")."; | ||
| internal::Expect(false, __FILE__, __LINE__, ss.str()); | ||
| } | ||
| } | ||
|
|
||
| // Conservative estimate on the lower/upper bound of the number of | ||
| // calls allowed. | ||
| virtual int ConservativeLowerBound() const { return min_; } | ||
| virtual int ConservativeUpperBound() const { return max_; } | ||
|
|
||
| virtual bool IsSatisfiedByCallCount(int call_count) const { | ||
| return min_ <= call_count && call_count <= max_; | ||
| } | ||
|
|
||
| virtual bool IsSaturatedByCallCount(int call_count) const { | ||
| return call_count >= max_; | ||
| } | ||
|
|
||
| virtual void DescribeTo(::std::ostream* os) const; | ||
|
|
||
| private: | ||
| const int min_; | ||
| const int max_; | ||
|
|
||
| GTEST_DISALLOW_COPY_AND_ASSIGN_(BetweenCardinalityImpl); | ||
| }; | ||
|
|
||
| // Formats "n times" in a human-friendly way. | ||
| inline internal::string FormatTimes(int n) { | ||
| if (n == 1) { | ||
| return "once"; | ||
| } else if (n == 2) { | ||
| return "twice"; | ||
| } else { | ||
| std::stringstream ss; | ||
| ss << n << " times"; | ||
| return ss.str(); | ||
| } | ||
| } | ||
|
|
||
| // Describes the Between(m, n) cardinality in human-friendly text. | ||
| void BetweenCardinalityImpl::DescribeTo(::std::ostream* os) const { | ||
| if (min_ == 0) { | ||
| if (max_ == 0) { | ||
| *os << "never called"; | ||
| } else if (max_ == INT_MAX) { | ||
| *os << "called any number of times"; | ||
| } else { | ||
| *os << "called at most " << FormatTimes(max_); | ||
| } | ||
| } else if (min_ == max_) { | ||
| *os << "called " << FormatTimes(min_); | ||
| } else if (max_ == INT_MAX) { | ||
| *os << "called at least " << FormatTimes(min_); | ||
| } else { | ||
| // 0 < min_ < max_ < INT_MAX | ||
| *os << "called between " << min_ << " and " << max_ << " times"; | ||
| } | ||
| } | ||
|
|
||
| } // Unnamed namespace | ||
|
|
||
| // Describes the given call count to an ostream. | ||
| void Cardinality::DescribeActualCallCountTo(int actual_call_count, | ||
| ::std::ostream* os) { | ||
| if (actual_call_count > 0) { | ||
| *os << "called " << FormatTimes(actual_call_count); | ||
| } else { | ||
| *os << "never called"; | ||
| } | ||
| } | ||
|
|
||
| // Creates a cardinality that allows at least n calls. | ||
| GTEST_API_ Cardinality AtLeast(int n) { return Between(n, INT_MAX); } | ||
|
|
||
| // Creates a cardinality that allows at most n calls. | ||
| GTEST_API_ Cardinality AtMost(int n) { return Between(0, n); } | ||
|
|
||
| // Creates a cardinality that allows any number of calls. | ||
| GTEST_API_ Cardinality AnyNumber() { return AtLeast(0); } | ||
|
|
||
| // Creates a cardinality that allows between min and max calls. | ||
| GTEST_API_ Cardinality Between(int min, int max) { | ||
| return Cardinality(new BetweenCardinalityImpl(min, max)); | ||
| } | ||
|
|
||
| // Creates a cardinality that allows exactly n calls. | ||
| GTEST_API_ Cardinality Exactly(int n) { return Between(n, n); } | ||
|
|
||
| } // namespace testing |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,174 @@ | ||
| // Copyright 2007, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| // Google Mock - a framework for writing C++ mock classes. | ||
| // | ||
| // This file defines some utilities useful for implementing Google | ||
| // Mock. They are subject to change without notice, so please DO NOT | ||
| // USE THEM IN USER CODE. | ||
|
|
||
| #include "gmock/internal/gmock-internal-utils.h" | ||
|
|
||
| #include <ctype.h> | ||
| #include <ostream> // NOLINT | ||
| #include <string> | ||
| #include "gmock/gmock.h" | ||
| #include "gmock/internal/gmock-port.h" | ||
| #include "gtest/gtest.h" | ||
|
|
||
| namespace testing { | ||
| namespace internal { | ||
|
|
||
| // Converts an identifier name to a space-separated list of lower-case | ||
| // words. Each maximum substring of the form [A-Za-z][a-z]*|\d+ is | ||
| // treated as one word. For example, both "FooBar123" and | ||
| // "foo_bar_123" are converted to "foo bar 123". | ||
| GTEST_API_ string ConvertIdentifierNameToWords(const char* id_name) { | ||
| string result; | ||
| char prev_char = '\0'; | ||
| for (const char* p = id_name; *p != '\0'; prev_char = *(p++)) { | ||
| // We don't care about the current locale as the input is | ||
| // guaranteed to be a valid C++ identifier name. | ||
| const bool starts_new_word = IsUpper(*p) || | ||
| (!IsAlpha(prev_char) && IsLower(*p)) || | ||
| (!IsDigit(prev_char) && IsDigit(*p)); | ||
|
|
||
| if (IsAlNum(*p)) { | ||
| if (starts_new_word && result != "") | ||
| result += ' '; | ||
| result += ToLower(*p); | ||
| } | ||
| } | ||
| return result; | ||
| } | ||
|
|
||
| // This class reports Google Mock failures as Google Test failures. A | ||
| // user can define another class in a similar fashion if he intends to | ||
| // use Google Mock with a testing framework other than Google Test. | ||
| class GoogleTestFailureReporter : public FailureReporterInterface { | ||
| public: | ||
| virtual void ReportFailure(FailureType type, const char* file, int line, | ||
| const string& message) { | ||
| AssertHelper(type == kFatal ? | ||
| TestPartResult::kFatalFailure : | ||
| TestPartResult::kNonFatalFailure, | ||
| file, | ||
| line, | ||
| message.c_str()) = Message(); | ||
| if (type == kFatal) { | ||
| posix::Abort(); | ||
| } | ||
| } | ||
| }; | ||
|
|
||
| // Returns the global failure reporter. Will create a | ||
| // GoogleTestFailureReporter and return it the first time called. | ||
| GTEST_API_ FailureReporterInterface* GetFailureReporter() { | ||
| // Points to the global failure reporter used by Google Mock. gcc | ||
| // guarantees that the following use of failure_reporter is | ||
| // thread-safe. We may need to add additional synchronization to | ||
| // protect failure_reporter if we port Google Mock to other | ||
| // compilers. | ||
| static FailureReporterInterface* const failure_reporter = | ||
| new GoogleTestFailureReporter(); | ||
| return failure_reporter; | ||
| } | ||
|
|
||
| // Protects global resources (stdout in particular) used by Log(). | ||
| static GTEST_DEFINE_STATIC_MUTEX_(g_log_mutex); | ||
|
|
||
| // Returns true iff a log with the given severity is visible according | ||
| // to the --gmock_verbose flag. | ||
| GTEST_API_ bool LogIsVisible(LogSeverity severity) { | ||
| if (GMOCK_FLAG(verbose) == kInfoVerbosity) { | ||
| // Always show the log if --gmock_verbose=info. | ||
| return true; | ||
| } else if (GMOCK_FLAG(verbose) == kErrorVerbosity) { | ||
| // Always hide it if --gmock_verbose=error. | ||
| return false; | ||
| } else { | ||
| // If --gmock_verbose is neither "info" nor "error", we treat it | ||
| // as "warning" (its default value). | ||
| return severity == kWarning; | ||
| } | ||
| } | ||
|
|
||
| // Prints the given message to stdout iff 'severity' >= the level | ||
| // specified by the --gmock_verbose flag. If stack_frames_to_skip >= | ||
| // 0, also prints the stack trace excluding the top | ||
| // stack_frames_to_skip frames. In opt mode, any positive | ||
| // stack_frames_to_skip is treated as 0, since we don't know which | ||
| // function calls will be inlined by the compiler and need to be | ||
| // conservative. | ||
| GTEST_API_ void Log(LogSeverity severity, | ||
| const string& message, | ||
| int stack_frames_to_skip) { | ||
| if (!LogIsVisible(severity)) | ||
| return; | ||
|
|
||
| // Ensures that logs from different threads don't interleave. | ||
| MutexLock l(&g_log_mutex); | ||
|
|
||
| // "using ::std::cout;" doesn't work with Symbian's STLport, where cout is a | ||
| // macro. | ||
|
|
||
| if (severity == kWarning) { | ||
| // Prints a GMOCK WARNING marker to make the warnings easily searchable. | ||
| std::cout << "\nGMOCK WARNING:"; | ||
| } | ||
| // Pre-pends a new-line to message if it doesn't start with one. | ||
| if (message.empty() || message[0] != '\n') { | ||
| std::cout << "\n"; | ||
| } | ||
| std::cout << message; | ||
| if (stack_frames_to_skip >= 0) { | ||
| #ifdef NDEBUG | ||
| // In opt mode, we have to be conservative and skip no stack frame. | ||
| const int actual_to_skip = 0; | ||
| #else | ||
| // In dbg mode, we can do what the caller tell us to do (plus one | ||
| // for skipping this function's stack frame). | ||
| const int actual_to_skip = stack_frames_to_skip + 1; | ||
| #endif // NDEBUG | ||
|
|
||
| // Appends a new-line to message if it doesn't end with one. | ||
| if (!message.empty() && *message.rbegin() != '\n') { | ||
| std::cout << "\n"; | ||
| } | ||
| std::cout << "Stack trace:\n" | ||
| << ::testing::internal::GetCurrentOsStackTraceExceptTop( | ||
| ::testing::UnitTest::GetInstance(), actual_to_skip); | ||
| } | ||
| std::cout << ::std::flush; | ||
| } | ||
|
|
||
| } // namespace internal | ||
| } // namespace testing |
| Original file line number | Diff line number | Diff line change |
|---|---|---|
| @@ -0,0 +1,183 @@ | ||
| // Copyright 2008, Google Inc. | ||
| // All rights reserved. | ||
| // | ||
| // Redistribution and use in source and binary forms, with or without | ||
| // modification, are permitted provided that the following conditions are | ||
| // met: | ||
| // | ||
| // * Redistributions of source code must retain the above copyright | ||
| // notice, this list of conditions and the following disclaimer. | ||
| // * Redistributions in binary form must reproduce the above | ||
| // copyright notice, this list of conditions and the following disclaimer | ||
| // in the documentation and/or other materials provided with the | ||
| // distribution. | ||
| // * Neither the name of Google Inc. nor the names of its | ||
| // contributors may be used to endorse or promote products derived from | ||
| // this software without specific prior written permission. | ||
| // | ||
| // THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS | ||
| // "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT | ||
| // LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR | ||
| // A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT | ||
| // OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, | ||
| // SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT | ||
| // LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, | ||
| // DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY | ||
| // THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | ||
| // (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE | ||
| // OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | ||
| // | ||
| // Author: wan@google.com (Zhanyong Wan) | ||
|
|
||
| #include "gmock/gmock.h" | ||
| #include "gmock/internal/gmock-port.h" | ||
|
|
||
| namespace testing { | ||
|
|
||
| // TODO(wan@google.com): support using environment variables to | ||
| // control the flag values, like what Google Test does. | ||
|
|
||
| GMOCK_DEFINE_bool_(catch_leaked_mocks, true, | ||
| "true iff Google Mock should report leaked mock objects " | ||
| "as failures."); | ||
|
|
||
| GMOCK_DEFINE_string_(verbose, internal::kWarningVerbosity, | ||
| "Controls how verbose Google Mock's output is." | ||
| " Valid values:\n" | ||
| " info - prints all messages.\n" | ||
| " warning - prints warnings and errors.\n" | ||
| " error - prints errors only."); | ||
|
|
||
| namespace internal { | ||
|
|
||
| // Parses a string as a command line flag. The string should have the | ||
| // format "--gmock_flag=value". When def_optional is true, the | ||
| // "=value" part can be omitted. | ||
| // | ||
| // Returns the value of the flag, or NULL if the parsing failed. | ||
| static const char* ParseGoogleMockFlagValue(const char* str, | ||
| const char* flag, | ||
| bool def_optional) { | ||
| // str and flag must not be NULL. | ||
| if (str == NULL || flag == NULL) return NULL; | ||
|
|
||
| // The flag must start with "--gmock_". | ||
| const std::string flag_str = std::string("--gmock_") + flag; | ||
| const size_t flag_len = flag_str.length(); | ||
| if (strncmp(str, flag_str.c_str(), flag_len) != 0) return NULL; | ||
|
|
||
| // Skips the flag name. | ||
| const char* flag_end = str + flag_len; | ||
|
|
||
| // When def_optional is true, it's OK to not have a "=value" part. | ||
| if (def_optional && (flag_end[0] == '\0')) { | ||
| return flag_end; | ||
| } | ||
|
|
||
| // If def_optional is true and there are more characters after the | ||
| // flag name, or if def_optional is false, there must be a '=' after | ||
| // the flag name. | ||
| if (flag_end[0] != '=') return NULL; | ||
|
|
||
| // Returns the string after "=". | ||
| return flag_end + 1; | ||
| } | ||
|
|
||
| // Parses a string for a Google Mock bool flag, in the form of | ||
| // "--gmock_flag=value". | ||
| // | ||
| // On success, stores the value of the flag in *value, and returns | ||
| // true. On failure, returns false without changing *value. | ||
| static bool ParseGoogleMockBoolFlag(const char* str, const char* flag, | ||
| bool* value) { | ||
| // Gets the value of the flag as a string. | ||
| const char* const value_str = ParseGoogleMockFlagValue(str, flag, true); | ||
|
|
||
| // Aborts if the parsing failed. | ||
| if (value_str == NULL) return false; | ||
|
|
||
| // Converts the string value to a bool. | ||
| *value = !(*value_str == '0' || *value_str == 'f' || *value_str == 'F'); | ||
| return true; | ||
| } | ||
|
|
||
| // Parses a string for a Google Mock string flag, in the form of | ||
| // "--gmock_flag=value". | ||
| // | ||
| // On success, stores the value of the flag in *value, and returns | ||
| // true. On failure, returns false without changing *value. | ||
| template <typename String> | ||
| static bool ParseGoogleMockStringFlag(const char* str, const char* flag, | ||
| String* value) { | ||
| // Gets the value of the flag as a string. | ||
| const char* const value_str = ParseGoogleMockFlagValue(str, flag, false); | ||
|
|
||
| // Aborts if the parsing failed. | ||
| if (value_str == NULL) return false; | ||
|
|
||
| // Sets *value to the value of the flag. | ||
| *value = value_str; | ||
| return true; | ||
| } | ||
|
|
||
| // The internal implementation of InitGoogleMock(). | ||
| // | ||
| // The type parameter CharType can be instantiated to either char or | ||
| // wchar_t. | ||
| template <typename CharType> | ||
| void InitGoogleMockImpl(int* argc, CharType** argv) { | ||
| // Makes sure Google Test is initialized. InitGoogleTest() is | ||
| // idempotent, so it's fine if the user has already called it. | ||
| InitGoogleTest(argc, argv); | ||
| if (*argc <= 0) return; | ||
|
|
||
| for (int i = 1; i != *argc; i++) { | ||
| const std::string arg_string = StreamableToString(argv[i]); | ||
| const char* const arg = arg_string.c_str(); | ||
|
|
||
| // Do we see a Google Mock flag? | ||
| if (ParseGoogleMockBoolFlag(arg, "catch_leaked_mocks", | ||
| &GMOCK_FLAG(catch_leaked_mocks)) || | ||
| ParseGoogleMockStringFlag(arg, "verbose", &GMOCK_FLAG(verbose))) { | ||
| // Yes. Shift the remainder of the argv list left by one. Note | ||
| // that argv has (*argc + 1) elements, the last one always being | ||
| // NULL. The following loop moves the trailing NULL element as | ||
| // well. | ||
| for (int j = i; j != *argc; j++) { | ||
| argv[j] = argv[j + 1]; | ||
| } | ||
|
|
||
| // Decrements the argument count. | ||
| (*argc)--; | ||
|
|
||
| // We also need to decrement the iterator as we just removed | ||
| // an element. | ||
| i--; | ||
| } | ||
| } | ||
| } | ||
|
|
||
| } // namespace internal | ||
|
|
||
| // Initializes Google Mock. This must be called before running the | ||
| // tests. In particular, it parses a command line for the flags that | ||
| // Google Mock recognizes. Whenever a Google Mock flag is seen, it is | ||
| // removed from argv, and *argc is decremented. | ||
| // | ||
| // No value is returned. Instead, the Google Mock flag variables are | ||
| // updated. | ||
| // | ||
| // Since Google Test is needed for Google Mock to work, this function | ||
| // also initializes Google Test and parses its flags, if that hasn't | ||
| // been done. | ||
| GTEST_API_ void InitGoogleMock(int* argc, char** argv) { | ||
| internal::InitGoogleMockImpl(argc, argv); | ||
| } | ||
|
|
||
| // This overloaded version can be used in Windows programs compiled in | ||
| // UNICODE mode. | ||
| GTEST_API_ void InitGoogleMock(int* argc, wchar_t** argv) { | ||
| internal::InitGoogleMockImpl(argc, argv); | ||
| } | ||
|
|
||
| } // namespace testing |