Add IsEmpty overload for C-style strings
Fixes #3937 PiperOrigin-RevId: 463180144 Change-Id: I21b528acc4c3f3aba4234642be01fcead7fe7f00
This commit is contained in:
parent
7735334a46
commit
b1e9b6323a
@ -40,6 +40,9 @@
|
|||||||
#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 {
|
||||||
@ -56,16 +59,44 @@ namespace testing {
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
// Defines a matcher that matches an empty container. The container must
|
namespace internal {
|
||||||
// support both size() and empty(), which all STL-like containers provide.
|
|
||||||
MATCHER(IsEmpty, negation ? "isn't empty" : "is empty") {
|
// Implements the polymorphic IsEmpty matcher, which
|
||||||
if (arg.empty()) {
|
// can be used as a Matcher<T> as long as T is either a container that defines
|
||||||
|
// 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;
|
||||||
}
|
}
|
||||||
*result_listener << "whose size is " << arg.size();
|
*listener << "whose size is " << c.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
|
||||||
// context to true. Useful for types that define "explicit operator
|
// context to true. Useful for types that define "explicit operator
|
||||||
// bool" operators and so can't be compared for equality with true
|
// bool" operators and so can't be compared for equality with true
|
||||||
|
@ -39,6 +39,8 @@
|
|||||||
#pragma warning(disable : 4100)
|
#pragma warning(disable : 4100)
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
#include <vector>
|
||||||
|
|
||||||
#include "test/gmock-matchers_test.h"
|
#include "test/gmock-matchers_test.h"
|
||||||
|
|
||||||
namespace testing {
|
namespace testing {
|
||||||
@ -983,6 +985,30 @@ TEST(ComparisonBaseTest, WorksWithMoveOnly) {
|
|||||||
helper.Call(MoveOnly(1));
|
helper.Call(MoveOnly(1));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
TEST(IsEmptyTest, MatchesContainer) {
|
||||||
|
const Matcher<std::vector<int>> m = IsEmpty();
|
||||||
|
std::vector<int> a = {};
|
||||||
|
std::vector<int> b = {1};
|
||||||
|
EXPECT_TRUE(m.Matches(a));
|
||||||
|
EXPECT_FALSE(m.Matches(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(IsEmptyTest, MatchesStdString) {
|
||||||
|
const Matcher<std::string> m = IsEmpty();
|
||||||
|
std::string a = "z";
|
||||||
|
std::string b = "";
|
||||||
|
EXPECT_FALSE(m.Matches(a));
|
||||||
|
EXPECT_TRUE(m.Matches(b));
|
||||||
|
}
|
||||||
|
|
||||||
|
TEST(IsEmptyTest, MatchesCString) {
|
||||||
|
const Matcher<const char*> m = IsEmpty();
|
||||||
|
const char a[] = "";
|
||||||
|
const char b[] = "x";
|
||||||
|
EXPECT_TRUE(m.Matches(a));
|
||||||
|
EXPECT_FALSE(m.Matches(b));
|
||||||
|
}
|
||||||
|
|
||||||
// Tests that IsNull() matches any NULL pointer of any type.
|
// Tests that IsNull() matches any NULL pointer of any type.
|
||||||
TEST(IsNullTest, MatchesNullPointer) {
|
TEST(IsNullTest, MatchesNullPointer) {
|
||||||
Matcher<int*> m1 = IsNull();
|
Matcher<int*> m1 = IsNull();
|
||||||
|
Loading…
Reference in New Issue
Block a user