Add IsEmpty overload for C-style strings
Fixes #3937 PiperOrigin-RevId: 463180144 Change-Id: I21b528acc4c3f3aba4234642be01fcead7fe7f00
This commit is contained in:
		
				
					committed by
					
						
						Copybara-Service
					
				
			
			
				
	
			
			
			
						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();
 | 
				
			||||||
 
 | 
				
			|||||||
		Reference in New Issue
	
	Block a user