aboutsummaryrefslogtreecommitdiffstats
path: root/test
diff options
context:
space:
mode:
authorbillydonahue <billydonahue@google.com>2014-05-19 17:54:51 +0000
committerbillydonahue <billydonahue@google.com>2014-05-19 17:54:51 +0000
commit1f5fdea417f1a55cffcfc0711d345d1d8ca2bc01 (patch)
treef05cabf6742496f8709c9df23aae8b8d002ea08f /test
parentbd0188320de5aab1b09718e2c466387099d43cfb (diff)
downloadgoogletest-1f5fdea417f1a55cffcfc0711d345d1d8ca2bc01.tar.gz
googletest-1f5fdea417f1a55cffcfc0711d345d1d8ca2bc01.tar.bz2
googletest-1f5fdea417f1a55cffcfc0711d345d1d8ca2bc01.zip
Push several shanges:
Make single argument constructors explicit in macros. Remove NOMINMAX macro. Add macros for disabling Microsoft Visual C++ warnings. Add WhenDynamicCastTo<T> matcher. A matcher that matches a pointer that matches inner_matcher when dynamic_cast<T> is applied. Add IWYU export pragmas to the tuple include lines. Fix NativeArray to not require a copy constructor unless we ask for one. This allows ElementsAre() to support non-copyable types. Examine WINAPI_FAMILY_PARTITION macros to better distinguish windows platforms. Author: martin@martin.st From: https://codereview.appspot.com/57220043/
Diffstat (limited to 'test')
-rw-r--r--test/gmock-generated-actions_test.cc4
-rw-r--r--test/gmock-internal-utils_test.cc4
-rw-r--r--test/gmock-matchers_test.cc147
3 files changed, 144 insertions, 11 deletions
diff --git a/test/gmock-generated-actions_test.cc b/test/gmock-generated-actions_test.cc
index 784c59d1..c2d2a0a8 100644
--- a/test/gmock-generated-actions_test.cc
+++ b/test/gmock-generated-actions_test.cc
@@ -900,9 +900,9 @@ template <typename T1, typename T2>
// pattern requires the user to use it directly.
ConcatImplActionP3<std::string, T1, T2>
Concat(const std::string& a, T1 b, T2 c) {
- GTEST_INTENTIONAL_CONST_COND_PUSH_
+ GTEST_INTENTIONAL_CONST_COND_PUSH_()
if (true) {
- GTEST_INTENTIONAL_CONST_COND_POP_
+ GTEST_INTENTIONAL_CONST_COND_POP_()
// This branch verifies that ConcatImpl() can be invoked without
// explicit template arguments.
return ConcatImpl(a, b, c);
diff --git a/test/gmock-internal-utils_test.cc b/test/gmock-internal-utils_test.cc
index e5e842a1..95a7dc39 100644
--- a/test/gmock-internal-utils_test.cc
+++ b/test/gmock-internal-utils_test.cc
@@ -247,9 +247,9 @@ TEST(LosslessArithmeticConvertibleTest, FloatingPointToFloatingPoint) {
// Larger size => smaller size is not fine.
EXPECT_FALSE((LosslessArithmeticConvertible<double, float>::value));
- GTEST_INTENTIONAL_CONST_COND_PUSH_
+ GTEST_INTENTIONAL_CONST_COND_PUSH_()
if (sizeof(double) == sizeof(long double)) { // NOLINT
- GTEST_INTENTIONAL_CONST_COND_POP_
+ GTEST_INTENTIONAL_CONST_COND_POP_()
// In some implementations (e.g. MSVC), double and long double
// have the same size.
EXPECT_TRUE((LosslessArithmeticConvertible<long double, double>::value));
diff --git a/test/gmock-matchers_test.cc b/test/gmock-matchers_test.cc
index 0f6bcb29..ea0153ea 100644
--- a/test/gmock-matchers_test.cc
+++ b/test/gmock-matchers_test.cc
@@ -33,10 +33,6 @@
//
// This file tests some commonly used argument matchers.
-// windows.h defines macros which conflict with standard identifiers used in
-// this test. Defining this symbol prevents windows.h from doing that.
-#define NOMINMAX
-
#include "gmock/gmock-matchers.h"
#include "gmock/gmock-more-matchers.h"
@@ -657,8 +653,21 @@ TEST(MatcherCastTest, ValueIsNotCopied) {
EXPECT_TRUE(m.Matches(n));
}
-class Base {};
-class Derived : public Base {};
+class Base {
+ public:
+ virtual ~Base() {}
+ Base() {}
+ private:
+ GTEST_DISALLOW_COPY_AND_ASSIGN_(Base);
+};
+
+class Derived : public Base {
+ public:
+ Derived() : Base() {}
+ int i;
+};
+
+class OtherDerived : public Base {};
// Tests that SafeMatcherCast<T>(m) works when m is a polymorphic matcher.
TEST(SafeMatcherCastTest, FromPolymorphicMatcher) {
@@ -3135,6 +3144,107 @@ TEST(PointeeTest, ReferenceToNonConstRawPointer) {
EXPECT_FALSE(m.Matches(p));
}
+
+MATCHER_P(FieldIIs, inner_matcher, "") {
+ return ExplainMatchResult(inner_matcher, arg.i, result_listener);
+}
+
+TEST(WhenDynamicCastToTest, SameType) {
+ Derived derived;
+ derived.i = 4;
+
+ // Right type. A pointer is passed down.
+ Base* as_base_ptr = &derived;
+ EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Not(IsNull())));
+ EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(4))));
+ EXPECT_THAT(as_base_ptr,
+ Not(WhenDynamicCastTo<Derived*>(Pointee(FieldIIs(5)))));
+}
+
+TEST(WhenDynamicCastToTest, WrongTypes) {
+ Base base;
+ Derived derived;
+ OtherDerived other_derived;
+
+ // Wrong types. NULL is passed.
+ EXPECT_THAT(&base, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
+ EXPECT_THAT(&base, WhenDynamicCastTo<Derived*>(IsNull()));
+ Base* as_base_ptr = &derived;
+ EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<OtherDerived*>(Pointee(_))));
+ EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<OtherDerived*>(IsNull()));
+ as_base_ptr = &other_derived;
+ EXPECT_THAT(as_base_ptr, Not(WhenDynamicCastTo<Derived*>(Pointee(_))));
+ EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
+}
+
+TEST(WhenDynamicCastToTest, AlreadyNull) {
+ // Already NULL.
+ Base* as_base_ptr = NULL;
+ EXPECT_THAT(as_base_ptr, WhenDynamicCastTo<Derived*>(IsNull()));
+}
+
+struct AmbiguousCastTypes {
+ class VirtualDerived : public virtual Base {};
+ class DerivedSub1 : public VirtualDerived {};
+ class DerivedSub2 : public VirtualDerived {};
+ class ManyDerivedInHierarchy : public DerivedSub1, public DerivedSub2 {};
+};
+
+TEST(WhenDynamicCastToTest, AmbiguousCast) {
+ AmbiguousCastTypes::DerivedSub1 sub1;
+ AmbiguousCastTypes::ManyDerivedInHierarchy many_derived;
+ // Multiply derived from Base. dynamic_cast<> returns NULL.
+ Base* as_base_ptr =
+ static_cast<AmbiguousCastTypes::DerivedSub1*>(&many_derived);
+ EXPECT_THAT(as_base_ptr,
+ WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(IsNull()));
+ as_base_ptr = &sub1;
+ EXPECT_THAT(
+ as_base_ptr,
+ WhenDynamicCastTo<AmbiguousCastTypes::VirtualDerived*>(Not(IsNull())));
+}
+
+TEST(WhenDynamicCastToTest, Describe) {
+ Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
+#if GTEST_HAS_RTTI
+ const string prefix =
+ "when dynamic_cast to " + internal::GetTypeName<Derived*>() + ", ";
+#else // GTEST_HAS_RTTI
+ const string prefix = "when dynamic_cast, ";
+#endif // GTEST_HAS_RTTI
+ EXPECT_EQ(prefix + "points to a value that is anything", Describe(matcher));
+ EXPECT_EQ(prefix + "does not point to a value that is anything",
+ DescribeNegation(matcher));
+}
+
+TEST(WhenDynamicCastToTest, Explain) {
+ Matcher<Base*> matcher = WhenDynamicCastTo<Derived*>(Pointee(_));
+ Base* null = NULL;
+ EXPECT_THAT(Explain(matcher, null), HasSubstr("NULL"));
+ Derived derived;
+ EXPECT_TRUE(matcher.Matches(&derived));
+ EXPECT_THAT(Explain(matcher, &derived), HasSubstr("which points to "));
+
+ // With references, the matcher itself can fail. Test for that one.
+ Matcher<const Base&> ref_matcher = WhenDynamicCastTo<const OtherDerived&>(_);
+ EXPECT_THAT(Explain(ref_matcher, derived),
+ HasSubstr("which cannot be dynamic_cast"));
+}
+
+TEST(WhenDynamicCastToTest, GoodReference) {
+ Derived derived;
+ derived.i = 4;
+ Base& as_base_ref = derived;
+ EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(FieldIIs(4)));
+ EXPECT_THAT(as_base_ref, WhenDynamicCastTo<const Derived&>(Not(FieldIIs(5))));
+}
+
+TEST(WhenDynamicCastToTest, BadReference) {
+ Derived derived;
+ Base& as_base_ref = derived;
+ EXPECT_THAT(as_base_ref, Not(WhenDynamicCastTo<const OtherDerived&>(_)));
+}
+
// Minimal const-propagating pointer.
template <typename T>
class ConstPropagatingPtr {
@@ -3210,17 +3320,24 @@ TEST(PointeeTest, AlwaysExplainsPointee) {
// An uncopyable class.
class Uncopyable {
public:
+ Uncopyable() : value_(-1) {}
explicit Uncopyable(int a_value) : value_(a_value) {}
int value() const { return value_; }
+ void set_value(int i) { value_ = i; }
+
private:
- const int value_;
+ int value_;
GTEST_DISALLOW_COPY_AND_ASSIGN_(Uncopyable);
};
// Returns true iff x.value() is positive.
bool ValueIsPositive(const Uncopyable& x) { return x.value() > 0; }
+MATCHER_P(UncopyableIs, inner_matcher, "") {
+ return ExplainMatchResult(inner_matcher, arg.value(), result_listener);
+}
+
// A user-defined struct for testing Field().
struct AStruct {
AStruct() : x(0), y(1.0), z(5), p(NULL) {}
@@ -4527,6 +4644,13 @@ TEST(ElemensAreArrayStreamTest, WorksForStreamlike) {
EXPECT_THAT(s, Not(ElementsAreArray(expected)));
}
+TEST(ElementsAreTest, WorksWithUncopyable) {
+ Uncopyable objs[2];
+ objs[0].set_value(-3);
+ objs[1].set_value(1);
+ EXPECT_THAT(objs, ElementsAre(UncopyableIs(-3), Truly(ValueIsPositive)));
+}
+
// Tests for UnorderedElementsAreArray()
TEST(UnorderedElementsAreArrayTest, SucceedsWhenExpected) {
@@ -4609,6 +4733,14 @@ class UnorderedElementsAreTest : public testing::Test {
typedef std::vector<int> IntVec;
};
+TEST_F(UnorderedElementsAreTest, WorksWithUncopyable) {
+ Uncopyable objs[2];
+ objs[0].set_value(-3);
+ objs[1].set_value(1);
+ EXPECT_THAT(objs,
+ UnorderedElementsAre(Truly(ValueIsPositive), UncopyableIs(-3)));
+}
+
TEST_F(UnorderedElementsAreTest, SucceedsWhenExpected) {
const int a[] = { 1, 2, 3 };
std::vector<int> s(a, a + GTEST_ARRAY_SIZE_(a));
@@ -5332,3 +5464,4 @@ TEST(PointwiseTest, AllowsMonomorphicInnerMatcher) {
} // namespace gmock_matchers_test
} // namespace testing
+