Commit a8ce8d27 authored by xiabo's avatar xiabo
Browse files

修改googletest版本

parent 0a21fff9
...@@ -109,7 +109,7 @@ namespace: ...@@ -109,7 +109,7 @@ namespace:
| `ValuesIn(container)` or `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)`. | | `ValuesIn(container)` or `ValuesIn(begin,end)` | Yields values from a C-style array, an STL-style container, or an iterator range `[begin, end)`. |
| `Bool()` | Yields sequence `{false, true}`. | | `Bool()` | Yields sequence `{false, true}`. |
| `Combine(g1, g2, ..., gN)` | Yields as `std::tuple` *n*-tuples all combinations (Cartesian product) of the values generated by the given *n* generators `g1`, `g2`, ..., `gN`. | | `Combine(g1, g2, ..., gN)` | Yields as `std::tuple` *n*-tuples all combinations (Cartesian product) of the values generated by the given *n* generators `g1`, `g2`, ..., `gN`. |
| `ConvertGenerator<T>(g)` | Yields values generated by generator `g`, `static_cast` to `T`. |
The optional last argument *`name_generator`* is a function or functor that The optional last argument *`name_generator`* is a function or functor that
generates custom test name suffixes based on the test parameters. The function generates custom test name suffixes based on the test parameters. The function
must accept an argument of type must accept an argument of type
......
# Googletest Samples # Googletest Samples
If you're like us, you'd like to look at If you're like us, you'd like to look at
[googletest samples.](https://github.com/google/googletest/blob/main/googletest/samples) [googletest samples.](https://github.com/google/googletest/tree/master/googletest/samples)
The sample directory has a number of well-commented samples showing how to use a The sample directory has a number of well-commented samples showing how to use a
variety of googletest features. variety of googletest features.
......
########################################################################
# Note: CMake support is community-based. The maintainers do not use CMake
# internally.
#
# CMake build script for Google Mock.
#
# To run the tests for Google Mock itself on Linux, use 'make test' or
# ctest. You can select which tests to run using 'ctest -R regex'.
# For more options, run 'ctest --help'.
option(gmock_build_tests "Build all of Google Mock's own tests." OFF)
# A directory to find Google Test sources.
if (EXISTS "${CMAKE_CURRENT_SOURCE_DIR}/gtest/CMakeLists.txt")
set(gtest_dir gtest)
else()
set(gtest_dir ../googletest)
endif()
# Defines pre_project_set_up_hermetic_build() and set_up_hermetic_build().
include("${gtest_dir}/cmake/hermetic_build.cmake" OPTIONAL)
if (COMMAND pre_project_set_up_hermetic_build)
# Google Test also calls hermetic setup functions from add_subdirectory,
# although its changes will not affect things at the current scope.
pre_project_set_up_hermetic_build()
endif()
########################################################################
#
# Project-wide settings
# Name of the project.
#
# CMake files in this project can refer to the root source directory
# as ${gmock_SOURCE_DIR} and to the root binary directory as
# ${gmock_BINARY_DIR}.
# Language "C" is required for find_package(Threads).
cmake_minimum_required(VERSION 3.5)
cmake_policy(SET CMP0048 NEW)
project(gmock VERSION ${GOOGLETEST_VERSION} LANGUAGES CXX C)
if (COMMAND set_up_hermetic_build)
set_up_hermetic_build()
endif()
# Instructs CMake to process Google Test's CMakeLists.txt and add its
# targets to the current scope. We are placing Google Test's binary
# directory in a subdirectory of our own as VC compilation may break
# if they are the same (the default).
add_subdirectory("${gtest_dir}" "${gmock_BINARY_DIR}/${gtest_dir}")
# These commands only run if this is the main project
if(CMAKE_PROJECT_NAME STREQUAL "gmock" OR CMAKE_PROJECT_NAME STREQUAL "googletest-distribution")
# BUILD_SHARED_LIBS is a standard CMake variable, but we declare it here to
# make it prominent in the GUI.
option(BUILD_SHARED_LIBS "Build shared libraries (DLLs)." OFF)
else()
mark_as_advanced(gmock_build_tests)
endif()
# Although Google Test's CMakeLists.txt calls this function, the
# changes there don't affect the current scope. Therefore we have to
# call it again here.
config_compiler_and_linker() # from ${gtest_dir}/cmake/internal_utils.cmake
# Adds Google Mock's and Google Test's header directories to the search path.
set(gmock_build_include_dirs
"${gmock_SOURCE_DIR}/include"
"${gmock_SOURCE_DIR}"
"${gtest_SOURCE_DIR}/include"
# This directory is needed to build directly from Google Test sources.
"${gtest_SOURCE_DIR}")
include_directories(${gmock_build_include_dirs})
########################################################################
#
# Defines the gmock & gmock_main libraries. User tests should link
# with one of them.
# Google Mock libraries. We build them using more strict warnings than what
# are used for other targets, to ensure that Google Mock can be compiled by
# a user aggressive about warnings.
if (MSVC)
cxx_library(gmock
"${cxx_strict}"
"${gtest_dir}/src/gtest-all.cc"
src/gmock-all.cc)
cxx_library(gmock_main
"${cxx_strict}"
"${gtest_dir}/src/gtest-all.cc"
src/gmock-all.cc
src/gmock_main.cc)
else()
cxx_library(gmock "${cxx_strict}" src/gmock-all.cc)
target_link_libraries(gmock PUBLIC gtest)
set_target_properties(gmock PROPERTIES VERSION ${GOOGLETEST_VERSION})
cxx_library(gmock_main "${cxx_strict}" src/gmock_main.cc)
target_link_libraries(gmock_main PUBLIC gmock)
set_target_properties(gmock_main PROPERTIES VERSION ${GOOGLETEST_VERSION})
endif()
# If the CMake version supports it, attach header directory information
# to the targets for when we are part of a parent build (ie being pulled
# in via add_subdirectory() rather than being a standalone build).
if (DEFINED CMAKE_VERSION AND NOT "${CMAKE_VERSION}" VERSION_LESS "2.8.11")
string(REPLACE ";" "$<SEMICOLON>" dirs "${gmock_build_include_dirs}")
target_include_directories(gmock SYSTEM INTERFACE
"$<BUILD_INTERFACE:${dirs}>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
target_include_directories(gmock_main SYSTEM INTERFACE
"$<BUILD_INTERFACE:${dirs}>"
"$<INSTALL_INTERFACE:$<INSTALL_PREFIX>/${CMAKE_INSTALL_INCLUDEDIR}>")
endif()
########################################################################
#
# Install rules
install_project(gmock gmock_main)
########################################################################
#
# Google Mock's own tests.
#
# You can skip this section if you aren't interested in testing
# Google Mock itself.
#
# The tests are not built by default. To build them, set the
# gmock_build_tests option to ON. You can do it by running ccmake
# or specifying the -Dgmock_build_tests=ON flag when running cmake.
if (gmock_build_tests)
# This must be set in the root directory for the tests to be run by
# 'make test' or ctest.
enable_testing()
if (MINGW OR CYGWIN)
if (CMAKE_VERSION VERSION_LESS "2.8.12")
add_compile_options("-Wa,-mbig-obj")
else()
add_definitions("-Wa,-mbig-obj")
endif()
endif()
############################################################
# C++ tests built with standard compiler flags.
cxx_test(gmock-actions_test gmock_main)
cxx_test(gmock-cardinalities_test gmock_main)
cxx_test(gmock_ex_test gmock_main)
cxx_test(gmock-function-mocker_test gmock_main)
cxx_test(gmock-internal-utils_test gmock_main)
cxx_test(gmock-matchers-arithmetic_test gmock_main)
cxx_test(gmock-matchers-comparisons_test gmock_main)
cxx_test(gmock-matchers-containers_test gmock_main)
cxx_test(gmock-matchers-misc_test gmock_main)
cxx_test(gmock-more-actions_test gmock_main)
cxx_test(gmock-nice-strict_test gmock_main)
cxx_test(gmock-port_test gmock_main)
cxx_test(gmock-spec-builders_test gmock_main)
cxx_test(gmock_link_test gmock_main test/gmock_link2_test.cc)
cxx_test(gmock_test gmock_main)
if (DEFINED GTEST_HAS_PTHREAD)
cxx_test(gmock_stress_test gmock)
endif()
# gmock_all_test is commented to save time building and running tests.
# Uncomment if necessary.
# cxx_test(gmock_all_test gmock_main)
############################################################
# C++ tests built with non-standard compiler flags.
if (MSVC)
cxx_library(gmock_main_no_exception "${cxx_no_exception}"
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
cxx_library(gmock_main_no_rtti "${cxx_no_rtti}"
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
else()
cxx_library(gmock_main_no_exception "${cxx_no_exception}" src/gmock_main.cc)
target_link_libraries(gmock_main_no_exception PUBLIC gmock)
cxx_library(gmock_main_no_rtti "${cxx_no_rtti}" src/gmock_main.cc)
target_link_libraries(gmock_main_no_rtti PUBLIC gmock)
endif()
cxx_test_with_flags(gmock-more-actions_no_exception_test "${cxx_no_exception}"
gmock_main_no_exception test/gmock-more-actions_test.cc)
cxx_test_with_flags(gmock_no_rtti_test "${cxx_no_rtti}"
gmock_main_no_rtti test/gmock-spec-builders_test.cc)
cxx_shared_library(shared_gmock_main "${cxx_default}"
"${gtest_dir}/src/gtest-all.cc" src/gmock-all.cc src/gmock_main.cc)
# Tests that a binary can be built with Google Mock as a shared library. On
# some system configurations, it may not possible to run the binary without
# knowing more details about the system configurations. We do not try to run
# this binary. To get a more robust shared library coverage, configure with
# -DBUILD_SHARED_LIBS=ON.
cxx_executable_with_flags(shared_gmock_test_ "${cxx_default}"
shared_gmock_main test/gmock-spec-builders_test.cc)
set_target_properties(shared_gmock_test_
PROPERTIES
COMPILE_DEFINITIONS "GTEST_LINKED_AS_SHARED_LIBRARY=1")
############################################################
# Python tests.
cxx_executable(gmock_leak_test_ test gmock_main)
py_test(gmock_leak_test)
cxx_executable(gmock_output_test_ test gmock)
py_test(gmock_output_test)
endif()
...@@ -122,7 +122,7 @@ ...@@ -122,7 +122,7 @@
// MORE INFORMATION: // MORE INFORMATION:
// //
// To learn more about using these macros, please search for 'ACTION' on // To learn more about using these macros, please search for 'ACTION' on
// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md // https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md
// IWYU pragma: private, include "gmock/gmock.h" // IWYU pragma: private, include "gmock/gmock.h"
// IWYU pragma: friend gmock/.* // IWYU pragma: friend gmock/.*
...@@ -1428,10 +1428,8 @@ struct WithArgsAction { ...@@ -1428,10 +1428,8 @@ struct WithArgsAction {
// MSVC complains about the I parameter pack not being // MSVC complains about the I parameter pack not being
// expanded (error C3520) despite it being expanded in the // expanded (error C3520) despite it being expanded in the
// type alias. // type alias.
// TupleElement is also an MSVC workaround. OnceAction<R(typename std::tuple_element<
// See its definition for details. I, std::tuple<Args...>>::type...)>>::value,
OnceAction<R(internal::TupleElement<
I, std::tuple<Args...>>...)>>::value,
int>::type = 0> int>::type = 0>
operator OnceAction<R(Args...)>() && { // NOLINT operator OnceAction<R(Args...)>() && { // NOLINT
struct OA { struct OA {
...@@ -1455,10 +1453,8 @@ struct WithArgsAction { ...@@ -1455,10 +1453,8 @@ struct WithArgsAction {
// MSVC complains about the I parameter pack not being // MSVC complains about the I parameter pack not being
// expanded (error C3520) despite it being expanded in the // expanded (error C3520) despite it being expanded in the
// type alias. // type alias.
// TupleElement is also an MSVC workaround. Action<R(typename std::tuple_element<
// See its definition for details. I, std::tuple<Args...>>::type...)>>::value,
Action<R(internal::TupleElement<
I, std::tuple<Args...>>...)>>::value,
int>::type = 0> int>::type = 0>
operator Action<R(Args...)>() const { // NOLINT operator Action<R(Args...)>() const { // NOLINT
Action<InnerSignature<R, Args...>> converted(inner_action); Action<InnerSignature<R, Args...>> converted(inner_action);
......
...@@ -34,8 +34,8 @@ ...@@ -34,8 +34,8 @@
// IWYU pragma: private, include "gmock/gmock.h" // IWYU pragma: private, include "gmock/gmock.h"
// IWYU pragma: friend gmock/.* // IWYU pragma: friend gmock/.*
#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ #ifndef GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT
#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ #define GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_ // NOLINT
#include <type_traits> // IWYU pragma: keep #include <type_traits> // IWYU pragma: keep
#include <utility> // IWYU pragma: keep #include <utility> // IWYU pragma: keep
...@@ -109,10 +109,7 @@ using internal::FunctionMocker; ...@@ -109,10 +109,7 @@ using internal::FunctionMocker;
} // namespace testing } // namespace testing
#define MOCK_METHOD(...) \ #define MOCK_METHOD(...) \
GMOCK_INTERNAL_WARNING_PUSH() \ GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__)
GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \
GMOCK_PP_VARIADIC_CALL(GMOCK_INTERNAL_MOCK_METHOD_ARG_, __VA_ARGS__) \
GMOCK_INTERNAL_WARNING_POP()
#define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \ #define GMOCK_INTERNAL_MOCK_METHOD_ARG_1(...) \
GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__) GMOCK_INTERNAL_WRONG_ARITY(__VA_ARGS__)
...@@ -514,4 +511,4 @@ using internal::FunctionMocker; ...@@ -514,4 +511,4 @@ using internal::FunctionMocker;
#define GMOCK_MOCKER_(arity, constness, Method) \ #define GMOCK_MOCKER_(arity, constness, Method) \
GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__) GTEST_CONCAT_TOKEN_(gmock##constness##arity##_##Method##_, __LINE__)
#endif // GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_FUNCTION_MOCKER_H_ #endif // GOOGLEMOCK_INCLUDE_GMOCK_INTERNAL_GMOCK_FUNCTION_MOCKER_H_
...@@ -240,7 +240,7 @@ ...@@ -240,7 +240,7 @@
// //
// To learn more about using these macros, please search for 'MATCHER' // To learn more about using these macros, please search for 'MATCHER'
// on // on
// https://github.com/google/googletest/blob/main/docs/gmock_cook_book.md // https://github.com/google/googletest/blob/master/docs/gmock_cook_book.md
// //
// This file also implements some commonly used argument matchers. More // This file also implements some commonly used argument matchers. More
// matchers can be defined by the user implementing the // matchers can be defined by the user implementing the
...@@ -258,7 +258,6 @@ ...@@ -258,7 +258,6 @@
#include <algorithm> #include <algorithm>
#include <cmath> #include <cmath>
#include <initializer_list> #include <initializer_list>
#include <ios>
#include <iterator> #include <iterator>
#include <limits> #include <limits>
#include <memory> #include <memory>
...@@ -2310,11 +2309,11 @@ class SizeIsMatcher { ...@@ -2310,11 +2309,11 @@ class SizeIsMatcher {
: size_matcher_(MatcherCast<SizeType>(size_matcher)) {} : size_matcher_(MatcherCast<SizeType>(size_matcher)) {}
void DescribeTo(::std::ostream* os) const override { void DescribeTo(::std::ostream* os) const override {
*os << "has a size that "; *os << "size ";
size_matcher_.DescribeTo(os); size_matcher_.DescribeTo(os);
} }
void DescribeNegationTo(::std::ostream* os) const override { void DescribeNegationTo(::std::ostream* os) const override {
*os << "has a size that "; *os << "size ";
size_matcher_.DescribeNegationTo(os); size_matcher_.DescribeNegationTo(os);
} }
...@@ -3236,21 +3235,6 @@ auto UnpackStructImpl(const T& t, MakeIndexSequence<16>, char) { ...@@ -3236,21 +3235,6 @@ auto UnpackStructImpl(const T& t, MakeIndexSequence<16>, char) {
const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] = t; const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p] = t;
return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p); return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p);
} }
template <typename T>
auto UnpackStructImpl(const T& t, MakeIndexSequence<17>, char) {
const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q] = t;
return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q);
}
template <typename T>
auto UnpackStructImpl(const T& t, MakeIndexSequence<18>, char) {
const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r] = t;
return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r);
}
template <typename T>
auto UnpackStructImpl(const T& t, MakeIndexSequence<19>, char) {
const auto& [a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s] = t;
return std::tie(a, b, c, d, e, f, g, h, i, j, k, l, m, n, o, p, q, r, s);
}
#endif // defined(__cpp_structured_bindings) #endif // defined(__cpp_structured_bindings)
template <size_t I, typename T> template <size_t I, typename T>
...@@ -3317,7 +3301,7 @@ class FieldsAreMatcherImpl<Struct, IndexSequence<I...>> ...@@ -3317,7 +3301,7 @@ class FieldsAreMatcherImpl<Struct, IndexSequence<I...>>
std::vector<StringMatchResultListener> inner_listener(sizeof...(I)); std::vector<StringMatchResultListener> inner_listener(sizeof...(I));
VariadicExpand( VariadicExpand(
{failed_pos == ~size_t{}&& !std::get<I>(matchers_).MatchAndExplain( {failed_pos == ~size_t{} && !std::get<I>(matchers_).MatchAndExplain(
std::get<I>(tuple), &inner_listener[I]) std::get<I>(tuple), &inner_listener[I])
? failed_pos = I ? failed_pos = I
: 0 ...}); : 0 ...});
...@@ -3645,6 +3629,23 @@ class UnorderedElementsAreMatcherImpl ...@@ -3645,6 +3629,23 @@ class UnorderedElementsAreMatcherImpl
AnalyzeElements(stl_container.begin(), stl_container.end(), AnalyzeElements(stl_container.begin(), stl_container.end(),
&element_printouts, listener); &element_printouts, listener);
if (matrix.LhsSize() == 0 && matrix.RhsSize() == 0) {
return true;
}
if (match_flags() == UnorderedMatcherRequire::ExactMatch) {
if (matrix.LhsSize() != matrix.RhsSize()) {
// The element count doesn't match. If the container is empty,
// there's no need to explain anything as Google Mock already
// prints the empty container. Otherwise we just need to show
// how many elements there actually are.
if (matrix.LhsSize() != 0 && listener->IsInterested()) {
*listener << "which has " << Elements(matrix.LhsSize());
}
return false;
}
}
return VerifyMatchMatrix(element_printouts, matrix, listener) && return VerifyMatchMatrix(element_printouts, matrix, listener) &&
FindPairing(matrix, listener); FindPairing(matrix, listener);
} }
...@@ -4099,12 +4100,7 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> { ...@@ -4099,12 +4100,7 @@ class ArgsMatcherImpl : public MatcherInterface<ArgsTuple> {
const char* sep = ""; const char* sep = "";
// Workaround spurious C4189 on MSVC<=15.7 when k is empty. // Workaround spurious C4189 on MSVC<=15.7 when k is empty.
(void)sep; (void)sep;
// The static_cast to void is needed to silence Clang's -Wcomma warning. const char* dummy[] = {"", (*os << sep << "#" << k, sep = ", ")...};
// This pattern looks suspiciously like we may have mismatched parentheses
// and may have been trying to use the first operation of the comma operator
// as a member of the array, so Clang warns that we may have made a mistake.
const char* dummy[] = {
"", (static_cast<void>(*os << sep << "#" << k), sep = ", ")...};
(void)dummy; (void)dummy;
*os << ") "; *os << ") ";
} }
...@@ -5471,13 +5467,7 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage( ...@@ -5471,13 +5467,7 @@ PolymorphicMatcher<internal::ExceptionMatcherImpl<Err>> ThrowsMessage(
} \ } \
}; \ }; \
}; \ }; \
inline name##Matcher GMOCK_INTERNAL_WARNING_PUSH() \ GTEST_ATTRIBUTE_UNUSED_ inline name##Matcher name() { return {}; } \
GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-function") \
GMOCK_INTERNAL_WARNING_CLANG(ignored, "-Wunused-member-function") \
name \
GMOCK_INTERNAL_WARNING_POP()() { \
return {}; \
} \
template <typename arg_type> \ template <typename arg_type> \
bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain( \ bool name##Matcher::gmock_Impl<arg_type>::MatchAndExplain( \
const arg_type& arg, \ const arg_type& arg, \
......
...@@ -40,9 +40,6 @@ ...@@ -40,9 +40,6 @@
#ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_ #ifndef GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_
#define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_ #define GOOGLEMOCK_INCLUDE_GMOCK_GMOCK_MORE_MATCHERS_H_
#include <ostream>
#include <string>
#include "gmock/gmock-matchers.h" #include "gmock/gmock-matchers.h"
namespace testing { namespace testing {
...@@ -59,42 +56,14 @@ namespace testing { ...@@ -59,42 +56,14 @@ namespace testing {
#endif #endif
#endif #endif
namespace internal { // Defines a matcher that matches an empty container. The container must
// support both size() and empty(), which all STL-like containers provide.
// Implements the polymorphic IsEmpty matcher, which MATCHER(IsEmpty, negation ? "isn't empty" : "is empty") {
// can be used as a Matcher<T> as long as T is either a container that defines if (arg.empty()) {
// empty() and size() (e.g. std::vector or std::string), or a C-style string.
class IsEmptyMatcher {
public:
// Matches anything that defines empty() and size().
template <typename MatcheeContainerType>
bool MatchAndExplain(const MatcheeContainerType& c,
MatchResultListener* listener) const {
if (c.empty()) {
return true; return true;
} }
*listener << "whose size is " << c.size(); *result_listener << "whose size is " << arg.size();
return false; return false;
}
// Matches C-style strings.
bool MatchAndExplain(const char* s, MatchResultListener* listener) const {
return MatchAndExplain(std::string(s), listener);
}
// Describes what this matcher matches.
void DescribeTo(std::ostream* os) const { *os << "is empty"; }
void DescribeNegationTo(std::ostream* os) const { *os << "isn't empty"; }
};
} // namespace internal
// Creates a polymorphic matcher that matches an empty container or C-style
// string. The container must support both size() and empty(), which all
// STL-like containers provide.
inline PolymorphicMatcher<internal::IsEmptyMatcher> IsEmpty() {
return MakePolymorphicMatcher(internal::IsEmptyMatcher());
} }
// Define a matcher that matches a value that evaluates in boolean // Define a matcher that matches a value that evaluates in boolean
......
...@@ -65,7 +65,6 @@ ...@@ -65,7 +65,6 @@
#include <functional> #include <functional>
#include <map> #include <map>
#include <memory> #include <memory>
#include <ostream>
#include <set> #include <set>
#include <sstream> #include <sstream>
#include <string> #include <string>
...@@ -657,7 +656,7 @@ class GTEST_API_ InSequence { ...@@ -657,7 +656,7 @@ class GTEST_API_ InSequence {
InSequence(const InSequence&) = delete; InSequence(const InSequence&) = delete;
InSequence& operator=(const InSequence&) = delete; InSequence& operator=(const InSequence&) = delete;
}; } GTEST_ATTRIBUTE_UNUSED_;
namespace internal { namespace internal {
...@@ -707,12 +706,6 @@ class GTEST_API_ ExpectationBase { ...@@ -707,12 +706,6 @@ class GTEST_API_ ExpectationBase {
// describes it to the ostream. // describes it to the ostream.
virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0; virtual void MaybeDescribeExtraMatcherTo(::std::ostream* os) = 0;
// Do not rely on this for correctness.
// This is only for making human-readable test output easier to understand.
void UntypedDescription(std::string description) {
description_ = std::move(description);
}
protected: protected:
friend class ::testing::Expectation; friend class ::testing::Expectation;
friend class UntypedFunctionMockerBase; friend class UntypedFunctionMockerBase;
...@@ -779,10 +772,6 @@ class GTEST_API_ ExpectationBase { ...@@ -779,10 +772,6 @@ class GTEST_API_ ExpectationBase {
retired_ = true; retired_ = true;
} }
// Returns a human-readable description of this expectation.
// Do not rely on this for correctness. It is only for human readability.
const std::string& GetDescription() const { return description_; }
// Returns true if and only if this expectation is satisfied. // Returns true if and only if this expectation is satisfied.
bool IsSatisfied() const GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) { bool IsSatisfied() const GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
g_gmock_mutex.AssertHeld(); g_gmock_mutex.AssertHeld();
...@@ -842,7 +831,6 @@ class GTEST_API_ ExpectationBase { ...@@ -842,7 +831,6 @@ class GTEST_API_ ExpectationBase {
const char* file_; // The file that contains the expectation. const char* file_; // The file that contains the expectation.
int line_; // The line number of the expectation. int line_; // The line number of the expectation.
const std::string source_text_; // The EXPECT_CALL(...) source text. const std::string source_text_; // The EXPECT_CALL(...) source text.
std::string description_; // User-readable name for the expectation.
// True if and only if the cardinality is specified explicitly. // True if and only if the cardinality is specified explicitly.
bool cardinality_specified_; bool cardinality_specified_;
Cardinality cardinality_; // The cardinality of the expectation. Cardinality cardinality_; // The cardinality of the expectation.
...@@ -921,13 +909,6 @@ class TypedExpectation<R(Args...)> : public ExpectationBase { ...@@ -921,13 +909,6 @@ class TypedExpectation<R(Args...)> : public ExpectationBase {
return *this; return *this;
} }
// Do not rely on this for correctness.
// This is only for making human-readable test output easier to understand.
TypedExpectation& Description(std::string name) {
ExpectationBase::UntypedDescription(std::move(name));
return *this;
}
// Implements the .Times() clause. // Implements the .Times() clause.
TypedExpectation& Times(const Cardinality& a_cardinality) { TypedExpectation& Times(const Cardinality& a_cardinality) {
ExpectationBase::UntypedTimes(a_cardinality); ExpectationBase::UntypedTimes(a_cardinality);
...@@ -1218,15 +1199,10 @@ class TypedExpectation<R(Args...)> : public ExpectationBase { ...@@ -1218,15 +1199,10 @@ class TypedExpectation<R(Args...)> : public ExpectationBase {
::std::ostream* why) ::std::ostream* why)
GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) { GTEST_EXCLUSIVE_LOCK_REQUIRED_(g_gmock_mutex) {
g_gmock_mutex.AssertHeld(); g_gmock_mutex.AssertHeld();
const ::std::string& expectation_description = GetDescription();
if (IsSaturated()) { if (IsSaturated()) {
// We have an excessive call. // We have an excessive call.
IncrementCallCount(); IncrementCallCount();
*what << "Mock function "; *what << "Mock function called more times than expected - ";
if (!expectation_description.empty()) {
*what << "\"" << expectation_description << "\" ";
}
*what << "called more times than expected - ";
mocker->DescribeDefaultActionTo(args, what); mocker->DescribeDefaultActionTo(args, what);
DescribeCallCountTo(why); DescribeCallCountTo(why);
...@@ -1241,11 +1217,7 @@ class TypedExpectation<R(Args...)> : public ExpectationBase { ...@@ -1241,11 +1217,7 @@ class TypedExpectation<R(Args...)> : public ExpectationBase {
} }
// Must be done after IncrementCount()! // Must be done after IncrementCount()!
*what << "Mock function "; *what << "Mock function call matches " << source_text() << "...\n";
if (!expectation_description.empty()) {
*what << "\"" << expectation_description << "\" ";
}
*what << "call matches " << source_text() << "...\n";
return &(GetCurrentAction(mocker, args)); return &(GetCurrentAction(mocker, args));
} }
......
Markdown is supported
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment