| // 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. |
| |
| |
| // Google Mock - a framework for writing C++ mock classes. |
| // |
| // This is the main header file a user should include. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #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. |
| |
| // 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. |
| |
| |
| // Google Mock - a framework for writing C++ mock classes. |
| // |
| // This file implements some commonly used actions. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ |
| #define GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ |
| |
| #ifndef _WIN32_WCE |
| # include <errno.h> |
| #endif |
| |
| #include <algorithm> |
| #include <functional> |
| #include <memory> |
| #include <string> |
| #include <type_traits> |
| #include <utility> |
| |
| // 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. |
| |
| |
| // 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. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |
| #define GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |
| |
| #include <stdio.h> |
| #include <ostream> // NOLINT |
| #include <string> |
| #include <type_traits> |
| // 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. |
| |
| // |
| // 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. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #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/gtest.h" |
| // 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. See README for details |
| // |
| // ** Custom implementation starts here ** |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #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_ |
| |
| // For MS Visual C++, check the compiler version. At least VS 2015 is |
| // required to compile Google Mock. |
| #if defined(_MSC_VER) && _MSC_VER < 1900 |
| # error "At least Visual C++ 2015 (14.0) 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_ |
| |
| namespace testing { |
| |
| template <typename> |
| class Matcher; |
| |
| namespace internal { |
| |
| // Silence MSVC C4100 (unreferenced formal parameter) and |
| // C4805('==': unsafe mix of type 'const int' and type 'const bool') |
| #ifdef _MSC_VER |
| # pragma warning(push) |
| # pragma warning(disable:4100) |
| # pragma warning(disable:4805) |
| #endif |
| |
| // Joins a vector of strings as if they are fields of a tuple; returns |
| // the joined string. |
| GTEST_API_ std::string JoinAsTuple(const Strings& fields); |
| |
| // 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_ std::string ConvertIdentifierNameToWords(const char* id_name); |
| |
| // PointeeOf<Pointer>::type is the type of a value pointed to by a |
| // Pointer, which can be either a smart pointer or a raw pointer. The |
| // following default implementation is for the case where Pointer is a |
| // smart pointer. |
| template <typename Pointer> |
| struct PointeeOf { |
| // Smart pointer classes define type element_type as the type of |
| // their pointees. |
| typedef typename Pointer::element_type type; |
| }; |
| // This specialization is for the raw pointer case. |
| template <typename T> |
| struct PointeeOf<T*> { typedef T type; }; // NOLINT |
| |
| // GetRawPointer(p) returns the raw pointer underlying p when p is a |
| // smart pointer, or returns p itself when p is already a raw pointer. |
| // The following default implementation is for the smart pointer case. |
| template <typename Pointer> |
| inline const typename Pointer::element_type* GetRawPointer(const Pointer& p) { |
| return p.get(); |
| } |
| // This overloaded version is for the raw pointer case. |
| template <typename Element> |
| inline Element* GetRawPointer(Element* p) { return p; } |
| |
| // MSVC treats wchar_t as a native type usually, but treats it as the |
| // same as unsigned short when the compiler option /Zc:wchar_t- is |
| // specified. It defines _NATIVE_WCHAR_T_DEFINED symbol when wchar_t |
| // is a native type. |
| #if defined(_MSC_VER) && !defined(_NATIVE_WCHAR_T_DEFINED) |
| // wchar_t is a typedef. |
| #else |
| # define GMOCK_WCHAR_T_IS_NATIVE_ 1 |
| #endif |
| |
| // signed wchar_t and unsigned wchar_t are NOT in the C++ standard. |
| // Using them is a bad practice and not portable. So DON'T use them. |
| // |
| // Still, Google Mock is designed to work even if the user uses signed |
| // wchar_t or unsigned wchar_t (obviously, assuming the compiler |
| // supports them). |
| // |
| // To gcc, |
| // wchar_t == signed wchar_t != unsigned wchar_t == unsigned int |
| #ifdef __GNUC__ |
| #if !defined(__WCHAR_UNSIGNED__) |
| // signed/unsigned wchar_t are valid types. |
| # define GMOCK_HAS_SIGNED_WCHAR_T_ 1 |
| #endif |
| #endif |
| |
| // In what follows, we use the term "kind" to indicate whether a type |
| // is bool, an integer type (excluding bool), a floating-point type, |
| // or none of them. This categorization is useful for determining |
| // when a matcher argument type can be safely converted to another |
| // type in the implementation of SafeMatcherCast. |
| enum TypeKind { |
| kBool, kInteger, kFloatingPoint, kOther |
| }; |
| |
| // KindOf<T>::value is the kind of type T. |
| template <typename T> struct KindOf { |
| enum { value = kOther }; // The default kind. |
| }; |
| |
| // This macro declares that the kind of 'type' is 'kind'. |
| #define GMOCK_DECLARE_KIND_(type, kind) \ |
| template <> struct KindOf<type> { enum { value = kind }; } |
| |
| GMOCK_DECLARE_KIND_(bool, kBool); |
| |
| // All standard integer types. |
| GMOCK_DECLARE_KIND_(char, kInteger); |
| GMOCK_DECLARE_KIND_(signed char, kInteger); |
| GMOCK_DECLARE_KIND_(unsigned char, kInteger); |
| GMOCK_DECLARE_KIND_(short, kInteger); // NOLINT |
| GMOCK_DECLARE_KIND_(unsigned short, kInteger); // NOLINT |
| GMOCK_DECLARE_KIND_(int, kInteger); |
| GMOCK_DECLARE_KIND_(unsigned int, kInteger); |
| GMOCK_DECLARE_KIND_(long, kInteger); // NOLINT |
| GMOCK_DECLARE_KIND_(unsigned long, kInteger); // NOLINT |
| |
| #if GMOCK_WCHAR_T_IS_NATIVE_ |
| GMOCK_DECLARE_KIND_(wchar_t, kInteger); |
| #endif |
| |
| // Non-standard integer types. |
| GMOCK_DECLARE_KIND_(Int64, kInteger); |
| GMOCK_DECLARE_KIND_(UInt64, kInteger); |
| |
| // All standard floating-point types. |
| GMOCK_DECLARE_KIND_(float, kFloatingPoint); |
| GMOCK_DECLARE_KIND_(double, kFloatingPoint); |
| GMOCK_DECLARE_KIND_(long double, kFloatingPoint); |
| |
| #undef GMOCK_DECLARE_KIND_ |
| |
| // Evaluates to the kind of 'type'. |
| #define GMOCK_KIND_OF_(type) \ |
| static_cast< ::testing::internal::TypeKind>( \ |
| ::testing::internal::KindOf<type>::value) |
| |
| // Evaluates to true iff integer type T is signed. |
| #define GMOCK_IS_SIGNED_(T) (static_cast<T>(-1) < 0) |
| |
| // LosslessArithmeticConvertibleImpl<kFromKind, From, kToKind, To>::value |
| // is true iff arithmetic type From can be losslessly converted to |
| // arithmetic type To. |
| // |
| // It's the user's responsibility to ensure that both From and To are |
| // raw (i.e. has no CV modifier, is not a pointer, and is not a |
| // reference) built-in arithmetic types, kFromKind is the kind of |
| // From, and kToKind is the kind of To; the value is |
| // implementation-defined when the above pre-condition is violated. |
| template <TypeKind kFromKind, typename From, TypeKind kToKind, typename To> |
| struct LosslessArithmeticConvertibleImpl : public false_type {}; |
| |
| // Converting bool to bool is lossless. |
| template <> |
| struct LosslessArithmeticConvertibleImpl<kBool, bool, kBool, bool> |
| : public true_type {}; // NOLINT |
| |
| // Converting bool to any integer type is lossless. |
| template <typename To> |
| struct LosslessArithmeticConvertibleImpl<kBool, bool, kInteger, To> |
| : public true_type {}; // NOLINT |
| |
| // Converting bool to any floating-point type is lossless. |
| template <typename To> |
| struct LosslessArithmeticConvertibleImpl<kBool, bool, kFloatingPoint, To> |
| : public true_type {}; // NOLINT |
| |
| // Converting an integer to bool is lossy. |
| template <typename From> |
| struct LosslessArithmeticConvertibleImpl<kInteger, From, kBool, bool> |
| : public false_type {}; // NOLINT |
| |
| // Converting an integer to another non-bool integer is lossless iff |
| // the target type's range encloses the source type's range. |
| template <typename From, typename To> |
| struct LosslessArithmeticConvertibleImpl<kInteger, From, kInteger, To> |
| : public bool_constant< |
| // When converting from a smaller size to a larger size, we are |
| // fine as long as we are not converting from signed to unsigned. |
| ((sizeof(From) < sizeof(To)) && |
| (!GMOCK_IS_SIGNED_(From) || GMOCK_IS_SIGNED_(To))) || |
| // When converting between the same size, the signedness must match. |
| ((sizeof(From) == sizeof(To)) && |
| (GMOCK_IS_SIGNED_(From) == GMOCK_IS_SIGNED_(To)))> {}; // NOLINT |
| |
| #undef GMOCK_IS_SIGNED_ |
| |
| // Converting an integer to a floating-point type may be lossy, since |
| // the format of a floating-point number is implementation-defined. |
| template <typename From, typename To> |
| struct LosslessArithmeticConvertibleImpl<kInteger, From, kFloatingPoint, To> |
| : public false_type {}; // NOLINT |
| |
| // Converting a floating-point to bool is lossy. |
| template <typename From> |
| struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kBool, bool> |
| : public false_type {}; // NOLINT |
| |
| // Converting a floating-point to an integer is lossy. |
| template <typename From, typename To> |
| struct LosslessArithmeticConvertibleImpl<kFloatingPoint, From, kInteger, To> |
| : public false_type {}; // NOLINT |
| |
| // Converting a floating-point to another floating-point is lossless |
| // iff the target type is at least as big as the source type. |
| template <typename From, typename To> |
| struct LosslessArithmeticConvertibleImpl< |
| kFloatingPoint, From, kFloatingPoint, To> |
| : public bool_constant<sizeof(From) <= sizeof(To)> {}; // NOLINT |
| |
| // LosslessArithmeticConvertible<From, To>::value is true iff arithmetic |
| // type From can be losslessly converted to arithmetic type To. |
| // |
| // It's the user's responsibility to ensure that both From and To are |
| // raw (i.e. has no CV modifier, is not a pointer, and is not a |
| // reference) built-in arithmetic types; the value is |
| // implementation-defined when the above pre-condition is violated. |
| template <typename From, typename To> |
| struct LosslessArithmeticConvertible |
| : public LosslessArithmeticConvertibleImpl< |
| GMOCK_KIND_OF_(From), From, GMOCK_KIND_OF_(To), To> {}; // NOLINT |
| |
| // This interface knows how to report a Google Mock failure (either |
| // non-fatal or fatal). |
| class FailureReporterInterface { |
| public: |
| // The type of a failure (either non-fatal or fatal). |
| enum FailureType { |
| kNonfatal, kFatal |
| }; |
| |
| virtual ~FailureReporterInterface() {} |
| |
| // Reports a failure that occurred at the given source file location. |
| virtual void ReportFailure(FailureType type, const char* file, int line, |
| const std::string& message) = 0; |
| }; |
| |
| // Returns the failure reporter used by Google Mock. |
| GTEST_API_ FailureReporterInterface* GetFailureReporter(); |
| |
| // Asserts that condition is true; aborts the process with the given |
| // message if condition is false. We cannot use LOG(FATAL) or CHECK() |
| // as Google Mock might be used to mock the log sink itself. We |
| // inline this function to prevent it from showing up in the stack |
| // trace. |
| inline void Assert(bool condition, const char* file, int line, |
| const std::string& msg) { |
| if (!condition) { |
| GetFailureReporter()->ReportFailure(FailureReporterInterface::kFatal, |
| file, line, msg); |
| } |
| } |
| inline void Assert(bool condition, const char* file, int line) { |
| Assert(condition, file, line, "Assertion failed."); |
| } |
| |
| // Verifies that condition is true; generates a non-fatal failure if |
| // condition is false. |
| inline void Expect(bool condition, const char* file, int line, |
| const std::string& msg) { |
| if (!condition) { |
| GetFailureReporter()->ReportFailure(FailureReporterInterface::kNonfatal, |
| file, line, msg); |
| } |
| } |
| inline void Expect(bool condition, const char* file, int line) { |
| Expect(condition, file, line, "Expectation failed."); |
| } |
| |
| // Severity level of a log. |
| enum LogSeverity { |
| kInfo = 0, |
| kWarning = 1 |
| }; |
| |
| // Valid values for the --gmock_verbose flag. |
| |
| // All logs (informational and warnings) are printed. |
| const char kInfoVerbosity[] = "info"; |
| // Only warnings are printed. |
| const char kWarningVerbosity[] = "warning"; |
| // No logs are printed. |
| const char kErrorVerbosity[] = "error"; |
| |
| // Returns true iff a log with the given severity is visible according |
| // to the --gmock_verbose flag. |
| GTEST_API_ bool LogIsVisible(LogSeverity severity); |
| |
| // 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 std::string& message, |
| int stack_frames_to_skip); |
| |
| // A marker class that is used to resolve parameterless expectations to the |
| // correct overload. This must not be instantiable, to prevent client code from |
| // accidentally resolving to the overload; for example: |
| // |
| // ON_CALL(mock, Method({}, nullptr))... |
| // |
| class WithoutMatchers { |
| private: |
| WithoutMatchers() {} |
| friend GTEST_API_ WithoutMatchers GetWithoutMatchers(); |
| }; |
| |
| // Internal use only: access the singleton instance of WithoutMatchers. |
| GTEST_API_ WithoutMatchers GetWithoutMatchers(); |
| |
| // Type traits. |
| |
| // is_reference<T>::value is non-zero iff T is a reference type. |
| template <typename T> struct is_reference : public false_type {}; |
| template <typename T> struct is_reference<T&> : public true_type {}; |
| |
| // type_equals<T1, T2>::value is non-zero iff T1 and T2 are the same type. |
| template <typename T1, typename T2> struct type_equals : public false_type {}; |
| template <typename T> struct type_equals<T, T> : public true_type {}; |
| |
| // remove_reference<T>::type removes the reference from type T, if any. |
| template <typename T> struct remove_reference { typedef T type; }; // NOLINT |
| template <typename T> struct remove_reference<T&> { typedef T type; }; // NOLINT |
| |
| // DecayArray<T>::type turns an array type U[N] to const U* and preserves |
| // other types. Useful for saving a copy of a function argument. |
| template <typename T> struct DecayArray { typedef T type; }; // NOLINT |
| template <typename T, size_t N> struct DecayArray<T[N]> { |
| typedef const T* type; |
| }; |
| // Sometimes people use arrays whose size is not available at the use site |
| // (e.g. extern const char kNamePrefix[]). This specialization covers that |
| // case. |
| template <typename T> struct DecayArray<T[]> { |
| typedef const T* type; |
| }; |
| |
| // Disable MSVC warnings for infinite recursion, since in this case the |
| // the recursion is unreachable. |
| #ifdef _MSC_VER |
| # pragma warning(push) |
| # pragma warning(disable:4717) |
| #endif |
| |
| // Invalid<T>() is usable as an expression of type T, but will terminate |
| // the program with an assertion failure if actually run. This is useful |
| // when a value of type T is needed for compilation, but the statement |
| // will not really be executed (or we don't care if the statement |
| // crashes). |
| template <typename T> |
| inline T Invalid() { |
| Assert(false, "", -1, "Internal error: attempt to return invalid value"); |
| // This statement is unreachable, and would never terminate even if it |
| // could be reached. It is provided only to placate compiler warnings |
| // about missing return statements. |
| return Invalid<T>(); |
| } |
| |
| #ifdef _MSC_VER |
| # pragma warning(pop) |
| #endif |
| |
| // Given a raw type (i.e. having no top-level reference or const |
| // modifier) RawContainer that's either an STL-style container or a |
| // native array, class StlContainerView<RawContainer> has the |
| // following members: |
| // |
| // - type is a type that provides an STL-style container view to |
| // (i.e. implements the STL container concept for) RawContainer; |
| // - const_reference is a type that provides a reference to a const |
| // RawContainer; |
| // - ConstReference(raw_container) returns a const reference to an STL-style |
| // container view to raw_container, which is a RawContainer. |
| // - Copy(raw_container) returns an STL-style container view of a |
| // copy of raw_container, which is a RawContainer. |
| // |
| // This generic version is used when RawContainer itself is already an |
| // STL-style container. |
| template <class RawContainer> |
| class StlContainerView { |
| public: |
| typedef RawContainer type; |
| typedef const type& const_reference; |
| |
| static const_reference ConstReference(const RawContainer& container) { |
| // Ensures that RawContainer is not a const type. |
| testing::StaticAssertTypeEq<RawContainer, |
| GTEST_REMOVE_CONST_(RawContainer)>(); |
| return container; |
| } |
| static type Copy(const RawContainer& container) { return container; } |
| }; |
| |
| // This specialization is used when RawContainer is a native array type. |
| template <typename Element, size_t N> |
| class StlContainerView<Element[N]> { |
| public: |
| typedef GTEST_REMOVE_CONST_(Element) RawElement; |
| typedef internal::NativeArray<RawElement> type; |
| // NativeArray<T> can represent a native array either by value or by |
| // reference (selected by a constructor argument), so 'const type' |
| // can be used to reference a const native array. We cannot |
| // 'typedef const type& const_reference' here, as that would mean |
| // ConstReference() has to return a reference to a local variable. |
| typedef const type const_reference; |
| |
| static const_reference ConstReference(const Element (&array)[N]) { |
| // Ensures that Element is not a const type. |
| testing::StaticAssertTypeEq<Element, RawElement>(); |
| return type(array, N, RelationToSourceReference()); |
| } |
| static type Copy(const Element (&array)[N]) { |
| return type(array, N, RelationToSourceCopy()); |
| } |
| }; |
| |
| // This specialization is used when RawContainer is a native array |
| // represented as a (pointer, size) tuple. |
| template <typename ElementPointer, typename Size> |
| class StlContainerView< ::std::tuple<ElementPointer, Size> > { |
| public: |
| typedef GTEST_REMOVE_CONST_( |
| typename internal::PointeeOf<ElementPointer>::type) RawElement; |
| typedef internal::NativeArray<RawElement> type; |
| typedef const type const_reference; |
| |
| static const_reference ConstReference( |
| const ::std::tuple<ElementPointer, Size>& array) { |
| return type(std::get<0>(array), std::get<1>(array), |
| RelationToSourceReference()); |
| } |
| static type Copy(const ::std::tuple<ElementPointer, Size>& array) { |
| return type(std::get<0>(array), std::get<1>(array), RelationToSourceCopy()); |
| } |
| }; |
| |
| // The following specialization prevents the user from instantiating |
| // StlContainer with a reference type. |
| template <typename T> class StlContainerView<T&>; |
| |
| // A type transform to remove constness from the first part of a pair. |
| // Pairs like that are used as the value_type of associative containers, |
| // and this transform produces a similar but assignable pair. |
| template <typename T> |
| struct RemoveConstFromKey { |
| typedef T type; |
| }; |
| |
| // Partially specialized to remove constness from std::pair<const K, V>. |
| template <typename K, typename V> |
| struct RemoveConstFromKey<std::pair<const K, V> > { |
| typedef std::pair<K, V> type; |
| }; |
| |
| // Mapping from booleans to types. Similar to boost::bool_<kValue> and |
| // std::integral_constant<bool, kValue>. |
| template <bool kValue> |
| struct BooleanConstant {}; |
| |
| // Emit an assertion failure due to incorrect DoDefault() usage. Out-of-lined to |
| // reduce code size. |
| GTEST_API_ void IllegalDoDefault(const char* file, int line); |
| |
| // Helper types for Apply() below. |
| template <size_t... Is> struct int_pack { typedef int_pack type; }; |
| |
| template <class Pack, size_t I> struct append; |
| template <size_t... Is, size_t I> |
| struct append<int_pack<Is...>, I> : int_pack<Is..., I> {}; |
| |
| template <size_t C> |
| struct make_int_pack : append<typename make_int_pack<C - 1>::type, C - 1> {}; |
| template <> struct make_int_pack<0> : int_pack<> {}; |
| |
| template <typename F, typename Tuple, size_t... Idx> |
| auto ApplyImpl(F&& f, Tuple&& args, int_pack<Idx...>) -> decltype( |
| std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...)) { |
| return std::forward<F>(f)(std::get<Idx>(std::forward<Tuple>(args))...); |
| } |
| |
| // Apply the function to a tuple of arguments. |
| template <typename F, typename Tuple> |
| auto Apply(F&& f, Tuple&& args) |
| -> decltype(ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args), |
| make_int_pack<std::tuple_size<Tuple>::value>())) { |
| return ApplyImpl(std::forward<F>(f), std::forward<Tuple>(args), |
| make_int_pack<std::tuple_size<Tuple>::value>()); |
| } |
| |
| // Template struct Function<F>, where F must be a function type, contains |
| // the following typedefs: |
| // |
| // Result: the function's return type. |
| // Arg<N>: the type of the N-th argument, where N starts with 0. |
| // 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 T> |
| struct Function; |
| |
| template <typename R, typename... Args> |
| struct Function<R(Args...)> { |
| using Result = R; |
| static constexpr size_t ArgumentCount = sizeof...(Args); |
| template <size_t I> |
| using Arg = ElemFromList<I, typename MakeIndexSequence<sizeof...(Args)>::type, |
| Args...>; |
| using ArgumentTuple = std::tuple<Args...>; |
| using ArgumentMatcherTuple = std::tuple<Matcher<Args>...>; |
| using MakeResultVoid = void(Args...); |
| using MakeResultIgnoredValue = IgnoredValue(Args...); |
| }; |
| |
| template <typename R, typename... Args> |
| constexpr size_t Function<R(Args...)>::ArgumentCount; |
| |
| #ifdef _MSC_VER |
| # pragma warning(pop) |
| #endif |
| |
| } // namespace internal |
| } // namespace testing |
| |
| #endif // GMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_INTERNAL_UTILS_H_ |
| |
| #ifdef _MSC_VER |
| # pragma warning(push) |
| # pragma warning(disable:4100) |
| #endif |
| |
| namespace testing { |
| |
| // To implement an action Foo, define: |
| // 1. a class FooAction that implements the ActionInterface interface, and |
| // 2. a factory function that creates an Action object from a |
| // const FooAction*. |
| // |
| // The two-level delegation design follows that of Matcher, providing |
| // consistency for extension developers. It also eases ownership |
| // management as Action objects can now be copied like plain values. |
| |
| namespace internal { |
| |
| // BuiltInDefaultValueGetter<T, true>::Get() returns a |
| // default-constructed T value. BuiltInDefaultValueGetter<T, |
| // false>::Get() crashes with an error. |
| // |
| // This primary template is used when kDefaultConstructible is true. |
| template <typename T, bool kDefaultConstructible> |
| struct BuiltInDefaultValueGetter { |
| static T Get() { return T(); } |
| }; |
| template <typename T> |
| struct BuiltInDefaultValueGetter<T, false> { |
| static T Get() { |
| Assert(false, __FILE__, __LINE__, |
| "Default action undefined for the function return type."); |
| return internal::Invalid<T>(); |
| // The above statement will never be reached, but is required in |
| // order for this function to compile. |
| } |
| }; |
| |
| // BuiltInDefaultValue<T>::Get() returns the "built-in" default value |
| // for type T, which is NULL when T is a raw pointer type, 0 when T is |
| // a numeric type, false when T is bool, or "" when T is string or |
| // std::string. In addition, in C++11 and above, it turns a |
| // default-constructed T value if T is default constructible. For any |
| // other type T, the built-in default T value is undefined, and the |
| // function will abort the process. |
| template <typename T> |
| class BuiltInDefaultValue { |
| public: |
| // This function returns true iff type T has a built-in default value. |
| static bool Exists() { |
| return ::std::is_default_constructible<T>::value; |
| } |
| |
| static T Get() { |
| return BuiltInDefaultValueGetter< |
| T, ::std::is_default_constructible<T>::value>::Get(); |
| } |
| }; |
| |
| // This partial specialization says that we use the same built-in |
| // default value for T and const T. |
| template <typename T> |
| class BuiltInDefaultValue<const T> { |
| public: |
| static bool Exists() { return BuiltInDefaultValue<T>::Exists(); } |
| static T Get() { return BuiltInDefaultValue<T>::Get(); } |
| }; |
| |
| // This partial specialization defines the default values for pointer |
| // types. |
| template <typename T> |
| class BuiltInDefaultValue<T*> { |
| public: |
| static bool Exists() { return true; } |
| static T* Get() { return nullptr; } |
| }; |
| |
| // The following specializations define the default values for |
| // specific types we care about. |
| #define GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(type, value) \ |
| template <> \ |
| class BuiltInDefaultValue<type> { \ |
| public: \ |
| static bool Exists() { return true; } \ |
| static type Get() { return value; } \ |
| } |
| |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(void, ); // NOLINT |
| #if GTEST_HAS_GLOBAL_STRING |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::string, ""); |
| #endif // GTEST_HAS_GLOBAL_STRING |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(::std::string, ""); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(bool, false); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned char, '\0'); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed char, '\0'); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(char, '\0'); |
| |
| // There's no need for a default action for signed wchar_t, as that |
| // type is the same as wchar_t for gcc, and invalid for MSVC. |
| // |
| // There's also no need for a default action for unsigned wchar_t, as |
| // that type is the same as unsigned int for gcc, and invalid for |
| // MSVC. |
| #if GMOCK_WCHAR_T_IS_NATIVE_ |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(wchar_t, 0U); // NOLINT |
| #endif |
| |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned short, 0U); // NOLINT |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed short, 0); // NOLINT |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned int, 0U); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed int, 0); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(unsigned long, 0UL); // NOLINT |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(signed long, 0L); // NOLINT |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(UInt64, 0); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(Int64, 0); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(float, 0); |
| GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_(double, 0); |
| |
| #undef GMOCK_DEFINE_DEFAULT_ACTION_FOR_RETURN_TYPE_ |
| |
| } // namespace internal |
| |
| // When an unexpected function call is encountered, Google Mock will |
| // let it return a default value if the user has specified one for its |
| // return type, or if the return type has a built-in default value; |
| // otherwise Google Mock won't know what value to return and will have |
| // to abort the process. |
| // |
| // The DefaultValue<T> class allows a user to specify the |
| // default value for a type T that is both copyable and publicly |
| // destructible (i.e. anything that can be used as a function return |
| // type). The usage is: |
| // |
| // // Sets the default value for type T to be foo. |
| // DefaultValue<T>::Set(foo); |
| template <typename T> |
| class DefaultValue { |
| public: |
| // Sets the default value for type T; requires T to be |
| // copy-constructable and have a public destructor. |
| static void Set(T x) { |
| delete producer_; |
| producer_ = new FixedValueProducer(x); |
| } |
| |
| // Provides a factory function to be called to generate the default value. |
| // This method can be used even if T is only move-constructible, but it is not |
| // limited to that case. |
| typedef T (*FactoryFunction)(); |
| static void SetFactory(FactoryFunction factory) { |
| delete producer_; |
| producer_ = new FactoryValueProducer(factory); |
| } |
| |
| // Unsets the default value for type T. |
| static void Clear() { |
| delete producer_; |
| producer_ = nullptr; |
| } |
| |
| // Returns true iff the user has set the default value for type T. |
| static bool IsSet() { return producer_ != nullptr; } |
| |
| // Returns true if T has a default return value set by the user or there |
| // exists a built-in default value. |
| static bool Exists() { |
| return IsSet() || internal::BuiltInDefaultValue<T>::Exists(); |
| } |
| |
| // Returns the default value for type T if the user has set one; |
| // otherwise returns the built-in default value. Requires that Exists() |
| // is true, which ensures that the return value is well-defined. |
| static T Get() { |
| return producer_ == nullptr ? internal::BuiltInDefaultValue<T>::Get() |
| : producer_->Produce(); |
| } |
| |
| private: |
| class ValueProducer { |
| public: |
| virtual ~ValueProducer() {} |
| virtual T Produce() = 0; |
| }; |
| |
| class FixedValueProducer : public ValueProducer { |
| public: |
| explicit FixedValueProducer(T value) : value_(value) {} |
| T Produce() override { return value_; } |
| |
| private: |
| const T value_; |
| GTEST_DISALLOW_COPY_AND_ASSIGN_(FixedValueProducer); |
| }; |
| |
| class FactoryValueProducer : public ValueProducer { |
| public: |
| explicit FactoryValueProducer(FactoryFunction factory) |
| : factory_(factory) {} |
| T Produce() override { return factory_(); } |
| |
| private: |
| const FactoryFunction factory_; |
| GTEST_DISALLOW_COPY_AND_ASSIGN_(FactoryValueProducer); |
| }; |
| |
| static ValueProducer* producer_; |
| }; |
| |
| // This partial specialization allows a user to set default values for |
| // reference types. |
| template <typename T> |
| class DefaultValue<T&> { |
| public: |
| // Sets the default value for type T&. |
| static void Set(T& x) { // NOLINT |
| address_ = &x; |
| } |
| |
| // Unsets the default value for type T&. |
| static void Clear() { address_ = nullptr; } |
| |
| // Returns true iff the user has set the default value for type T&. |
| static bool IsSet() { return address_ != nullptr; } |
| |
| // Returns true if T has a default return value set by the user or there |
| // exists a built-in default value. |
| static bool Exists() { |
| return IsSet() || internal::BuiltInDefaultValue<T&>::Exists(); |
| } |
| |
| // Returns the default value for type T& if the user has set one; |
| // otherwise returns the built-in default value if there is one; |
| // otherwise aborts the process. |
| static T& Get() { |
| return address_ == nullptr ? internal::BuiltInDefaultValue<T&>::Get() |
| : *address_; |
| } |
| |
| private: |
| static T* address_; |
| }; |
| |
| // This specialization allows DefaultValue<void>::Get() to |
| // compile. |
| template <> |
| class DefaultValue<void> { |
| public: |
| static bool Exists() { return true; } |
| static void Get() {} |
| }; |
| |
| // Points to the user-set default value for type T. |
| template <typename T> |
| typename DefaultValue<T>::ValueProducer* DefaultValue<T>::producer_ = nullptr; |
| |
| // Points to the user-set default value for type T&. |
| template <typename T> |
| T* DefaultValue<T&>::address_ = nullptr; |
| |
| // Implement this interface to define an action for function type F. |
| template <typename F> |
| class ActionInterface { |
| public: |
| typedef typename internal::Function<F>::Result Result; |
| typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; |
| |
| ActionInterface() {} |
| virtual ~ActionInterface() {} |
| |
| // Performs the action. This method is not const, as in general an |
| // action can have side effects and be stateful. For example, a |
| // get-the-next-element-from-the-collection action will need to |
| // remember the current element. |
| virtual Result Perform(const ArgumentTuple& args) = 0; |
| |
| private: |
| GTEST_DISALLOW_COPY_AND_ASSIGN_(ActionInterface); |
| }; |
| |
| // An Action<F> is a copyable and IMMUTABLE (except by assignment) |
| // object that represents an action to be taken when a mock function |
| // of type F is called. The implementation of Action<T> is just a |
| // std::shared_ptr to const ActionInterface<T>. Don't inherit from Action! |
| // You can view an object implementing ActionInterface<F> as a |
| // concrete action (including its current state), and an Action<F> |
| // object as a handle to it. |
| template <typename F> |
| class Action { |
| // Adapter class to allow constructing Action from a legacy ActionInterface. |
| // New code should create Actions from functors instead. |
| struct ActionAdapter { |
| // Adapter must be copyable to satisfy std::function requirements. |
| ::std::shared_ptr<ActionInterface<F>> impl_; |
| |
| template <typename... Args> |
| typename internal::Function<F>::Result operator()(Args&&... args) { |
| return impl_->Perform( |
| ::std::forward_as_tuple(::std::forward<Args>(args)...)); |
| } |
| }; |
| |
| public: |
| typedef typename internal::Function<F>::Result Result; |
| typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; |
| |
| // Constructs a null Action. Needed for storing Action objects in |
| // STL containers. |
| Action() {} |
| |
| // Construct an Action from a specified callable. |
| // This cannot take std::function directly, because then Action would not be |
| // directly constructible from lambda (it would require two conversions). |
| template <typename G, |
| typename = typename ::std::enable_if< |
| ::std::is_constructible<::std::function<F>, G>::value>::type> |
| Action(G&& fun) : fun_(::std::forward<G>(fun)) {} // NOLINT |
| |
| // Constructs an Action from its implementation. |
| explicit Action(ActionInterface<F>* impl) |
| : fun_(ActionAdapter{::std::shared_ptr<ActionInterface<F>>(impl)}) {} |
| |
| // This constructor allows us to turn an Action<Func> object into an |
| // Action<F>, as long as F's arguments can be implicitly converted |
| // to Func's and Func's return type can be implicitly converted to F's. |
| template <typename Func> |
| explicit Action(const Action<Func>& action) : fun_(action.fun_) {} |
| |
| // Returns true iff this is the DoDefault() action. |
| bool IsDoDefault() const { return fun_ == nullptr; } |
| |
| // Performs the action. Note that this method is const even though |
| // the corresponding method in ActionInterface is not. The reason |
| // is that a const Action<F> means that it cannot be re-bound to |
| // another concrete action, not that the concrete action it binds to |
| // cannot change state. (Think of the difference between a const |
| // pointer and a pointer to const.) |
| Result Perform(ArgumentTuple args) const { |
| if (IsDoDefault()) { |
| internal::IllegalDoDefault(__FILE__, __LINE__); |
| } |
| return internal::Apply(fun_, ::std::move(args)); |
| } |
| |
| private: |
| template <typename G> |
| friend class Action; |
| |
| // fun_ is an empty function iff this is the DoDefault() action. |
| ::std::function<F> fun_; |
| }; |
| |
| // The PolymorphicAction class template makes it easy to implement a |
| // polymorphic action (i.e. an action that can be used in mock |
| // functions of than one type, e.g. Return()). |
| // |
| // To define a polymorphic action, a user first provides a COPYABLE |
| // implementation class that has a Perform() method template: |
| // |
| // class FooAction { |
| // public: |
| // template <typename Result, typename ArgumentTuple> |
| // Result Perform(const ArgumentTuple& args) const { |
| // // Processes the arguments and returns a result, using |
| // // std::get<N>(args) to get the N-th (0-based) argument in the tuple. |
| // } |
| // ... |
| // }; |
| // |
| // Then the user creates the polymorphic action using |
| // MakePolymorphicAction(object) where object has type FooAction. See |
| // the definition of Return(void) and SetArgumentPointee<N>(value) for |
| // complete examples. |
| template <typename Impl> |
| class PolymorphicAction { |
| public: |
| explicit PolymorphicAction(const Impl& impl) : impl_(impl) {} |
| |
| template <typename F> |
| operator Action<F>() const { |
| return Action<F>(new MonomorphicImpl<F>(impl_)); |
| } |
| |
| private: |
| template <typename F> |
| class MonomorphicImpl : public ActionInterface<F> { |
| public: |
| typedef typename internal::Function<F>::Result Result; |
| typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; |
| |
| explicit MonomorphicImpl(const Impl& impl) : impl_(impl) {} |
| |
| Result Perform(const ArgumentTuple& args) override { |
| return impl_.template Perform<Result>(args); |
| } |
| |
| private: |
| Impl impl_; |
| |
| GTEST_DISALLOW_ASSIGN_(MonomorphicImpl); |
| }; |
| |
| Impl impl_; |
| |
| GTEST_DISALLOW_ASSIGN_(PolymorphicAction); |
| }; |
| |
| // Creates an Action from its implementation and returns it. The |
| // created Action object owns the implementation. |
| template <typename F> |
| Action<F> MakeAction(ActionInterface<F>* impl) { |
| return Action<F>(impl); |
| } |
| |
| // Creates a polymorphic action from its implementation. This is |
| // easier to use than the PolymorphicAction<Impl> constructor as it |
| // doesn't require you to explicitly write the template argument, e.g. |
| // |
| // MakePolymorphicAction(foo); |
| // vs |
| // PolymorphicAction<TypeOfFoo>(foo); |
| template <typename Impl> |
| inline PolymorphicAction<Impl> MakePolymorphicAction(const Impl& impl) { |
| return PolymorphicAction<Impl>(impl); |
| } |
| |
| namespace internal { |
| |
| // Helper struct to specialize ReturnAction to execute a move instead of a copy |
| // on return. Useful for move-only types, but could be used on any type. |
| template <typename T> |
| struct ByMoveWrapper { |
| explicit ByMoveWrapper(T value) : payload(std::move(value)) {} |
| T payload; |
| }; |
| |
| // Implements the polymorphic Return(x) action, which can be used in |
| // any function that returns the type of x, regardless of the argument |
| // types. |
| // |
| // Note: The value passed into Return must be converted into |
| // Function<F>::Result when this action is cast to Action<F> rather than |
| // when that action is performed. This is important in scenarios like |
| // |
| // MOCK_METHOD1(Method, T(U)); |
| // ... |
| // { |
| // Foo foo; |
| // X x(&foo); |
| // EXPECT_CALL(mock, Method(_)).WillOnce(Return(x)); |
| // } |
| // |
| // In the example above the variable x holds reference to foo which leaves |
| // scope and gets destroyed. If copying X just copies a reference to foo, |
| // that copy will be left with a hanging reference. If conversion to T |
| // makes a copy of foo, the above code is safe. To support that scenario, we |
| // need to make sure that the type conversion happens inside the EXPECT_CALL |
| // statement, and conversion of the result of Return to Action<T(U)> is a |
| // good place for that. |
| // |
| // The real life example of the above scenario happens when an invocation |
| // of gtl::Container() is passed into Return. |
| // |
| template <typename R> |
| class ReturnAction { |
| public: |
| // Constructs a ReturnAction object from the value to be returned. |
| // 'value' is passed by value instead of by const reference in order |
| // to allow Return("string literal") to compile. |
| explicit ReturnAction(R value) : value_(new R(std::move(value))) {} |
| |
| // This template type conversion operator allows Return(x) to be |
| // used in ANY function that returns x's type. |
| template <typename F> |
| operator Action<F>() const { // NOLINT |
| // Assert statement belongs here because this is the best place to verify |
| // conditions on F. It produces the clearest error messages |
| // in most compilers. |
| // Impl really belongs in this scope as a local class but can't |
| // because MSVC produces duplicate symbols in different translation units |
| // in this case. Until MS fixes that bug we put Impl into the class scope |
| // and put the typedef both here (for use in assert statement) and |
| // in the Impl class. But both definitions must be the same. |
| typedef typename Function<F>::Result Result; |
| GTEST_COMPILE_ASSERT_( |
| !is_reference<Result>::value, |
| use_ReturnRef_instead_of_Return_to_return_a_reference); |
| static_assert(!std::is_void<Result>::value, |
| "Can't use Return() on an action expected to return `void`."); |
| return Action<F>(new Impl<R, F>(value_)); |
| } |
| |
| private: |
| // Implements the Return(x) action for a particular function type F. |
| template <typename R_, typename F> |
| class Impl : public ActionInterface<F> { |
| public: |
| typedef typename Function<F>::Result Result; |
| typedef typename Function<F>::ArgumentTuple ArgumentTuple; |
| |
| // The implicit cast is necessary when Result has more than one |
| // single-argument constructor (e.g. Result is std::vector<int>) and R |
| // has a type conversion operator template. In that case, value_(value) |
| // won't compile as the compiler doesn't known which constructor of |
| // Result to call. ImplicitCast_ forces the compiler to convert R to |
| // Result without considering explicit constructors, thus resolving the |
| // ambiguity. value_ is then initialized using its copy constructor. |
| explicit Impl(const std::shared_ptr<R>& value) |
| : value_before_cast_(*value), |
| value_(ImplicitCast_<Result>(value_before_cast_)) {} |
| |
| Result Perform(const ArgumentTuple&) override { return value_; } |
| |
| private: |
| GTEST_COMPILE_ASSERT_(!is_reference<Result>::value, |
| Result_cannot_be_a_reference_type); |
| // We save the value before casting just in case it is being cast to a |
| // wrapper type. |
| R value_before_cast_; |
| Result value_; |
| |
| GTEST_DISALLOW_COPY_AND_ASSIGN_(Impl); |
| }; |
| |
| // Partially specialize for ByMoveWrapper. This version of ReturnAction will |
| // move its contents instead. |
| template <typename R_, typename F> |
| class Impl<ByMoveWrapper<R_>, F> : public ActionInterface<F> { |
| public: |
| typedef typename Function<F>::Result Result; |
| typedef typename Function<F>::ArgumentTuple ArgumentTuple; |
| |
| explicit Impl(const std::shared_ptr<R>& wrapper) |
| : performed_(false), wrapper_(wrapper) {} |
| |
| Result Perform(const ArgumentTuple&) override { |
| GTEST_CHECK_(!performed_) |
| << "A ByMove() action should only be performed once."; |
| performed_ = true; |
| return std::move(wrapper_->payload); |
| } |
| |
| private: |
| bool performed_; |
| const std::shared_ptr<R> wrapper_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| |
| const std::shared_ptr<R> value_; |
| |
| GTEST_DISALLOW_ASSIGN_(ReturnAction); |
| }; |
| |
| // Implements the ReturnNull() action. |
| class ReturnNullAction { |
| public: |
| // Allows ReturnNull() to be used in any pointer-returning function. In C++11 |
| // this is enforced by returning nullptr, and in non-C++11 by asserting a |
| // pointer type on compile time. |
| template <typename Result, typename ArgumentTuple> |
| static Result Perform(const ArgumentTuple&) { |
| return nullptr; |
| } |
| }; |
| |
| // Implements the Return() action. |
| class ReturnVoidAction { |
| public: |
| // Allows Return() to be used in any void-returning function. |
| template <typename Result, typename ArgumentTuple> |
| static void Perform(const ArgumentTuple&) { |
| CompileAssertTypesEqual<void, Result>(); |
| } |
| }; |
| |
| // Implements the polymorphic ReturnRef(x) action, which can be used |
| // in any function that returns a reference to the type of x, |
| // regardless of the argument types. |
| template <typename T> |
| class ReturnRefAction { |
| public: |
| // Constructs a ReturnRefAction object from the reference to be returned. |
| explicit ReturnRefAction(T& ref) : ref_(ref) {} // NOLINT |
| |
| // This template type conversion operator allows ReturnRef(x) to be |
| // used in ANY function that returns a reference to x's type. |
| template <typename F> |
| operator Action<F>() const { |
| typedef typename Function<F>::Result Result; |
| // Asserts that the function return type is a reference. This |
| // catches the user error of using ReturnRef(x) when Return(x) |
| // should be used, and generates some helpful error message. |
| GTEST_COMPILE_ASSERT_(internal::is_reference<Result>::value, |
| use_Return_instead_of_ReturnRef_to_return_a_value); |
| return Action<F>(new Impl<F>(ref_)); |
| } |
| |
| private: |
| // Implements the ReturnRef(x) action for a particular function type F. |
| template <typename F> |
| class Impl : public ActionInterface<F> { |
| public: |
| typedef typename Function<F>::Result Result; |
| typedef typename Function<F>::ArgumentTuple ArgumentTuple; |
| |
| explicit Impl(T& ref) : ref_(ref) {} // NOLINT |
| |
| Result Perform(const ArgumentTuple&) override { return ref_; } |
| |
| private: |
| T& ref_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| |
| T& ref_; |
| |
| GTEST_DISALLOW_ASSIGN_(ReturnRefAction); |
| }; |
| |
| // Implements the polymorphic ReturnRefOfCopy(x) action, which can be |
| // used in any function that returns a reference to the type of x, |
| // regardless of the argument types. |
| template <typename T> |
| class ReturnRefOfCopyAction { |
| public: |
| // Constructs a ReturnRefOfCopyAction object from the reference to |
| // be returned. |
| explicit ReturnRefOfCopyAction(const T& value) : value_(value) {} // NOLINT |
| |
| // This template type conversion operator allows ReturnRefOfCopy(x) to be |
| // used in ANY function that returns a reference to x's type. |
| template <typename F> |
| operator Action<F>() const { |
| typedef typename Function<F>::Result Result; |
| // Asserts that the function return type is a reference. This |
| // catches the user error of using ReturnRefOfCopy(x) when Return(x) |
| // should be used, and generates some helpful error message. |
| GTEST_COMPILE_ASSERT_( |
| internal::is_reference<Result>::value, |
| use_Return_instead_of_ReturnRefOfCopy_to_return_a_value); |
| return Action<F>(new Impl<F>(value_)); |
| } |
| |
| private: |
| // Implements the ReturnRefOfCopy(x) action for a particular function type F. |
| template <typename F> |
| class Impl : public ActionInterface<F> { |
| public: |
| typedef typename Function<F>::Result Result; |
| typedef typename Function<F>::ArgumentTuple ArgumentTuple; |
| |
| explicit Impl(const T& value) : value_(value) {} // NOLINT |
| |
| Result Perform(const ArgumentTuple&) override { return value_; } |
| |
| private: |
| T value_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| |
| const T value_; |
| |
| GTEST_DISALLOW_ASSIGN_(ReturnRefOfCopyAction); |
| }; |
| |
| // Implements the polymorphic DoDefault() action. |
| class DoDefaultAction { |
| public: |
| // This template type conversion operator allows DoDefault() to be |
| // used in any function. |
| template <typename F> |
| operator Action<F>() const { return Action<F>(); } // NOLINT |
| }; |
| |
| // Implements the Assign action to set a given pointer referent to a |
| // particular value. |
| template <typename T1, typename T2> |
| class AssignAction { |
| public: |
| AssignAction(T1* ptr, T2 value) : ptr_(ptr), value_(value) {} |
| |
| template <typename Result, typename ArgumentTuple> |
| void Perform(const ArgumentTuple& /* args */) const { |
| *ptr_ = value_; |
| } |
| |
| private: |
| T1* const ptr_; |
| const T2 value_; |
| |
| GTEST_DISALLOW_ASSIGN_(AssignAction); |
| }; |
| |
| #if !GTEST_OS_WINDOWS_MOBILE |
| |
| // Implements the SetErrnoAndReturn action to simulate return from |
| // various system calls and libc functions. |
| template <typename T> |
| class SetErrnoAndReturnAction { |
| public: |
| SetErrnoAndReturnAction(int errno_value, T result) |
| : errno_(errno_value), |
| result_(result) {} |
| template <typename Result, typename ArgumentTuple> |
| Result Perform(const ArgumentTuple& /* args */) const { |
| errno = errno_; |
| return result_; |
| } |
| |
| private: |
| const int errno_; |
| const T result_; |
| |
| GTEST_DISALLOW_ASSIGN_(SetErrnoAndReturnAction); |
| }; |
| |
| #endif // !GTEST_OS_WINDOWS_MOBILE |
| |
| // Implements the SetArgumentPointee<N>(x) action for any function |
| // whose N-th argument (0-based) is a pointer to x's type. The |
| // template parameter kIsProto is true iff type A is ProtocolMessage, |
| // proto2::Message, or a sub-class of those. |
| template <size_t N, typename A, bool kIsProto> |
| class SetArgumentPointeeAction { |
| public: |
| // Constructs an action that sets the variable pointed to by the |
| // N-th function argument to 'value'. |
| explicit SetArgumentPointeeAction(const A& value) : value_(value) {} |
| |
| template <typename Result, typename ArgumentTuple> |
| void Perform(const ArgumentTuple& args) const { |
| CompileAssertTypesEqual<void, Result>(); |
| *::std::get<N>(args) = value_; |
| } |
| |
| private: |
| const A value_; |
| |
| GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); |
| }; |
| |
| template <size_t N, typename Proto> |
| class SetArgumentPointeeAction<N, Proto, true> { |
| public: |
| // Constructs an action that sets the variable pointed to by the |
| // N-th function argument to 'proto'. Both ProtocolMessage and |
| // proto2::Message have the CopyFrom() method, so the same |
| // implementation works for both. |
| explicit SetArgumentPointeeAction(const Proto& proto) : proto_(new Proto) { |
| proto_->CopyFrom(proto); |
| } |
| |
| template <typename Result, typename ArgumentTuple> |
| void Perform(const ArgumentTuple& args) const { |
| CompileAssertTypesEqual<void, Result>(); |
| ::std::get<N>(args)->CopyFrom(*proto_); |
| } |
| |
| private: |
| const std::shared_ptr<Proto> proto_; |
| |
| GTEST_DISALLOW_ASSIGN_(SetArgumentPointeeAction); |
| }; |
| |
| // Implements the Invoke(object_ptr, &Class::Method) action. |
| template <class Class, typename MethodPtr> |
| struct InvokeMethodAction { |
| Class* const obj_ptr; |
| const MethodPtr method_ptr; |
| |
| template <typename... Args> |
| auto operator()(Args&&... args) const |
| -> decltype((obj_ptr->*method_ptr)(std::forward<Args>(args)...)) { |
| return (obj_ptr->*method_ptr)(std::forward<Args>(args)...); |
| } |
| }; |
| |
| // Implements the InvokeWithoutArgs(f) action. The template argument |
| // FunctionImpl is the implementation type of f, which can be either a |
| // function pointer or a functor. InvokeWithoutArgs(f) can be used as an |
| // Action<F> as long as f's type is compatible with F. |
| template <typename FunctionImpl> |
| struct InvokeWithoutArgsAction { |
| FunctionImpl function_impl; |
| |
| // Allows InvokeWithoutArgs(f) to be used as any action whose type is |
| // compatible with f. |
| template <typename... Args> |
| auto operator()(const Args&...) -> decltype(function_impl()) { |
| return function_impl(); |
| } |
| }; |
| |
| // Implements the InvokeWithoutArgs(object_ptr, &Class::Method) action. |
| template <class Class, typename MethodPtr> |
| struct InvokeMethodWithoutArgsAction { |
| Class* const obj_ptr; |
| const MethodPtr method_ptr; |
| |
| using ReturnType = typename std::result_of<MethodPtr(Class*)>::type; |
| |
| template <typename... Args> |
| ReturnType operator()(const Args&...) const { |
| return (obj_ptr->*method_ptr)(); |
| } |
| }; |
| |
| // Implements the IgnoreResult(action) action. |
| template <typename A> |
| class IgnoreResultAction { |
| public: |
| explicit IgnoreResultAction(const A& action) : action_(action) {} |
| |
| template <typename F> |
| operator Action<F>() const { |
| // Assert statement belongs here because this is the best place to verify |
| // conditions on F. It produces the clearest error messages |
| // in most compilers. |
| // Impl really belongs in this scope as a local class but can't |
| // because MSVC produces duplicate symbols in different translation units |
| // in this case. Until MS fixes that bug we put Impl into the class scope |
| // and put the typedef both here (for use in assert statement) and |
| // in the Impl class. But both definitions must be the same. |
| typedef typename internal::Function<F>::Result Result; |
| |
| // Asserts at compile time that F returns void. |
| CompileAssertTypesEqual<void, Result>(); |
| |
| return Action<F>(new Impl<F>(action_)); |
| } |
| |
| private: |
| template <typename F> |
| class Impl : public ActionInterface<F> { |
| public: |
| typedef typename internal::Function<F>::Result Result; |
| typedef typename internal::Function<F>::ArgumentTuple ArgumentTuple; |
| |
| explicit Impl(const A& action) : action_(action) {} |
| |
| void Perform(const ArgumentTuple& args) override { |
| // Performs the action and ignores its result. |
| action_.Perform(args); |
| } |
| |
| private: |
| // Type OriginalFunction is the same as F except that its return |
| // type is IgnoredValue. |
| typedef typename internal::Function<F>::MakeResultIgnoredValue |
| OriginalFunction; |
| |
| const Action<OriginalFunction> action_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| |
| const A action_; |
| |
| GTEST_DISALLOW_ASSIGN_(IgnoreResultAction); |
| }; |
| |
| template <typename InnerAction, size_t... I> |
| struct WithArgsAction { |
| InnerAction action; |
| |
| // The inner action could be anything convertible to Action<X>. |
| // We use the conversion operator to detect the signature of the inner Action. |
| template <typename R, typename... Args> |
| operator Action<R(Args...)>() const { // NOLINT |
| Action<R(typename std::tuple_element<I, std::tuple<Args...>>::type...)> |
| converted(action); |
| |
| return [converted](Args... args) -> R { |
| return converted.Perform(std::forward_as_tuple( |
| std::get<I>(std::forward_as_tuple(std::forward<Args>(args)...))...)); |
| }; |
| } |
| }; |
| |
| template <typename... Actions> |
| struct DoAllAction { |
| private: |
| template <typename... Args, size_t... I> |
| std::vector<Action<void(Args...)>> Convert(IndexSequence<I...>) const { |
| return {std::get<I>(actions)...}; |
| } |
| |
| public: |
| std::tuple<Actions...> actions; |
| |
| template <typename R, typename... Args> |
| operator Action<R(Args...)>() const { // NOLINT |
| struct Op { |
| std::vector<Action<void(Args...)>> converted; |
| Action<R(Args...)> last; |
| R operator()(Args... args) const { |
| auto tuple_args = std::forward_as_tuple(std::forward<Args>(args)...); |
| for (auto& a : converted) { |
| a.Perform(tuple_args); |
| } |
| return last.Perform(tuple_args); |
| } |
| }; |
| return Op{Convert<Args...>(MakeIndexSequence<sizeof...(Actions) - 1>()), |
| std::get<sizeof...(Actions) - 1>(actions)}; |
| } |
| }; |
| |
| } // namespace internal |
| |
| // An Unused object can be implicitly constructed from ANY value. |
| // This is handy when defining actions that ignore some or all of the |
| // mock function arguments. For example, given |
| // |
| // MOCK_METHOD3(Foo, double(const string& label, double x, double y)); |
| // MOCK_METHOD3(Bar, double(int index, double x, double y)); |
| // |
| // instead of |
| // |
| // double DistanceToOriginWithLabel(const string& label, double x, double y) { |
| // return sqrt(x*x + y*y); |
| // } |
| // double DistanceToOriginWithIndex(int index, double x, double y) { |
| // return sqrt(x*x + y*y); |
| // } |
| // ... |
| // EXPECT_CALL(mock, Foo("abc", _, _)) |
| // .WillOnce(Invoke(DistanceToOriginWithLabel)); |
| // EXPECT_CALL(mock, Bar(5, _, _)) |
| // .WillOnce(Invoke(DistanceToOriginWithIndex)); |
| // |
| // you could write |
| // |
| // // We can declare any uninteresting argument as Unused. |
| // double DistanceToOrigin(Unused, double x, double y) { |
| // return sqrt(x*x + y*y); |
| // } |
| // ... |
| // EXPECT_CALL(mock, Foo("abc", _, _)).WillOnce(Invoke(DistanceToOrigin)); |
| // EXPECT_CALL(mock, Bar(5, _, _)).WillOnce(Invoke(DistanceToOrigin)); |
| typedef internal::IgnoredValue Unused; |
| |
| // Creates an action that does actions a1, a2, ..., sequentially in |
| // each invocation. |
| template <typename... Action> |
| internal::DoAllAction<typename std::decay<Action>::type...> DoAll( |
| Action&&... action) { |
| return {std::forward_as_tuple(std::forward<Action>(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 <size_t k, typename InnerAction> |
| internal::WithArgsAction<typename std::decay<InnerAction>::type, k> |
| WithArg(InnerAction&& action) { |
| return {std::forward<InnerAction>(action)}; |
| } |
| |
| // WithArgs<N1, N2, ..., Nk>(an_action) creates an action that passes |
| // the selected arguments of the mock function to an_action and |
| // performs it. It serves as an adaptor between actions with |
| // different argument lists. |
| template <size_t k, size_t... ks, typename InnerAction> |
| internal::WithArgsAction<typename std::decay<InnerAction>::type, k, ks...> |
| WithArgs(InnerAction&& action) { |
| return {std::forward<InnerAction>(action)}; |
| } |
| |
| // 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> |
| internal::WithArgsAction<typename std::decay<InnerAction>::type> |
| WithoutArgs(InnerAction&& action) { |
| return {std::forward<InnerAction>(action)}; |
| } |
| |
| // Creates an action that returns 'value'. 'value' is passed by value |
| // instead of const reference - otherwise Return("string literal") |
| // will trigger a compiler error about using array as initializer. |
| template <typename R> |
| internal::ReturnAction<R> Return(R value) { |
| return internal::ReturnAction<R>(std::move(value)); |
| } |
| |
| // Creates an action that returns NULL. |
| inline PolymorphicAction<internal::ReturnNullAction> ReturnNull() { |
| return MakePolymorphicAction(internal::ReturnNullAction()); |
| } |
| |
| // Creates an action that returns from a void function. |
| inline PolymorphicAction<internal::ReturnVoidAction> Return() { |
| return MakePolymorphicAction(internal::ReturnVoidAction()); |
| } |
| |
| // Creates an action that returns the reference to a variable. |
| template <typename R> |
| inline internal::ReturnRefAction<R> ReturnRef(R& x) { // NOLINT |
| return internal::ReturnRefAction<R>(x); |
| } |
| |
| // Creates an action that returns the reference to a copy of the |
| // argument. The copy is created when the action is constructed and |
| // lives as long as the action. |
| template <typename R> |
| inline internal::ReturnRefOfCopyAction<R> ReturnRefOfCopy(const R& x) { |
| return internal::ReturnRefOfCopyAction<R>(x); |
| } |
| |
| // Modifies the parent action (a Return() action) to perform a move of the |
| // argument instead of a copy. |
| // Return(ByMove()) actions can only be executed once and will assert this |
| // invariant. |
| template <typename R> |
| internal::ByMoveWrapper<R> ByMove(R x) { |
| return internal::ByMoveWrapper<R>(std::move(x)); |
| } |
| |
| // Creates an action that does the default action for the give mock function. |
| inline internal::DoDefaultAction DoDefault() { |
| return internal::DoDefaultAction(); |
| } |
| |
| // Creates an action that sets the variable pointed by the N-th |
| // (0-based) function argument to 'value'. |
| template <size_t N, typename T> |
| PolymorphicAction< |
| internal::SetArgumentPointeeAction< |
| N, T, internal::IsAProtocolMessage<T>::value> > |
| SetArgPointee(const T& x) { |
| return MakePolymorphicAction(internal::SetArgumentPointeeAction< |
| N, T, internal::IsAProtocolMessage<T>::value>(x)); |
| } |
| |
| template <size_t N> |
| PolymorphicAction< |
| internal::SetArgumentPointeeAction<N, const char*, false> > |
| SetArgPointee(const char* p) { |
| return MakePolymorphicAction(internal::SetArgumentPointeeAction< |
| N, const char*, false>(p)); |
| } |
| |
| template <size_t N> |
| PolymorphicAction< |
| internal::SetArgumentPointeeAction<N, const wchar_t*, false> > |
| SetArgPointee(const wchar_t* p) { |
| return MakePolymorphicAction(internal::SetArgumentPointeeAction< |
| N, const wchar_t*, false>(p)); |
| } |
| |
| // The following version is DEPRECATED. |
| template <size_t N, typename T> |
| PolymorphicAction< |
| internal::SetArgumentPointeeAction< |
| N, T, internal::IsAProtocolMessage<T>::value> > |
| SetArgumentPointee(const T& x) { |
| return MakePolymorphicAction(internal::SetArgumentPointeeAction< |
| N, T, internal::IsAProtocolMessage<T>::value>(x)); |
| } |
| |
| // Creates an action that sets a pointer referent to a given value. |
| template <typename T1, typename T2> |
| PolymorphicAction<internal::AssignAction<T1, T2> > Assign(T1* ptr, T2 val) { |
| return MakePolymorphicAction(internal::AssignAction<T1, T2>(ptr, val)); |
| } |
| |
| #if !GTEST_OS_WINDOWS_MOBILE |
| |
| // Creates an action that sets errno and returns the appropriate error. |
| template <typename T> |
| PolymorphicAction<internal::SetErrnoAndReturnAction<T> > |
| SetErrnoAndReturn(int errval, T result) { |
| return MakePolymorphicAction( |
| internal::SetErrnoAndReturnAction<T>(errval, result)); |
| } |
| |
| #endif // !GTEST_OS_WINDOWS_MOBILE |
| |
| // Various overloads for Invoke(). |
| |
| // Legacy function. |
| // Actions can now be implicitly constructed from callables. No need to create |
| // wrapper objects. |
| // This function exists for backwards compatibility. |
| template <typename FunctionImpl> |
| typename std::decay<FunctionImpl>::type Invoke(FunctionImpl&& function_impl) { |
| return std::forward<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> |
| internal::InvokeMethodAction<Class, MethodPtr> Invoke(Class* obj_ptr, |
| MethodPtr method_ptr) { |
| return {obj_ptr, method_ptr}; |
| } |
| |
| // Creates an action that invokes 'function_impl' with no argument. |
| template <typename FunctionImpl> |
| internal::InvokeWithoutArgsAction<typename std::decay<FunctionImpl>::type> |
| InvokeWithoutArgs(FunctionImpl function_impl) { |
| return {std::move(function_impl)}; |
| } |
| |
| // Creates an action that invokes the given method on the given object |
| // with no argument. |
| template <class Class, typename MethodPtr> |
| internal::InvokeMethodWithoutArgsAction<Class, MethodPtr> InvokeWithoutArgs( |
| Class* obj_ptr, MethodPtr method_ptr) { |
| return {obj_ptr, method_ptr}; |
| } |
| |
| // Creates an action that performs an_action and throws away its |
| // result. In other words, it changes the return type of an_action to |
| // void. an_action MUST NOT return void, or the code won't compile. |
| template <typename A> |
| inline internal::IgnoreResultAction<A> IgnoreResult(const A& an_action) { |
| return internal::IgnoreResultAction<A>(an_action); |
| } |
| |
| // Creates a reference wrapper for the given L-value. If necessary, |
| // you can explicitly specify the type of the reference. For example, |
| // suppose 'derived' is an object of type Derived, ByRef(derived) |
| // would wrap a Derived&. If you want to wrap a const Base& instead, |
| // where Base is a base class of Derived, just write: |
| // |
| // ByRef<const Base>(derived) |
| // |
| // N.B. ByRef is redundant with std::ref, std::cref and std::reference_wrapper. |
| // However, it may still be used for consistency with ByMove(). |
| template <typename T> |
| inline ::std::reference_wrapper<T> ByRef(T& l_value) { // NOLINT |
| return ::std::reference_wrapper<T>(l_value); |
| } |
| |
| } // namespace testing |
| |
| #ifdef _MSC_VER |
| # pragma warning(pop) |
| #endif |
| |
| |
| #endif // GMOCK_INCLUDE_GMOCK_GMOCK_ACTIONS_H_ |
| // 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. |
| |
| |
| // 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. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ |
| #define GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ |
| |
| #include <limits.h> |
| #include <memory> |
| #include <ostream> // NOLINT |
| |
| GTEST_DISABLE_MSC_WARNINGS_PUSH_(4251 \ |
| /* class A needs to have dll-interface to be used by clients of class B */) |
| |
| 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 std::shared_ptr |
| // to const CardinalityInterface. 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: |
| std::shared_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 |
| |
| GTEST_DISABLE_MSC_WARNINGS_POP_() // 4251 |
| |
| #endif // GMOCK_INCLUDE_GMOCK_GMOCK_CARDINALITIES_H_ |
| #ifndef THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT |
| #define THIRD_PARTY_GOOGLETEST_GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT |
| |
| // This file was GENERATED by command: |
| // pump.py gmock-generated-function-mockers.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. |
| |
| |
| // Google Mock - a framework for writing C++ mock classes. |
| // |
| // This file implements function mockers of various arities. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ |
| #define GMOCK_INCLUDE_GMOCK_GMOCK_GENERATED_FUNCTION_MOCKERS_H_ |
| |
| #include <functional> |
| #include <utility> |
| |
| // 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. |
| |
| |
| // Google Mock - a framework for writing C++ mock classes. |
| // |
| // This file implements the ON_CALL() and EXPECT_CALL() macros. |
| // |
| // A user can use the ON_CALL() macro to specify the default action of |
| // a mock method. The syntax is: |
| // |
| // ON_CALL(mock_object, Method(argument-matchers)) |
| // .With(multi-argument-matcher) |
| // .WillByDefault(action); |
| // |
| // where the .With() clause is optional. |
| // |
| // A user can use the EXPECT_CALL() macro to specify an expectation on |
| // a mock method. The syntax is: |
| // |
| // EXPECT_CALL(mock_object, Method(argument-matchers)) |
| // .With(multi-argument-matchers) |
| // .Times(cardinality) |
| // .InSequence(sequences) |
| // .After(expectations) |
| // .WillOnce(action) |
| // .WillRepeatedly(action) |
| // .RetiresOnSaturation(); |
| // |
| // where all clauses are optional, and .InSequence()/.After()/ |
| // .WillOnce() can appear any number of times. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ |
| #define GMOCK_INCLUDE_GMOCK_GMOCK_SPEC_BUILDERS_H_ |
| |
| #include <map> |
| #include <memory> |
| #include <set> |
| #include <sstream> |
| #include <string> |
| #include <utility> |
| #include <vector> |
| // 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. |
| |
| |
| // Google Mock - a framework for writing C++ mock classes. |
| // |
| // This file implements some commonly used argument matchers. More |
| // matchers can be defined by the user implementing the |
| // MatcherInterface<T> interface if necessary. |
| // |
| // See googletest/include/gtest/gtest-matchers.h for the definition of class |
| // Matcher, class MatcherInterface, and others. |
| |
| // GOOGLETEST_CM0002 DO NOT DELETE |
| |
| #ifndef GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ |
| #define GMOCK_INCLUDE_GMOCK_GMOCK_MATCHERS_H_ |
| |
| #include <math.h> |
| #include <algorithm> |
| #include <initializer_list> |
| #include <iterator> |
| #include <limits> |
| #include <memory> |
| #include <ostream> // NOLINT |
| #include <sstream> |
| #include <string> |
| #include <type_traits> |
| #include <utility> |
| #include <vector> |
| |
| GTEST_DISABLE_MSC_WARNINGS_PUSH_( |
| 4251 5046 /* class A needs to have dll-interface to be used by clients of |
| class B */ |
| /* Symbol involving type with internal linkage not defined */) |
| |
| namespace testing { |
| |
| // To implement a matcher Foo for type T, define: |
| // 1. a class FooMatcherImpl that implements the |
| // MatcherInterface<T> interface, and |
| // 2. a factory function that creates a Matcher<T> object from a |
| // FooMatcherImpl*. |
| // |
| // The two-level delegation design makes it possible to allow a user |
| // to write "v" instead of "Eq(v)" where a Matcher is expected, which |
| // is impossible if we pass matchers by pointers. It also eases |
| // ownership management as Matcher objects can now be copied like |
| // plain values. |
| |
| // A match result listener that stores the explanation in a string. |
| class StringMatchResultListener : public MatchResultListener { |
| public: |
| StringMatchResultListener() : MatchResultListener(&ss_) {} |
| |
| // Returns the explanation accumulated so far. |
| std::string str() const { return ss_.str(); } |
| |
| // Clears the explanation accumulated so far. |
| void Clear() { ss_.str(""); } |
| |
| private: |
| ::std::stringstream ss_; |
| |
| GTEST_DISALLOW_COPY_AND_ASSIGN_(StringMatchResultListener); |
| }; |
| |
| // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION |
| // and MUST NOT BE USED IN USER CODE!!! |
| namespace internal { |
| |
| // The MatcherCastImpl class template is a helper for implementing |
| // MatcherCast(). We need this helper in order to partially |
| // specialize the implementation of MatcherCast() (C++ allows |
| // class/struct templates to be partially specialized, but not |
| // function templates.). |
| |
| // This general version is used when MatcherCast()'s argument is a |
| // polymorphic matcher (i.e. something that can be converted to a |
| // Matcher but is not one yet; for example, Eq(value)) or a value (for |
| // example, "hello"). |
| template <typename T, typename M> |
| class MatcherCastImpl { |
| public: |
| static Matcher<T> Cast(const M& polymorphic_matcher_or_value) { |
| // M can be a polymorphic matcher, in which case we want to use |
| // its conversion operator to create Matcher<T>. Or it can be a value |
| // that should be passed to the Matcher<T>'s constructor. |
| // |
| // We can't call Matcher<T>(polymorphic_matcher_or_value) when M is a |
| // polymorphic matcher because it'll be ambiguous if T has an implicit |
| // constructor from M (this usually happens when T has an implicit |
| // constructor from any type). |
| // |
| // It won't work to unconditionally implict_cast |
| // polymorphic_matcher_or_value to Matcher<T> because it won't trigger |
| // a user-defined conversion from M to T if one exists (assuming M is |
| // a value). |
| return CastImpl( |
| polymorphic_matcher_or_value, |
| BooleanConstant< |
| std::is_convertible<M, Matcher<T> >::value>(), |
| BooleanConstant< |
| std::is_convertible<M, T>::value>()); |
| } |
| |
| private: |
| template <bool Ignore> |
| static Matcher<T> CastImpl(const M& polymorphic_matcher_or_value, |
| BooleanConstant<true> /* convertible_to_matcher */, |
| BooleanConstant<Ignore>) { |
| // M is implicitly convertible to Matcher<T>, which means that either |
| // M is a polymorphic matcher or Matcher<T> has an implicit constructor |
| // from M. In both cases using the implicit conversion will produce a |
| // matcher. |
| // |
| // Even if T has an implicit constructor from M, it won't be called because |
| // creating Matcher<T> would require a chain of two user-defined conversions |
| // (first to create T from M and then to create Matcher<T> from T). |
| return polymorphic_matcher_or_value; |
| } |
| |
| // M can't be implicitly converted to Matcher<T>, so M isn't a polymorphic |
| // matcher. It's a value of a type implicitly convertible to T. Use direct |
| // initialization to create a matcher. |
| static Matcher<T> CastImpl( |
| const M& value, BooleanConstant<false> /* convertible_to_matcher */, |
| BooleanConstant<true> /* convertible_to_T */) { |
| return Matcher<T>(ImplicitCast_<T>(value)); |
| } |
| |
| // M can't be implicitly converted to either Matcher<T> or T. Attempt to use |
| // polymorphic matcher Eq(value) in this case. |
| // |
| // Note that we first attempt to perform an implicit cast on the value and |
| // only fall back to the polymorphic Eq() matcher afterwards because the |
| // latter calls bool operator==(const Lhs& lhs, const Rhs& rhs) in the end |
| // which might be undefined even when Rhs is implicitly convertible to Lhs |
| // (e.g. std::pair<const int, int> vs. std::pair<int, int>). |
| // |
| // We don't define this method inline as we need the declaration of Eq(). |
| static Matcher<T> CastImpl( |
| const M& value, BooleanConstant<false> /* convertible_to_matcher */, |
| BooleanConstant<false> /* convertible_to_T */); |
| }; |
| |
| // This more specialized version is used when MatcherCast()'s argument |
| // is already a Matcher. This only compiles when type T can be |
| // statically converted to type U. |
| template <typename T, typename U> |
| class MatcherCastImpl<T, Matcher<U> > { |
| public: |
| static Matcher<T> Cast(const Matcher<U>& source_matcher) { |
| return Matcher<T>(new Impl(source_matcher)); |
| } |
| |
| private: |
| class Impl : public MatcherInterface<T> { |
| public: |
| explicit Impl(const Matcher<U>& source_matcher) |
| : source_matcher_(source_matcher) {} |
| |
| // We delegate the matching logic to the source matcher. |
| bool MatchAndExplain(T x, MatchResultListener* listener) const override { |
| using FromType = typename std::remove_cv<typename std::remove_pointer< |
| typename std::remove_reference<T>::type>::type>::type; |
| using ToType = typename std::remove_cv<typename std::remove_pointer< |
| typename std::remove_reference<U>::type>::type>::type; |
| // Do not allow implicitly converting base*/& to derived*/&. |
| static_assert( |
| // Do not trigger if only one of them is a pointer. That implies a |
| // regular conversion and not a down_cast. |
| (std::is_pointer<typename std::remove_reference<T>::type>::value != |
| std::is_pointer<typename std::remove_reference<U>::type>::value) || |
| std::is_same<FromType, ToType>::value || |
| !std::is_base_of<FromType, ToType>::value, |
| "Can't implicitly convert from <base> to <derived>"); |
| |
| return source_matcher_.MatchAndExplain(static_cast<U>(x), listener); |
| } |
| |
| void DescribeTo(::std::ostream* os) const override { |
| source_matcher_.DescribeTo(os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const override { |
| source_matcher_.DescribeNegationTo(os); |
| } |
| |
| private: |
| const Matcher<U> source_matcher_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| }; |
| |
| // This even more specialized version is used for efficiently casting |
| // a matcher to its own type. |
| template <typename T> |
| class MatcherCastImpl<T, Matcher<T> > { |
| public: |
| static Matcher<T> Cast(const Matcher<T>& matcher) { return matcher; } |
| }; |
| |
| } // namespace internal |
| |
| // In order to be safe and clear, casting between different matcher |
| // types is done explicitly via MatcherCast<T>(m), which takes a |
| // matcher m and returns a Matcher<T>. It compiles only when T can be |
| // statically converted to the argument type of m. |
| template <typename T, typename M> |
| inline Matcher<T> MatcherCast(const M& matcher) { |
| return internal::MatcherCastImpl<T, M>::Cast(matcher); |
| } |
| |
| // Implements SafeMatcherCast(). |
| // |
| // FIXME: The intermediate SafeMatcherCastImpl class was introduced as a |
| // workaround for a compiler bug, and can now be removed. |
| template <typename T> |
| class SafeMatcherCastImpl { |
| public: |
| // This overload handles polymorphic matchers and values only since |
| // monomorphic matchers are handled by the next one. |
| template <typename M> |
| static inline Matcher<T> Cast(const M& polymorphic_matcher_or_value) { |
| return internal::MatcherCastImpl<T, M>::Cast(polymorphic_matcher_or_value); |
| } |
| |
| // This overload handles monomorphic matchers. |
| // |
| // In general, if type T can be implicitly converted to type U, we can |
| // safely convert a Matcher<U> to a Matcher<T> (i.e. Matcher is |
| // contravariant): just keep a copy of the original Matcher<U>, convert the |
| // argument from type T to U, and then pass it to the underlying Matcher<U>. |
| // The only exception is when U is a reference and T is not, as the |
| // underlying Matcher<U> may be interested in the argument's address, which |
| // is not preserved in the conversion from T to U. |
| template <typename U> |
| static inline Matcher<T> Cast(const Matcher<U>& matcher) { |
| // Enforce that T can be implicitly converted to U. |
| GTEST_COMPILE_ASSERT_((std::is_convertible<T, U>::value), |
| "T must be implicitly convertible to U"); |
| // Enforce that we are not converting a non-reference type T to a reference |
| // type U. |
| GTEST_COMPILE_ASSERT_( |
| internal::is_reference<T>::value || !internal::is_reference<U>::value, |
| cannot_convert_non_reference_arg_to_reference); |
| // In case both T and U are arithmetic types, enforce that the |
| // conversion is not lossy. |
| typedef GTEST_REMOVE_REFERENCE_AND_CONST_(T) RawT; |
| typedef GTEST_REMOVE_REFERENCE_AND_CONST_(U) RawU; |
| const bool kTIsOther = GMOCK_KIND_OF_(RawT) == internal::kOther; |
| const bool kUIsOther = GMOCK_KIND_OF_(RawU) == internal::kOther; |
| GTEST_COMPILE_ASSERT_( |
| kTIsOther || kUIsOther || |
| (internal::LosslessArithmeticConvertible<RawT, RawU>::value), |
| conversion_of_arithmetic_types_must_be_lossless); |
| return MatcherCast<T>(matcher); |
| } |
| }; |
| |
| template <typename T, typename M> |
| inline Matcher<T> SafeMatcherCast(const M& polymorphic_matcher) { |
| return SafeMatcherCastImpl<T>::Cast(polymorphic_matcher); |
| } |
| |
| // A<T>() returns a matcher that matches any value of type T. |
| template <typename T> |
| Matcher<T> A(); |
| |
| // Anything inside the 'internal' namespace IS INTERNAL IMPLEMENTATION |
| // and MUST NOT BE USED IN USER CODE!!! |
| namespace internal { |
| |
| // If the explanation is not empty, prints it to the ostream. |
| inline void PrintIfNotEmpty(const std::string& explanation, |
| ::std::ostream* os) { |
| if (explanation != "" && os != nullptr) { |
| *os << ", " << explanation; |
| } |
| } |
| |
| // Returns true if the given type name is easy to read by a human. |
| // This is used to decide whether printing the type of a value might |
| // be helpful. |
| inline bool IsReadableTypeName(const std::string& type_name) { |
| // We consider a type name readable if it's short or doesn't contain |
| // a template or function type. |
| return (type_name.length() <= 20 || |
| type_name.find_first_of("<(") == std::string::npos); |
| } |
| |
| // Matches the value against the given matcher, prints the value and explains |
| // the match result to the listener. Returns the match result. |
| // 'listener' must not be NULL. |
| // Value cannot be passed by const reference, because some matchers take a |
| // non-const argument. |
| template <typename Value, typename T> |
| bool MatchPrintAndExplain(Value& value, const Matcher<T>& matcher, |
| MatchResultListener* listener) { |
| if (!listener->IsInterested()) { |
| // If the listener is not interested, we do not need to construct the |
| // inner explanation. |
| return matcher.Matches(value); |
| } |
| |
| StringMatchResultListener inner_listener; |
| const bool match = matcher.MatchAndExplain(value, &inner_listener); |
| |
| UniversalPrint(value, listener->stream()); |
| #if GTEST_HAS_RTTI |
| const std::string& type_name = GetTypeName<Value>(); |
| if (IsReadableTypeName(type_name)) |
| *listener->stream() << " (of type " << type_name << ")"; |
| #endif |
| PrintIfNotEmpty(inner_listener.str(), listener->stream()); |
| |
| return match; |
| } |
| |
| // An internal helper class for doing compile-time loop on a tuple's |
| // fields. |
| template <size_t N> |
| class TuplePrefix { |
| public: |
| // TuplePrefix<N>::Matches(matcher_tuple, value_tuple) returns true |
| // iff the first N fields of matcher_tuple matches the first N |
| // fields of value_tuple, respectively. |
| template <typename MatcherTuple, typename ValueTuple> |
| static bool Matches(const MatcherTuple& matcher_tuple, |
| const ValueTuple& value_tuple) { |
| return TuplePrefix<N - 1>::Matches(matcher_tuple, value_tuple) && |
| std::get<N - 1>(matcher_tuple).Matches(std::get<N - 1>(value_tuple)); |
| } |
| |
| // TuplePrefix<N>::ExplainMatchFailuresTo(matchers, values, os) |
| // describes failures in matching the first N fields of matchers |
| // against the first N fields of values. If there is no failure, |
| // nothing will be streamed to os. |
| template <typename MatcherTuple, typename ValueTuple> |
| static void ExplainMatchFailuresTo(const MatcherTuple& matchers, |
| const ValueTuple& values, |
| ::std::ostream* os) { |
| // First, describes failures in the first N - 1 fields. |
| TuplePrefix<N - 1>::ExplainMatchFailuresTo(matchers, values, os); |
| |
| // Then describes the failure (if any) in the (N - 1)-th (0-based) |
| // field. |
| typename std::tuple_element<N - 1, MatcherTuple>::type matcher = |
| std::get<N - 1>(matchers); |
| typedef typename std::tuple_element<N - 1, ValueTuple>::type Value; |
| const Value& value = std::get<N - 1>(values); |
| StringMatchResultListener listener; |
| if (!matcher.MatchAndExplain(value, &listener)) { |
| *os << " Expected arg #" << N - 1 << ": "; |
| std::get<N - 1>(matchers).DescribeTo(os); |
| *os << "\n Actual: "; |
| // We remove the reference in type Value to prevent the |
| // universal printer from printing the address of value, which |
| // isn't interesting to the user most of the time. The |
| // matcher's MatchAndExplain() method handles the case when |
| // the address is interesting. |
| internal::UniversalPrint(value, os); |
| PrintIfNotEmpty(listener.str(), os); |
| *os << "\n"; |
| } |
| } |
| }; |
| |
| // The base case. |
| template <> |
| class TuplePrefix<0> { |
| public: |
| template <typename MatcherTuple, typename ValueTuple> |
| static bool Matches(const MatcherTuple& /* matcher_tuple */, |
| const ValueTuple& /* value_tuple */) { |
| return true; |
| } |
| |
| template <typename MatcherTuple, typename ValueTuple> |
| static void ExplainMatchFailuresTo(const MatcherTuple& /* matchers */, |
| const ValueTuple& /* values */, |
| ::std::ostream* /* os */) {} |
| }; |
| |
| // TupleMatches(matcher_tuple, value_tuple) returns true iff all |
| // matchers in matcher_tuple match the corresponding fields in |
| // value_tuple. It is a compiler error if matcher_tuple and |
| // value_tuple have different number of fields or incompatible field |
| // types. |
| template <typename MatcherTuple, typename ValueTuple> |
| bool TupleMatches(const MatcherTuple& matcher_tuple, |
| const ValueTuple& value_tuple) { |
| // Makes sure that matcher_tuple and value_tuple have the same |
| // number of fields. |
| GTEST_COMPILE_ASSERT_(std::tuple_size<MatcherTuple>::value == |
| std::tuple_size<ValueTuple>::value, |
| matcher_and_value_have_different_numbers_of_fields); |
| return TuplePrefix<std::tuple_size<ValueTuple>::value>::Matches(matcher_tuple, |
| value_tuple); |
| } |
| |
| // Describes failures in matching matchers against values. If there |
| // is no failure, nothing will be streamed to os. |
| template <typename MatcherTuple, typename ValueTuple> |
| void ExplainMatchFailureTupleTo(const MatcherTuple& matchers, |
| const ValueTuple& values, |
| ::std::ostream* os) { |
| TuplePrefix<std::tuple_size<MatcherTuple>::value>::ExplainMatchFailuresTo( |
| matchers, values, os); |
| } |
| |
| // TransformTupleValues and its helper. |
| // |
| // TransformTupleValuesHelper hides the internal machinery that |
| // TransformTupleValues uses to implement a tuple traversal. |
| template <typename Tuple, typename Func, typename OutIter> |
| class TransformTupleValuesHelper { |
| private: |
| typedef ::std::tuple_size<Tuple> TupleSize; |
| |
| public: |
| // For each member of tuple 't', taken in order, evaluates '*out++ = f(t)'. |
| // Returns the final value of 'out' in case the caller needs it. |
| static OutIter Run(Func f, const Tuple& t, OutIter out) { |
| return IterateOverTuple<Tuple, TupleSize::value>()(f, t, out); |
| } |
| |
| private: |
| template <typename Tup, size_t kRemainingSize> |
| struct IterateOverTuple { |
| OutIter operator() (Func f, const Tup& t, OutIter out) const { |
| *out++ = f(::std::get<TupleSize::value - kRemainingSize>(t)); |
| return IterateOverTuple<Tup, kRemainingSize - 1>()(f, t, out); |
| } |
| }; |
| template <typename Tup> |
| struct IterateOverTuple<Tup, 0> { |
| OutIter operator() (Func /* f */, const Tup& /* t */, OutIter out) const { |
| return out; |
| } |
| }; |
| }; |
| |
| // Successively invokes 'f(element)' on each element of the tuple 't', |
| // appending each result to the 'out' iterator. Returns the final value |
| // of 'out'. |
| template <typename Tuple, typename Func, typename OutIter> |
| OutIter TransformTupleValues(Func f, const Tuple& t, OutIter out) { |
| return TransformTupleValuesHelper<Tuple, Func, OutIter>::Run(f, t, out); |
| } |
| |
| // Implements A<T>(). |
| template <typename T> |
| class AnyMatcherImpl : public MatcherInterface<const T&> { |
| public: |
| bool MatchAndExplain(const T& /* x */, |
| MatchResultListener* /* listener */) const override { |
| return true; |
| } |
| void DescribeTo(::std::ostream* os) const override { *os << "is anything"; } |
| void DescribeNegationTo(::std::ostream* os) const override { |
| // This is mostly for completeness' safe, as it's not very useful |
| // to write Not(A<bool>()). However we cannot completely rule out |
| // such a possibility, and it doesn't hurt to be prepared. |
| *os << "never matches"; |
| } |
| }; |
| |
| // Implements _, a matcher that matches any value of any |
| // type. This is a polymorphic matcher, so we need a template type |
| // conversion operator to make it appearing as a Matcher<T> for any |
| // type T. |
| class AnythingMatcher { |
| public: |
| template <typename T> |
| operator Matcher<T>() const { return A<T>(); } |
| }; |
| |
| // Implements the polymorphic IsNull() matcher, which matches any raw or smart |
| // pointer that is NULL. |
| class IsNullMatcher { |
| public: |
| template <typename Pointer> |
| bool MatchAndExplain(const Pointer& p, |
| MatchResultListener* /* listener */) const { |
| return p == nullptr; |
| } |
| |
| void DescribeTo(::std::ostream* os) const { *os << "is NULL"; } |
| void DescribeNegationTo(::std::ostream* os) const { |
| *os << "isn't NULL"; |
| } |
| }; |
| |
| // Implements the polymorphic NotNull() matcher, which matches any raw or smart |
| // pointer that is not NULL. |
| class NotNullMatcher { |
| public: |
| template <typename Pointer> |
| bool MatchAndExplain(const Pointer& p, |
| MatchResultListener* /* listener */) const { |
| return p != nullptr; |
| } |
| |
| void DescribeTo(::std::ostream* os) const { *os << "isn't NULL"; } |
| void DescribeNegationTo(::std::ostream* os) const { |
| *os << "is NULL"; |
| } |
| }; |
| |
| // Ref(variable) matches any argument that is a reference to |
| // 'variable'. This matcher is polymorphic as it can match any |
| // super type of the type of 'variable'. |
| // |
| // The RefMatcher template class implements Ref(variable). It can |
| // only be instantiated with a reference type. This prevents a user |
| // from mistakenly using Ref(x) to match a non-reference function |
| // argument. For example, the following will righteously cause a |
| // compiler error: |
| // |
| // int n; |
| // Matcher<int> m1 = Ref(n); // This won't compile. |
| // Matcher<int&> m2 = Ref(n); // This will compile. |
| template <typename T> |
| class RefMatcher; |
| |
| template <typename T> |
| class RefMatcher<T&> { |
| // Google Mock is a generic framework and thus needs to support |
| // mocking any function types, including those that take non-const |
| // reference arguments. Therefore the template parameter T (and |
| // Super below) can be instantiated to either a const type or a |
| // non-const type. |
| public: |
| // RefMatcher() takes a T& instead of const T&, as we want the |
| // compiler to catch using Ref(const_value) as a matcher for a |
| // non-const reference. |
| explicit RefMatcher(T& x) : object_(x) {} // NOLINT |
| |
| template <typename Super> |
| operator Matcher<Super&>() const { |
| // By passing object_ (type T&) to Impl(), which expects a Super&, |
| // we make sure that Super is a super type of T. In particular, |
| // this catches using Ref(const_value) as a matcher for a |
| // non-const reference, as you cannot implicitly convert a const |
| // reference to a non-const reference. |
| return MakeMatcher(new Impl<Super>(object_)); |
| } |
| |
| private: |
| template <typename Super> |
| class Impl : public MatcherInterface<Super&> { |
| public: |
| explicit Impl(Super& x) : object_(x) {} // NOLINT |
| |
| // MatchAndExplain() takes a Super& (as opposed to const Super&) |
| // in order to match the interface MatcherInterface<Super&>. |
| bool MatchAndExplain(Super& x, |
| MatchResultListener* listener) const override { |
| *listener << "which is located @" << static_cast<const void*>(&x); |
| return &x == &object_; |
| } |
| |
| void DescribeTo(::std::ostream* os) const override { |
| *os << "references the variable "; |
| UniversalPrinter<Super&>::Print(object_, os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const override { |
| *os << "does not reference the variable "; |
| UniversalPrinter<Super&>::Print(object_, os); |
| } |
| |
| private: |
| const Super& object_; |
| |
| GTEST_DISALLOW_ASSIGN_(Impl); |
| }; |
| |
| T& object_; |
| |
| GTEST_DISALLOW_ASSIGN_(RefMatcher); |
| }; |
| |
| // Polymorphic helper functions for narrow and wide string matchers. |
| inline bool CaseInsensitiveCStringEquals(const char* lhs, const char* rhs) { |
| return String::CaseInsensitiveCStringEquals(lhs, rhs); |
| } |
| |
| inline bool CaseInsensitiveCStringEquals(const wchar_t* lhs, |
| const wchar_t* rhs) { |
| return String::CaseInsensitiveWideCStringEquals(lhs, rhs); |
| } |
| |
| // String comparison for narrow or wide strings that can have embedded NUL |
| // characters. |
| template <typename StringType> |
| bool CaseInsensitiveStringEquals(const StringType& s1, |
| const StringType& s2) { |
| // Are the heads equal? |
| if (!CaseInsensitiveCStringEquals(s1.c_str(), s2.c_str())) { |
| return false; |
| } |
| |
| // Skip the equal heads. |
| const typename StringType::value_type nul = 0; |
| const size_t i1 = s1.find(nul), i2 = s2.find(nul); |
| |
| // Are we at the end of either s1 or s2? |
| if (i1 == StringType::npos || i2 == StringType::npos) { |
| return i1 == i2; |
| } |
| |
| // Are the tails equal? |
| return CaseInsensitiveStringEquals(s1.substr(i1 + 1), s2.substr(i2 + 1)); |
| } |
| |
| // String matchers. |
| |
| // Implements equality-based string matchers like StrEq, StrCaseNe, and etc. |
| template <typename StringType> |
| class StrEqualityMatcher { |
| public: |
| StrEqualityMatcher(const StringType& str, bool expect_eq, |
| bool case_sensitive) |
| : string_(str), expect_eq_(expect_eq), case_sensitive_(case_sensitive) {} |
| |
| #if GTEST_HAS_ABSL |
| bool MatchAndExplain(const absl::string_view& s, |
| MatchResultListener* listener) const { |
| // This should fail to compile if absl::string_view is used with wide |
| // strings. |
| const StringType& str = string(s); |
| return MatchAndExplain(str, listener); |
| } |
| #endif // GTEST_HAS_ABSL |
| |
| // Accepts pointer types, particularly: |
| // const char* |
| // char* |
| // const wchar_t* |
| // wchar_t* |
| template <typename CharType> |
| bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { |
| if (s == nullptr) { |
| return !expect_eq_; |
| } |
| return MatchAndExplain(StringType(s), listener); |
| } |
| |
| // Matches anything that can convert to StringType. |
| // |
| // This is a template, not just a plain function with const StringType&, |
| // because absl::string_view has some interfering non-explicit constructors. |
| template <typename MatcheeStringType> |
| bool MatchAndExplain(const MatcheeStringType& s, |
| MatchResultListener* /* listener */) const { |
| const StringType& s2(s); |
| const bool eq = case_sensitive_ ? s2 == string_ : |
| CaseInsensitiveStringEquals(s2, string_); |
| return expect_eq_ == eq; |
| } |
| |
| void DescribeTo(::std::ostream* os) const { |
| DescribeToHelper(expect_eq_, os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const { |
| DescribeToHelper(!expect_eq_, os); |
| } |
| |
| private: |
| void DescribeToHelper(bool expect_eq, ::std::ostream* os) const { |
| *os << (expect_eq ? "is " : "isn't "); |
| *os << "equal to "; |
| if (!case_sensitive_) { |
| *os << "(ignoring case) "; |
| } |
| UniversalPrint(string_, os); |
| } |
| |
| const StringType string_; |
| const bool expect_eq_; |
| const bool case_sensitive_; |
| |
| GTEST_DISALLOW_ASSIGN_(StrEqualityMatcher); |
| }; |
| |
| // Implements the polymorphic HasSubstr(substring) matcher, which |
| // can be used as a Matcher<T> as long as T can be converted to a |
| // string. |
| template <typename StringType> |
| class HasSubstrMatcher { |
| public: |
| explicit HasSubstrMatcher(const StringType& substring) |
| : substring_(substring) {} |
| |
| #if GTEST_HAS_ABSL |
| bool MatchAndExplain(const absl::string_view& s, |
| MatchResultListener* listener) const { |
| // This should fail to compile if absl::string_view is used with wide |
| // strings. |
| const StringType& str = string(s); |
| return MatchAndExplain(str, listener); |
| } |
| #endif // GTEST_HAS_ABSL |
| |
| // Accepts pointer types, particularly: |
| // const char* |
| // char* |
| // const wchar_t* |
| // wchar_t* |
| template <typename CharType> |
| bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { |
| return s != nullptr && MatchAndExplain(StringType(s), listener); |
| } |
| |
| // Matches anything that can convert to StringType. |
| // |
| // This is a template, not just a plain function with const StringType&, |
| // because absl::string_view has some interfering non-explicit constructors. |
| template <typename MatcheeStringType> |
| bool MatchAndExplain(const MatcheeStringType& s, |
| MatchResultListener* /* listener */) const { |
| const StringType& s2(s); |
| return s2.find(substring_) != StringType::npos; |
| } |
| |
| // Describes what this matcher matches. |
| void DescribeTo(::std::ostream* os) const { |
| *os << "has substring "; |
| UniversalPrint(substring_, os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const { |
| *os << "has no substring "; |
| UniversalPrint(substring_, os); |
| } |
| |
| private: |
| const StringType substring_; |
| |
| GTEST_DISALLOW_ASSIGN_(HasSubstrMatcher); |
| }; |
| |
| // Implements the polymorphic StartsWith(substring) matcher, which |
| // can be used as a Matcher<T> as long as T can be converted to a |
| // string. |
| template <typename StringType> |
| class StartsWithMatcher { |
| public: |
| explicit StartsWithMatcher(const StringType& prefix) : prefix_(prefix) { |
| } |
| |
| #if GTEST_HAS_ABSL |
| bool MatchAndExplain(const absl::string_view& s, |
| MatchResultListener* listener) const { |
| // This should fail to compile if absl::string_view is used with wide |
| // strings. |
| const StringType& str = string(s); |
| return MatchAndExplain(str, listener); |
| } |
| #endif // GTEST_HAS_ABSL |
| |
| // Accepts pointer types, particularly: |
| // const char* |
| // char* |
| // const wchar_t* |
| // wchar_t* |
| template <typename CharType> |
| bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { |
| return s != nullptr && MatchAndExplain(StringType(s), listener); |
| } |
| |
| // Matches anything that can convert to StringType. |
| // |
| // This is a template, not just a plain function with const StringType&, |
| // because absl::string_view has some interfering non-explicit constructors. |
| template <typename MatcheeStringType> |
| bool MatchAndExplain(const MatcheeStringType& s, |
| MatchResultListener* /* listener */) const { |
| const StringType& s2(s); |
| return s2.length() >= prefix_.length() && |
| s2.substr(0, prefix_.length()) == prefix_; |
| } |
| |
| void DescribeTo(::std::ostream* os) const { |
| *os << "starts with "; |
| UniversalPrint(prefix_, os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const { |
| *os << "doesn't start with "; |
| UniversalPrint(prefix_, os); |
| } |
| |
| private: |
| const StringType prefix_; |
| |
| GTEST_DISALLOW_ASSIGN_(StartsWithMatcher); |
| }; |
| |
| // Implements the polymorphic EndsWith(substring) matcher, which |
| // can be used as a Matcher<T> as long as T can be converted to a |
| // string. |
| template <typename StringType> |
| class EndsWithMatcher { |
| public: |
| explicit EndsWithMatcher(const StringType& suffix) : suffix_(suffix) {} |
| |
| #if GTEST_HAS_ABSL |
| bool MatchAndExplain(const absl::string_view& s, |
| MatchResultListener* listener) const { |
| // This should fail to compile if absl::string_view is used with wide |
| // strings. |
| const StringType& str = string(s); |
| return MatchAndExplain(str, listener); |
| } |
| #endif // GTEST_HAS_ABSL |
| |
| // Accepts pointer types, particularly: |
| // const char* |
| // char* |
| // const wchar_t* |
| // wchar_t* |
| template <typename CharType> |
| bool MatchAndExplain(CharType* s, MatchResultListener* listener) const { |
| return s != nullptr && MatchAndExplain(StringType(s), listener); |
| } |
| |
| // Matches anything that can convert to StringType. |
| // |
| // This is a template, not just a plain function with const StringType&, |
| // because absl::string_view has some interfering non-explicit constructors. |
| template <typename MatcheeStringType> |
| bool MatchAndExplain(const MatcheeStringType& s, |
| MatchResultListener* /* listener */) const { |
| const StringType& s2(s); |
| return s2.length() >= suffix_.length() && |
| s2.substr(s2.length() - suffix_.length()) == suffix_; |
| } |
| |
| void DescribeTo(::std::ostream* os) const { |
| *os << "ends with "; |
| UniversalPrint(suffix_, os); |
| } |
| |
| void DescribeNegationTo(::std::ostream* os) const { |
| *os << "doesn't end with "; |
| UniversalPrint(suffix_, os); |
| } |
| |
| private: |
| const StringType suffix_; |
| |
| GTEST_DISALLOW_ASSIGN_(EndsWithMatcher); |
| }; |
| |
| // Implements a matcher that compares the two fields of a 2-tuple |
| // using one of the ==, <=, <, etc, operators. The two fields being |
| // compared don't have to have the same type. |
| // |
| // The matcher defined here is polymorphic (for example, Eq() can be |
| // used to match a std::tuple<int, short>, a std::tuple<const long&, double>, |
| // etc). Therefore we use a template type conversion operator in the |
| // implementation. |
| template <typename D, typename Op> |
| class PairMatchBase { |
| public: |
| template <typename T1, typename T2> |
| operator Matcher<::std::tuple<T1, T2>>() const { |
| return Matcher<::std::tuple<T1, T2>>(new Impl<const ::std::tuple<T1, T2>&>); |
| } |
| template <typename T1, typename T2> |
| operator Matcher<const ::std::tuple<T1, T2>&>() const { |
| return MakeMatcher(new Impl<const ::std::tuple<T1, T2>&>); |
| } |
| |
| private: |
| static ::std::ostream& GetDesc(::std::ostream& os) { // NOLINT |
| |